diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 000000000..a5ec49122
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,9 @@
+**/node_modules/**
+node_modules
+**/vendor/**
+vendor
+**/test/**
+**/dist/**
+
+// being refactored / removed
+packages/uikit-workshop/src/scripts/components/styleguide.js
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 000000000..826a1702e
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,86 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true,
+ builtin: true,
+ es6: true,
+ browser: true,
+ },
+ parser: 'babel-eslint',
+ parserOptions: {
+ ecmaVersion: 2018,
+ sourceType: 'module',
+ allowImportExportEverywhere: true,
+ ecmaFeatures: {
+ jsx: true,
+ experimentalDecorators: true,
+ },
+ },
+ globals: {},
+ plugins: ['prettier'],
+ extends: ['eslint-config-prettier'].map(require.resolve),
+ rules: {
+ 'prettier/prettier': 'error',
+ 'block-scoped-var': 0,
+ camelcase: 0,
+ 'consistent-return': 2,
+ curly: [2, 'all'],
+ 'dot-notation': [1, { allowKeywords: true }],
+ eqeqeq: [2, 'allow-null'],
+ 'global-strict': [0, 'never'],
+ 'guard-for-in': 2,
+ 'key-spacing': 0,
+ 'new-cap': 0,
+ 'no-alert': 2,
+ 'no-bitwise': 2,
+ 'no-caller': 2,
+ 'no-cond-assign': [2, 'except-parens'],
+ 'no-debugger': 2,
+ 'no-dupe-args': 2,
+ 'no-dupe-keys': 2,
+ 'no-empty': 2,
+ 'no-eval': 2,
+ 'no-extend-native': 2,
+ 'no-extra-bind': 2,
+ 'no-extra-parens': 0,
+ 'no-func-assign': 2,
+ 'no-implied-eval': 2,
+ 'no-invalid-regexp': 2,
+ 'no-irregular-whitespace': 1,
+ 'no-iterator': 2,
+ 'no-loop-func': 2,
+ 'no-mixed-requires': 0,
+ 'no-multi-str': 2,
+ 'no-native-reassign': 2,
+ 'no-new': 2,
+ 'no-param-reassign': 1,
+ 'no-proto': 2,
+ 'no-redeclare': 0,
+ 'no-script-url': 2,
+ 'no-self-assign': 2,
+ 'no-self-compare': 2,
+ 'no-sequences': 2,
+ 'no-shadow': 2,
+ 'no-undef': 2,
+ 'no-underscore-dangle': 0,
+ 'no-unreachable': 1,
+ 'no-unused-vars': 1,
+ 'no-use-before-define': 1,
+ 'no-useless-call': 2,
+ 'no-useless-concat': 2,
+ 'no-var': 2,
+ 'no-with': 2,
+ quotes: [0, 'single'],
+ radix: 2,
+ strict: 0,
+ 'valid-typeof': 2,
+ 'vars-on-top': 0,
+ 'prefer-const': [
+ 'error',
+ {
+ destructuring: 'any',
+ ignoreReadBeforeAssign: false,
+ },
+ ],
+ },
+};
diff --git a/.eslintrc b/.eslintrc.json
similarity index 97%
rename from .eslintrc
rename to .eslintrc.json
index d5dd0f115..335572829 100644
--- a/.eslintrc
+++ b/.eslintrc.json
@@ -1,11 +1,12 @@
{
+ "root": true,
"env": {
"node": true,
"builtin": true,
"es6": true
},
"parserOptions": {
- "ecmaVersion": 6,
+ "ecmaVersion": 2017,
"sourceType": "module"
},
"globals": {},
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index ab24808be..477f273af 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -6,7 +6,7 @@ No pull request is too small. Check out any [help wanted 🆘](https://github.co
## Prerequisites
-To get started, you'll need Node 8 or higher. Managing Node with [nvm](https://github.com/creationix/nvm) is recommended. Once installed, you can target the version of Node we specify within the [`.nvmrc`](https://github.com/pattern-lab/patternlab-node/blob/master/.nvmrc) file.
+To get started, you'll need Node installed. Managing Node with [nvm](https://github.com/creationix/nvm) is recommended. Once installed, you can target the version of Node we specify within the [`.nvmrc`](https://github.com/pattern-lab/patternlab-node/blob/master/.nvmrc) file.
```sh
nvm install <>
@@ -47,7 +47,7 @@ This ensures that any changes you've made will still result in a clean and funct
## Coding style
-Formatting is automated via [Prettier](https://prettier.io/), setup to run on precommit. We suggest [editor integration](https://prettier.io/docs/en/editors.html) for this and for eslint. Prettier is further configured within `.prettierrc`. Eslint validates syntax and usage that Prettier doesn't handle. Configuration for both is found within the `.eslintrc` file.
+Formatting is automated via [Prettier](https://prettier.io/), setup to run on precommit. We suggest [editor integration](https://prettier.io/docs/en/editors.html) for this and for eslint. Prettier is further configured within `.prettierrc`. Eslint validates syntax and usage that Prettier doesn't handle. Configuration for both is found within the `.eslintrc.json` file.
The `.editorconfig` controls spaces / tabs within supported editors. Check out their [site](http://editorconfig.org/).
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..5805c3f03
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+patreon: patternlab
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 193e6014f..9e5ad2464 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,6 +1,6 @@
-
+
I am using Pattern Lab Node `vX.X.X` on `Windows | Mac | Linux`, with Node `vX.X.X`, using a `Gulp | Grunt | Vanilla | Custom` Edition.
diff --git a/.github/stale.yml b/.github/stale.yml
index 61a1fe74b..5969a91e8 100644
--- a/.github/stale.yml
+++ b/.github/stale.yml
@@ -1,7 +1,7 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
-daysUntilClose: 14
+daysUntilClose: 30
# Issues with these labels will never be considered stale
exemptLabels:
- "staged for next release 🏁"
diff --git a/.gitignore b/.gitignore
index b4874dffb..96232f92a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,13 @@ Thumbs.db
.nyc_output/
.vscode/
.idea/
+.env
packages/core/test/public
+packages/*/public
!packages/core/test/patterns/public/.gitkeep
!packages/core/test/patterns/testDependencyGraph.json
lerna-debug.log
+packages/edition-node-gulp/dependencyGraph.json
+packages/uikit-workshop/dist
+
+yarn-error.log
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 000000000..43c97e719
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+package-lock=false
diff --git a/.nvmrc b/.nvmrc
index e3f76f340..7f976a5ae 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-8.9.4
+12.12.0
diff --git a/.prettierignore b/.prettierignore
index 3a4d3d062..f25d454d3 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -8,3 +8,8 @@
packages/core/scripts/api.handlebars
packages/core/scripts/events.handlebars
packages/core/test/files/annotations.js
+packages/**/annotations.js
+**/uikit-workshop/src/js/**/*
+*.json
+*.md
+*.scss
diff --git a/.travis.yml b/.travis.yml
index c606e3434..3fb4c3593 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,17 +1,24 @@
language: node_js
+addons:
+ chrome: stable
+
before_install:
- - phantomjs --version
+ # version lifted from `.nvmrc`
+ - nvm install
+ - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.19.0
+ - export PATH="$HOME/.yarn/bin:$PATH"
before_script:
- - npm install -g lerna@2.9.0
- - npm run bootstrap
- - lerna add @pattern-lab/engine-mustache
- - lerna add @pattern-lab/engine-handlebars
- - lerna add @pattern-lab/engine-underscore
- - lerna add @pattern-lab/engine-liquid
- - lerna add @pattern-lab/engine-twig
- - lerna add @pattern-lab/engine-react
+ - yarn run setup
+ - npx lerna add @pattern-lab/engine-mustache --scope=@pattern-lab/core
+ - npx lerna add @pattern-lab/engine-handlebars --scope=@pattern-lab/core
+ - npx lerna add @pattern-lab/engine-underscore --scope=@pattern-lab/core
+ - npx lerna add @pattern-lab/engine-liquid --scope=@pattern-lab/core
+ - npx lerna add @pattern-lab/engine-twig --scope=@pattern-lab/core
+ - npx lerna add @pattern-lab/engine-react --scope=@pattern-lab/core
+
+script: travis_wait yarn run test
branches:
only:
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..ddc797b61
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,396 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+
+### Bug Fixes
+
+* **plugintabs:** enabling multiple file formats [#1163](https://github.com/pattern-lab/patternlab-node/issues/1163) ([bb5e817](https://github.com/pattern-lab/patternlab-node/commit/bb5e8179e6b8553a6e1af0bede26db412b6c0b68))
+* adjust UIKit Nav updates to account for the noViewAll config variation ([73eac97](https://github.com/pattern-lab/patternlab-node/commit/73eac976461f4e587b0c30668942c4895aea319f))
+* make sure the top-level Dropdown menus always open/close ([7a8b418](https://github.com/pattern-lab/patternlab-node/commit/7a8b418bfcbd200ef8b2802b1a07964a9995bf9f))
+* only allow one top level nav item to be open at a time while rendering as a dropdown menu ([409bef3](https://github.com/pattern-lab/patternlab-node/commit/409bef37165260d9b728013ac33e7aa67541c832))
+* re-try Netlify preview to debug local vs prod rendering differences ([6da41a1](https://github.com/pattern-lab/patternlab-node/commit/6da41a14feea034f891c745dfeb062fa3b196235))
+* Update dependency on twing JS engine ([cfe88c6](https://github.com/pattern-lab/patternlab-node/commit/cfe88c6cdbf2219b9955eaa0ffcfc0e4a7683511))
+* **cli:** fix test script glob ([ff18eb5](https://github.com/pattern-lab/patternlab-node/commit/ff18eb51ce24fc5423b009168e85ede366069139))
+
+
+
+
+
+## [5.9.2](https://github.com/pattern-lab/patternlab-node/compare/v5.9.1...v5.9.2) (2020-04-24)
+
+**Note:** Version bump only for package pl-node
+
+
+
+
+
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/compare/v5.9.0...v5.9.1) (2020-04-24)
+
+
+### Bug Fixes
+
+* **cli:** ensure specified directory exists prior to scaffold ([cc3b696](https://github.com/pattern-lab/patternlab-node/commit/cc3b69624d486c94ee3b1f4b1bbb0334a514fa59))
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+
+### Bug Fixes
+
+* **cli:** set current working directory before scaffolded npm init ([6d2186d](https://github.com/pattern-lab/patternlab-node/commit/6d2186d8e8a74634198a4474ca8ae83221dd70a9))
+* **core:** do not warn about uikit-polyfills ([6bb68e7](https://github.com/pattern-lab/patternlab-node/commit/6bb68e763769969546542bf7aaf6d1f4235c6622))
+* actually exit build when Twig render fails ([5d28a24](https://github.com/pattern-lab/patternlab-node/commit/5d28a24a53011396289c1e29e0a715cd82470185))
+* Update packages/engine-twig-php/lib/engine_twig_php.js ([c67d50e](https://github.com/pattern-lab/patternlab-node/commit/c67d50ebb5d69816b7514e85f129f8ecde984ad3))
+
+
+### Features
+
+* **docs:** yarnify ([5a47dc7](https://github.com/pattern-lab/patternlab-node/commit/5a47dc7b90dc5c43c12a51143b41943dcbd8564c))
+* **README:** add netlify badges ([941df8a](https://github.com/pattern-lab/patternlab-node/commit/941df8a59b6b75bc1255646005f329e40be68106))
+
+
+
+
+
+# [5.8.0](https://github.com/pattern-lab/patternlab-node/compare/v5.7.2...v5.8.0) (2020-04-03)
+
+
+### Bug Fixes
+
+* the namespace notation should not be mixed with PatternLab shorthand pattern naming & name is not defined in the textarea macro ([8250fe8](https://github.com/pattern-lab/patternlab-node/commit/8250fe88231d03735424d597eae40496da2cb48c))
+* Updated the README to reflect which issues are resolved. ([d90c3c4](https://github.com/pattern-lab/patternlab-node/commit/d90c3c4605f9a5bcd1153996e3f4d1a17d58bd92))
+
+
+### Features
+
+* switch engine-twig to use twing rather than node-twig ([daca95c](https://github.com/pattern-lab/patternlab-node/commit/daca95c4ffa48916fb6c67c5184bde9b624acd76))
+
+
+
+
+
+## [5.7.2](https://github.com/pattern-lab/patternlab-node/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+
+### Bug Fixes
+
+* update iframe resizer UI to be hidden when iframe is full width ([9797c1a](https://github.com/pattern-lab/patternlab-node/commit/9797c1a047d746d21b88a1f57b57f618a03a54df))
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/patternlab-node/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+
+### Bug Fixes
+
+* update twig-renderer ([46f53b7](https://github.com/pattern-lab/patternlab-node/commit/46f53b79f8bb0bb64a9c55fd32f29459cea6e28c))
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+
+### Features
+
+* **cli:** make options more user friendly ([ad845b3](https://github.com/pattern-lab/patternlab-node/commit/ad845b394ef81f90895ebb5bc6f12cc608e5e3d4))
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/patternlab-node/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+
+### Bug Fixes
+
+* a11y fix on text contrast ([6d75b22](https://github.com/pattern-lab/patternlab-node/commit/6d75b226ce27228025b2915e5d402f7080faee31))
+* a11y issue on a missing description of that complementary icon ([4f13807](https://github.com/pattern-lab/patternlab-node/commit/4f13807cb93df33435088de3a51170b9c4515889))
+
+
+### Features
+
+* pass additional configuration into twig-php engine ([dff5a78](https://github.com/pattern-lab/patternlab-node/commit/dff5a7830918fa46e2692d9f9daed4121f803461))
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+
+### Features
+
+* upgrade Twig to use new filter, map, reduce ([4218a5a](https://github.com/pattern-lab/patternlab-node/commit/4218a5a04b06027548afd9f417486297dd25fef8))
+
+
+
+
+
+## [5.4.2](https://github.com/pattern-lab/patternlab-node/compare/v5.4.1...v5.4.2) (2019-11-27)
+
+**Note:** Version bump only for package pl-node-pr
+
+
+
+
+
+## [5.4.1](https://github.com/pattern-lab/patternlab-node/compare/v5.4.0...v5.4.1) (2019-11-26)
+
+
+### Bug Fixes
+
+* temp workaround to address instance where the latest version of Edge supports ES modules but NOT Custom Elements ([ada3d82](https://github.com/pattern-lab/patternlab-node/commit/ada3d829019345fd33ed949f306972efdcb4fa57))
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+
+### Bug Fixes
+
+* re-add popstate listener ([6dbbd6a](https://github.com/pattern-lab/patternlab-node/commit/6dbbd6aae3709cc17544c12dd10588120eb9e71a))
+* **script:** remove quotes around starterkit ([e4897fb](https://github.com/pattern-lab/patternlab-node/commit/e4897fb6e4d4cd0985ab72397abd03ff04be514b))
+* add a new method to check if PL is currently compiling + add new method to get the config PL is using ([26e886c](https://github.com/pattern-lab/patternlab-node/commit/26e886c93db5d135c91de648724f7278c4d5b3e9))
+* check if dependency graph file exists before trying to remove ([f9af6a9](https://github.com/pattern-lab/patternlab-node/commit/f9af6a95025a22041e7ff8a4bfb19e4727385e98))
+* comment out example config to disable viewAll links ([ddb3fad](https://github.com/pattern-lab/patternlab-node/commit/ddb3fad5770d1d66432c4b583ae9af09a3a47d48))
+
+
+### Features
+
+* add the ability to disable Pattern Lab viewall links in the navigation ([156e609](https://github.com/pattern-lab/patternlab-node/commit/156e609a92e7f7e7ebd8f4f5cd77b5d695db8bad))
+* major improvements to local UIKit workflow ([4dc9173](https://github.com/pattern-lab/patternlab-node/commit/4dc9173a5a44b422e9677824de3728048b7c4f05))
+* test adding cross-env to Twig Edition test ([3f8bb01](https://github.com/pattern-lab/patternlab-node/commit/3f8bb01bc4e96a0aba61c213ea1619c02593defc))
+
+
+
+
+
+## [5.3.3](https://github.com/pattern-lab/patternlab-node/compare/v5.3.2...v5.3.3) (2019-11-22)
+
+
+### Bug Fixes
+
+* simplify overflow fix ([378cf42](https://github.com/pattern-lab/patternlab-node/commit/378cf4282a3e5b4f597287eb538270e3358c8c69))
+* testing potential FF fix for https://github.com/pattern-lab/patternlab-node/issues/1100 ([613bba1](https://github.com/pattern-lab/patternlab-node/commit/613bba104f2082be507938db78f1db7a07f6b8be))
+
+
+
+
+
+
+## [5.3.2](https://github.com/pattern-lab/patternlab-node/compare/v5.3.1...v5.3.2) (2019-11-14)
+
+**Note:** Version bump only for package pl-node
+
+
+
+
+
+## [5.3.1](https://github.com/pattern-lab/patternlab-node/compare/v5.3.0...v5.3.1) (2019-11-13)
+
+
+### Bug Fixes
+
+* CSS fix to properly highlight the correct active page / link in the Nav; improve dropdown open / close animation ([ec4ab84](https://github.com/pattern-lab/patternlab-node/commit/ec4ab84ddc8007796c9012a3f493822d76f039a7))
+* small UI fixes for the sticky Tabs header on smaller screens + drawer content collapsing on smaller screens + better handling of Nav link cleanup when changing pages ([347e2fe](https://github.com/pattern-lab/patternlab-node/commit/347e2fe29a78a1d168005a07c656b4f9f1124c7f))
+* tweak header and drawer padding when viewing on a device with curved edges ([98e9baf](https://github.com/pattern-lab/patternlab-node/commit/98e9baf649eceb9124218a924b6b08097b910e86))
+* uikit fixes and minor CSS updates intended for the v5.3.0 release ([26c4ced](https://github.com/pattern-lab/patternlab-node/commit/26c4ceddaae09fa4fa4873f092c924274498c5da))
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+
+### Bug Fixes
+
+* add PluginTab workaround for Safari ([2fa9367](https://github.com/pattern-lab/patternlab-node/commit/2fa936769be65484af52f242dca2536a3382462c))
+* **core:** re-add cleanPublic fix ([c100bbc](https://github.com/pattern-lab/patternlab-node/commit/c100bbca3f339e9132acb9c482e98c1c8a66b8b5))
+* **plugin-tab:** defensively call addPanels ([b82bd12](https://github.com/pattern-lab/patternlab-node/commit/b82bd129fdbe48de95b62d75fb7fe95cea896b7e))
+* port over missing UIKit Sass that wasn't added in the original PR ([f7659e6](https://github.com/pattern-lab/patternlab-node/commit/f7659e64d0eee13be20921dd5afc48ac20ae93e6))
+
+
+### Features
+
+* port latest UIKit updates + fixes upstream ([d07952c](https://github.com/pattern-lab/patternlab-node/commit/d07952cb07e3792b995dda2e589262ecf4153fdc))
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/patternlab-node/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+
+### Bug Fixes
+
+* **deploy:** add setup command ([7c1d8d1](https://github.com/pattern-lab/patternlab-node/commit/7c1d8d14842a467bb301e2ede2ec83074ff35ae2))
+* add missing $ ([c95a06e](https://github.com/pattern-lab/patternlab-node/commit/c95a06ece78631b068f8721666caf33452e57a7a))
+* address bug causing viewport width to progressively decrease in size when resizing your screen / refreshing on certain devices ([41b11af](https://github.com/pattern-lab/patternlab-node/commit/41b11af8aaaf066fcf99abd2513eae8706122d32))
+* configure the Logo's `altText` config option when used as an HTML attribute ([ade34a2](https://github.com/pattern-lab/patternlab-node/commit/ade34a29435f5112f0449ad020bee7e9dc2c81e1))
+* fix classname typo ([da3c5f1](https://github.com/pattern-lab/patternlab-node/commit/da3c5f144d22b1ac3ad99680a264433d4438ebb2))
+* temp workaround to fix content exceeding the height of drawer container ([435243c](https://github.com/pattern-lab/patternlab-node/commit/435243cbfbd000a7d96a0e9fa7beff1a988ede64))
+* update drawer UI to not collapse content on smaller screen sizes ([7147085](https://github.com/pattern-lab/patternlab-node/commit/71470856b8b389421348366afd247a599d1e9c86))
+* update package.json description in `@pattern-lab/uikit-polyfills` ([22fc44a](https://github.com/pattern-lab/patternlab-node/commit/22fc44a4b3683753a469a98abfcdad8f1234f28a))
+* **engine_twig_php:** Allow additional flexibility with twig namespaces. ([07bfaa3](https://github.com/pattern-lab/patternlab-node/commit/07bfaa35a00ff62fd2016cc9f34e09cf5af36559))
+
+
+### Features
+
+* add lit-element, basic Typescript support to Webpack ([611f705](https://github.com/pattern-lab/patternlab-node/commit/611f705be85eea8a31091169750d64e988798cee))
+* add local copy of new Slotify library till published to NPM ([63b9d83](https://github.com/pattern-lab/patternlab-node/commit/63b9d833908151ce5cb5aa5184c72254125c7ed1))
+* add new component to make Button-like styles more reusable ([5e7b014](https://github.com/pattern-lab/patternlab-node/commit/5e7b0140622eb89154c38925769a6def6d669fb3))
+* add new component ([e8ce2a9](https://github.com/pattern-lab/patternlab-node/commit/e8ce2a927365b8d5316a7d8229c979ff31b04907))
+* add support for auto-closing Nav when clicking inside of the rendered iframe ([9d602fe](https://github.com/pattern-lab/patternlab-node/commit/9d602fe335a5d3b5bca5cac258c2465934d9a46a))
+* add support for optional chaining syntax via Babel plugin ([c8886b6](https://github.com/pattern-lab/patternlab-node/commit/c8886b6d9d91fea246fa3ab7947f289509dc26d5))
+* major refactoring + UI updates to address cross browser support; UI cleanup and conversion of the majority of the remaining components over to lit-element ([2ff8e1c](https://github.com/pattern-lab/patternlab-node/commit/2ff8e1c98cdd02e8077064c48eca5f7754a3db02))
+* refactor + convert pl-toggle-info to lit-element ([85cd9c5](https://github.com/pattern-lab/patternlab-node/commit/85cd9c50ca814066bf999badf2071d84964f00cc))
+* refactor + convert pl-toggle-layout to lit-element ([46009d9](https://github.com/pattern-lab/patternlab-node/commit/46009d91b1cb9ed613baa5a7626cba4f42883465))
+* refactor + convert pl-toggle-theme to lit-element ([95a3b21](https://github.com/pattern-lab/patternlab-node/commit/95a3b21a89dacd2d5b4df8c134ce438d4efdbd04))
+* refactor Drawer to render via lit-element + massively improve rendering performance ([28d47eb](https://github.com/pattern-lab/patternlab-node/commit/28d47eb3cbbce038204203e786e5188b4cefe64f))
+* remove mixin that was causing outlines to be removed from default UI styles ([622ed76](https://github.com/pattern-lab/patternlab-node/commit/622ed76d435b3b2e31e412266c3090506f98051b))
+* temp add unsafe-svg directive till upstream PR merged ([34de61c](https://github.com/pattern-lab/patternlab-node/commit/34de61ccd9c7bb3b48ca5ef386a87efc8e84babc))
+* update the Nav design to not bold the active item in order to not shift the layout ([0eda431](https://github.com/pattern-lab/patternlab-node/commit/0eda4312ba9f4c61afa6322c3ff45f9cda0efc9e))
+* update Webpack config to use the latest Style Loader + new SVG icon system ([2ed70e7](https://github.com/pattern-lab/patternlab-node/commit/2ed70e79d8656c7314d8b3109aa1c34160ad24f9))
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **config:** add new default pattern export options ([a7487a0](https://github.com/pattern-lab/patternlab-node/commit/a7487a0681cb11e6f3c5c8eaefd62e5648ad5ea3))
+
+
+
+
+
+## [5.0.2](https://github.com/pattern-lab/patternlab-node/compare/v5.0.1...v5.0.2) (2019-10-28)
+
+
+### Bug Fixes
+
+* **uikit-workshop:** add template files to published bundle ([9005fce](https://github.com/pattern-lab/patternlab-node/commit/9005fcee9e129fb41d509f706195e1437bddc710))
+* **uikit-workshop:** add webpack config to published bundle ([060a573](https://github.com/pattern-lab/patternlab-node/commit/060a573cbddce9ee3d270d39337d0c8cac8372fa))
+
+
+
+
+
+## [5.0.1](https://github.com/pattern-lab/patternlab-node/compare/v5.0.0...v5.0.1) (2019-10-28)
+
+
+### Bug Fixes
+
+* add missing “dist” folder to array of files / folders published to NPM ([8829429](https://github.com/pattern-lab/patternlab-node/commit/88294296c438352570befd2eb6b9e1ca2ae3b750))
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* **1049:** Treat folders like patterns only if they're subfolders of pattern groupings ([4eb79ab](https://github.com/pattern-lab/patternlab-node/commit/4eb79ab48b335a35b2e5ed3b7053974b8e8bb6b6))
+* **cli:** add custom install logic to edition-node ([f04fd26](https://github.com/pattern-lab/patternlab-node/commit/f04fd266429cd806987dab747e6d69bff9b926a4))
+* **cli:** allow any package to be installed as a starterkit ([d2aa1be](https://github.com/pattern-lab/patternlab-node/commit/d2aa1be810a0a7473dcc52391a2263dacfdda0b8)), closes [#1067](https://github.com/pattern-lab/patternlab-node/issues/1067)
+* **cli:** merge config arrays via overwrite instead of concatenate ([42e5f7b](https://github.com/pattern-lab/patternlab-node/commit/42e5f7b42a26b4fc1f262c68ee4b474b546f2eac))
+* **cli:** proper path resolution to helpers ([a18fe5e](https://github.com/pattern-lab/patternlab-node/commit/a18fe5ef4d1c074a5eba8bfa255ebbee2261bf74))
+* **cli:** re-order and clarify engines ([e39e301](https://github.com/pattern-lab/patternlab-node/commit/e39e301a33306c6615fabf64262f1893ca682b97))
+* **core:** allow plugin resolution to follow normal algorithm ([3f6b83b](https://github.com/pattern-lab/patternlab-node/commit/3f6b83be080c88aec1d8b73bececb76f0f57a79d))
+* **core:** find plugins from config only and with simpler args ([fe7351c](https://github.com/pattern-lab/patternlab-node/commit/fe7351cba346425512cbb2ef3a1b7728ab06ae60))
+* **deploy:** add setup command ([74dd314](https://github.com/pattern-lab/patternlab-node/commit/74dd3142bf48873a9f1ec4e8dccb8aa2fef9001d))
+* **engine_twig_php:** Pseudo patterns Twig PHP ([226aa8b](https://github.com/pattern-lab/patternlab-node/commit/226aa8bbaaf5e418530ccf54a28f6c5657ee6dea)), closes [#1045](https://github.com/pattern-lab/patternlab-node/issues/1045)
+* **engine_twig_php:** Twig incremental rebuilds ([1ade945](https://github.com/pattern-lab/patternlab-node/commit/1ade9451840b2645706a0b01129e2b697dc22d4b)), closes [#1015](https://github.com/pattern-lab/patternlab-node/issues/1015)
+* **engine_twig_php:** Twig incremental rebuilds ([5d33f24](https://github.com/pattern-lab/patternlab-node/commit/5d33f24f156ebe50900701513a855de7de608dcf)), closes [#1015](https://github.com/pattern-lab/patternlab-node/issues/1015)
+* **lerna:** typo in config ([525a47b](https://github.com/pattern-lab/patternlab-node/commit/525a47b51fba91c1bf5b7439735f48eb7dfa073e))
+* **lint:** Use const instead of var ([ad1e782](https://github.com/pattern-lab/patternlab-node/commit/ad1e782ef71295eb610f56d019eaa35499fb3f85))
+* **plugin:** correct spelling error and function locations ([d4abd88](https://github.com/pattern-lab/patternlab-node/commit/d4abd88cb017550002407241b5045a2ad1adb1dc))
+* **plugin-tab:** bump lodash from 4.17.5 to 4.17.15 in /packages/plugin-tab ([#1081](https://github.com/pattern-lab/patternlab-node/issues/1081)) ([3f89dda](https://github.com/pattern-lab/patternlab-node/commit/3f89dda1685874e251f9777f969c0943e0080881))
+* **plugin-tab:** handle params correctly ([d248993](https://github.com/pattern-lab/patternlab-node/commit/d2489939bb0db1a1d67b0e7f47dfb1838b88b0a0))
+* **starterkit:** add css output and build command ([ccb2d35](https://github.com/pattern-lab/patternlab-node/commit/ccb2d3569b741220324a3fa738ab3d4d2eb97ffe))
+* add better pre-rendering support ([8ecd615](https://github.com/pattern-lab/patternlab-node/commit/8ecd6159a89232f42e0a9dc3c688b6e21de8fc30))
+* add eslint fixes ([00d7bbe](https://github.com/pattern-lab/patternlab-node/commit/00d7bbe319ea77a6ee8cc9cd0348856feaaf13ad))
+* add missing @babel/runtime package to address silent error getting thrown on Travis ([1918d04](https://github.com/pattern-lab/patternlab-node/commit/1918d042d7e90cc8aaa2fdfcd8649961c0a5dd50))
+* add missing preact-render-to-string library ([881296a](https://github.com/pattern-lab/patternlab-node/commit/881296a2c256424beac28bd560c5b1a5e1fed005))
+* add repo info to root package.json so Auto knows what repo to configure for ([85142e8](https://github.com/pattern-lab/patternlab-node/commit/85142e8e94549edd7980459e5975d0639c34864d))
+* address unrelated eslint errors from PL core ([6ada00d](https://github.com/pattern-lab/patternlab-node/commit/6ada00d396eb436837f7453664bfa50522a2ec10))
+* correct typo in build logging ([96d989f](https://github.com/pattern-lab/patternlab-node/commit/96d989f8869630ba9f59705bfca66755f20e35ab))
+* fall back to seeing the current pattern's query string to `all` or the defaultPattern value if undefined when the iframe page initially loads ([a368459](https://github.com/pattern-lab/patternlab-node/commit/a3684590fca02cf96b99421b87a0ad0a711893ad))
+* fix incorrect Webpack version in package.json ([9788e89](https://github.com/pattern-lab/patternlab-node/commit/9788e8977921e31fe43f2a1ec19d4684dd4709c5))
+* fix issue with viewport height exceeding the space available ([95cd1cf](https://github.com/pattern-lab/patternlab-node/commit/95cd1cfa57f086ecb84ac2e996ecda81f0c6a1a6))
+* fix Prism.js typo so languages not found / supported don't throw a JS error ([a8c19f9](https://github.com/pattern-lab/patternlab-node/commit/a8c19f9f9b11d4abbdcd9e573fb0cb418d665660))
+* fix Twig Edition examples by adding missing Twig namespaces to config ([b4c20ef](https://github.com/pattern-lab/patternlab-node/commit/b4c20ef88ee0d3010760584c6f05ff7f92b711a6))
+* minor CSS fixes + fresh prod build ([8ac2c1f](https://github.com/pattern-lab/patternlab-node/commit/8ac2c1fa1c7558ed2ac50755f599a438d682ee2a))
+* re-enable displaying the top level `All` link if PL isn't configured to hide this specific link in the ishControlsHide config option. Addresses [#1048](https://github.com/pattern-lab/patternlab-node/issues/1048) ([6bb4e1a](https://github.com/pattern-lab/patternlab-node/commit/6bb4e1ac6f38b47f93030c8c5bca62d5db2132e4))
+* re-enable using the defaultPattern config for the initial iframe page load if defined ([d645ea1](https://github.com/pattern-lab/patternlab-node/commit/d645ea15150061d7ad13741d2dc37b12b9786411))
+* regenerate fresh UIKit build after fixing main JS issues ([9ea34d2](https://github.com/pattern-lab/patternlab-node/commit/9ea34d2efe43cafacb3729ac113121ba51126344))
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/commit/74e5af28c4e714fdfc1db535b94c52f3dc14a3a4))
+* squashing minor UI bugs ([a8a606c](https://github.com/pattern-lab/patternlab-node/commit/a8a606cfb224f7041f53ff5026a84e13fa17914c))
+* temporarily disable Random and Disco viewport controls until the full JS logic for these is re-enabled ([14b9a19](https://github.com/pattern-lab/patternlab-node/commit/14b9a19e4dee9462f3784eae28066893cc893624))
+* temporarily downgrade Preact version so tooltip used for displaying viewport sizes renders correctly ([52dcf85](https://github.com/pattern-lab/patternlab-node/commit/52dcf85e756ee171ca993288d98f5b5ef9a0a24b))
+* update autoprefixer browserslist config to address warning messages ([5e52f2b](https://github.com/pattern-lab/patternlab-node/commit/5e52f2b0ed02e2002ca867368636c3c0dc79ff0a))
+* update initial PL iframe path default ([a26fbb9](https://github.com/pattern-lab/patternlab-node/commit/a26fbb956e13901d1751c435b76de65637191ca4))
+* update Javascript to address merge conflict issue with previous PR merge / recent release ([cf2ecc1](https://github.com/pattern-lab/patternlab-node/commit/cf2ecc154383c3e8abd56dc88484370bc58ac30b))
+* update styles for pattern state dots ([7728acc](https://github.com/pattern-lab/patternlab-node/commit/7728accc9a6e5cd83be451f7d74e522dfe721cad))
+* update the default pattern that displays in the Handlebars demo ([ff1d85f](https://github.com/pattern-lab/patternlab-node/commit/ff1d85f2852fc4f210841e8e0aaf14b55165ce58))
+* **starterkit:** remove config file ([f90e38a](https://github.com/pattern-lab/patternlab-node/commit/f90e38aa873dcff0dd08fe4dabc3b71bf95080b6))
+* **starterkit:** use handlebars meta files ([d8f5e12](https://github.com/pattern-lab/patternlab-node/commit/d8f5e12471bd783bd3755626701ecc17669fc761))
+* updates to address eslint / prettier issues ([d945acc](https://github.com/pattern-lab/patternlab-node/commit/d945acc13b8e4e36f3815b017fbc12266c323d1f))
+* updates to fix eslint / prettier issues; update packages/core to reuse root .eslintrc.js file ([5b7a057](https://github.com/pattern-lab/patternlab-node/commit/5b7a057d46ccd16b5832af1441030c7b76f237a8))
+* use 100% of the screen available when JS is disabled / the first time the iframe loads up ([c0c5bff](https://github.com/pattern-lab/patternlab-node/commit/c0c5bff7a63b157d5b81dc2bcecee9e732ecfd4e))
+* **uikit:** clear out "404" responses when loading tabs ([73874b1](https://github.com/pattern-lab/patternlab-node/commit/73874b1b0b66ca6425c2b74331d417efdb529e2e))
+* **uikit-workshop:** fix merge problem ([d245b3b](https://github.com/pattern-lab/patternlab-node/commit/d245b3bca044c29f281052bf2feb95eeffafcf6b))
+
+
+### Features
+
+* **core:** invoke registered plugin hooks ([a54d775](https://github.com/pattern-lab/patternlab-node/commit/a54d7753b6939fe6a58da543f4fb34f64dd8901a))
+* **edition-node:** switch to engine-handlebars ([b481e22](https://github.com/pattern-lab/patternlab-node/commit/b481e22dc1f41ddd4da709621640a15190fba257))
+* **engine-handlebars:** Default location for helpers, like engine-nunjucks ([11c4180](https://github.com/pattern-lab/patternlab-node/commit/11c41805e0c3dbebb7109719c4f3c780d32feab5))
+* **engine-handlebars:** Demonstration of custom Handlebars helper ([f330b5b](https://github.com/pattern-lab/patternlab-node/commit/f330b5bca72f2f34bfafe5c2c64e6b0b8823eb1c))
+* **engine-handlebars:** Document the Helpers feature ([a01e040](https://github.com/pattern-lab/patternlab-node/commit/a01e040429a7f77dfeb28d67c690e835b97881de))
+* **engine-handlebars:** Load Handlebars helpers specified in the config ([a12df36](https://github.com/pattern-lab/patternlab-node/commit/a12df36d2a644dfac8ded1dfd94b987e99c29d79))
+* **engine-nunjucks:** Configurable extension locations; Use usePatternlabConfig() ([e54e3b3](https://github.com/pattern-lab/patternlab-node/commit/e54e3b3d48f934d3a4d44b9f4ff262f742a4aaf9))
+* **engine-react:** set package to private ([3aea881](https://github.com/pattern-lab/patternlab-node/commit/3aea8815f19df5b527cdda0b75cf99a9a8c3bc1e))
+* **plugin-tab:** pivot to using hook functions ([d4b2598](https://github.com/pattern-lab/patternlab-node/commit/d4b25984fc2a2646cc1876a5c635f57593c35f09))
+* **plugin-tab, core:** initial plugin hook exploration ([2f3d39a](https://github.com/pattern-lab/patternlab-node/commit/2f3d39ac6b125ad4c6b872e27ee224ce2ea33a12))
+* **starterkits:** add starterkit-handlebars-demo ([384d2cf](https://github.com/pattern-lab/patternlab-node/commit/384d2cfa3440c1e6f456d39f56ca6381f82f7689))
+* **uikit-workshop:** add plugin-loader ([fc966d6](https://github.com/pattern-lab/patternlab-node/commit/fc966d6b151e24055bc2f4146d6a90b5fb392765))
+* introduce netlify preview ([6c5d332](https://github.com/pattern-lab/patternlab-node/commit/6c5d332479fb6836bd8bd5530a074d13440f8ae4))
+* remove pre-built uikit dist folder and switch to auto-building when bootstrapping OR when publishing to NPM ([b5dd553](https://github.com/pattern-lab/patternlab-node/commit/b5dd5538ee00ddf1da321851865fa1c223cedb43))
+* switch to Yarn + Yarn workspaces ([f4c4ec3](https://github.com/pattern-lab/patternlab-node/commit/f4c4ec33cd30d372c87ffa904fbe7d5b819ee14e))
+* update Node to v12 ([fcbb970](https://github.com/pattern-lab/patternlab-node/commit/fcbb970648cdd775c9a88078f14c1f24c5b62d73))
+
+
+### Reverts
+
+* don't flatten folders containing only one item inside ([77f1f46](https://github.com/pattern-lab/patternlab-node/commit/77f1f46595328bd96fba46347b532295c65802d1))
+
+
+### BREAKING CHANGES
+
+* **core:** plugins now use async functions instead of events
+* **plugin-tab:** event based listeners replaced with functions
+* **cli:** previously, we concatenated arrays, which is unlikely to be intended
+* **edition-node:** use handlebars over mustache
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 000000000..75ecbe287
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,17 @@
+# This is a comment.
+# Each line is a file pattern followed by one or more owners.
+
+# These owners will be the default owners for everything in
+# the repo. Unless a later match takes precedence,
+# @global-owner1 and @global-owner2 will be requested for
+# review when someone opens a pull request.
+@pattern-lab/trusted-committers
+
+# CLI owner
+/packages/cli @raphaelokon
+
+# uikit-workshop owner
+/packages/uikit-workshop @sghoweri
+
+# engine-nunjucks owner
+/packages/engine-nunjucks @danwhite85
diff --git a/README.md b/README.md
index c284ea698..cd621433a 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
# Pattern Lab
@@ -16,21 +16,33 @@ If you'd like to see what a front-end project built with Pattern Lab looks like,
[]()
[](https://gitter.im/pattern-lab/node)
+Docs @ [](https://app.netlify.com/sites/patternlab-docs-preview/deploys)
+
+Pattern Lab Preview @ [](https://app.netlify.com/sites/patternlab-handlebars-preview/deploys)
+
## Using Pattern Lab
Refer to the [core usage guidelines](https://github.com/pattern-lab/patternlab-node/blob/master/packages/core/README.md#usage)
### Installation
-Installation is still in flux due to the monorepo transition. Bear with us as we figure this out. Our intent is to ship the Pattern Lab Node CLI soon which will help new and existing users.
+As of Pattern Lab Node 3.0.0, installation of [Editions](http://patternlab.io/docs/advanced-ecosystem-overview.html) is accomplished via the command line interface.
-_In the meantime..._
+The below assumes a new directory and project is required. This is likely what you want to do if starting from scratch. You could also run this within an existing project. The CLI will ask you for the installation location.
-if you already have an Edition tracking 3.X alphas, you can update using the [standard instructions](https://github.com/pattern-lab/patternlab-node/wiki/Upgrading#3x-instructions).
+1. Open a terminal window and following along below:
+ ```bash
+ mkdir new-project
+ cd new-project
+ npm create pattern-lab
+ ```
+ > If you get an error stating that `npx` is not installed, ensure you are on `npm 5.2.0` or later by running `npm -v` or install it globally with `npm install -g npx`. [Learn more about npx.](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)
+1. Follow the on-screen prompts to choose your Edition and a Starterkit should you want one.
+ - If you chose `edition-node`, new commands in the "scripts" will be added in your `package.json`.
+ - If you chose `edition-node-gulp`, a `gulpfile.js` will be added to your project.
-if you don't mind pulling down everything and playing with it locally, clone this repo and follow the instructions for [developing locally](https://github.com/pattern-lab/patternlab-node/blob/master/.github/CONTRIBUTING.md#developing-locally).
+ > Notice that `@pattern-lab/cli` was installed as a depdendency. Learn how to further [use the cli in your own project](https://github.com/pattern-lab/patternlab-node/blob/dev/packages/cli/readme.md#configuring-your-project-to-use-the-cli).
-if you don't yet have a 3.X compatible Edition and want to try something a bit messier (and unsupported for now), you could attempt this [workaround](https://github.com/pattern-lab/patternlab-node/issues/813).
## Ecosystem
@@ -38,6 +50,13 @@ if you don't yet have a 3.X compatible Edition and want to try something a bit m
Core, and Editions, are part of the [Pattern Lab Ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). With this architecture, we encourage people to write and maintain their own Editions, Starterkits, and even PatternEngines.
+## Changelog
+
+[Each package within this monorepo](https://github.com/pattern-lab/patternlab-node/tree/master/packages) has its own changelog. Below are the main ones to watch:
+
+* [@pattern-lab/core changelog ](https://github.com/pattern-lab/patternlab-node/blob/master/packages/core/CHANGELOG.md)
+* [@pattern-lab/cli changelog ](https://github.com/pattern-lab/patternlab-node/blob/master/packages/cli/CHANGELOG.md)
+
## Support for Pattern Lab
Pattern Lab / Node wouldn't be what it is today without the support of the community. It will always be free and open source. Continued development is made possible in part from the support of [these wonderful project supporters](https://github.com/pattern-lab/patternlab-node/wiki/Thanks). If you want to learn more about supporting the project, visit the [Pattern Lab / Node Patreon page](https://www.patreon.com/patternlab).
@@ -45,9 +64,10 @@ Pattern Lab / Node wouldn't be what it is today without the support of the commu
**:100: Thanks for support from the following:**
* **[Brad Frost](http://bradfrost.com/)**
+* Jan Ditze
* [Marcos Peebles](https://twitter.com/marcospeebles)
+* [Maximilian Franzke](https://twitter.com/maedmaex)
* [Susan Simkins](https://twitter.com/susanmsimkins)
-* [Wilfred Nas](https://twitter.com/wnas)
## Contributing
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 000000000..6960ccf61
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,27 @@
+module.exports = {
+ presets: [
+ [
+ '@babel/preset-env',
+ {
+ targets: {
+ node: 'current',
+ },
+ },
+ ],
+ ],
+ plugins: [
+ /**
+ * 1. Helps with our Web Component Preact renderer
+ */
+ '@babel/plugin-syntax-jsx' /* [1] */,
+ [
+ '@babel/plugin-transform-react-jsx' /* [1] */,
+ {
+ pragma: 'h',
+ pragmaFrag: '"span"',
+ throwIfNamespace: false,
+ useBuiltIns: false,
+ },
+ ],
+ ],
+};
diff --git a/lerna.json b/lerna.json
index 79a18e651..84951f7f0 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,15 +1,38 @@
{
- "lerna": "2.9.0",
+ "lerna": "3.11.0",
+ "version": "5.9.3",
"packages": [
"packages/*"
],
- "version": "independent",
"command": {
"init": {
"exact": true
+ },
+ "publish": {
+ "allowBranch": [
+ "master",
+ "dev"
+ ],
+ "conventionalCommits": true,
+ "gitReset": true,
+ "includeMergedTags": true,
+ "noCommitHooks": true,
+ "verifyAccess": true
+ },
+ "changed": {
+ "includeMergedTags": true
}
},
+ "ignoreChanges": [
+ "**/__fixtures__/**",
+ "**/__tests__/**",
+ "**/*.md",
+ "**/__snapshots__/**"
+ ],
+ "npmClient": "yarn",
"npmClientArgs": [
+ "--ignore-optional",
"--registry=https://registry.npmjs.org/"
- ]
+ ],
+ "useWorkspaces": true
}
diff --git a/netlify.toml b/netlify.toml
new file mode 100644
index 000000000..94337a4da
--- /dev/null
+++ b/netlify.toml
@@ -0,0 +1,2 @@
+[context.deploy-preview]
+ command = "yarn setup && yarn preview:hbs && yarn preview:docs"
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 9513bfa86..000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,3347 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "acorn": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
- "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "requires": {
- "acorn": "3.3.0"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
- }
- }
- },
- "ajv": {
- "version": "5.5.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
- "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
- "requires": {
- "co": "4.6.0",
- "fast-deep-equal": "1.1.0",
- "fast-json-stable-stringify": "2.0.0",
- "json-schema-traverse": "0.3.1"
- }
- },
- "ajv-keywords": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
- "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
- },
- "ansi-escapes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
- "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ=="
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "1.0.3"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
- },
- "assert-plus": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
- "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "aws4": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
- "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "bind-obj-methods": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-1.0.0.tgz",
- "integrity": "sha1-T1l5ysFXk633DkiBYeRj4gnKUJw="
- },
- "bluebird": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
- "requires": {
- "callsites": "0.2.0"
- }
- },
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
- },
- "ci-info": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz",
- "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA=="
- },
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
- },
- "clean-yaml-object": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz",
- "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g="
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "2.0.0"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
- },
- "color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
- },
- "combined-stream": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
- "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "commander": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
- "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.4",
- "typedarray": "0.0.6"
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "coveralls": {
- "version": "2.13.3",
- "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz",
- "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==",
- "requires": {
- "js-yaml": "3.6.1",
- "lcov-parse": "0.0.10",
- "log-driver": "1.2.5",
- "minimist": "1.2.0",
- "request": "2.79.0"
- },
- "dependencies": {
- "aws-sign2": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
- "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
- },
- "boom": {
- "version": "2.10.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
- "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "caseless": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
- "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c="
- },
- "cryptiles": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
- "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
- "requires": {
- "boom": "2.10.1"
- }
- },
- "form-data": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
- "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.6",
- "mime-types": "2.1.18"
- }
- },
- "har-validator": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
- "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
- "requires": {
- "chalk": "1.1.3",
- "commander": "2.14.1",
- "is-my-json-valid": "2.17.2",
- "pinkie-promise": "2.0.1"
- }
- },
- "hawk": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
- "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
- "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
- },
- "http-signature": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
- "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.1",
- "sshpk": "1.13.1"
- }
- },
- "js-yaml": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz",
- "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=",
- "requires": {
- "argparse": "1.0.10",
- "esprima": "2.7.3"
- }
- },
- "qs": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
- "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw="
- },
- "request": {
- "version": "2.79.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
- "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.11.0",
- "combined-stream": "1.0.6",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "2.0.6",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.18",
- "oauth-sign": "0.8.2",
- "qs": "6.3.2",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.4",
- "tunnel-agent": "0.4.3",
- "uuid": "3.2.1"
- }
- },
- "sntp": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
- "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "tunnel-agent": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
- "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us="
- },
- "uuid": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
- "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
- }
- }
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "requires": {
- "globby": "5.0.0",
- "is-path-cwd": "1.0.0",
- "is-path-in-cwd": "1.0.0",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "rimraf": "2.6.2"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "requires": {
- "esutils": "2.0.2"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "eslint": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz",
- "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==",
- "requires": {
- "ajv": "5.5.2",
- "babel-code-frame": "6.26.0",
- "chalk": "2.3.2",
- "concat-stream": "1.6.1",
- "cross-spawn": "5.1.0",
- "debug": "3.1.0",
- "doctrine": "2.1.0",
- "eslint-scope": "3.7.1",
- "eslint-visitor-keys": "1.0.0",
- "espree": "3.5.4",
- "esquery": "1.0.0",
- "esutils": "2.0.2",
- "file-entry-cache": "2.0.0",
- "functional-red-black-tree": "1.0.1",
- "glob": "7.1.2",
- "globals": "11.3.0",
- "ignore": "3.3.7",
- "imurmurhash": "0.1.4",
- "inquirer": "3.3.0",
- "is-resolvable": "1.1.0",
- "js-yaml": "3.10.0",
- "json-stable-stringify-without-jsonify": "1.0.1",
- "levn": "0.3.0",
- "lodash": "4.17.5",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "natural-compare": "1.4.0",
- "optionator": "0.8.2",
- "path-is-inside": "1.0.2",
- "pluralize": "7.0.0",
- "progress": "2.0.0",
- "require-uncached": "1.0.3",
- "semver": "5.5.0",
- "strip-ansi": "4.0.0",
- "strip-json-comments": "2.0.1",
- "table": "4.0.2",
- "text-table": "0.2.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- }
- }
- },
- "eslint-config-prettier": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz",
- "integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==",
- "requires": {
- "get-stdin": "5.0.1"
- }
- },
- "eslint-plugin-prettier": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz",
- "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==",
- "requires": {
- "fast-diff": "1.1.2",
- "jest-docblock": "21.2.0"
- }
- },
- "eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
- "requires": {
- "esrecurse": "4.2.1",
- "estraverse": "4.2.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
- "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
- },
- "espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
- "requires": {
- "acorn": "5.5.3",
- "acorn-jsx": "3.0.1"
- }
- },
- "esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
- },
- "esquery": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
- "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "events-to-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz",
- "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y="
- },
- "execa": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
- "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- }
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
- },
- "external-editor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
- "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
- "requires": {
- "chardet": "0.4.2",
- "iconv-lite": "0.4.19",
- "tmp": "0.0.33"
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fast-deep-equal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
- },
- "fast-diff": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
- "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "1.0.5"
- }
- },
- "file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
- "requires": {
- "flat-cache": "1.3.0",
- "object-assign": "4.1.1"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "2.0.0"
- }
- },
- "flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
- "requires": {
- "circular-json": "0.3.3",
- "del": "2.2.2",
- "graceful-fs": "4.1.11",
- "write": "0.2.1"
- }
- },
- "foreground-child": {
- "version": "1.5.6",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
- "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
- "requires": {
- "cross-spawn": "4.0.2",
- "signal-exit": "3.0.2"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
- "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
- "requires": {
- "lru-cache": "4.1.1",
- "which": "1.3.0"
- }
- }
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "fs-exists-cached": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz",
- "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "function-loop": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz",
- "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "generate-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
- "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ="
- },
- "generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
- "requires": {
- "is-property": "1.0.2"
- }
- },
- "get-stdin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
- "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "globals": {
- "version": "11.3.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz",
- "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw=="
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "requires": {
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "glob": "7.1.2",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "husky": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
- "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==",
- "requires": {
- "is-ci": "1.1.0",
- "normalize-path": "1.0.0",
- "strip-indent": "2.0.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
- },
- "ignore": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA=="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "inquirer": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
- "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
- "requires": {
- "ansi-escapes": "3.0.0",
- "chalk": "2.3.2",
- "cli-cursor": "2.1.0",
- "cli-width": "2.2.0",
- "external-editor": "2.1.0",
- "figures": "2.0.0",
- "lodash": "4.17.5",
- "mute-stream": "0.0.7",
- "run-async": "2.3.0",
- "rx-lite": "4.0.8",
- "rx-lite-aggregates": "4.0.8",
- "string-width": "2.1.1",
- "strip-ansi": "4.0.0",
- "through": "2.3.8"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- }
- }
- },
- "is-ci": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
- "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
- "requires": {
- "ci-info": "1.1.2"
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-my-ip-valid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
- "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
- },
- "is-my-json-valid": {
- "version": "2.17.2",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
- "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
- "requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "is-my-ip-valid": "1.0.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
- }
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
- "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
- "requires": {
- "is-path-inside": "1.0.1"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "1.0.2"
- }
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "jest-docblock": {
- "version": "21.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz",
- "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw=="
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "js-yaml": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
- "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
- "requires": {
- "argparse": "1.0.10",
- "esprima": "4.0.0"
- },
- "dependencies": {
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
- }
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
- "json-schema-traverse": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsonpointer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "lcov-parse": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
- "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM="
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "2.0.0",
- "path-exists": "3.0.0"
- }
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "log-driver": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz",
- "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY="
- },
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "mime-db": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
- "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
- },
- "mime-types": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
- "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
- "requires": {
- "mime-db": "1.33.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "minipass": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz",
- "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==",
- "requires": {
- "yallist": "3.0.2"
- },
- "dependencies": {
- "yallist": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
- "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k="
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "mri": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz",
- "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "normalize-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
- "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k="
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "2.0.1"
- }
- },
- "nyc": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.4.1.tgz",
- "integrity": "sha512-5eCZpvaksFVjP2rt1r60cfXmt3MUtsQDw8bAzNqNEr4WLvUMLgiVENMf/B9bE9YAX0mGVvaGA3v9IS9ekNqB1Q==",
- "requires": {
- "archy": "1.0.0",
- "arrify": "1.0.1",
- "caching-transform": "1.0.1",
- "convert-source-map": "1.5.1",
- "debug-log": "1.0.1",
- "default-require-extensions": "1.0.0",
- "find-cache-dir": "0.1.1",
- "find-up": "2.1.0",
- "foreground-child": "1.5.6",
- "glob": "7.1.2",
- "istanbul-lib-coverage": "1.1.1",
- "istanbul-lib-hook": "1.1.0",
- "istanbul-lib-instrument": "1.9.1",
- "istanbul-lib-report": "1.1.2",
- "istanbul-lib-source-maps": "1.2.2",
- "istanbul-reports": "1.1.3",
- "md5-hex": "1.3.0",
- "merge-source-map": "1.0.4",
- "micromatch": "2.3.11",
- "mkdirp": "0.5.1",
- "resolve-from": "2.0.0",
- "rimraf": "2.6.2",
- "signal-exit": "3.0.2",
- "spawn-wrap": "1.4.2",
- "test-exclude": "4.1.1",
- "yargs": "10.0.3",
- "yargs-parser": "8.0.0"
- },
- "dependencies": {
- "align-text": {
- "version": "0.1.4",
- "bundled": true,
- "requires": {
- "kind-of": "3.2.2",
- "longest": "1.0.1",
- "repeat-string": "1.6.1"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "bundled": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "bundled": true
- },
- "append-transform": {
- "version": "0.4.0",
- "bundled": true,
- "requires": {
- "default-require-extensions": "1.0.0"
- }
- },
- "archy": {
- "version": "1.0.0",
- "bundled": true
- },
- "arr-diff": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "bundled": true
- },
- "array-unique": {
- "version": "0.2.1",
- "bundled": true
- },
- "arrify": {
- "version": "1.0.1",
- "bundled": true
- },
- "async": {
- "version": "1.5.2",
- "bundled": true
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "bundled": true,
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- }
- },
- "babel-generator": {
- "version": "6.26.0",
- "bundled": true,
- "requires": {
- "babel-messages": "6.23.0",
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0",
- "detect-indent": "4.0.0",
- "jsesc": "1.3.0",
- "lodash": "4.17.4",
- "source-map": "0.5.7",
- "trim-right": "1.0.1"
- }
- },
- "babel-messages": {
- "version": "6.23.0",
- "bundled": true,
- "requires": {
- "babel-runtime": "6.26.0"
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "bundled": true,
- "requires": {
- "core-js": "2.5.3",
- "regenerator-runtime": "0.11.1"
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "bundled": true,
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "lodash": "4.17.4"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "bundled": true,
- "requires": {
- "babel-code-frame": "6.26.0",
- "babel-messages": "6.23.0",
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "debug": "2.6.9",
- "globals": "9.18.0",
- "invariant": "2.2.2",
- "lodash": "4.17.4"
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "bundled": true,
- "requires": {
- "babel-runtime": "6.26.0",
- "esutils": "2.0.2",
- "lodash": "4.17.4",
- "to-fast-properties": "1.0.3"
- }
- },
- "babylon": {
- "version": "6.18.0",
- "bundled": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true
- },
- "brace-expansion": {
- "version": "1.1.8",
- "bundled": true,
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "1.8.5",
- "bundled": true,
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
- }
- },
- "builtin-modules": {
- "version": "1.1.1",
- "bundled": true
- },
- "caching-transform": {
- "version": "1.0.1",
- "bundled": true,
- "requires": {
- "md5-hex": "1.3.0",
- "mkdirp": "0.5.1",
- "write-file-atomic": "1.3.4"
- }
- },
- "camelcase": {
- "version": "1.2.1",
- "bundled": true,
- "optional": true
- },
- "center-align": {
- "version": "0.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "align-text": "0.1.4",
- "lazy-cache": "1.0.4"
- }
- },
- "chalk": {
- "version": "1.1.3",
- "bundled": true,
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "cliui": {
- "version": "2.1.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "center-align": "0.1.3",
- "right-align": "0.1.3",
- "wordwrap": "0.0.2"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.2",
- "bundled": true,
- "optional": true
- }
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true
- },
- "commondir": {
- "version": "1.0.1",
- "bundled": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true
- },
- "convert-source-map": {
- "version": "1.5.1",
- "bundled": true
- },
- "core-js": {
- "version": "2.5.3",
- "bundled": true
- },
- "cross-spawn": {
- "version": "4.0.2",
- "bundled": true,
- "requires": {
- "lru-cache": "4.1.1",
- "which": "1.3.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "bundled": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "debug-log": {
- "version": "1.0.1",
- "bundled": true
- },
- "decamelize": {
- "version": "1.2.0",
- "bundled": true
- },
- "default-require-extensions": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "strip-bom": "2.0.0"
- }
- },
- "detect-indent": {
- "version": "4.0.0",
- "bundled": true,
- "requires": {
- "repeating": "2.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.1",
- "bundled": true,
- "requires": {
- "is-arrayish": "0.2.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "bundled": true
- },
- "esutils": {
- "version": "2.0.2",
- "bundled": true
- },
- "execa": {
- "version": "0.7.0",
- "bundled": true,
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "5.1.0",
- "bundled": true,
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- }
- }
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "bundled": true,
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "bundled": true,
- "requires": {
- "fill-range": "2.2.3"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "bundled": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "filename-regex": {
- "version": "2.0.1",
- "bundled": true
- },
- "fill-range": {
- "version": "2.2.3",
- "bundled": true,
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
- }
- },
- "find-cache-dir": {
- "version": "0.1.1",
- "bundled": true,
- "requires": {
- "commondir": "1.0.1",
- "mkdirp": "0.5.1",
- "pkg-dir": "1.0.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "bundled": true,
- "requires": {
- "locate-path": "2.0.0"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "bundled": true
- },
- "for-own": {
- "version": "0.1.5",
- "bundled": true,
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "foreground-child": {
- "version": "1.5.6",
- "bundled": true,
- "requires": {
- "cross-spawn": "4.0.2",
- "signal-exit": "3.0.2"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true
- },
- "get-caller-file": {
- "version": "1.0.2",
- "bundled": true
- },
- "get-stream": {
- "version": "3.0.0",
- "bundled": true
- },
- "glob": {
- "version": "7.1.2",
- "bundled": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "bundled": true,
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "globals": {
- "version": "9.18.0",
- "bundled": true
- },
- "graceful-fs": {
- "version": "4.1.11",
- "bundled": true
- },
- "handlebars": {
- "version": "4.0.11",
- "bundled": true,
- "requires": {
- "async": "1.5.2",
- "optimist": "0.6.1",
- "source-map": "0.4.4",
- "uglify-js": "2.8.29"
- },
- "dependencies": {
- "source-map": {
- "version": "0.4.4",
- "bundled": true,
- "requires": {
- "amdefine": "1.0.1"
- }
- }
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "has-flag": {
- "version": "1.0.0",
- "bundled": true
- },
- "hosted-git-info": {
- "version": "2.5.0",
- "bundled": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "bundled": true
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "invariant": {
- "version": "2.2.2",
- "bundled": true,
- "requires": {
- "loose-envify": "1.3.1"
- }
- },
- "invert-kv": {
- "version": "1.0.0",
- "bundled": true
- },
- "is-arrayish": {
- "version": "0.2.1",
- "bundled": true
- },
- "is-buffer": {
- "version": "1.1.6",
- "bundled": true
- },
- "is-builtin-module": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "builtin-modules": "1.1.1"
- }
- },
- "is-dotfile": {
- "version": "1.0.3",
- "bundled": true
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "bundled": true,
- "requires": {
- "is-primitive": "2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "bundled": true
- },
- "is-extglob": {
- "version": "1.0.0",
- "bundled": true
- },
- "is-finite": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-glob": {
- "version": "2.0.1",
- "bundled": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "bundled": true,
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "bundled": true
- },
- "is-primitive": {
- "version": "2.0.0",
- "bundled": true
- },
- "is-stream": {
- "version": "1.1.0",
- "bundled": true
- },
- "is-utf8": {
- "version": "0.2.1",
- "bundled": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true
- },
- "isexe": {
- "version": "2.0.0",
- "bundled": true
- },
- "isobject": {
- "version": "2.1.0",
- "bundled": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "istanbul-lib-coverage": {
- "version": "1.1.1",
- "bundled": true
- },
- "istanbul-lib-hook": {
- "version": "1.1.0",
- "bundled": true,
- "requires": {
- "append-transform": "0.4.0"
- }
- },
- "istanbul-lib-instrument": {
- "version": "1.9.1",
- "bundled": true,
- "requires": {
- "babel-generator": "6.26.0",
- "babel-template": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "istanbul-lib-coverage": "1.1.1",
- "semver": "5.4.1"
- }
- },
- "istanbul-lib-report": {
- "version": "1.1.2",
- "bundled": true,
- "requires": {
- "istanbul-lib-coverage": "1.1.1",
- "mkdirp": "0.5.1",
- "path-parse": "1.0.5",
- "supports-color": "3.2.3"
- },
- "dependencies": {
- "supports-color": {
- "version": "3.2.3",
- "bundled": true,
- "requires": {
- "has-flag": "1.0.0"
- }
- }
- }
- },
- "istanbul-lib-source-maps": {
- "version": "1.2.2",
- "bundled": true,
- "requires": {
- "debug": "3.1.0",
- "istanbul-lib-coverage": "1.1.1",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.2",
- "source-map": "0.5.7"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "bundled": true,
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "istanbul-reports": {
- "version": "1.1.3",
- "bundled": true,
- "requires": {
- "handlebars": "4.0.11"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "bundled": true
- },
- "jsesc": {
- "version": "1.3.0",
- "bundled": true
- },
- "kind-of": {
- "version": "3.2.2",
- "bundled": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "bundled": true,
- "optional": true
- },
- "lcid": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "invert-kv": "1.0.0"
- }
- },
- "load-json-file": {
- "version": "1.1.0",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "strip-bom": "2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "p-locate": "2.0.0",
- "path-exists": "3.0.0"
- },
- "dependencies": {
- "path-exists": {
- "version": "3.0.0",
- "bundled": true
- }
- }
- },
- "lodash": {
- "version": "4.17.4",
- "bundled": true
- },
- "longest": {
- "version": "1.0.1",
- "bundled": true
- },
- "loose-envify": {
- "version": "1.3.1",
- "bundled": true,
- "requires": {
- "js-tokens": "3.0.2"
- }
- },
- "lru-cache": {
- "version": "4.1.1",
- "bundled": true,
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "md5-hex": {
- "version": "1.3.0",
- "bundled": true,
- "requires": {
- "md5-o-matic": "0.1.1"
- }
- },
- "md5-o-matic": {
- "version": "0.1.1",
- "bundled": true
- },
- "mem": {
- "version": "1.1.0",
- "bundled": true,
- "requires": {
- "mimic-fn": "1.1.0"
- }
- },
- "merge-source-map": {
- "version": "1.0.4",
- "bundled": true,
- "requires": {
- "source-map": "0.5.7"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "bundled": true,
- "requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
- }
- },
- "mimic-fn": {
- "version": "1.1.0",
- "bundled": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "requires": {
- "brace-expansion": "1.1.8"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "bundled": true
- },
- "normalize-package-data": {
- "version": "2.4.0",
- "bundled": true,
- "requires": {
- "hosted-git-info": "2.5.0",
- "is-builtin-module": "1.0.0",
- "semver": "5.4.1",
- "validate-npm-package-license": "3.0.1"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "bundled": true,
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "bundled": true,
- "requires": {
- "path-key": "2.0.1"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true
- },
- "object.omit": {
- "version": "2.0.1",
- "bundled": true,
- "requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "optimist": {
- "version": "0.6.1",
- "bundled": true,
- "requires": {
- "minimist": "0.0.8",
- "wordwrap": "0.0.3"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true
- },
- "os-locale": {
- "version": "2.1.0",
- "bundled": true,
- "requires": {
- "execa": "0.7.0",
- "lcid": "1.0.0",
- "mem": "1.1.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "bundled": true
- },
- "p-limit": {
- "version": "1.1.0",
- "bundled": true
- },
- "p-locate": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "p-limit": "1.1.0"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "bundled": true,
- "requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "bundled": true,
- "requires": {
- "error-ex": "1.3.1"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "bundled": true,
- "requires": {
- "pinkie-promise": "2.0.1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true
- },
- "path-key": {
- "version": "2.0.1",
- "bundled": true
- },
- "path-parse": {
- "version": "1.0.5",
- "bundled": true
- },
- "path-type": {
- "version": "1.1.0",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "pify": {
- "version": "2.3.0",
- "bundled": true
- },
- "pinkie": {
- "version": "2.0.4",
- "bundled": true
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "bundled": true,
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "pkg-dir": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "find-up": "1.1.2"
- },
- "dependencies": {
- "find-up": {
- "version": "1.1.2",
- "bundled": true,
- "requires": {
- "path-exists": "2.1.0",
- "pinkie-promise": "2.0.1"
- }
- }
- }
- },
- "preserve": {
- "version": "0.2.0",
- "bundled": true
- },
- "pseudomap": {
- "version": "1.0.2",
- "bundled": true
- },
- "randomatic": {
- "version": "1.1.7",
- "bundled": true,
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "bundled": true,
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "bundled": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "bundled": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "read-pkg": {
- "version": "1.1.0",
- "bundled": true,
- "requires": {
- "load-json-file": "1.1.0",
- "normalize-package-data": "2.4.0",
- "path-type": "1.1.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "bundled": true,
- "requires": {
- "find-up": "1.1.2",
- "read-pkg": "1.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "1.1.2",
- "bundled": true,
- "requires": {
- "path-exists": "2.1.0",
- "pinkie-promise": "2.0.1"
- }
- }
- }
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "bundled": true
- },
- "regex-cache": {
- "version": "0.4.4",
- "bundled": true,
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "bundled": true
- },
- "repeat-element": {
- "version": "1.1.2",
- "bundled": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "bundled": true
- },
- "repeating": {
- "version": "2.0.1",
- "bundled": true,
- "requires": {
- "is-finite": "1.0.2"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "bundled": true
- },
- "require-main-filename": {
- "version": "1.0.1",
- "bundled": true
- },
- "resolve-from": {
- "version": "2.0.0",
- "bundled": true
- },
- "right-align": {
- "version": "0.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "align-text": "0.1.4"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "bundled": true,
- "requires": {
- "glob": "7.1.2"
- }
- },
- "semver": {
- "version": "5.4.1",
- "bundled": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true
- },
- "shebang-command": {
- "version": "1.2.0",
- "bundled": true,
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "bundled": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true
- },
- "slide": {
- "version": "1.1.6",
- "bundled": true
- },
- "source-map": {
- "version": "0.5.7",
- "bundled": true
- },
- "spawn-wrap": {
- "version": "1.4.2",
- "bundled": true,
- "requires": {
- "foreground-child": "1.5.6",
- "mkdirp": "0.5.1",
- "os-homedir": "1.0.2",
- "rimraf": "2.6.2",
- "signal-exit": "3.0.2",
- "which": "1.3.0"
- }
- },
- "spdx-correct": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "spdx-license-ids": "1.2.2"
- }
- },
- "spdx-expression-parse": {
- "version": "1.0.4",
- "bundled": true
- },
- "spdx-license-ids": {
- "version": "1.2.2",
- "bundled": true
- },
- "string-width": {
- "version": "2.1.1",
- "bundled": true,
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "bundled": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "bundled": true
- },
- "strip-ansi": {
- "version": "4.0.0",
- "bundled": true,
- "requires": {
- "ansi-regex": "3.0.0"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "bundled": true,
- "requires": {
- "is-utf8": "0.2.1"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "bundled": true
- },
- "supports-color": {
- "version": "2.0.0",
- "bundled": true
- },
- "test-exclude": {
- "version": "4.1.1",
- "bundled": true,
- "requires": {
- "arrify": "1.0.1",
- "micromatch": "2.3.11",
- "object-assign": "4.1.1",
- "read-pkg-up": "1.0.1",
- "require-main-filename": "1.0.1"
- }
- },
- "to-fast-properties": {
- "version": "1.0.3",
- "bundled": true
- },
- "trim-right": {
- "version": "1.0.1",
- "bundled": true
- },
- "uglify-js": {
- "version": "2.8.29",
- "bundled": true,
- "optional": true,
- "requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
- },
- "dependencies": {
- "yargs": {
- "version": "3.10.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "camelcase": "1.2.1",
- "cliui": "2.1.0",
- "decamelize": "1.2.0",
- "window-size": "0.1.0"
- }
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "validate-npm-package-license": {
- "version": "3.0.1",
- "bundled": true,
- "requires": {
- "spdx-correct": "1.0.2",
- "spdx-expression-parse": "1.0.4"
- }
- },
- "which": {
- "version": "1.3.0",
- "bundled": true,
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "bundled": true
- },
- "window-size": {
- "version": "0.1.0",
- "bundled": true,
- "optional": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "bundled": true
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "bundled": true,
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1"
- },
- "dependencies": {
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true
- },
- "write-file-atomic": {
- "version": "1.3.4",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "imurmurhash": "0.1.4",
- "slide": "1.1.6"
- }
- },
- "y18n": {
- "version": "3.2.1",
- "bundled": true
- },
- "yallist": {
- "version": "2.1.2",
- "bundled": true
- },
- "yargs": {
- "version": "10.0.3",
- "bundled": true,
- "requires": {
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "find-up": "2.1.0",
- "get-caller-file": "1.0.2",
- "os-locale": "2.1.0",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "2.1.1",
- "which-module": "2.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "8.0.0"
- },
- "dependencies": {
- "cliui": {
- "version": "3.2.0",
- "bundled": true,
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
- },
- "dependencies": {
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- }
- }
- }
- }
- },
- "yargs-parser": {
- "version": "8.0.0",
- "bundled": true,
- "requires": {
- "camelcase": "4.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "bundled": true
- }
- }
- }
- }
- },
- "oauth-sign": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "1.2.0"
- }
- },
- "opener": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz",
- "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg="
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "requires": {
- "deep-is": "0.1.3",
- "fast-levenshtein": "2.0.6",
- "levn": "0.3.0",
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2",
- "wordwrap": "1.0.0"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "own-or": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz",
- "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw="
- },
- "own-or-env": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz",
- "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==",
- "requires": {
- "own-or": "1.0.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-limit": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
- "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
- "requires": {
- "p-try": "1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "1.2.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "pluralize": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
- "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "prettier": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz",
- "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw=="
- },
- "pretty-quick": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.4.1.tgz",
- "integrity": "sha512-Q4V2GAflSaM739kKH63utbfI2n4s2fCDCyjFC4ykxA9ueb7FknLcLAZSKa3DejHMt5q9Fq395eKTZ9wYwoILBw==",
- "requires": {
- "chalk": "2.3.2",
- "execa": "0.8.0",
- "find-up": "2.1.0",
- "ignore": "3.3.7",
- "mri": "1.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- }
- }
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "progress": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- },
- "readable-stream": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
- "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "require-uncached": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
- "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
- "requires": {
- "caller-path": "0.1.0",
- "resolve-from": "1.0.1"
- }
- },
- "resolve-from": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
- "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "2.0.1",
- "signal-exit": "3.0.2"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "requires": {
- "is-promise": "2.1.0"
- }
- },
- "rx-lite": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
- "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
- },
- "rx-lite-aggregates": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
- "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
- "requires": {
- "rx-lite": "4.0.8"
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "slice-ansi": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
- "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0"
- }
- },
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "requires": {
- "source-map": "0.5.7"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- }
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "sshpk": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
- "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "stack-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz",
- "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- }
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
- "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- },
- "table": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
- "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
- "requires": {
- "ajv": "5.5.2",
- "ajv-keywords": "2.1.1",
- "chalk": "2.3.2",
- "lodash": "4.17.5",
- "slice-ansi": "1.0.0",
- "string-width": "2.1.1"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- }
- }
- },
- "tap": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/tap/-/tap-11.1.1.tgz",
- "integrity": "sha512-XpXmLJlDpPrGsaEJlpSV7u16kR/jaPUf5XyzdL59l8KsLNFSmQKH4qCEBKy9y+OCku9ee77NvobCsZLpK8ruZg==",
- "requires": {
- "bind-obj-methods": "1.0.0",
- "bluebird": "3.5.1",
- "clean-yaml-object": "0.1.0",
- "color-support": "1.1.3",
- "coveralls": "2.13.3",
- "foreground-child": "1.5.6",
- "fs-exists-cached": "1.0.0",
- "function-loop": "1.0.1",
- "glob": "7.1.2",
- "isexe": "2.0.0",
- "js-yaml": "3.10.0",
- "minipass": "2.2.1",
- "mkdirp": "0.5.1",
- "nyc": "11.4.1",
- "opener": "1.4.3",
- "os-homedir": "1.0.2",
- "own-or": "1.0.0",
- "own-or-env": "1.0.1",
- "rimraf": "2.6.2",
- "signal-exit": "3.0.2",
- "source-map-support": "0.4.18",
- "stack-utils": "1.0.1",
- "tap-mocha-reporter": "3.0.6",
- "tap-parser": "7.0.0",
- "tmatch": "3.1.0",
- "trivial-deferred": "1.0.1",
- "tsame": "1.1.2",
- "write-file-atomic": "2.3.0",
- "yapool": "1.0.0"
- }
- },
- "tap-mocha-reporter": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.6.tgz",
- "integrity": "sha512-UImgw3etckDQCoqZIAIKcQDt0w1JLVs3v0yxLlmwvGLZl6MGFxF7JME5PElXjAoDklVDU42P3vVu5jgr37P4Yg==",
- "requires": {
- "color-support": "1.1.3",
- "debug": "2.6.9",
- "diff": "1.4.0",
- "escape-string-regexp": "1.0.5",
- "glob": "7.1.2",
- "js-yaml": "3.10.0",
- "readable-stream": "2.3.4",
- "tap-parser": "5.4.0",
- "unicode-length": "1.0.3"
- },
- "dependencies": {
- "diff": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
- "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8="
- },
- "tap-parser": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz",
- "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==",
- "requires": {
- "events-to-array": "1.1.2",
- "js-yaml": "3.10.0",
- "readable-stream": "2.3.4"
- }
- }
- }
- },
- "tap-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz",
- "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==",
- "requires": {
- "events-to-array": "1.1.2",
- "js-yaml": "3.10.0",
- "minipass": "2.2.1"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "tmatch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-3.1.0.tgz",
- "integrity": "sha512-W3MSATOCN4pVu2qFxmJLIArSifeSOFqnfx9hiUaVgOmeRoI2NbU7RNga+6G+L8ojlFeQge+ZPCclWyUpQ8UeNQ=="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "1.0.2"
- }
- },
- "tough-cookie": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
- "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
- "requires": {
- "punycode": "1.4.1"
- }
- },
- "trivial-deferred": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz",
- "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM="
- },
- "tsame": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/tsame/-/tsame-1.1.2.tgz",
- "integrity": "sha512-ovCs24PGjmByVPr9tSIOs/yjUX9sJl0grEmOsj9dZA/UknQkgPOKcUqM84aSCvt9awHuhc/boMzTg3BHFalxWw=="
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "optional": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "1.1.2"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "unicode-length": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz",
- "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=",
- "requires": {
- "punycode": "1.4.1",
- "strip-ansi": "3.0.1"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "1.3.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
- "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
- "requires": {
- "mkdirp": "0.5.1"
- }
- },
- "write-file-atomic": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
- "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
- "requires": {
- "graceful-fs": "4.1.11",
- "imurmurhash": "0.1.4",
- "signal-exit": "3.0.2"
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yapool": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz",
- "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o="
- }
- }
-}
diff --git a/package.json b/package.json
index aff6447c8..d2c271c91 100644
--- a/package.json
+++ b/package.json
@@ -1,16 +1,53 @@
{
- "devDependencies": {
- "lerna": "2.9.0"
+ "workspaces": {
+ "packages": [
+ "packages/*"
+ ],
+ "nohoist": [
+ "@pattern-lab/engine-*",
+ "**/@pattern-lab/engine-*",
+ "**/@pattern-lab/uikit-workshop"
+ ]
+ },
+ "dependencies": {
+ "@babel/plugin-proposal-decorators": "^7.4.4",
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "babel-eslint": "^10.0.2",
+ "eslint": "^6.1.0",
+ "eslint-config-airbnb-base": "^14.0.0",
+ "eslint-config-prettier": "^6.0.0",
+ "eslint-plugin-import": "^2.18.2",
+ "eslint-plugin-prettier": "^3.1.0",
+ "prettier": "^1.14.3",
+ "lerna": "3.17.0",
+ "pretty-quick": "^1.11.1",
+ "auto": "^7.8.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/pattern-lab/patternlab-node.git"
},
+ "private": true,
"scripts": {
- "bootstrap": "lerna bootstrap --hoist tap --hoist eslin* --hoist husky --hoist prettier --hoist pretty-quick",
+ "postinstall": "lerna run postbootstrap",
+ "setup": "yarn",
+ "build:uikit": "cd packages/uikit-workshop && npm run build",
"precommit": "pretty-quick --staged",
- "prettier": "prettier --config .prettierrc --write ./**/*.js",
- "test": "tap packages/core/test/*_tests.js --reporter spec --coverage"
+ "lint:fix": "npm run lint -- --fix",
+ "lint": "eslint --max-warnings 0 './packages/{core,cli,uikit-workshop}/**/*.js ' --ignore-path .eslintignore",
+ "test": "lerna run test",
+ "clean": "git clean -dfx",
+ "publish": "npx lerna publish -m \"[skip travis] chore(release): publish %s\"",
+ "postpublish": "auto release",
+ "preview:docs": "cd packages/docs && yarn production",
+ "preview:hbs": "cd packages/development-edition-engine-handlebars && npx patternlab add --starterkits @pattern-lab/starterkit-handlebars-vanilla && npm run pl:build"
},
"nyc": {
"exclude": [
- "**/*_tests.js"
+ "**/*_tests.js",
+ "packages/cli",
+ "packages/core/test",
+ "packages/live-server"
]
}
}
diff --git a/packages/cli/.eslintrc b/packages/cli/.eslintrc
deleted file mode 100644
index 026fd1b2a..000000000
--- a/packages/cli/.eslintrc
+++ /dev/null
@@ -1,78 +0,0 @@
-{
- "env": {
- "node": true,
- "builtin": true,
- "es6": true
- },
- "parserOptions": {
- "ecmaVersion": 6,
- "sourceType": "module"
- },
- "globals": {},
- "extends": ["prettier"],
- "plugins": ["prettier"],
- "rules": {
- "prettier/prettier": "error",
- "block-scoped-var": 0,
- "camelcase": 0,
- "consistent-return": 2,
- "curly": [2, "all"],
- "dot-notation": [1, { "allowKeywords": true }],
- "eqeqeq": [2, "allow-null"],
- "global-strict": [0, "never"],
- "guard-for-in": 2,
- "key-spacing": 0,
- "new-cap": 0,
- "no-alert": 2,
- "no-bitwise": 2,
- "no-caller": 2,
- "no-cond-assign": [2, "except-parens"],
- "no-debugger": 2,
- "no-dupe-args": 2,
- "no-dupe-keys": 2,
- "no-empty": 2,
- "no-eval": 2,
- "no-extend-native": 2,
- "no-extra-bind": 2,
- "no-extra-parens": 0,
- "no-func-assign": 2,
- "no-implied-eval": 2,
- "no-invalid-regexp": 2,
- "no-irregular-whitespace": 1,
- "no-iterator": 2,
- "no-loop-func": 2,
- "no-mixed-requires": 0,
- "no-multi-str": 2,
- "no-native-reassign": 2,
- "no-new": 2,
- "no-param-reassign": 1,
- "no-proto": 2,
- "no-redeclare": 0,
- "no-script-url": 2,
- "no-self-assign": 2,
- "no-self-compare": 2,
- "no-sequences": 2,
- "no-shadow": 2,
- "no-undef": 2,
- "no-underscore-dangle": 0,
- "no-unreachable": 1,
- "no-unused-vars": 1,
- "no-use-before-define": 1,
- "no-useless-call": 2,
- "no-useless-concat": 2,
- "no-var": 2,
- "no-with": 2,
- "quotes": [0, "single"],
- "radix": 2,
- "strict": 0,
- "valid-typeof": 2,
- "vars-on-top": 0,
- "prefer-const": [
- "error",
- {
- "destructuring": "any",
- "ignoreReadBeforeAssign": false
- }
- ]
- }
-}
diff --git a/packages/cli/.gitattributes b/packages/cli/.gitattributes
index 9e2529733..141034634 100644
--- a/packages/cli/.gitattributes
+++ b/packages/cli/.gitattributes
@@ -1,2 +1,3 @@
* text=auto
+bin/patternlab.js lf
readme.md merge=union
diff --git a/packages/cli/.gitignore b/packages/cli/.gitignore
index be6f1bb0e..55a89459b 100644
--- a/packages/cli/.gitignore
+++ b/packages/cli/.gitignore
@@ -67,7 +67,7 @@ Network Trash Folder
Temporary Items
.apdisk
-# PatternLab CLI specific
+# Pattern Lab CLI specific
.DS_Store
latest-change.txt
diff --git a/packages/cli/.npmrc b/packages/cli/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/cli/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/cli/.nvmrc b/packages/cli/.nvmrc
new file mode 100644
index 000000000..a13e7b9c8
--- /dev/null
+++ b/packages/cli/.nvmrc
@@ -0,0 +1 @@
+10.0.0
diff --git a/packages/cli/.travis.yml b/packages/cli/.travis.yml
index 877a0f9dd..1f0e15052 100644
--- a/packages/cli/.travis.yml
+++ b/packages/cli/.travis.yml
@@ -1,7 +1,7 @@
language: node_js
node_js:
- node
- - 6
+ - 8
before_script:
- npm install edition-node
- npm install starterkit-mustache-base
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 9a6cd35f6..3f84d02ec 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -3,31 +3,290 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [0.0.1-alpha.15](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.14...@pattern-lab/cli@0.0.1-alpha.15) (2018-03-21)
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+
+### Bug Fixes
+
+* **cli:** fix test script glob ([ff18eb5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/ff18eb51ce24fc5423b009168e85ede366069139))
+
+
+
+
+
+
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.9.0...v5.9.1) (2020-04-24)
+
+
+### Bug Fixes
+
+* **cli:** ensure specified directory exists prior to scaffold ([cc3b696](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/cc3b69624d486c94ee3b1f4b1bbb0334a514fa59))
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+
+### Bug Fixes
+
+* **cli:** set current working directory before scaffolded npm init ([6d2186d](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/6d2186d8e8a74634198a4474ca8ae83221dd70a9))
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.6.0...v5.7.0) (2020-02-17)
### Features
-* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/7f4ce6f))
+* **cli:** make options more user friendly ([ad845b3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/ad845b394ef81f90895ebb5bc6f12cc608e5e3d4))
-
-## [0.0.1-alpha.14](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.13...@pattern-lab/cli@0.0.1-alpha.14) (2018-03-05)
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/cli
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/cli
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+**Note:** Version bump only for package @pattern-lab/cli
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
### Bug Fixes
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/1473cd5))
+* updates to fix eslint / prettier issues; update packages/core to reuse root .eslintrc.js file ([5b7a057](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/5b7a057d46ccd16b5832af1441030c7b76f237a8))
+* **cli:** add custom install logic to edition-node ([f04fd26](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/f04fd266429cd806987dab747e6d69bff9b926a4))
+* **cli:** allow any package to be installed as a starterkit ([d2aa1be](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/d2aa1be810a0a7473dcc52391a2263dacfdda0b8)), closes [#1067](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/issues/1067)
+* **cli:** merge config arrays via overwrite instead of concatenate ([42e5f7b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/42e5f7b42a26b4fc1f262c68ee4b474b546f2eac))
+* **cli:** proper path resolution to helpers ([a18fe5e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/a18fe5ef4d1c074a5eba8bfa255ebbee2261bf74))
+* **cli:** re-order and clarify engines ([e39e301](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/e39e301a33306c6615fabf64262f1893ca682b97))
+* **plugin:** correct spelling error and function locations ([d4abd88](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/d4abd88cb017550002407241b5045a2ad1adb1dc))
+
+
+### Features
+
+* **starterkits:** add starterkit-handlebars-demo ([384d2cf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/384d2cfa3440c1e6f456d39f56ca6381f82f7689))
+
+
+### BREAKING CHANGES
+
+* **cli:** previously, we concatenated arrays, which is unlikely to be intended
+
+
+
+
+
+
+## [1.0.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@1.0.2...@pattern-lab/cli@1.0.3) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/cli
+
+
+
+
+
+
+# [1.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.1.0...@pattern-lab/cli@1.0.0) (2019-08-23)
+
+
+### Bug Fixes
+
+* **cli:** merge config arrays via overwrite instead of concatenate ([42e5f7b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/42e5f7b))
+* **cli:** proper path resolution to helpers ([a18fe5e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/a18fe5e))
+
+
+### BREAKING CHANGES
+
+* **cli:** previously, we concatenated arrays, which is unlikely to be intended
+
+
+
+
+
+# [0.1.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.3...@pattern-lab/cli@0.1.0) (2019-08-23)
+
+
+### Bug Fixes
+
+* updates to fix eslint / prettier issues; update packages/core to reuse root .eslintrc.js file ([5b7a057](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/5b7a057))
+* **cli:** add custom install logic to edition-node ([f04fd26](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/f04fd26))
+* **cli:** re-order and clarify engines ([e39e301](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/e39e301))
+
+
+### Features
+
+* **starterkits:** add starterkit-handlebars-demo ([384d2cf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/384d2cf))
+
+
+## [0.0.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.3-alpha.0...@pattern-lab/cli@0.0.3) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/cli
+
+
+
+
+
+## [0.0.1-beta.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-beta.0...@pattern-lab/cli@0.0.1-beta.2) (2019-02-09)
+
+
+### Bug Fixes
+
+* **cli:** do not call build before serve ([663d8e1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/663d8e1)), closes [#917](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/issues/917)
+* **cli:** pass watch options cleanly to core ([8bf186b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/8bf186b))
+* **cli:** remove copy-source-files ([64311a1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/64311a1)), closes [#833](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/issues/833)
+* **nvmrc:** bump Node version ([36a917f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/36a917f))
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/98dfadf))
+
+
+### Features
+
+* **README:** simplify README and add CLI configuration instructions ([ceec673](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/ceec673))
+
+
+
+
+
+
+## [0.0.1-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.23...@pattern-lab/cli@0.0.1-beta.0) (2018-09-07)
+
+
+### Bug Fixes
+
+* **cli:** set initialized to false during plugin installation ([88cce3f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/88cce3f))
+* **cli:** support scoped plugins ([4ae13ce](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/4ae13ce))
+* **package:** update tap dependency ([2b70ff4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/2b70ff4))
+
+
+
+
+
+
+
+## [0.0.1-alpha.23](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.22...@pattern-lab/cli@0.0.1-alpha.23) (2018-07-09)
+
+### Bug Fixes
+
+* **install:** copy dependencies ([1acef87](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/1acef87))
+
+
+
+## [0.0.1-alpha.22](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.21...@pattern-lab/cli@0.0.1-alpha.22) (2018-07-06)
+
+**Note:** Version bump only for package @pattern-lab/cli
+
+
+
+## [0.0.1-alpha.21](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.20...@pattern-lab/cli@0.0.1-alpha.21) (2018-07-06)
+
+### Bug Fixes
+
+* **install:** add break statements to install edition command ([3b1813c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/3b1813c))
+* **install:** use process to find package.json ([200c7cb](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/200c7cb))
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/5ab3995))
+
+
+
+## [0.0.1-alpha.20](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.19...@pattern-lab/cli@0.0.1-alpha.20) (2018-07-05)
+
+### Bug Fixes
+
+* **cli:** change whitespace to spaces per standard ([4556fc7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/4556fc7))
+* **tests:** change test command name similar to live-server until this passes CI ([5c39be1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/5c39be1))
+
+### Features
+
+* **serve:** change calling method ([3b86a0d](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/3b86a0d))
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/38a01b1))
+
+
+
+## [0.0.1-alpha.19](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.18...@pattern-lab/cli@0.0.1-alpha.19) (2018-05-19)
+
+### Bug Fixes
+
+* **cli:** change line-endings of cli entrypoint ([3fc86c2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/3fc86c2))
+* **wording:** reconcile Pattern Lab vs PatternLab ([f3d1e0d](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/f3d1e0d))
+
+
+
+## [0.0.1-alpha.18](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.17...@pattern-lab/cli@0.0.1-alpha.18) (2018-05-04)
+
+### Bug Fixes
+
+* **version:** use static core method getVersion ([f9dcd4d](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/f9dcd4d))
+
+
+
+## [0.0.1-alpha.17](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.16...@pattern-lab/cli@0.0.1-alpha.17) (2018-05-04)
+
+### Bug Fixes
+
+* **package:** update publish config and installation target ([27d2c8f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/27d2c8f))
+
+
+
+## [0.0.1-alpha.16](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.15...@pattern-lab/cli@0.0.1-alpha.16) (2018-05-04)
+
+### Features
+
+* **API:** standardize v() and version() into a single call ([6309e69](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/6309e69))
+
+### BREAKING CHANGES
+
+* **API:** change `version()` to return a string representation of the version, removing `v()`
+
+
+
+## [0.0.1-alpha.15](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.14...@pattern-lab/cli@0.0.1-alpha.15) (2018-03-21)
+
+### Features
+
+* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/7f4ce6f))
+
+
+
+## [0.0.1-alpha.14](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/compare/@pattern-lab/cli@0.0.1-alpha.13...@pattern-lab/cli@0.0.1-alpha.14) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli/commit/1473cd5))
+
-## 0.0.1-alpha.13 (2018-03-02)
+## 0.0.1-alpha.13 (2018-03-02)
### Features
diff --git a/packages/cli/bin/archive.js b/packages/cli/bin/archive.js
index 10e71d4cc..9d7a6989c 100644
--- a/packages/cli/bin/archive.js
+++ b/packages/cli/bin/archive.js
@@ -1,5 +1,5 @@
'use strict';
-const fs = require('fs-promise');
+const fs = require('fs');
const path = require('path');
const Archiver = require('archiver');
const isValidConfig = require('./validate-config');
@@ -8,46 +8,46 @@ const debug = require('./utils').debug;
/**
* @func exportPatterns
* @desc Exports the patterns into the patternExportDirectory.
- * @param {object} config - The passed PatternLab config.
+ * @param {object} config - The passed Pattern Lab config.
*/
function exportPatterns(config) {
- if (!isValidConfig) {
- throw new TypeError(
- 'export: Expects config not to be empty OR of type object if not empty.'
- );
- }
+ if (!isValidConfig) {
+ throw new TypeError(
+ 'export: Expects config not to be empty OR of type object if not empty.'
+ );
+ }
- const archive = new Archiver('zip', {});
- const exportsPath = path.resolve(
- './',
- config.patternExportDirectory,
- 'patterns.zip'
- );
- const output = fs.createWriteStream(exportsPath);
+ const archive = new Archiver('zip', {});
+ const exportsPath = path.resolve(
+ './',
+ config.patternExportDirectory,
+ 'patterns.zip'
+ );
+ const output = fs.createWriteStream(exportsPath);
- output.on('close', () => {
- debug(
- `export: Exported patterns in ${exportsPath} - ${archive.pointer()} total bytes.`
- );
- });
+ output.on('close', () => {
+ debug(
+ `export: Exported patterns in ${exportsPath} - ${archive.pointer()} total bytes.`
+ );
+ });
- archive.on('error', function(err) {
- throw new TypeError(
- `export: An error occured during zipping the patterns: ${err}`
- );
- });
+ archive.on('error', function(err) {
+ throw new TypeError(
+ `export: An error occured during zipping the patterns: ${err}`
+ );
+ });
- archive.pipe(output);
+ archive.pipe(output);
- archive
- .glob(
- '?(_patterns|_data|_meta|_annotations)/**',
- {
- cwd: config.paths.source.root,
- },
- {}
- )
- .finalize();
+ archive
+ .glob(
+ '?(_patterns|_data|_meta|_annotations)/**',
+ {
+ cwd: config.paths.source.root,
+ },
+ {}
+ )
+ .finalize();
}
module.exports = exportPatterns;
diff --git a/packages/cli/bin/ask.js b/packages/cli/bin/ask.js
index d0dde731e..55a337230 100644
--- a/packages/cli/bin/ask.js
+++ b/packages/cli/bin/ask.js
@@ -8,42 +8,42 @@ const ask = inquirer.prompt;
/**
* @func init
- * @desc Initiates a PatternLab project by getting user input through inquiry. Scaffolds the project and download mandatory files
+ * @desc Initiates a Pattern Lab project by getting user input through inquiry. Scaffolds the project and download mandatory files
* @param {object} options - Options passed in from CLI
* @param {boolean} options.force - Flag whether to force install in existing project directory. May overwrite stuff.
*/
const init = options =>
- wrapsAsync(function*() {
- /**
- * @property {string} project_root="./" - Path to the project root directory
- * @property {string|Symbol} edition - The name of the edition npm package or a Symbol for no install
- */
- const editionAnswers = yield ask(editionSetup);
+ wrapsAsync(function*() {
+ /**
+ * @property {string} project_root="./" - Path to the project root directory
+ * @property {string|Symbol} edition - The name of the edition npm package or a Symbol for no install
+ */
+ const editionAnswers = yield ask(editionSetup);
- /**
- * @property {object|Symbol} starterkit - The name of a starterkit npm package or a Symbol for no install
- */
- const starterkitAnswers = yield ask(starterkitSetup);
+ /**
+ * @property {object|Symbol} starterkit - The name of a starterkit npm package or a Symbol for no install
+ */
+ const starterkitAnswers = yield ask(starterkitSetup);
- /**
- * @property {boolean} confirm - A bool hold the confirmation status
- */
- const confirmation = yield ask(confirmSetup);
+ /**
+ * @property {boolean} confirm - A bool hold the confirmation status
+ */
+ const confirmation = yield ask(confirmSetup);
- // IF we have no confirmation we start all over again.
- if (!confirmation.confirm) {
- return init(options);
- }
+ // IF we have no confirmation we start all over again.
+ if (!confirmation.confirm) {
+ return init(options);
+ }
- return {
- // Destructure the answers
- projectDir: editionAnswers.project_root,
- edition: editionAnswers.edition !== false ? editionAnswers.edition : '',
- starterkit:
- starterkitAnswers.starterkit !== false
- ? starterkitAnswers.starterkit
- : '',
- };
- });
+ return {
+ // Destructure the answers
+ projectDir: editionAnswers.project_root,
+ edition: editionAnswers.edition !== false ? editionAnswers.edition : '',
+ starterkit:
+ starterkitAnswers.starterkit !== false
+ ? starterkitAnswers.starterkit
+ : '',
+ };
+ });
module.exports = init;
diff --git a/packages/cli/bin/build.js b/packages/cli/bin/build.js
index 06f9ed757..51108a33d 100644
--- a/packages/cli/bin/build.js
+++ b/packages/cli/bin/build.js
@@ -5,34 +5,34 @@ const isValidConfig = require('./validate-config');
/**
* @func build
- * @desc Init patternLab core and build the PatternLab files.
- * @param {object} config - The passed PatternLab config.
+ * @desc Init patternLab core and build the Pattern Lab files.
+ * @param {object} config - The passed Pattern Lab config.
* @param {object} options - Additional opts to specify build mode.
*/
function build(config, options) {
- if (!isValidConfig) {
- throw new TypeError(
- 'build: Expects config not to be empty and of type object.'
- );
- }
+ if (!isValidConfig) {
+ throw new TypeError(
+ 'build: Expects config not to be empty and of type object.'
+ );
+ }
- // Initiate PatternLab core with the config
- const patternLab = pl(config);
+ // Initiate Pattern Lab core with the config
+ const patternLab = pl(config);
- /**
- * Check whether a flag was passed for build
- * 1. Build only patterns
- * 2. Normal build
- */
- if (options && options.patternsOnly) {
- // 1
- debug(`build: Building only patterns now into ${config.paths.public.root}`);
- return patternLab.patternsonly(config.cleanPublic);
- } else {
- // 2
- debug(`build: Building your project now into ${config.paths.public.root}`);
- return patternLab.build(config.cleanPublic);
- }
+ /**
+ * Check whether a flag was passed for build
+ * 1. Build only patterns
+ * 2. Normal build
+ */
+ if (options && options.patternsOnly) {
+ // 1
+ debug(`build: Building only patterns now into ${config.paths.public.root}`);
+ return patternLab.patternsonly(config.cleanPublic);
+ } else {
+ // 2
+ debug(`build: Building your project now into ${config.paths.public.root}`);
+ return patternLab.build(config.cleanPublic);
+ }
}
module.exports = build;
diff --git a/packages/cli/bin/cli-actions/build.js b/packages/cli/bin/cli-actions/build.js
index 9651d15ec..c6a34434a 100644
--- a/packages/cli/bin/cli-actions/build.js
+++ b/packages/cli/bin/cli-actions/build.js
@@ -1,19 +1,17 @@
'use strict';
const buildPatterns = require('../build');
-const copyFiles = require('../copy-source-files');
const resolveConfig = require('../resolve-config');
const { error, info, wrapAsync } = require('../utils');
const build = options =>
- wrapAsync(function*() {
- try {
- const config = yield resolveConfig(options.parent.config);
- yield copyFiles(config.paths);
- yield buildPatterns(config, options);
- info(`build: Yay, your PatternLab project was successfully built ☺`);
- } catch (err) {
- error(err);
- }
- });
+ wrapAsync(function*() {
+ try {
+ const config = yield resolveConfig(options.parent.config);
+ yield buildPatterns(config, options);
+ info(`build: Yay, your Pattern Lab project was successfully built ☺`);
+ } catch (err) {
+ error(err);
+ }
+ });
module.exports = build;
diff --git a/packages/cli/bin/cli-actions/disable.js b/packages/cli/bin/cli-actions/disable.js
index 5222518e9..6c53cb5a2 100644
--- a/packages/cli/bin/cli-actions/disable.js
+++ b/packages/cli/bin/cli-actions/disable.js
@@ -11,29 +11,32 @@ const writeJsonAsync = require('../utils').writeJsonAsync;
* @param {object} options
*/
const enable = options =>
- wrapAsync(function*() {
- const { parent: { config: configPath }, plugins } = options;
- const config = yield resolveConfig(configPath);
+ wrapAsync(function*() {
+ const {
+ parent: { config: configPath },
+ plugins,
+ } = options;
+ const config = yield resolveConfig(configPath);
- const spinner = ora(`⊙ patternlab → Disable …`).start();
+ const spinner = ora(`⊙ patternlab → Disable …`).start();
- if (plugins && Array.isArray(plugins)) {
- spinner.succeed(
- `⊙ patternlab → Disable following plugins: ${plugins.join(', ')}`
- );
- plugins.map(plugin => {
- if (_.has(config, `plugins[${plugin}]`)) {
- _.set(config, `plugins[${plugin}]['enabled']`, false);
- spinner.succeed(
- `⊙ patternlab → Disabled following plugin: ${plugin}`
- );
- } else {
- spinner.warn(`⊙ patternlab → Couldn't find plugin: ${plugin}`);
- }
- });
- }
- yield writeJsonAsync(options.parent.config, config);
- spinner.succeed(`⊙ patternlab → Updated config`);
- });
+ if (plugins && Array.isArray(plugins)) {
+ spinner.succeed(
+ `⊙ patternlab → Disable following plugins: ${plugins.join(', ')}`
+ );
+ plugins.map(plugin => {
+ if (_.has(config, `plugins[${plugin}]`)) {
+ _.set(config, `plugins[${plugin}]['enabled']`, false);
+ spinner.succeed(
+ `⊙ patternlab → Disabled following plugin: ${plugin}`
+ );
+ } else {
+ spinner.warn(`⊙ patternlab → Couldn't find plugin: ${plugin}`);
+ }
+ });
+ }
+ yield writeJsonAsync(options.parent.config, config);
+ spinner.succeed(`⊙ patternlab → Updated config`);
+ });
module.exports = enable;
diff --git a/packages/cli/bin/cli-actions/enable.js b/packages/cli/bin/cli-actions/enable.js
index 17ed14326..0edb57401 100644
--- a/packages/cli/bin/cli-actions/enable.js
+++ b/packages/cli/bin/cli-actions/enable.js
@@ -11,27 +11,30 @@ const writeJsonAsync = require('../utils').writeJsonAsync;
* @param {object} options
*/
const enable = options =>
- wrapAsync(function*() {
- const { parent: { config: configPath }, plugins } = options;
- const config = yield resolveConfig(configPath);
+ wrapAsync(function*() {
+ const {
+ parent: { config: configPath },
+ plugins,
+ } = options;
+ const config = yield resolveConfig(configPath);
- const spinner = ora(`⊙ patternlab → Enable …`).start();
+ const spinner = ora(`⊙ patternlab → Enable …`).start();
- if (plugins && Array.isArray(plugins)) {
- spinner.succeed(
- `⊙ patternlab → Enable following plugins: ${plugins.join(', ')}`
- );
- plugins.map(plugin => {
- if (_.has(config, `plugins[${plugin}]`)) {
- _.set(config, `plugins[${plugin}]['enabled']`, true);
- spinner.succeed(`⊙ patternlab → Enabled following plugin: ${plugin}`);
- } else {
- spinner.warn(`⊙ patternlab → Couldn't find plugin: ${plugin}`);
- }
- });
- }
- yield writeJsonAsync(options.parent.config, config);
- spinner.succeed(`⊙ patternlab → Updated config`);
- });
+ if (plugins && Array.isArray(plugins)) {
+ spinner.succeed(
+ `⊙ patternlab → Enable following plugins: ${plugins.join(', ')}`
+ );
+ plugins.map(plugin => {
+ if (_.has(config, `plugins[${plugin}]`)) {
+ _.set(config, `plugins[${plugin}]['enabled']`, true);
+ spinner.succeed(`⊙ patternlab → Enabled following plugin: ${plugin}`);
+ } else {
+ spinner.warn(`⊙ patternlab → Couldn't find plugin: ${plugin}`);
+ }
+ });
+ }
+ yield writeJsonAsync(options.parent.config, config);
+ spinner.succeed(`⊙ patternlab → Updated config`);
+ });
module.exports = enable;
diff --git a/packages/cli/bin/cli-actions/export.js b/packages/cli/bin/cli-actions/export.js
index 989a00687..5f4f4ebc7 100644
--- a/packages/cli/bin/cli-actions/export.js
+++ b/packages/cli/bin/cli-actions/export.js
@@ -4,9 +4,9 @@ const resolveConfig = require('../resolve-config');
const wrapAsync = require('../utils').wrapAsync;
const _export = options =>
- wrapAsync(function*() {
- const config = yield resolveConfig(options.parent.config);
- archive(config);
- });
+ wrapAsync(function*() {
+ const config = yield resolveConfig(options.parent.config);
+ archive(config);
+ });
module.exports = _export;
diff --git a/packages/cli/bin/cli-actions/help.js b/packages/cli/bin/cli-actions/help.js
index 1c7806b21..6448e7749 100644
--- a/packages/cli/bin/cli-actions/help.js
+++ b/packages/cli/bin/cli-actions/help.js
@@ -1,10 +1,10 @@
'use strict';
module.exports = () => {
- /* eslint-disable */
- console.log(`
+ /* eslint-disable */
+ console.log(`
Examples:
- $ patternlab init # Initialize a PatternLab project.');
- $ patternlab # Builds the PatternLab from the current dir');
- $ patternlab --config # PatternLab from a config in a specified directory');`);
- /* eslint-enable */
+ $ patternlab init # Initialize a Pattern Lab project.');
+ $ patternlab # Builds Pattern Lab from the current dir');
+ $ patternlab --config # Pattern Lab from a config in a specified directory');`);
+ /* eslint-enable */
};
diff --git a/packages/cli/bin/cli-actions/init.js b/packages/cli/bin/cli-actions/init.js
index aaf14fa89..afc715a99 100644
--- a/packages/cli/bin/cli-actions/init.js
+++ b/packages/cli/bin/cli-actions/init.js
@@ -1,5 +1,6 @@
'use strict';
const patternlab = require('@pattern-lab/core');
+const merge = require('deepmerge');
const ask = require('../ask');
const scaffold = require('../scaffold');
const installEdition = require('../install-edition');
@@ -12,60 +13,77 @@ const writeJsonAsync = require('../utils').writeJsonAsync;
const defaultPatternlabConfig = patternlab.getDefaultConfig();
+// https://github.com/TehShrike/deepmerge#overwrite-array
+const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray;
+
const init = options =>
- wrapAsync(function*() {
- const sourceDir = 'source';
- const publicDir = 'public';
- const exportDir = 'pattern_exports';
- const answers = options.projectDir ? options : yield ask(options);
- const projectDir = answers.projectDir || './';
- const edition = answers.edition;
- const starterkit = answers.starterkit;
+ wrapAsync(function*() {
+ const sourceDir = 'source';
+ const publicDir = 'public';
+ const exportDir = 'pattern_exports';
+ const answers = options.projectDir ? options : yield ask(options);
+ const projectDir = answers.projectDir || './';
+ const edition = answers.edition;
+ const starterkit = answers.starterkit;
- /**
- * Process the init routines
- * 1 Replace config paths
- * 2. Scaffold the folder structure
- * 3. If `edition` is present:
- * 3.1 Install edition
- * 3.2 Reassign adjustedconfig
- * 4. If `starterkit` is present install it and copy over the mandatory starterkit files to sourceDir
- * 5. Save patternlab-config.json in projectDir
- */
- const spinner = ora(
- `Setting up PatternLab project in ${projectDir}`
- ).start();
- let patternlabConfig = replaceConfigPaths(
- defaultPatternlabConfig,
- projectDir,
- sourceDir,
- publicDir,
- exportDir
- ); // 1
+ /**
+ * Process the init routines
+ * 1 Replace config paths
+ * 2. Scaffold the folder structure
+ * 3. If `edition` is present:
+ * 3.1 Install edition
+ * 3.2 Reassign adjustedconfig
+ * 4. If `starterkit` is present install it and copy over the mandatory starterkit files to sourceDir
+ * 5. Save patternlab-config.json in projectDir
+ */
+ const spinner = ora(`Setting up Pattern Lab in ${projectDir}`).start();
+ let patternlabConfig = replaceConfigPaths(
+ defaultPatternlabConfig,
+ projectDir,
+ sourceDir,
+ publicDir,
+ exportDir
+ ); // 1
- yield scaffold(projectDir, sourceDir, publicDir, exportDir); // 2
+ yield scaffold(projectDir, sourceDir, publicDir, exportDir); // 2
- if (edition) {
- spinner.text = `⊙ patternlab → Installing edition: ${edition}`;
- const newConf = yield installEdition(edition, patternlabConfig); // 3.1
- patternlabConfig = Object.assign(patternlabConfig, newConf); // 3.2
- spinner.succeed(`⊙ patternlab → Installed edition: ${edition}`);
- }
- if (starterkit) {
- spinner.text = `⊙ patternlab → Installing starterkit ${starterkit}`;
- spinner.start();
- yield installStarterkit(starterkit, patternlabConfig);
- spinner.succeed(`⊙ patternlab → Installed starterkit: ${starterkit}`);
- } // 4
- yield writeJsonAsync(
- path.resolve(projectDir, 'patternlab-config.json'),
- patternlabConfig
- ); // 5
+ if (edition) {
+ spinner.text = `⊙ patternlab → Installing edition: ${edition}`;
+ const newConf = yield installEdition(
+ edition,
+ patternlabConfig,
+ projectDir
+ ); // 3.1
+ if (newConf) {
+ patternlabConfig = merge(patternlabConfig, newConf, {
+ arrayMerge: overwriteMerge,
+ }); // 3.2
+ }
+ spinner.succeed(`⊙ patternlab → Installed edition: ${edition}`);
+ }
+ if (starterkit) {
+ spinner.text = `⊙ patternlab → Installing starterkit ${starterkit}`;
+ spinner.start();
+ const starterkitConfig = yield installStarterkit(
+ starterkit,
+ patternlabConfig
+ );
+ spinner.succeed(`⊙ patternlab → Installed starterkit: ${starterkit}`);
+ if (starterkitConfig) {
+ patternlabConfig = merge(patternlabConfig, starterkitConfig, {
+ arrayMerge: overwriteMerge,
+ });
+ }
+ } // 4
+ yield writeJsonAsync(
+ path.resolve(projectDir, 'patternlab-config.json'),
+ patternlabConfig
+ ); // 5
- spinner.succeed(
- `⊙ patternlab → Yay ☺. PatternLab Node was successfully initialised in ${projectDir}`
- );
- return true;
- });
+ spinner.succeed(
+ `⊙ patternlab → Yay ☺. Pattern Lab Node was successfully initialized in ${projectDir}`
+ );
+ return true;
+ });
module.exports = init;
diff --git a/packages/cli/bin/cli-actions/install.js b/packages/cli/bin/cli-actions/install.js
index 598cf04fa..28aa8a445 100644
--- a/packages/cli/bin/cli-actions/install.js
+++ b/packages/cli/bin/cli-actions/install.js
@@ -12,54 +12,54 @@ const writeJsonAsync = require('../utils').writeJsonAsync;
* @param {object} options
*/
const install = options =>
- wrapAsync(function*() {
- const config = yield resolveConfig(options.parent.config);
+ wrapAsync(function*() {
+ const config = yield resolveConfig(options.parent.config);
- const spinner = ora(
- `⊙ patternlab → Installing additional resources …`
- ).start();
+ const spinner = ora(
+ `⊙ patternlab → Installing additional resources …`
+ ).start();
- if (options.starterkits && Array.isArray(options.starterkits)) {
- const starterkits = yield Promise.all(
- options.starterkits.map(starterkit =>
- wrapAsync(function*() {
- spinner.text = `⊙ patternlab → Installing starterkit: ${starterkit}`;
- return yield installStarterkit(
- {
- name: starterkit,
- value: starterkit,
- },
- config
- );
- })
- )
- );
- spinner.succeed(
- `⊙ patternlab → Installed following starterkits: ${starterkits.join(
- ', '
- )}`
- );
- }
- if (options.plugins && Array.isArray(options.plugins)) {
- const plugins = yield Promise.all(
- options.plugins.map(plugin =>
- wrapAsync(function*() {
- return yield installPlugin(
- {
- name: plugin,
- value: plugin,
- },
- config
- );
- })
- )
- );
- spinner.succeed(
- `⊙ patternlab → Installed following plugins: ${plugins.join(', ')}`
- );
- }
- yield writeJsonAsync(options.parent.config, config);
- spinner.succeed(`⊙ patternlab → Updated config`);
- });
+ if (options.starterkits && Array.isArray(options.starterkits)) {
+ const starterkits = yield Promise.all(
+ options.starterkits.map(starterkit =>
+ wrapAsync(function*() {
+ spinner.text = `⊙ patternlab → Installing starterkit: ${starterkit}`;
+ return yield installStarterkit(
+ {
+ name: starterkit,
+ value: starterkit,
+ },
+ config
+ );
+ })
+ )
+ );
+ spinner.succeed(
+ `⊙ patternlab → Installed following starterkits: ${starterkits.join(
+ ', '
+ )}`
+ );
+ }
+ if (options.plugins && Array.isArray(options.plugins)) {
+ const plugins = yield Promise.all(
+ options.plugins.map(plugin =>
+ wrapAsync(function*() {
+ return yield installPlugin(
+ {
+ name: plugin,
+ value: plugin,
+ },
+ config
+ );
+ })
+ )
+ );
+ spinner.succeed(
+ `⊙ patternlab → Installed following plugins: ${plugins.join(', ')}`
+ );
+ }
+ yield writeJsonAsync(options.parent.config, config);
+ spinner.succeed(`⊙ patternlab → Updated config`);
+ });
module.exports = install;
diff --git a/packages/cli/bin/cli-actions/serve.js b/packages/cli/bin/cli-actions/serve.js
index d303519da..6e2cc8fd2 100644
--- a/packages/cli/bin/cli-actions/serve.js
+++ b/packages/cli/bin/cli-actions/serve.js
@@ -1,14 +1,12 @@
'use strict';
const resolveConfig = require('../resolve-config');
-const build = require('./build');
const servePatterns = require('../serve');
const wrapAsync = require('../utils').wrapAsync;
const serve = options =>
- wrapAsync(function*() {
- const config = yield resolveConfig(options.parent.config);
- yield build(options);
- servePatterns(config, options.watch);
- });
+ wrapAsync(function*() {
+ const config = yield resolveConfig(options.parent.config);
+ servePatterns(config, options);
+ });
module.exports = serve;
diff --git a/packages/cli/bin/cli-actions/version.js b/packages/cli/bin/cli-actions/version.js
index 8dc62863f..9332488b0 100644
--- a/packages/cli/bin/cli-actions/version.js
+++ b/packages/cli/bin/cli-actions/version.js
@@ -1,8 +1,5 @@
'use strict';
const patternlab = require('@pattern-lab/core');
-const config = Object.assign(patternlab.getDefaultConfig(), {
- logLevel: 'quiet',
-});
module.exports = ({ version }) =>
- `${version} (PatternLab Node Core version: ${patternlab(config).v()})`;
+ `${version} (Pattern Lab Node Core version: ${patternlab.getVersion()})`;
diff --git a/packages/cli/bin/copy-source-files.js b/packages/cli/bin/copy-source-files.js
deleted file mode 100644
index 694552988..000000000
--- a/packages/cli/bin/copy-source-files.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-const copy = require('./utils').copyWithPattern;
-const debug = require('./utils').debug;
-const wrapAsync = require('./utils').wrapAsync;
-
-/**
- * @func copyFilesFromSourceToPublic
- * @desc Copies files from the source path to the public path.
- * @param {object} paths - The passed PatternLab config paths member.
- * @return {Array}
- */
-const copyFilesFromSourceToPublic = paths =>
- wrapAsync(function*() {
- // Copy files over
- const copiedFiles = [
- copy(paths.source.styleguide, '*', paths.public.root),
- copy(paths.source.js, '**/*.js', paths.public.js),
- copy(paths.source.css, '*.css', paths.public.css),
- copy(paths.source.images, '*', paths.public.images),
- copy(paths.source.fonts, '*', paths.public.fonts),
- copy(paths.source.root, 'favicon.ico', paths.public.root),
- ];
- debug(`build: Your files were copied over to ${paths.public.root}`);
- return yield Promise.all(copiedFiles);
- });
-
-module.exports = copyFilesFromSourceToPublic;
diff --git a/packages/cli/bin/inquiries/confirm.js b/packages/cli/bin/inquiries/confirm.js
index a28c8145b..9cabdf88d 100644
--- a/packages/cli/bin/inquiries/confirm.js
+++ b/packages/cli/bin/inquiries/confirm.js
@@ -1,12 +1,12 @@
'use strict';
/** confirmSetup {Array} - Inquirer question to confirm selection */
const confirmSetup = [
- {
- type: 'confirm',
- name: 'confirm',
- message: 'Are you happy with your choices? (Hit enter for YES)?',
- default: true,
- },
+ {
+ type: 'confirm',
+ name: 'confirm',
+ message: 'Are you happy with your choices? (Hit enter for YES)?',
+ default: true,
+ },
];
module.exports = confirmSetup;
diff --git a/packages/cli/bin/inquiries/edition.js b/packages/cli/bin/inquiries/edition.js
index d32ccaf25..f62dba232 100644
--- a/packages/cli/bin/inquiries/edition.js
+++ b/packages/cli/bin/inquiries/edition.js
@@ -3,42 +3,38 @@ const inquirer = require('inquirer');
/** editionSetup {Array} - Inquirer question logic for first question regarding editions */
const editionSetup = [
- {
- type: 'input',
- name: 'project_root',
- message: 'Please specify a directory for your PatternLab project.',
- default: () => './',
- },
- {
- type: 'list',
- name: 'edition',
- message: 'Which edition do you want to use (defaults to edition-node)?',
- choices: [
- {
- name: 'edition-node',
- value: '@pattern-lab/edition-node',
- },
- {
- name: 'edition-node-grunt',
- value: '@pattern-lab/edition-node-grunt',
- },
- {
- name: 'edition-node-gulp',
- value: '@pattern-lab/edition-node-gulp',
- },
- new inquirer.Separator(),
- {
- name: 'None',
- value: false,
- },
- ],
- default: function() {
- return {
- name: 'edition-node',
- value: '@pattern-lab/edition-node',
- };
- },
- },
+ {
+ type: 'input',
+ name: 'project_root',
+ message: 'Please specify a directory for your Pattern Lab project.',
+ default: () => './',
+ },
+ {
+ type: 'list',
+ name: 'edition',
+ message: 'What templating language do you want to use with Pattern Lab?',
+ choices: [
+ {
+ name: 'Handlebars',
+ value: '@pattern-lab/edition-node',
+ },
+ {
+ name: 'Twig (PHP)',
+ value: '@pattern-lab/edition-twig',
+ },
+ new inquirer.Separator(),
+ {
+ name: 'None',
+ value: false,
+ },
+ ],
+ default: function() {
+ return {
+ name: 'Handlebars',
+ value: '@pattern-lab/edition-node',
+ };
+ },
+ },
];
module.exports = editionSetup;
diff --git a/packages/cli/bin/inquiries/starterkit.js b/packages/cli/bin/inquiries/starterkit.js
index 8287b846d..523eb64bc 100644
--- a/packages/cli/bin/inquiries/starterkit.js
+++ b/packages/cli/bin/inquiries/starterkit.js
@@ -4,74 +4,47 @@ const CUSTOM_STARTERKIT = Symbol('CUSTOM_STARTERKIT');
/** starterkitSetup {Array} - Inquirer question logic for regarding starterkits */
const starterkitSetup = [
- {
- type: 'list',
- name: 'starterkit',
- message: 'Which starterkit do you want to use?',
- choices: [
- {
- name: 'starterkit-mustache-demo',
- value: '@pattern-lab/starterkit-mustache-demo',
- },
- {
- name: 'starterkit-mustache-bootstrap',
- value: 'starterkit-mustache-bootstrap',
- },
- {
- name: 'starterkit-mustache-foundation',
- value: 'starterkit-mustache-foundation',
- },
- {
- name: 'starterkit-twig-base',
- value: 'starterkit-twig-base',
- },
- {
- name: 'starterkit-twig-demo',
- value: 'starterkit-twig-demo',
- },
- {
- name: 'starterkit-mustache-materialdesign',
- value: 'starterkit-mustache-materialdesign',
- },
- {
- name: 'starterkit-twig-drupal-demo',
- value: 'starterkit-twig-drupal-demo',
- },
- {
- name: 'starterkit-twig-drupal-minimal',
- value: 'starterkit-twig-drupal-minimal',
- },
- {
- name: 'starterkit-mustache-webdesignday',
- value: 'starterkit-mustache-webdesignday',
- },
- {
- name: 'starterkit-mustache-base',
- value: '@pattern-lab/starterkit-mustache-base',
- },
- new inquirer.Separator(),
- {
- name: 'Custom starterkit',
- value: CUSTOM_STARTERKIT,
- },
- new inquirer.Separator(),
- {
- name: 'None',
- value: false,
- },
- ],
- default: {
- name: 'starterkit-mustache-base',
- value: 'starterkit-mustache-base',
- },
- },
- {
- name: 'starterkit',
- message: 'Type the name of the custom starterkit to use:',
- type: 'input',
- when(answers) {
- return answers.starterkit === CUSTOM_STARTERKIT;
- },
- },
+ {
+ type: 'list',
+ name: 'starterkit',
+ message: 'What initial patterns do you want included in your project?',
+ choices: [
+ {
+ name:
+ 'Handlebars base patterns (some basic patterns to get started with)',
+ value: '@pattern-lab/starterkit-handlebars-vanilla',
+ },
+ {
+ name: 'Handlebars demo patterns (full demo website and patterns)',
+ value: '@pattern-lab/starterkit-handlebars-demo',
+ },
+ {
+ name: 'Twig (PHP) demo patterns (full demo website and patterns)',
+ value: '@pattern-lab/starterkit-twig-demo',
+ },
+ new inquirer.Separator(),
+ {
+ name: 'Custom starterkit',
+ value: CUSTOM_STARTERKIT,
+ },
+ new inquirer.Separator(),
+ {
+ name: 'Blank project (no patterns)',
+ value: false,
+ },
+ ],
+ default: {
+ name: 'Handlebars demo patterns (full demo website and patterns)',
+ value: 'starterkit-handlebars-demo',
+ },
+ },
+ {
+ name: 'starterkit',
+ message: 'Type the name of the custom starterkit to use:',
+ type: 'input',
+ when(answers) {
+ return answers.starterkit === CUSTOM_STARTERKIT;
+ },
+ },
];
module.exports = starterkitSetup;
diff --git a/packages/cli/bin/install-edition.js b/packages/cli/bin/install-edition.js
index fb7ae8745..a8cffe72b 100644
--- a/packages/cli/bin/install-edition.js
+++ b/packages/cli/bin/install-edition.js
@@ -1,23 +1,109 @@
+/* eslint-disable no-param-reassign */
'use strict';
+
const path = require('path');
-const checkAndInstallPackage = require('./utils').checkAndInstallPackage;
-const copyAsync = require('./utils').copyAsync;
-const wrapAsync = require('./utils').wrapAsync;
-
-const installEdition = (edition, config) =>
- wrapAsync(function*() {
- /**
- * 1. Trigger edition install
- * 2. Copy over the mandatory edition files to sourceDir
- * 3. Adjust config paths
- */
- const sourceDir = config.paths.source.root;
- yield checkAndInstallPackage(edition); // 1
- yield copyAsync(
- path.resolve('./node_modules', edition, 'source', '_meta'),
- path.resolve(sourceDir, '_meta')
- ); // 2
- return config;
- });
+const merge = require('deepmerge');
+const EOL = require('os').EOL;
+const {
+ checkAndInstallPackage,
+ copyAsync,
+ wrapAsync,
+ writeJsonAsync,
+ getJSONKey,
+} = require('./utils');
+
+// https://github.com/TehShrike/deepmerge#overwrite-array
+const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray;
+
+const installEdition = (edition, config, projectDir) => {
+ const pkg = require(path.resolve(projectDir, 'package.json'));
+
+ return wrapAsync(function*() {
+ /**
+ * 1. Trigger edition install
+ * 2. Copy over the mandatory edition files to sourceDir
+ * 3. Copy dependencies defined in edition
+ * 4. Do custom post-install procedures for different core editions:
+ * 4.1 Copy gulpfile.js for edition-node-gulp
+ * 4.2 Copy scripts for edition-node
+ * 4.3 Copy items for edition-twig
+ */
+ const sourceDir = config.paths.source.root;
+ yield checkAndInstallPackage(edition); // 1
+ yield copyAsync(
+ path.resolve('./node_modules', edition, 'source', '_meta'),
+ path.resolve(sourceDir, '_meta')
+ ); // 2
+ pkg.dependencies = Object.assign(
+ {},
+ pkg.dependencies || {},
+ yield getJSONKey(edition, 'dependencies')
+ ); // 3
+ switch (
+ edition // 4
+ ) {
+ // 4.1
+ case '@pattern-lab/edition-node-gulp': {
+ yield copyAsync(
+ path.resolve('./node_modules', edition, 'gulpfile.js'),
+ path.resolve(sourceDir, '../', 'gulpfile.js')
+ );
+ break;
+ }
+ // 4.2
+ case '@pattern-lab/edition-node': {
+ const editionPath = path.resolve('./node_modules', edition);
+ const editionConfigPath = path.resolve(
+ editionPath,
+ 'patternlab-config.json'
+ );
+
+ const editionConfig = require(editionConfigPath);
+
+ pkg.scripts = Object.assign(
+ {},
+ pkg.scripts || {},
+ yield getJSONKey(edition, 'scripts')
+ );
+
+ yield copyAsync(
+ path.join(editionPath, path.sep, 'helpers', path.sep, 'test.js'),
+ path.resolve(sourceDir, '../', 'helpers/test.js')
+ );
+
+ config = merge(config, editionConfig, { arrayMerge: overwriteMerge });
+ break;
+ }
+ // 4.3
+ case '@pattern-lab/edition-twig': {
+ const editionPath = path.resolve('./node_modules', edition);
+ const editionConfigPath = path.resolve(
+ editionPath,
+ 'patternlab-config.json'
+ );
+ const editionConfig = require(editionConfigPath);
+
+ pkg.scripts = Object.assign(
+ {},
+ pkg.scripts || {},
+ yield getJSONKey(edition, 'scripts')
+ );
+
+ yield copyAsync(
+ path.resolve(editionPath, 'alter-twig.php'),
+ path.resolve(sourceDir, '../', 'alter-twig.php')
+ );
+
+ config = merge(config, editionConfig, { arrayMerge: overwriteMerge });
+ break;
+ }
+ }
+ yield writeJsonAsync(path.resolve(projectDir, 'package.json'), pkg, {
+ spaces: 2,
+ EOL: EOL,
+ });
+ return config;
+ });
+};
module.exports = installEdition;
diff --git a/packages/cli/bin/install-plugin.js b/packages/cli/bin/install-plugin.js
index 511adf859..f297bd62a 100644
--- a/packages/cli/bin/install-plugin.js
+++ b/packages/cli/bin/install-plugin.js
@@ -1,15 +1,33 @@
'use strict';
+
+const path = require('path');
+
const _ = require('lodash');
+
const checkAndInstallPackage = require('./utils').checkAndInstallPackage;
const wrapAsync = require('./utils').wrapAsync;
const installPlugin = (plugin, config) =>
- wrapAsync(function*() {
- const name = plugin.name || plugin;
- yield checkAndInstallPackage(name);
- // Put the installed plugin in the patternlab-config.json
- _.set(config, `plugins[${name}]['enabled']`, false);
- return name;
- });
+ wrapAsync(function*() {
+ const name = plugin.name || plugin;
+ yield checkAndInstallPackage(name);
+ // Put the installed plugin in the patternlab-config.json
+ _.set(config, `plugins[${name}]['enabled']`, true);
+ _.set(config, `plugins[${name}]['initialized']`, false);
+
+ // Get the options from the plugin, if any
+ const pluginPathConfig = path.resolve(
+ path.join(process.cwd(), 'node_modules', name, 'config.json')
+ );
+ try {
+ const pluginConfigJSON = require(pluginPathConfig);
+ if (!_.has(config.plugins[name].options)) {
+ _.set(config, `plugins[${name}][options]`, pluginConfigJSON);
+ }
+ } catch (ex) {
+ //a config.json file is not required at this time
+ }
+ return name;
+ });
module.exports = installPlugin;
diff --git a/packages/cli/bin/install-starterkit.js b/packages/cli/bin/install-starterkit.js
index 725b311d8..f7ce2b61c 100644
--- a/packages/cli/bin/install-starterkit.js
+++ b/packages/cli/bin/install-starterkit.js
@@ -1,20 +1,26 @@
'use strict';
const path = require('path');
-const checkAndInstallPackage = require('./utils').checkAndInstallPackage;
-const copyAsync = require('./utils').copyAsync;
-const wrapAsync = require('./utils').wrapAsync;
+const fs = require('fs-extra');
+const {
+ copyAsync,
+ wrapAsync,
+ checkAndInstallPackage,
+ readJsonAsync,
+} = require('./utils');
const installStarterkit = (starterkit, config) =>
- wrapAsync(function*() {
- const sourceDir = config.paths.source.root;
- const name = starterkit.value || starterkit;
- const url = name.startsWith('@pattern-lab/') ? name : `pattern-lab/${name}`;
- yield checkAndInstallPackage(name, url);
- yield copyAsync(
- path.resolve('./node_modules', name, 'dist'),
- path.resolve(sourceDir)
- );
- return name;
- });
+ wrapAsync(function*() {
+ const sourceDir = config.paths.source.root;
+ const name = starterkit.value || starterkit;
+ yield checkAndInstallPackage(name);
+ const kitPath = path.resolve('./node_modules', name);
+ yield copyAsync(path.resolve(kitPath, 'dist'), path.resolve(sourceDir));
+ let kitConfig;
+ const kitConfigPath = path.resolve(kitPath, 'patternlab-config.json');
+ if (fs.existsSync(kitConfigPath)) {
+ kitConfig = yield readJsonAsync(kitConfigPath);
+ }
+ return kitConfig;
+ });
module.exports = installStarterkit;
diff --git a/packages/cli/bin/patternlab.js b/packages/cli/bin/patternlab.js
index 51c812e3f..a76468994 100755
--- a/packages/cli/bin/patternlab.js
+++ b/packages/cli/bin/patternlab.js
@@ -1,6 +1,8 @@
#!/usr/bin/env node
+/* eslint-disable no-unused-vars */
'use strict';
const cli = require('commander');
+const path = require('path');
const build = require('./cli-actions/build');
const disable = require('./cli-actions/disable');
const enable = require('./cli-actions/enable');
@@ -19,13 +21,13 @@ log.on('patternlab.info', msg => console.log(msg)); // eslint-disable-line
// Conditionally register verbose logging
const verboseLogs = verbose =>
- log.on('patternlab.debug', msg => console.log(msg)); // eslint-disable-line
+ log.on('patternlab.debug', msg => console.log(msg)); // eslint-disable-line
// Conditionally unregister all logging
const silenceLogs = () => {
- log.removeAllListeners('patternlab.debug');
- log.removeAllListeners('patternlab.info');
- log.removeAllListeners('patternlab.error');
+ log.removeAllListeners('patternlab.debug');
+ log.removeAllListeners('patternlab.info');
+ log.removeAllListeners('patternlab.error');
};
// Split strings into an array
@@ -35,102 +37,103 @@ const list = val => val.split(',');
* Hook up cli version, usage and options
*/
cli
- .version(version(pkg), '-V, --version')
- .usage(' [options]')
- .arguments(' [options]')
- .option(
- '-c, --config ',
- 'Specify config file. Default looks up the project dir',
- val => val.trim(),
- './patternlab-config.json'
- )
- .option('-v, --verbose', 'Show verbose console logs', verboseLogs)
- .option('--silent', 'Turn off console logs', silenceLogs);
+ .version(version(pkg), '-V, --version')
+ .usage(' [options]')
+ .arguments(' [options]')
+ .option(
+ '-c, --config ',
+ 'Specify config file. Default looks up the project dir',
+ val => val.trim(),
+ path.resolve(process.cwd(), 'patternlab-config.json')
+ )
+ .option('-v, --verbose', 'Show verbose console logs', verboseLogs)
+ .option('--silent', 'Turn off console logs', silenceLogs);
/**
* build
- * @desc Setup patternlab's `build` cmd
+ * @desc Setup Pattern Lab's `build` cmd
*/
cli
- .command('build')
- .alias('compile')
- .description('Build the PatternLab. Optionally (re-)build only the patterns')
- .option('-p, --patterns-only', 'Whether to only build patterns')
- .action(build);
+ .command('build')
+ .alias('compile')
+ .description('Build Pattern Lab. Optionally (re-)build only the patterns')
+ .option('-p, --patterns-only', 'Whether to only build patterns')
+ .option('--no-watch', 'Start watching for changes')
+ .action(build);
/**
* export
- * @desc Export a PatternLab patterns into a compressed format
+ * @desc Export a Pattern Lab patterns into a compressed format
*/
cli
- .command('export')
- .description('Export a PatternLab patterns into a compressed format')
- .action(exportPatterns);
+ .command('export')
+ .description('Export Pattern Lab patterns into a compressed format')
+ .action(exportPatterns);
/**
* init
- * @desc Initialize a PatternLab project from scratch or import an edition and/or starterkit
+ * @desc Initialize a Pattern Lab project from scratch or import an edition and/or starterkit
*/
cli
- .command('init')
- .description(
- 'Initialize a PatternLab project from scratch or import an edition and/or starterkit'
- )
- .option('-p, --project-dir ', 'Specify a project directory')
- .option('-e, --edition ', 'Specify an edition to install')
- .option('-k, --starterkit ', 'Specify a starterkit to install')
- .action(init);
+ .command('init')
+ .description(
+ 'Initialize a Pattern Lab project from scratch or import an edition and/or starterkit'
+ )
+ .option('-p, --project-dir ', 'Specify a project directory')
+ .option('-e, --edition ', 'Specify an edition to install')
+ .option('-k, --starterkit ', 'Specify a starterkit to install')
+ .action(init);
/**
* install
* @desc Installs Pattern Lab related modules like starterkits or plugins
*/
cli
- .command('install')
- .alias('add')
- .description(
- 'Installs Pattern Lab related modules like starterkits or plugins'
- )
- .option(
- '--starterkits ',
- 'Specify one or more starterkit to install',
- list
- )
- .option('--plugins ', 'Specify one or more plugins to install', list)
- .action(install);
+ .command('install')
+ .alias('add')
+ .description(
+ 'Installs Pattern Lab related modules like starterkits or plugins'
+ )
+ .option(
+ '--starterkits ',
+ 'Specify one or more starterkit to install',
+ list
+ )
+ .option('--plugins ', 'Specify one or more plugins to install', list)
+ .action(install);
/**
* enable
* @desc Enable Pattern Lab plugins. Unavailable plugins are just skipped
*/
cli
- .command('enable')
- .alias('on')
- .description('Enable Pattern Lab plugins')
- .option('--plugins ', 'Specify one or more plugins to enable', list)
- .action(enable);
+ .command('enable')
+ .alias('on')
+ .description('Enable Pattern Lab plugins')
+ .option('--plugins ', 'Specify one or more plugins to enable', list)
+ .action(enable);
/**
* disable
* @desc Enable Pattern Lab plugins. Unavailable plugins are just skipped
*/
cli
- .command('disable')
- .alias('off')
- .description('Disable Pattern Lab plugins')
- .option('--plugins ', 'Specify one or more plugins to disable', list)
- .action(disable);
+ .command('disable')
+ .alias('off')
+ .description('Disable Pattern Lab plugins')
+ .option('--plugins ', 'Specify one or more plugins to disable', list)
+ .action(disable);
/**
* serve
* @desc Starts a server to inspect files in browser
*/
cli
- .command('serve')
- .alias('browse')
- .description('Starts a server to inspect files in browser')
- .option('-w, --watch', 'Start watching for changes')
- .action(serve);
+ .command('serve')
+ .alias('browse')
+ .description('Starts a server to inspect files in browser')
+ .option('--no-watch', 'Start watching for changes')
+ .action(serve);
// Show additional help
cli.on('--help', help);
@@ -140,10 +143,10 @@ cli.on('--help', help);
* Parse at the end because Node emit is immediate
*/
cli
- .on('*', () => {
- error(
- 'Invalid command provided. See the help for available commands/options.'
- );
- cli.help();
- })
- .parse(process.argv);
+ .on('*', () => {
+ error(
+ 'Invalid command provided. See the help for available commands/options.'
+ );
+ cli.help();
+ })
+ .parse(process.argv);
diff --git a/packages/cli/bin/replace-config.js b/packages/cli/bin/replace-config.js
index 735b48701..19dd7f2ea 100644
--- a/packages/cli/bin/replace-config.js
+++ b/packages/cli/bin/replace-config.js
@@ -5,7 +5,7 @@ const _ = require('lodash');
/**
* @func replaceConfigPaths
* @desc Immutable replace source and public paths in the passed config.
- * @param {config} config - The passed PatternLab config.
+ * @param {config} config - The passed Pattern Lab config.
* @param {string} projectDir - The project directory path, defaults to ./
* @param {string} sourceDir - The source root directory path.
* @param {string} publicDir - The public root directory path.
@@ -13,25 +13,25 @@ const _ = require('lodash');
* @return {config} - Returns a modified config. Original stays unaltered.
*/
function replaceConfigPaths(
- config,
- projectDir,
- sourceDir,
- publicDir,
- exportDir
+ config,
+ projectDir,
+ sourceDir,
+ publicDir,
+ exportDir
) {
- const conf = Object.assign({}, config);
- _.map(conf.paths.source, (value, key) => {
- conf.paths.source[key] = _.isString(value)
- ? value.replace(/^\.\/source/g, path.join(projectDir, sourceDir))
- : value;
- });
- _.map(conf.paths.public, (value, key) => {
- conf.paths.public[key] = _.isString(value)
- ? value.replace(/^\.\/public/g, path.join(projectDir, publicDir))
- : value;
- });
- conf.patternExportDirectory = path.join(projectDir, exportDir);
- return conf;
+ const conf = Object.assign({}, config);
+ _.map(conf.paths.source, (value, key) => {
+ conf.paths.source[key] = _.isString(value)
+ ? value.replace(/^\.\/source/g, path.join(projectDir, sourceDir))
+ : value;
+ });
+ _.map(conf.paths.public, (value, key) => {
+ conf.paths.public[key] = _.isString(value)
+ ? value.replace(/^\.\/public/g, path.join(projectDir, publicDir))
+ : value;
+ });
+ conf.patternExportDirectory = path.join(projectDir, exportDir);
+ return conf;
}
module.exports = replaceConfigPaths;
diff --git a/packages/cli/bin/resolve-config.js b/packages/cli/bin/resolve-config.js
index 6ee5a3d02..f34c5e083 100644
--- a/packages/cli/bin/resolve-config.js
+++ b/packages/cli/bin/resolve-config.js
@@ -7,39 +7,39 @@ const wrapAsync = require('./utils').wrapAsync;
/**
* @func resolveConfig
- * @desc Resolves the given PatternLab config file.
+ * @desc Resolves the given Pattern Lab config file.
* @param {string} [configPath=./patternlab-config.json] - Path to the patternlab-config.json. Defaults to project dir.
* @return {object|boolean} Returns the config object or false otherwise.
*/
function resolveConfig(configPath) {
- return wrapAsync(function*() {
- if (typeof configPath !== 'string') {
- error(
- 'resolveConfig: If configPath is set, it is expected to be of type string.'
- );
- return false;
- }
- if (!exists.sync(configPath)) {
- error(`resolveConfig: configPath ${configPath} does not exists`);
- return false;
- }
+ return wrapAsync(function*() {
+ if (typeof configPath !== 'string') {
+ error(
+ 'resolveConfig: If configPath is set, it is expected to be of type string.'
+ );
+ return false;
+ }
+ if (!exists.sync(configPath)) {
+ error(`resolveConfig: configPath ${configPath} does not exists`);
+ return false;
+ }
- /**
- * Setup the config.
- * 1. Check if user specified custom PatternLab config location
- * 2. Read the config file
- */
- try {
- const absoluteConfigPath = path.resolve(configPath); // 1
- return yield readJsonAsync(absoluteConfigPath); // 2
- } catch (err) {
- error(
- 'resolveConfig: Got an error during parsing your PatternLab config. Please make sure your config file exists.'
- );
- error(err);
- return false;
- }
- });
+ /**
+ * Setup the config.
+ * 1. Check if user specified custom Pattern Lab config location
+ * 2. Read the config file
+ */
+ try {
+ const absoluteConfigPath = path.resolve(configPath); // 1
+ return yield readJsonAsync(absoluteConfigPath); // 2
+ } catch (err) {
+ error(
+ 'resolveConfig: Got an error during parsing your Pattern Lab config. Please make sure your config file exists.'
+ );
+ error(err);
+ return false;
+ }
+ });
}
module.exports = resolveConfig;
diff --git a/packages/cli/bin/scaffold.js b/packages/cli/bin/scaffold.js
index 7c2077e5b..de1e4df73 100644
--- a/packages/cli/bin/scaffold.js
+++ b/packages/cli/bin/scaffold.js
@@ -1,11 +1,13 @@
'use strict';
const path = require('path');
+const execa = require('execa');
+const fs = require('fs-extra');
const wrapAsync = require('./utils').wrapAsync;
const mkdirsAsync = require('./utils').mkdirsAsync;
/**
* @func scaffold
- * @desc Generate file and folder structure for a PatternLab project
+ * @desc Generate file and folder structure for a Pattern Lab project
* @param {string} projectDir - The project root directory path.
* @param {string} sourceDir - The source root directory path.
* @param {string} publicDir - The public root directory path.
@@ -13,18 +15,25 @@ const mkdirsAsync = require('./utils').mkdirsAsync;
* @return {void}
*/
const scaffold = (projectDir, sourceDir, publicDir, exportDir) =>
- wrapAsync(function*() {
- /**
- * Create mandatory files structure
- * 1. Create project source directory
- * 2. Create project public directory
- * 3. Create project export directory
- */
- yield Promise.all([
- mkdirsAsync(path.resolve(projectDir, path.normalize(sourceDir))), // 1
- mkdirsAsync(path.resolve(projectDir, path.normalize(publicDir))), // 2
- mkdirsAsync(path.resolve(projectDir, path.normalize(exportDir))), // 3
- ]);
- });
+ wrapAsync(function*() {
+ const projectPath = path.join(process.cwd(), projectDir);
+ if (!fs.existsSync(path.join(projectPath, 'package.json'))) {
+ fs.ensureDirSync(projectPath);
+ execa.sync('npm', ['init', '-y'], {
+ cwd: projectPath,
+ });
+ }
+ /**
+ * Create mandatory files structure
+ * 1. Create project source directory
+ * 2. Create project public directory
+ * 3. Create project export directory
+ */
+ yield Promise.all([
+ mkdirsAsync(path.resolve(projectDir, path.normalize(sourceDir))), // 1
+ mkdirsAsync(path.resolve(projectDir, path.normalize(publicDir))), // 2
+ mkdirsAsync(path.resolve(projectDir, path.normalize(exportDir))), // 3
+ ]);
+ });
module.exports = scaffold;
diff --git a/packages/cli/bin/serve.js b/packages/cli/bin/serve.js
index 310240727..a7502b65f 100644
--- a/packages/cli/bin/serve.js
+++ b/packages/cli/bin/serve.js
@@ -7,40 +7,41 @@ const { error, info } = require('./utils');
/**
* @func serve
- * @desc Start a browser-sync server in the PatternLab public dir
- * @param {object} config - The passed PatternLab config
+ * @desc Start a browser-sync server in the Pattern Lab public dir
+ * @param {object} config - The passed Pattern Lab config
+ * @param {object} options - The passed options at invocation time
*/
-function serve(config) {
- if (!isValidConfig) {
- throw new TypeError(
- 'serve: Expects config not to be empty and of type object.'
- );
- }
+function serve(config, options) {
+ if (!isValidConfig) {
+ throw new TypeError(
+ 'serve: Expects config not to be empty and of type object.'
+ );
+ }
- if (
- !_.has(config, 'paths.public.root') ||
- _.isEmpty(config.paths.public.root)
- ) {
- throw new TypeError(
- 'serve: config.paths.public.root is empty or does not exist. Please check your PatternLab config.'
- );
- }
- if (
- !_.has(config, 'paths.source.root') ||
- _.isEmpty(config.paths.source.root)
- ) {
- throw new TypeError(
- 'serve: config.paths.source.root is empty or does not exist. Please check your PatternLab config.'
- );
- }
+ if (
+ !_.has(config, 'paths.public.root') ||
+ _.isEmpty(config.paths.public.root)
+ ) {
+ throw new TypeError(
+ 'serve: config.paths.public.root is empty or does not exist. Please check your Pattern Lab config.'
+ );
+ }
+ if (
+ !_.has(config, 'paths.source.root') ||
+ _.isEmpty(config.paths.source.root)
+ ) {
+ throw new TypeError(
+ 'serve: config.paths.source.root is empty or does not exist. Please check your Pattern Lab config.'
+ );
+ }
- try {
- info(`serve: Serving your files …`);
- const pl = patternlab(config);
- pl.serve({});
- } catch (err) {
- error(err);
- }
+ try {
+ info(`serve: Serving your files …`);
+ const pl = patternlab(config);
+ pl.server.serve(options);
+ } catch (err) {
+ error(err);
+ }
}
module.exports = serve;
diff --git a/packages/cli/bin/utils.js b/packages/cli/bin/utils.js
index 786ca7acf..771a6f1a9 100644
--- a/packages/cli/bin/utils.js
+++ b/packages/cli/bin/utils.js
@@ -1,5 +1,5 @@
'use strict';
-const fs = require('fs-promise');
+const fs = require('fs-extra');
const spawn = require('execa');
const glob = require('glob');
const path = require('path');
@@ -13,24 +13,24 @@ const hasYarn = require('has-yarn');
* @type {*}
*/
const log = Object.assign(
- {
- debug(msg) {
- this.emit(
- 'patternlab.debug',
- `${chalk.green('⊙ patternlab →')} ${chalk.dim(msg)}`
- );
- },
- info(msg) {
- this.emit('patternlab.info', `⊙ patternlab → ${chalk.dim(msg)}`);
- },
- error(msg) {
- this.emit(
- 'patternlab.error',
- `${chalk.red('⊙ patternlab →')} ${chalk.dim(msg)}`
- );
- },
- },
- EventEmitter.prototype
+ {
+ debug(msg) {
+ this.emit(
+ 'patternlab.debug',
+ `${chalk.green('⊙ patternlab →')} ${chalk.dim(msg)}`
+ );
+ },
+ info(msg) {
+ this.emit('patternlab.info', `⊙ patternlab → ${chalk.dim(msg)}`);
+ },
+ error(msg) {
+ this.emit(
+ 'patternlab.error',
+ `${chalk.red('⊙ patternlab →')} ${chalk.dim(msg)}`
+ );
+ },
+ },
+ EventEmitter.prototype
);
/**
@@ -63,29 +63,29 @@ const error = log.error.bind(log);
* @param {function} fn - Takes a generator function
*/
const wrapAsync = fn =>
- new Promise((resolve, reject) => {
- const generator = fn();
- /* eslint-disable */
- (function spwn(val) {
- let res;
- try {
- res =
- {}.toString.call(val) !== '[object Error]'
- ? generator.next(val)
- : generator.throw(val);
- } catch (err) {
- return reject(err);
- }
- const v = res.value;
- if (res.done) {
- return resolve(v);
- }
- Promise.resolve(v)
- .then(spwn)
- .catch(spwn);
- })();
- /* eslint-enable */
- });
+ new Promise((resolve, reject) => {
+ const generator = fn();
+ /* eslint-disable */
+ (function spwn(val) {
+ let res;
+ try {
+ res =
+ {}.toString.call(val) !== '[object Error]'
+ ? generator.next(val)
+ : generator.throw(val);
+ } catch (err) {
+ return reject(err);
+ }
+ const v = res.value;
+ if (res.done) {
+ return resolve(v);
+ }
+ Promise.resolve(v)
+ .then(spwn)
+ .catch(spwn);
+ })();
+ /* eslint-enable */
+ });
/**
* @func glob
@@ -95,13 +95,11 @@ const wrapAsync = fn =>
* @return {Promise}
*/
const asyncGlob = (pattern, opts) =>
- new Promise((resolve, reject) =>
- glob(
- pattern,
- opts,
- (err, matches) => (err !== null ? reject(err) : resolve(matches))
- )
- );
+ new Promise((resolve, reject) =>
+ glob(pattern, opts, (err, matches) =>
+ err !== null ? reject(err) : resolve(matches)
+ )
+ );
/**
* @func copyWithPattern
@@ -112,62 +110,60 @@ const asyncGlob = (pattern, opts) =>
* @return {Promise}
*/
const copyWithPattern = (cwd, pattern, dest) =>
- wrapAsync(function*() {
- const files = yield asyncGlob(pattern, { cwd: cwd });
- if (files.length === 0) {
- debug('copy: Nothing to copy');
- }
- // Copy concurrently
- const promises = files.map(file =>
- fs.copy(path.join(cwd, file), path.join(dest, file))
- );
- return yield Promise.all(promises);
- });
+ wrapAsync(function*() {
+ const files = yield asyncGlob(pattern, { cwd: cwd });
+ if (files.length === 0) {
+ debug('copy: Nothing to copy');
+ }
+ // Copy concurrently
+ const promises = files.map(file =>
+ fs.copy(path.join(cwd, file), path.join(dest, file))
+ );
+ return yield Promise.all(promises);
+ });
/**
* @func fetchPackage
* @desc Fetches and saves packages from npm into node_modules and adds a reference in the package.json under dependencies
* @param {string} packageName - The package name
- * @param {string} [url] - A URL which will be used to fetch the package from
*/
-const fetchPackage = (packageName, url) =>
- wrapAsync(function*() {
- const useYarn = hasYarn();
- const pm = useYarn ? 'yarn' : 'npm';
- const installCmd = useYarn ? 'add' : 'install';
- try {
- if (packageName || url) {
- const cmd = yield spawn(pm, [installCmd, url || packageName]);
- error(cmd.stderr);
- }
- } catch (err) {
- error(
- `fetchPackage: Fetching required dependencies from ${pm} failed for ${packageName} with ${err}`
- );
- throw err; // Rethrow error
- }
- });
+const fetchPackage = packageName =>
+ wrapAsync(function*() {
+ const useYarn = hasYarn();
+ const pm = useYarn ? 'yarn' : 'npm';
+ const installCmd = useYarn ? 'add' : 'install';
+ try {
+ if (packageName) {
+ const cmd = yield spawn(pm, [installCmd, packageName]);
+ error(cmd.stderr);
+ }
+ } catch (err) {
+ error(
+ `fetchPackage: Fetching required dependencies from ${pm} failed for ${packageName} with ${err}`
+ );
+ throw err; // Rethrow error
+ }
+ });
/**
* @func checkAndInstallPackage
* Checks whether a package for a given packageName is installed locally. If package cannot be found, fetch and install it
* @param {string} packageName - The package name
- * @param {string} [url] - A URL which will be used to fetch the package from
* @return {boolean}
*/
-const checkAndInstallPackage = (packageName, url) =>
- wrapAsync(function*() {
- try {
- require.resolve(packageName);
- return true;
- } catch (err) {
- debug(
- `checkAndInstallPackage: ${packageName} not installed. Fetching it now …`
- );
- yield fetchPackage(packageName, url);
- return false;
- }
- });
+const checkAndInstallPackage = packageName =>
+ wrapAsync(function*() {
+ try {
+ require.resolve(packageName);
+ return true;
+ } catch (err) {
+ debug(
+ `checkAndInstallPackage: ${packageName} not installed. Fetching it now …`
+ );
+ yield fetchPackage(packageName);
+ return false;
+ }
+ });
/**
* @func noop
@@ -175,18 +171,46 @@ const checkAndInstallPackage = (packageName, url) =>
*/
const noop = () => {};
+/**
+ * @func writeJsonAsync
+ * Wrapper for fs.writeJsonAsync with consistent spacing
+ * @param {string} filePath
+ * @param {object} data
+ */
+const writeJsonAsync = (filePath, data) =>
+ wrapAsync(function*() {
+ yield fs.outputJSON(filePath, data, { spaces: 2 });
+ });
+
+/**
+ * @func getJSONKey
+ * Installs package, then returns the value for the given JSON file's key within
+ * @param {string} packageName - the node_module to install / load
+ * @param {object} key - the key to find
+ * @param {object} fileName - the filePath of the JSON
+ */
+const getJSONKey = (packageName, key, fileName = 'package.json') =>
+ wrapAsync(function*() {
+ yield checkAndInstallPackage(packageName);
+ const jsonData = yield fs.readJson(
+ path.resolve('node_modules', packageName, fileName)
+ );
+ return jsonData[key];
+ });
+
module.exports = {
- copyWithPattern,
- copyAsync: fs.copy,
- mkdirsAsync: fs.mkdirs,
- moveAsync: fs.move,
- writeJsonAsync: fs.outputJson,
- readJsonAsync: fs.readJson,
- error,
- info,
- debug,
- log,
- wrapAsync,
- checkAndInstallPackage,
- noop,
+ copyWithPattern,
+ copyAsync: fs.copy,
+ mkdirsAsync: fs.mkdirs,
+ moveAsync: fs.move,
+ writeJsonAsync: writeJsonAsync,
+ readJsonAsync: fs.readJson,
+ error,
+ info,
+ debug,
+ log,
+ wrapAsync,
+ checkAndInstallPackage,
+ noop,
+ getJSONKey,
};
diff --git a/packages/cli/bin/validate-config.js b/packages/cli/bin/validate-config.js
index 0cd571e4a..eb4e521e8 100644
--- a/packages/cli/bin/validate-config.js
+++ b/packages/cli/bin/validate-config.js
@@ -6,7 +6,7 @@
* @return {object} - Returns true is all is good, false otherwise.
*/
function isValidConfig(config) {
- return !config || typeof config !== 'object';
+ return !config || typeof config !== 'object';
}
module.exports = isValidConfig;
diff --git a/packages/cli/package-lock.json b/packages/cli/package-lock.json
deleted file mode 100644
index e641a77f4..000000000
--- a/packages/cli/package-lock.json
+++ /dev/null
@@ -1,1440 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "acorn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.0.tgz",
- "integrity": "sha512-arn53F07VXmls4o4pUhSzBa4fvaagPRe7AVZ8l7NHxFWUie2DsuFSBMMNAkgzRlOhEhzAnxeKyaWVzOH4xqp/g=="
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "requires": {
- "acorn": "3.3.0"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
- }
- }
- },
- "ajv": {
- "version": "5.5.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
- "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
- "requires": {
- "co": "4.6.0",
- "fast-deep-equal": "1.1.0",
- "fast-json-stable-stringify": "2.0.0",
- "json-schema-traverse": "0.3.1"
- }
- },
- "ajv-keywords": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
- "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
- },
- "ansi-escapes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
- "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ=="
- },
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
- "archiver": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz",
- "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=",
- "requires": {
- "archiver-utils": "1.3.0",
- "async": "2.6.0",
- "buffer-crc32": "0.2.13",
- "glob": "7.1.2",
- "lodash": "4.17.5",
- "readable-stream": "2.3.4",
- "tar-stream": "1.5.5",
- "zip-stream": "1.2.0"
- }
- },
- "archiver-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
- "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
- "requires": {
- "glob": "7.1.2",
- "graceful-fs": "4.1.11",
- "lazystream": "1.0.0",
- "lodash": "4.17.5",
- "normalize-path": "2.1.1",
- "readable-stream": "2.3.4"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "1.0.3"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "async": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
- "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
- "requires": {
- "lodash": "4.17.5"
- }
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "bl": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
- "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
- "requires": {
- "readable-stream": "2.3.4"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
- },
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
- "requires": {
- "callsites": "0.2.0"
- }
- },
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
- },
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "2.0.0"
- }
- },
- "cli-spinners": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz",
- "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY="
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "clone": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
- "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8="
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
- },
- "color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "commander": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
- "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
- },
- "compress-commons": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
- "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
- "requires": {
- "buffer-crc32": "0.2.13",
- "crc32-stream": "2.0.0",
- "normalize-path": "2.1.1",
- "readable-stream": "2.3.4"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.4",
- "typedarray": "0.0.6"
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "crc": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
- "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ="
- },
- "crc32-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
- "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
- "requires": {
- "crc": "3.5.0",
- "readable-stream": "2.3.4"
- }
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "requires": {
- "clone": "1.0.3"
- }
- },
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "requires": {
- "globby": "5.0.0",
- "is-path-cwd": "1.0.0",
- "is-path-in-cwd": "1.0.0",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "rimraf": "2.6.2"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "requires": {
- "esutils": "2.0.2"
- }
- },
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "requires": {
- "once": "1.4.0"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "eslint": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz",
- "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==",
- "requires": {
- "ajv": "5.5.2",
- "babel-code-frame": "6.26.0",
- "chalk": "2.3.2",
- "concat-stream": "1.6.1",
- "cross-spawn": "5.1.0",
- "debug": "3.1.0",
- "doctrine": "2.1.0",
- "eslint-scope": "3.7.1",
- "eslint-visitor-keys": "1.0.0",
- "espree": "3.5.4",
- "esquery": "1.0.0",
- "esutils": "2.0.2",
- "file-entry-cache": "2.0.0",
- "functional-red-black-tree": "1.0.1",
- "glob": "7.1.2",
- "globals": "11.3.0",
- "ignore": "3.3.7",
- "imurmurhash": "0.1.4",
- "inquirer": "3.3.0",
- "is-resolvable": "1.1.0",
- "js-yaml": "3.10.0",
- "json-stable-stringify-without-jsonify": "1.0.1",
- "levn": "0.3.0",
- "lodash": "4.17.5",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "natural-compare": "1.4.0",
- "optionator": "0.8.2",
- "path-is-inside": "1.0.2",
- "pluralize": "7.0.0",
- "progress": "2.0.0",
- "require-uncached": "1.0.3",
- "semver": "5.5.0",
- "strip-ansi": "4.0.0",
- "strip-json-comments": "2.0.1",
- "table": "4.0.2",
- "text-table": "0.2.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "inquirer": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
- "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
- "dev": true,
- "requires": {
- "ansi-escapes": "3.0.0",
- "chalk": "2.3.2",
- "cli-cursor": "2.1.0",
- "cli-width": "2.2.0",
- "external-editor": "2.1.0",
- "figures": "2.0.0",
- "lodash": "4.17.5",
- "mute-stream": "0.0.7",
- "run-async": "2.3.0",
- "rx-lite": "4.0.8",
- "rx-lite-aggregates": "4.0.8",
- "string-width": "2.1.1",
- "strip-ansi": "4.0.0",
- "through": "2.3.8"
- }
- }
- }
- },
- "eslint-config-prettier": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz",
- "integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==",
- "requires": {
- "get-stdin": "5.0.1"
- }
- },
- "eslint-plugin-prettier": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz",
- "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==",
- "requires": {
- "fast-diff": "1.1.2",
- "jest-docblock": "21.2.0"
- }
- },
- "eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
- "requires": {
- "esrecurse": "4.2.1",
- "estraverse": "4.2.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
- "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
- },
- "espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
- "requires": {
- "acorn": "5.5.0",
- "acorn-jsx": "3.0.1"
- }
- },
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
- },
- "esquery": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
- "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "execa": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz",
- "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==",
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- }
- },
- "external-editor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
- "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
- "requires": {
- "chardet": "0.4.2",
- "iconv-lite": "0.4.19",
- "tmp": "0.0.33"
- }
- },
- "fast-deep-equal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
- },
- "fast-diff": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
- "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "1.0.5"
- }
- },
- "file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
- "requires": {
- "flat-cache": "1.3.0",
- "object-assign": "4.1.1"
- }
- },
- "fill-keys": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz",
- "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=",
- "requires": {
- "is-object": "1.0.1",
- "merge-descriptors": "1.0.1"
- }
- },
- "flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
- "requires": {
- "circular-json": "0.3.3",
- "del": "2.2.2",
- "graceful-fs": "4.1.11",
- "write": "0.2.1"
- }
- },
- "fs-extra": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz",
- "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0"
- }
- },
- "fs-promise": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz",
- "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=",
- "requires": {
- "any-promise": "1.3.0",
- "fs-extra": "2.1.2",
- "mz": "2.7.0",
- "thenify-all": "1.6.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "get-stdin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
- "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "globals": {
- "version": "11.3.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz",
- "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw=="
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "requires": {
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "glob": "7.1.2",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- }
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-yarn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz",
- "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac="
- },
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
- },
- "ignore": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA=="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "inquirer": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.1.0.tgz",
- "integrity": "sha512-kn7N70US1MSZHZHSGJLiZ7iCwwncc7b0gc68YtlX29OjI3Mp0tSVV+snVXpZ1G+ONS3Ac9zd1m6hve2ibLDYfA==",
- "requires": {
- "ansi-escapes": "3.0.0",
- "chalk": "2.3.2",
- "cli-cursor": "2.1.0",
- "cli-width": "2.2.0",
- "external-editor": "2.1.0",
- "figures": "2.0.0",
- "lodash": "4.17.5",
- "mute-stream": "0.0.7",
- "run-async": "2.3.0",
- "rxjs": "5.5.6",
- "string-width": "2.1.1",
- "strip-ansi": "4.0.0",
- "through": "2.3.8"
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
- "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
- "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
- "requires": {
- "is-path-inside": "1.0.1"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "1.0.2"
- }
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "jest-docblock": {
- "version": "21.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz",
- "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw=="
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "js-yaml": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
- "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
- "requires": {
- "argparse": "1.0.10",
- "esprima": "4.0.0"
- }
- },
- "json-schema-traverse": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
- "requires": {
- "readable-stream": "2.3.4"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2"
- }
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "requires": {
- "chalk": "2.3.2"
- }
- },
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "module-not-found-error": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz",
- "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "requires": {
- "any-promise": "1.3.0",
- "object-assign": "4.1.1",
- "thenify-all": "1.6.0"
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "2.0.1"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "1.2.0"
- }
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "requires": {
- "deep-is": "0.1.3",
- "fast-levenshtein": "2.0.6",
- "levn": "0.3.0",
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2",
- "wordwrap": "1.0.0"
- }
- },
- "ora": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ora/-/ora-2.0.0.tgz",
- "integrity": "sha512-g+IR0nMUXq1k4nE3gkENbN4wkF0XsVZFyxznTF6CdmwQ9qeTGONGpSR9LM5//1l0TVvJoJF3MkMtJp6slUsWFg==",
- "requires": {
- "chalk": "2.3.2",
- "cli-cursor": "2.1.0",
- "cli-spinners": "1.1.0",
- "log-symbols": "2.2.0",
- "strip-ansi": "4.0.0",
- "wcwidth": "1.0.1"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "pluralize": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
- "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "prettier": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz",
- "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw=="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "progress": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
- },
- "proxyquire": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.0.0.tgz",
- "integrity": "sha512-TO9TAIz0mpa+SKddXsgCFatoe/KmHvoNVj2jDMC1kXE6kKn7/4CRpxvQ+0wAK9sbMT2FVO89qItlvnZMcFbJ2Q==",
- "requires": {
- "fill-keys": "1.0.2",
- "module-not-found-error": "1.0.1",
- "resolve": "1.1.7"
- }
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "readable-stream": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
- "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "require-uncached": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
- "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
- "requires": {
- "caller-path": "0.1.0",
- "resolve-from": "1.0.1"
- }
- },
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
- },
- "resolve-from": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
- "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "2.0.1",
- "signal-exit": "3.0.2"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "requires": {
- "is-promise": "2.1.0"
- }
- },
- "rx-lite": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
- "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
- },
- "rx-lite-aggregates": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
- "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
- "requires": {
- "rx-lite": "4.0.8"
- }
- },
- "rxjs": {
- "version": "5.5.6",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz",
- "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==",
- "requires": {
- "symbol-observable": "1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "sanitize-filename": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz",
- "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
- "requires": {
- "truncate-utf8-bytes": "1.0.2"
- }
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "slice-ansi": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
- "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- },
- "symbol-observable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
- "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
- },
- "table": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
- "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
- "requires": {
- "ajv": "5.5.2",
- "ajv-keywords": "2.1.1",
- "chalk": "2.3.2",
- "lodash": "4.17.5",
- "slice-ansi": "1.0.0",
- "string-width": "2.1.1"
- }
- },
- "tar-stream": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz",
- "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==",
- "requires": {
- "bl": "1.2.1",
- "end-of-stream": "1.4.1",
- "readable-stream": "2.3.4",
- "xtend": "4.0.1"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "thenify": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
- "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
- "requires": {
- "any-promise": "1.3.0"
- }
- },
- "thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
- "requires": {
- "thenify": "3.3.0"
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "1.0.2"
- }
- },
- "truncate-utf8-bytes": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
- "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=",
- "requires": {
- "utf8-byte-length": "1.0.4"
- }
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "1.1.2"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "utf8-byte-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
- "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E="
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
- "requires": {
- "defaults": "1.0.3"
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
- "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
- "requires": {
- "mkdirp": "0.5.1"
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "zip-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
- "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
- "requires": {
- "archiver-utils": "1.3.0",
- "compress-commons": "1.2.2",
- "lodash": "4.17.5",
- "readable-stream": "2.3.4"
- }
- }
- }
-}
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 6468608ef..847f1d94d 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,37 +1,42 @@
{
"name": "@pattern-lab/cli",
"description": "Command-line interface (CLI) for the @pattern-lab/core.",
- "version": "0.0.1-alpha.15",
+ "version": "5.9.3",
"bin": {
"patternlab": "bin/patternlab.js"
},
"author": {
"name": "Raphael Okon"
},
- "private": true,
"dependencies": {
- "@pattern-lab/core": "^3.0.0-alpha.11",
- "@pattern-lab/live-server": "^1.3.3-alpha.2",
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/live-server": "^5.9.3",
+ "@pattern-lab/starterkit-mustache-base": "3.0.3",
"archiver": "2.1.1",
- "chalk": "2.3.2",
- "commander": "2.14.1",
- "execa": "0.9.0",
- "fs-promise": "2.0.3",
+ "chalk": "2.4.1",
+ "commander": "2.15.1",
+ "deepmerge": "^2.1.1",
+ "execa": "0.10.0",
+ "fs-extra": "6.0.1",
"glob": "7.1.2",
"has-yarn": "1.0.0",
"inquirer": "5.1.0",
- "lodash": "4.17.5",
- "ora": "2.0.0",
+ "lodash": "4.17.15",
+ "ora": "2.1.0",
"path-exists": "3.0.0",
- "sanitize-filename": "1.6.1"
+ "sanitize-filename": "1.6.1",
+ "starterkit-mustache-acidtest": "0.0.3",
+ "starterkit-mustache-bootstrap": "0.1.1",
+ "starterkit-mustache-foundation": "0.1.1",
+ "starterkit-mustache-materialdesign": "0.1.2"
},
"devDependencies": {
"eslint": "4.18.2",
"eslint-config-prettier": "2.9.0",
"eslint-plugin-prettier": "2.6.0",
"prettier": "1.11.1",
- "proxyquire": "2.0.0",
- "tap": "11.1.1"
+ "proxyquire": "2.0.1",
+ "tap": "14.6.4"
},
"files": [
"bin"
@@ -44,13 +49,15 @@
],
"scripts": {
"lint": "eslint ./{bin,test}",
- "test": "tap './test/*.test.js' --reporter spec --timeout=120",
- "pretest": "npm run lint && npm install"
+ "test:separate": "tap ./test/*.test.js --reporter spec --timeout=120"
},
"repository": "https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli",
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"license": "MIT",
"engines": {
- "node": ">=6.0"
+ "node": ">=10.0"
+ },
+ "publishConfig": {
+ "access": "public"
}
}
diff --git a/packages/cli/readme.md b/packages/cli/readme.md
index 93f029058..e5a9ae95e 100644
--- a/packages/cli/readme.md
+++ b/packages/cli/readme.md
@@ -1,36 +1,69 @@
-# PatternLab Node CLI
+# Pattern Lab Node CLI
> Command-line interface (CLI) for the patternlab-node core.
-[](https://travis-ci.org/pattern-lab/patternlab-node-cli)
+[](https://travis-ci.org/pattern-lab/patternlab-node)
## Installation
*Note: Global installs are currently not supported and will be fixed when the Pattern Lab core hits v3.0.0*
#### Via NPM
-`npm install pattern-lab/patternlab-node-cli --save-dev`
+`npm install @pattern-lab/cli --save-dev`
#### Via Yarn
-`yarn add pattern-lab/patternlab-node-cli --dev`
+`yarn add @pattern-lab/cli --dev`
-## Getting Started
-1. In order to use PatternLab you need to initialize a PatternLab project with `patternlab init`. The CLI will ask you some setup question and scaffold your project based on it.
-2. Build your patterns use `patternlab build`. The PatternLab CLI will assume that the `patternlab-config.json` is in the project root. Othewise specify a custom path to config with `patternlab build --config path/to/config`
-3. To view your patterns in the browser preview `patternlab serve` or again specify a custom config location `patternlab serve --config path/to/config`
-4. To export your patterns in the browser preview `patternlab export` or again specify a custom config location `patternlab export --config path/to/config`
+## Configuring Your Project to Use the CLI
+
+If the CLI is installed globally, you may call commands directly, such as `patternlab --version`.
+
+If the CLI is not installed globally, you need to tell `npm` where to find the executable when invoking commands.
+
+Open `package.json` and add the following to your `scripts` object:
+
+```diff
+"scripts": {
++ "patternlab": "patternlab"
+},
+```
+This tells `npm` to look in the local `node_modules/.bin` directory for the `patternlab` CLI.
+
+Subcommands and options can then be forwarded to the CLI like this:
+
+```bash
+npm run patternlab -- serve
+```
+
+Installing [`edition-node`](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node) will add the following CLI commands for convenience:
+
+```diff
+ "scripts": {
++ "pl:build": "patternlab build --config ./patternlab-config.json",
++ "pl:help": "patternlab --help",
++ "pl:install": "patternlab install --config ./patternlab-config.json",
++ "pl:serve": "patternlab serve --config ./patternlab-config.json",
++ "pl:version": "patternlab --version"
+ },
+```
+
+Then you can invoke any of these like this:
+
+```
+npm run pl:serve
+```
## API & Usage
### General usage
```
Usage: patternlab [options]
Commands:
- build|compile [options] Build the PatternLab. Optionally (re-)build only the patterns
- export Export a PatternLab patterns into a compressed format
- init [options] Initialize a PatternLab project from scratch or import an edition and/or starterkit
+ build|compile [options] Build Pattern Lab. Optionally (re-)build only the patterns
+ export Export a Pattern Lab patterns into a compressed format
+ init [options] Initialize a Pattern Lab project from scratch or import an edition and/or starterkit
install|add [options] Installs Pattern Lab related modules like starterkits or plugins
serve|browse [options] Starts a server to inspect files in browser
-
+
Options:
-h, --help output usage information
-V, --version output the version number
@@ -39,22 +72,22 @@ Usage: patternlab [options]
--silent Turn off console logs
```
-### Build/Compile PatternLab
+### Build/Compile Pattern Lab
```
Usage: build|compile [options]
-
-Build the PatternLab. Optionally (re-)build only the patterns
-
+
+Build Pattern Lab. Optionally (re-)build only the patterns
+
Options:
-h, --help output usage information
-p, --patterns-only Whether to only build patterns
```
-### Initialize PatternLab
+### Initialize Pattern Lab
```
Usage: init [options]
-Initialize a PatternLab project from scratch or import an edition and/or starterkit
+Initialize a Pattern Lab project from scratch or import an edition and/or starterkit
Passing no options starts the init in interactive mode
Options:
@@ -64,7 +97,7 @@ Passing no options starts the init in interactive mode
-k, --starterkit Specify a starterkit to install. Default: starterkit-mustache-base
```
-### Serve PatternLab
+### Serve Pattern Lab
```
Usage: serve|browse [options]
@@ -76,11 +109,11 @@ Starts a server to inspect files in browser
-w, --watch Start watching for changes
```
-### Export PatternLab
+### Export Pattern Lab
```
Usage: export [options]
-Export a PatternLab patterns into a compressed format
+Export a Pattern Lab patterns into a compressed format
Options:
-h, --help output usage information
@@ -101,9 +134,9 @@ Installs Pattern Lab related modules like starterkits or plugins
## Examples
```
- $ patternlab init # Initialize a PatternLab project.
- $ patternlab build # Builds PatternLab from the current dir
- $ patternlab build --config # Builds PatternLab from different project directory
+ $ patternlab init # Initialize a Pattern Lab project.
+ $ patternlab build # Builds Pattern Lab from the current dir
+ $ patternlab build --config # Builds Pattern Lab from different project directory
```
## License
MIT © [Raphael Okon](https://github.com/raphaelokon)
diff --git a/packages/cli/test/build.test.js b/packages/cli/test/build.test.js
index deb9af92a..6a56cb6fe 100644
--- a/packages/cli/test/build.test.js
+++ b/packages/cli/test/build.test.js
@@ -6,40 +6,40 @@ const config = patternlab.getDefaultConfig();
// Require build and mock patternlab.build() so that we only test the build module behavior
const build = proxyquire('../bin/build', {
- '@pattern-lab/core': patternLabMock,
+ '@pattern-lab/core': patternLabMock,
});
const opts = { patternsOnly: true };
tap.test('Build ->', t => {
- t.throws(
- () => {
- build();
- },
- {},
- 'throws when config is empty'
- );
- t.throws(
- () => {
- build(123);
- },
- {},
- 'throws when config is not of type object'
- );
- t.throws(
- () => {
- build(undefined, opts);
- },
- {},
- '--patterns-only throws when config is empty'
- );
- t.throws(
- () => {
- build(undefined, opts);
- },
- {},
- '--patterns-only throws when config is not of type object'
- );
- t.type(build(config), 'boolean', 'returns a bool');
- t.type(build(config, opts), 'boolean', '--patterns-only returns a bool');
- t.end();
+ t.throws(
+ () => {
+ build();
+ },
+ {},
+ 'throws when config is empty'
+ );
+ t.throws(
+ () => {
+ build(123);
+ },
+ {},
+ 'throws when config is not of type object'
+ );
+ t.throws(
+ () => {
+ build(undefined, opts);
+ },
+ {},
+ '--patterns-only throws when config is empty'
+ );
+ t.throws(
+ () => {
+ build(undefined, opts);
+ },
+ {},
+ '--patterns-only throws when config is not of type object'
+ );
+ t.type(build(config), 'boolean', 'returns a bool');
+ t.type(build(config, opts), 'boolean', '--patterns-only returns a bool');
+ t.end();
});
diff --git a/packages/cli/test/cli-build.test.js b/packages/cli/test/cli-build.test.js
index f9d3349a4..d6712deae 100644
--- a/packages/cli/test/cli-build.test.js
+++ b/packages/cli/test/cli-build.test.js
@@ -8,42 +8,42 @@ const wrapAsync = require('../bin/utils').wrapAsync;
const projectRoot = getUniqueProjectPath();
tap.test('Init and build ->', t =>
- wrapAsync(function*() {
- yield spawnCmd([
- 'init',
- '--verbose',
- '--project-dir',
- projectRoot,
- '--edition',
- '@pattern-lab/edition-node',
- '--starterkit',
- '@pattern-lab/starterkit-mustache-demo',
- ]);
- yield spawnCmd([
- 'build',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- t.ok(
- exists.sync(path.resolve(projectRoot, 'public')),
- 'should build all files into public dir'
- );
- t.ok(
- exists.sync(path.resolve(projectRoot, 'public', 'annotations')),
- 'with an annotations dir'
- );
- t.ok(
- exists.sync(path.resolve(projectRoot, 'public', 'css')),
- 'with a css dir'
- );
- t.ok(
- exists.sync(path.resolve(projectRoot, 'public', 'images')),
- 'with a images dir'
- );
- t.ok(
- exists.sync(path.resolve(projectRoot, 'public', 'styleguide')),
- 'with a styleguide dir'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield spawnCmd([
+ 'init',
+ '--verbose',
+ '--project-dir',
+ projectRoot,
+ '--edition',
+ '@pattern-lab/edition-node',
+ '--starterkit',
+ '@pattern-lab/starterkit-mustache-demo',
+ ]);
+ yield spawnCmd([
+ 'build',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'public')),
+ 'should build all files into public dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'public', 'annotations')),
+ 'with an annotations dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'public', 'css')),
+ 'with a css dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'public', 'images')),
+ 'with a images dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'public', 'styleguide')),
+ 'with a styleguide dir'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/cli-disable.test.js b/packages/cli/test/cli-disable.test.js
index 1e4751511..64715b882 100644
--- a/packages/cli/test/cli-disable.test.js
+++ b/packages/cli/test/cli-disable.test.js
@@ -7,46 +7,46 @@ const wrapAsync = require('../bin/utils').wrapAsync;
const projectRoot = getUniqueProjectPath();
tap.test('Disable ->', t =>
- wrapAsync(function*() {
- yield spawnCmd([
- 'init',
- '--verbose',
- '--project-dir',
- projectRoot,
- '--edition',
- '@pattern-lab/edition-node',
- '--starterkit',
- '@pattern-lab/starterkit-mustache-base',
- ]);
- yield spawnCmd([
- 'install',
- '--plugins',
- '@pattern-lab/plugin-tab',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- yield spawnCmd([
- 'enable',
- '--plugins',
- '@pattern-lab/plugin-tab',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- yield spawnCmd([
- 'disable',
- '--plugins',
- '@pattern-lab/plugin-tab',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- const config = JSON.parse(
- readFileSync(`${projectRoot}/patternlab-config.json`, 'utf8')
- );
- t.equal(
- config.plugins['@pattern-lab/plugin-tab'].enabled,
- false,
- 'and set the enabled flag to false in patternlab-config.json'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield spawnCmd([
+ 'init',
+ '--verbose',
+ '--project-dir',
+ projectRoot,
+ '--edition',
+ '@pattern-lab/edition-node',
+ '--starterkit',
+ '@pattern-lab/starterkit-mustache-base',
+ ]);
+ yield spawnCmd([
+ 'install',
+ '--plugins',
+ '@pattern-lab/plugin-tab',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ yield spawnCmd([
+ 'enable',
+ '--plugins',
+ '@pattern-lab/plugin-tab',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ yield spawnCmd([
+ 'disable',
+ '--plugins',
+ '@pattern-lab/plugin-tab',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ const config = JSON.parse(
+ readFileSync(`${projectRoot}/patternlab-config.json`, 'utf8')
+ );
+ t.equal(
+ config.plugins['@pattern-lab/plugin-tab'].enabled,
+ false,
+ 'and set the enabled flag to false in patternlab-config.json'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/cli-enable.test.js b/packages/cli/test/cli-enable.test.js
index 47b4a70ca..62b7d837a 100644
--- a/packages/cli/test/cli-enable.test.js
+++ b/packages/cli/test/cli-enable.test.js
@@ -7,39 +7,39 @@ const wrapAsync = require('../bin/utils').wrapAsync;
const projectRoot = getUniqueProjectPath();
tap.test('Enable ->', t =>
- wrapAsync(function*() {
- yield spawnCmd([
- 'init',
- '--verbose',
- '--project-dir',
- projectRoot,
- '--edition',
- '@pattern-lab/edition-node',
- '--starterkit',
- '@pattern-lab/starterkit-mustache-base',
- ]);
- yield spawnCmd([
- 'install',
- '--plugins',
- '@pattern-lab/plugin-tab',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- yield spawnCmd([
- 'enable',
- '--plugins',
- '@pattern-lab/plugin-tab',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- const config = JSON.parse(
- readFileSync(`${projectRoot}/patternlab-config.json`, 'utf8')
- );
- t.equal(
- config.plugins['@pattern-lab/plugin-tab'].enabled,
- true,
- 'and set the enabled flag in patternlab-config.json'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield spawnCmd([
+ 'init',
+ '--verbose',
+ '--project-dir',
+ projectRoot,
+ '--edition',
+ '@pattern-lab/edition-node',
+ '--starterkit',
+ '@pattern-lab/starterkit-mustache-base',
+ ]);
+ yield spawnCmd([
+ 'install',
+ '--plugins',
+ '@pattern-lab/plugin-tab',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ yield spawnCmd([
+ 'enable',
+ '--plugins',
+ '@pattern-lab/plugin-tab',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ const config = JSON.parse(
+ readFileSync(`${projectRoot}/patternlab-config.json`, 'utf8')
+ );
+ t.equal(
+ config.plugins['@pattern-lab/plugin-tab'].enabled,
+ true,
+ 'and set the enabled flag in patternlab-config.json'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/cli-export.test.js b/packages/cli/test/cli-export.test.js
index c6e266415..63e82ba06 100644
--- a/packages/cli/test/cli-export.test.js
+++ b/packages/cli/test/cli-export.test.js
@@ -8,26 +8,26 @@ const wrapAsync = require('../bin/utils').wrapAsync;
const projectRoot = getUniqueProjectPath();
tap.test('Init and export ->', t =>
- wrapAsync(function*() {
- yield spawnCmd([
- 'init',
- '--verbose',
- '--project-dir',
- projectRoot,
- '--edition',
- '@pattern-lab/edition-node',
- '--starterkit',
- '@pattern-lab/starterkit-mustache-base',
- ]);
- yield spawnCmd([
- 'export',
- '--config',
- `${projectRoot}/patternlab-config.json`,
- ]);
- t.ok(
- exists.sync(path.resolve(projectRoot, 'pattern_exports', 'patterns.zip')),
- ' should create patterns.zip'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield spawnCmd([
+ 'init',
+ '--verbose',
+ '--project-dir',
+ projectRoot,
+ '--edition',
+ '@pattern-lab/edition-node',
+ '--starterkit',
+ '@pattern-lab/starterkit-mustache-base',
+ ]);
+ yield spawnCmd([
+ 'export',
+ '--config',
+ `${projectRoot}/patternlab-config.json`,
+ ]);
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'pattern_exports', 'patterns.zip')),
+ ' should create patterns.zip'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/cli-init.test.js b/packages/cli/test/cli-init.test.js
index 8cfde79c4..a80c031ff 100644
--- a/packages/cli/test/cli-init.test.js
+++ b/packages/cli/test/cli-init.test.js
@@ -8,31 +8,31 @@ const wrapAsync = require('../bin/utils').wrapAsync;
const projectRoot = getUniqueProjectPath();
tap.test('Init ->', t =>
- wrapAsync(function*() {
- yield spawnCmd([
- 'init',
- '--verbose',
- '--project-dir',
- projectRoot,
- '--edition',
- '@pattern-lab/edition-node',
- '--starterkit',
- '@pattern-lab/starterkit-mustache-base',
- ]);
- t.ok(
- exists.sync(path.resolve(projectRoot)),
- 'should initialize a PatternLab project'
- );
- t.ok(exists.sync(path.resolve(projectRoot, 'source')), 'with a source dir');
- t.ok(exists.sync(path.resolve(projectRoot, 'public')), 'with a public dir');
- t.ok(
- exists.sync(path.resolve(projectRoot, 'pattern_exports')),
- 'with a pattern_exports dir'
- );
- t.ok(
- exists.sync(path.resolve(projectRoot, 'patternlab-config.json')),
- 'with a pattern_exports dir'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield spawnCmd([
+ 'init',
+ '--verbose',
+ '--project-dir',
+ projectRoot,
+ '--edition',
+ '@pattern-lab/edition-node',
+ '--starterkit',
+ '@pattern-lab/starterkit-mustache-base',
+ ]);
+ t.ok(
+ exists.sync(path.resolve(projectRoot)),
+ 'should initialize a Pattern Lab project'
+ );
+ t.ok(exists.sync(path.resolve(projectRoot, 'source')), 'with a source dir');
+ t.ok(exists.sync(path.resolve(projectRoot, 'public')), 'with a public dir');
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'pattern_exports')),
+ 'with a pattern_exports dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectRoot, 'patternlab-config.json')),
+ 'with a pattern_exports dir'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/export.test.js b/packages/cli/test/export.test.js
index 82c88c2d6..169b60771 100644
--- a/packages/cli/test/export.test.js
+++ b/packages/cli/test/export.test.js
@@ -3,29 +3,29 @@ const tap = require('tap');
const wrapAsync = require('../bin/utils').wrapAsync;
tap.test('Export ->', t => {
- t.plan(2);
- t.test('with options empty', tt =>
- wrapAsync(function*() {
- try {
- yield exportPatterns();
- } catch (err) {
- tt.type(err, TypeError, 'throws when options are empty');
- tt.end();
- }
- })
- );
- t.test('with options not an object', tt =>
- wrapAsync(function*() {
- try {
- yield exportPatterns(123);
- } catch (err) {
- tt.type(
- err,
- TypeError,
- 'throws when passed options are not of type object'
- );
- tt.end();
- }
- })
- );
+ t.plan(2);
+ t.test('with options empty', tt =>
+ wrapAsync(function*() {
+ try {
+ yield exportPatterns();
+ } catch (err) {
+ tt.type(err, TypeError, 'throws when options are empty');
+ tt.end();
+ }
+ })
+ );
+ t.test('with options not an object', tt =>
+ wrapAsync(function*() {
+ try {
+ yield exportPatterns(123);
+ } catch (err) {
+ tt.type(
+ err,
+ TypeError,
+ 'throws when passed options are not of type object'
+ );
+ tt.end();
+ }
+ })
+ );
});
diff --git a/packages/cli/test/install-plugin.test.js b/packages/cli/test/install-plugin.test.js
index f269b03e3..269953007 100644
--- a/packages/cli/test/install-plugin.test.js
+++ b/packages/cli/test/install-plugin.test.js
@@ -7,23 +7,23 @@ const moduleExist = require.resolve;
const projectRoot = getUniqueProjectPath();
const minimalConfig = {
- paths: {
- source: {
- root: projectRoot,
- },
- },
+ paths: {
+ source: {
+ root: projectRoot,
+ },
+ },
};
tap.test('Install plugin-tab ->', t =>
- wrapAsync(function*() {
- yield installPlugin('@pattern-lab/plugin-tab', minimalConfig);
- const pkg = yield moduleExist('@pattern-lab/plugin-tab');
- t.ok(pkg, 'module should exist after install');
- t.equal(
- minimalConfig.plugins['@pattern-lab/plugin-tab'].enabled,
- false,
- 'and persist it on the patternlab-config.json'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield installPlugin('@pattern-lab/plugin-tab', minimalConfig);
+ const pkg = yield moduleExist('@pattern-lab/plugin-tab');
+ t.ok(pkg, 'module should exist after install');
+ t.equal(
+ minimalConfig.plugins['@pattern-lab/plugin-tab'].enabled,
+ false,
+ 'and persist it on the patternlab-config.json'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/install-starterkit.test.js b/packages/cli/test/install-starterkit.test.js
index edaf78bd2..0cda685c9 100644
--- a/packages/cli/test/install-starterkit.test.js
+++ b/packages/cli/test/install-starterkit.test.js
@@ -7,72 +7,72 @@ const moduleExist = require.resolve;
const projectRoot = getUniqueProjectPath();
const minimalConfig = {
- paths: {
- source: {
- root: projectRoot,
- },
- },
+ paths: {
+ source: {
+ root: projectRoot,
+ },
+ },
};
tap.test('Install starterkit-mustache-demo ->', t =>
- wrapAsync(function*() {
- yield installStarterkit(
- '@pattern-lab/starterkit-mustache-demo',
- minimalConfig
- );
- const pkg = yield moduleExist('@pattern-lab/starterkit-mustache-demo');
- t.ok(pkg, 'module should exist after install');
- t.end();
- })
+ wrapAsync(function*() {
+ yield installStarterkit(
+ '@pattern-lab/starterkit-mustache-demo',
+ minimalConfig
+ );
+ const pkg = yield moduleExist('@pattern-lab/starterkit-mustache-demo');
+ t.ok(pkg, 'module should exist after install');
+ t.end();
+ })
);
tap.test('Install starterkit-mustache-base ->', t =>
- wrapAsync(function*() {
- yield installStarterkit(
- '@pattern-lab/starterkit-mustache-base',
- minimalConfig
- );
- const pkg = yield moduleExist('@pattern-lab/starterkit-mustache-base');
- t.ok(pkg, 'module should exist after install');
- t.end();
- })
+ wrapAsync(function*() {
+ yield installStarterkit(
+ '@pattern-lab/starterkit-mustache-base',
+ minimalConfig
+ );
+ const pkg = yield moduleExist('@pattern-lab/starterkit-mustache-base');
+ t.ok(pkg, 'module should exist after install');
+ t.end();
+ })
);
tap.test('Install starterkit-mustache-bootstrap ->', t =>
- wrapAsync(function*() {
- yield installStarterkit('starterkit-mustache-bootstrap', minimalConfig);
- const pkg = yield moduleExist('starterkit-mustache-bootstrap');
- t.ok(pkg, 'module should exist after install');
- t.end();
- })
+ wrapAsync(function*() {
+ yield installStarterkit('starterkit-mustache-bootstrap', minimalConfig);
+ const pkg = yield moduleExist('starterkit-mustache-bootstrap');
+ t.ok(pkg, 'module should exist after install');
+ t.end();
+ })
);
tap.test('Install starterkit-mustache-foundation ->', t =>
- wrapAsync(function*() {
- yield installStarterkit('starterkit-mustache-foundation', minimalConfig);
- const pkg = yield moduleExist('starterkit-mustache-foundation');
- t.ok(pkg, 'module should exist after install');
- t.end();
- })
+ wrapAsync(function*() {
+ yield installStarterkit('starterkit-mustache-foundation', minimalConfig);
+ const pkg = yield moduleExist('starterkit-mustache-foundation');
+ t.ok(pkg, 'module should exist after install');
+ t.end();
+ })
);
tap.test('Install starterkit-mustache-acidtest ->', t =>
- wrapAsync(function*() {
- yield installStarterkit('starterkit-mustache-acidtest', minimalConfig);
- const pkg = yield moduleExist('starterkit-mustache-acidtest');
- t.ok(pkg, 'module should exist after install');
- t.end();
- })
+ wrapAsync(function*() {
+ yield installStarterkit('starterkit-mustache-acidtest', minimalConfig);
+ const pkg = yield moduleExist('starterkit-mustache-acidtest');
+ t.ok(pkg, 'module should exist after install');
+ t.end();
+ })
);
tap.test('Install starterkit-mustache-materialdesign ->', t =>
- wrapAsync(function*() {
- yield installStarterkit(
- 'starterkit-mustache-materialdesign',
- minimalConfig
- );
- const pkg = yield moduleExist('starterkit-mustache-materialdesign');
- t.ok(pkg, 'module should exist after install');
- t.end();
- })
+ wrapAsync(function*() {
+ yield installStarterkit(
+ 'starterkit-mustache-materialdesign',
+ minimalConfig
+ );
+ const pkg = yield moduleExist('starterkit-mustache-materialdesign');
+ t.ok(pkg, 'module should exist after install');
+ t.end();
+ })
);
diff --git a/packages/cli/test/mocks/liverserver.mock.js b/packages/cli/test/mocks/liverserver.mock.js
index 141173eff..754fd5fc1 100644
--- a/packages/cli/test/mocks/liverserver.mock.js
+++ b/packages/cli/test/mocks/liverserver.mock.js
@@ -1,15 +1,15 @@
function liveServerMock() {
- return {
- reload: function() {
- return true;
- },
- refreshCSS: function() {
- return true;
- },
- start: function() {
- return true;
- },
- };
+ return {
+ reload: function() {
+ return true;
+ },
+ refreshCSS: function() {
+ return true;
+ },
+ start: function() {
+ return true;
+ },
+ };
}
module.exports = liveServerMock;
diff --git a/packages/cli/test/mocks/patternlab.mock.js b/packages/cli/test/mocks/patternlab.mock.js
index ce455a868..7186ca734 100644
--- a/packages/cli/test/mocks/patternlab.mock.js
+++ b/packages/cli/test/mocks/patternlab.mock.js
@@ -1,21 +1,21 @@
function patternLabMock() {
- return {
- build: function() {
- return true;
- },
- help: function() {
- return true;
- },
- patternsonly: function() {
- return true;
- },
- liststarterkits: function() {
- return true;
- },
- loadstarterkit: function() {
- return true;
- },
- };
+ return {
+ build: function() {
+ return true;
+ },
+ help: function() {
+ return true;
+ },
+ patternsonly: function() {
+ return true;
+ },
+ liststarterkits: function() {
+ return true;
+ },
+ loadstarterkit: function() {
+ return true;
+ },
+ };
}
module.exports = patternLabMock;
diff --git a/packages/cli/test/replace_config_paths.test.js b/packages/cli/test/replace_config_paths.test.js
index 580958842..6a98385ac 100644
--- a/packages/cli/test/replace_config_paths.test.js
+++ b/packages/cli/test/replace_config_paths.test.js
@@ -4,41 +4,41 @@ const replaceConfigPaths = require('../bin/replace-config');
const config = patternlab.getDefaultConfig();
tap.test('replaceConfigPaths ->', t => {
- const newConfig = replaceConfigPaths(
- config,
- 'projectDir',
- 'sourceDir',
- 'publicDir',
- 'exportDir'
- );
- for (const k of Object.keys(newConfig.paths.source)) {
- if (k === 'patternlabFiles') {
- for (const l of Object.keys(newConfig.paths.source[k])) {
- t.ok(
- /^projectDir\/sourceDir\/|^\.\/node_modules/.test(
- newConfig.paths.source[k][l]
- ),
- `should be ok for newConfig.paths.source.${k}.${l}`
- );
- }
- } else {
- t.ok(
- /^projectDir\/sourceDir\/|^\.\/node_modules/.test(
- newConfig.paths.source[k]
- ),
- `should be ok for newConfig.paths.source.${k}`
- );
- }
- }
- for (const l of Object.keys(newConfig.paths.public)) {
- t.ok(
- /^projectDir\/publicDir\//.test(newConfig.paths.public[l]),
- `should be ok for newConfig.paths.public.${l}`
- );
- }
- t.ok(
- /^projectDir\/exportDir/.test(newConfig.patternExportDirectory),
- `should be ok for newConfig.patternExportDirectory`
- );
- t.end();
+ const newConfig = replaceConfigPaths(
+ config,
+ 'projectDir',
+ 'sourceDir',
+ 'publicDir',
+ 'exportDir'
+ );
+ for (const k of Object.keys(newConfig.paths.source)) {
+ if (k === 'patternlabFiles') {
+ for (const l of Object.keys(newConfig.paths.source[k])) {
+ t.ok(
+ /^projectDir\/sourceDir\/|^\.\/node_modules/.test(
+ newConfig.paths.source[k][l]
+ ),
+ `should be ok for newConfig.paths.source.${k}.${l}`
+ );
+ }
+ } else {
+ t.ok(
+ /^projectDir\/sourceDir\/|^\.\/node_modules/.test(
+ newConfig.paths.source[k]
+ ),
+ `should be ok for newConfig.paths.source.${k}`
+ );
+ }
+ }
+ for (const l of Object.keys(newConfig.paths.public)) {
+ t.ok(
+ /^projectDir\/publicDir\//.test(newConfig.paths.public[l]),
+ `should be ok for newConfig.paths.public.${l}`
+ );
+ }
+ t.ok(
+ /^projectDir\/exportDir/.test(newConfig.patternExportDirectory),
+ `should be ok for newConfig.patternExportDirectory`
+ );
+ t.end();
});
diff --git a/packages/cli/test/resolve_config.test.js b/packages/cli/test/resolve_config.test.js
index 7986cdb99..36c250d9a 100644
--- a/packages/cli/test/resolve_config.test.js
+++ b/packages/cli/test/resolve_config.test.js
@@ -3,16 +3,16 @@ const wrapAsync = require('../bin/utils').wrapAsync;
const resolveConfig = require('../bin/resolve-config');
tap.test('resolveConfig ->', t =>
- wrapAsync(function*() {
- const config = yield resolveConfig(
- './test/fixtures/patternlab-config.json'
- );
- const badConfig = yield resolveConfig(123);
- const configNotFound = yield resolveConfig('./test/fixtures/some-config');
- t.type(config, 'object', 'should return a config of type object');
- t.ok(config.paths, 'config should have a paths property');
- t.notOk(badConfig, 'returns false when configPath is not of type string');
- t.notOk(configNotFound, 'returns false when configPath is not found');
- t.end();
- })
+ wrapAsync(function*() {
+ const config = yield resolveConfig(
+ './test/fixtures/patternlab-config.json'
+ );
+ const badConfig = yield resolveConfig(123);
+ const configNotFound = yield resolveConfig('./test/fixtures/some-config');
+ t.type(config, 'object', 'should return a config of type object');
+ t.ok(config.paths, 'config should have a paths property');
+ t.notOk(badConfig, 'returns false when configPath is not of type string');
+ t.notOk(configNotFound, 'returns false when configPath is not found');
+ t.end();
+ })
);
diff --git a/packages/cli/test/scaffold.test.js b/packages/cli/test/scaffold.test.js
index 993388551..c63d2365d 100644
--- a/packages/cli/test/scaffold.test.js
+++ b/packages/cli/test/scaffold.test.js
@@ -11,21 +11,21 @@ const publicDir = 'public';
const exportDir = 'patterns_export';
tap.test('Scaffold ->', t =>
- wrapAsync(function*() {
- yield scaffold(projectDir, sourceDir, publicDir, exportDir);
- t.ok(exists.sync(path.resolve(projectDir)), 'should create project dir');
- t.ok(
- exists.sync(path.resolve(projectDir, sourceDir)),
- 'should create source dir'
- );
- t.ok(
- exists.sync(path.resolve(projectDir, publicDir)),
- 'should create public dir'
- );
- t.ok(
- exists.sync(path.resolve(projectDir, exportDir)),
- 'should create export dir'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ yield scaffold(projectDir, sourceDir, publicDir, exportDir);
+ t.ok(exists.sync(path.resolve(projectDir)), 'should create project dir');
+ t.ok(
+ exists.sync(path.resolve(projectDir, sourceDir)),
+ 'should create source dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectDir, publicDir)),
+ 'should create public dir'
+ );
+ t.ok(
+ exists.sync(path.resolve(projectDir, exportDir)),
+ 'should create export dir'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/serve.test.js b/packages/cli/test/serve.test.js
index c2fa761fd..c322cc41d 100644
--- a/packages/cli/test/serve.test.js
+++ b/packages/cli/test/serve.test.js
@@ -7,45 +7,45 @@ const wrapAsync = require('../bin/utils').wrapAsync;
// Require preview but mock patternlab so that we only test the module behavior
const preview = proxyquire('../bin/serve', {
- '@pattern-lab/core': patternLabMock,
+ '@pattern-lab/core': patternLabMock,
});
tap.test('Serve ->', t =>
- wrapAsync(function*() {
- const config = yield resolveConfig(
- './test/fixtures/patternlab-config.json'
- );
- config.paths.source.root = undefined;
- t.throws(
- () => {
- preview();
- },
- {},
- 'throws when config is empty'
- );
- t.throws(
- () => {
- preview(123);
- },
- {},
- 'throws when config is not of type object'
- );
- t.throws(
- () => {
- _.unset(config, 'paths.source.root');
- preview(config);
- },
- {},
- 'throws when no source root dir is set on config'
- );
- t.throws(
- () => {
- _.unset(config, 'paths.public.root');
- preview(config);
- },
- {},
- 'throws when no public root dir is set on config'
- );
- t.end();
- })
+ wrapAsync(function*() {
+ const config = yield resolveConfig(
+ './test/fixtures/patternlab-config.json'
+ );
+ config.paths.source.root = undefined;
+ t.throws(
+ () => {
+ preview();
+ },
+ {},
+ 'throws when config is empty'
+ );
+ t.throws(
+ () => {
+ preview(123);
+ },
+ {},
+ 'throws when config is not of type object'
+ );
+ t.throws(
+ () => {
+ _.unset(config, 'paths.source.root');
+ preview(config);
+ },
+ {},
+ 'throws when no source root dir is set on config'
+ );
+ t.throws(
+ () => {
+ _.unset(config, 'paths.public.root');
+ preview(config);
+ },
+ {},
+ 'throws when no public root dir is set on config'
+ );
+ t.end();
+ })
);
diff --git a/packages/cli/test/utils/getUniqueProjectPath.js b/packages/cli/test/utils/getUniqueProjectPath.js
index aaa153e35..0ac892b19 100644
--- a/packages/cli/test/utils/getUniqueProjectPath.js
+++ b/packages/cli/test/utils/getUniqueProjectPath.js
@@ -1,6 +1,6 @@
const crypto = require('crypto');
module.exports = () => {
- const UUID = crypto.randomBytes(16).toString('hex');
- return `./tmp/${UUID}`;
+ const UUID = crypto.randomBytes(16).toString('hex');
+ return `./tmp/${UUID}`;
};
diff --git a/packages/cli/test/utils/spawnCmd.js b/packages/cli/test/utils/spawnCmd.js
index e2e0306cd..4d0623515 100644
--- a/packages/cli/test/utils/spawnCmd.js
+++ b/packages/cli/test/utils/spawnCmd.js
@@ -4,10 +4,10 @@ const wrapAsync = require('../../bin/utils').wrapAsync;
const cli = path.resolve(__dirname, '../../bin/patternlab.js');
const spawnCmd = (args, endFn) =>
- wrapAsync(function*() {
- const fn = endFn || function() {};
- yield spawn('node', [cli].concat(args));
- fn();
- });
+ wrapAsync(function*() {
+ const fn = endFn || function() {};
+ yield spawn('node', [cli].concat(args));
+ fn();
+ });
module.exports = spawnCmd;
diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js
new file mode 100644
index 000000000..5a2cc7f1e
--- /dev/null
+++ b/packages/core/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ['../../.eslintrc.js'],
+};
diff --git a/packages/core/.npmrc b/packages/core/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/core/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/core/.nvmrc b/packages/core/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/core/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index aafeb53c1..dc3dbfe77 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -3,109 +3,329 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [3.0.0-alpha.11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.10...@pattern-lab/core@3.0.0-alpha.11) (2018-03-21)
-
-
-### Bug Fixes
-
-* **changes_hunter:** guard for incrementalRebuild while watching ([c652b9c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/c652b9c)), closes [#794](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/794) [#802](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/802)
-* **data_loader:** look for exact name of the file passed in ([eb46be2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/eb46be2))
-* **get:** add internal ability to omit missing pattern warning ([e3dddc6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/e3dddc6)), closes [#786](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/786)
-* **lint:** run code through prettier ([ca52fde](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/ca52fde)), closes [#825](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/825)
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/337aa32))
-* **tests:** Revert annotations file back to expected legacy format ([3618f27](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/3618f27))
-
-
-### Features
-
-* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/7f4ce6f))
-
-
-
-
-
-# [3.0.0-alpha.10](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.9...@pattern-lab/core@3.0.0-alpha.10) (2018-03-05)
-
-
-### Bug Fixes
-
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/1473cd5))
-* **config:** update patch to uikit files ([5ccd0d2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5ccd0d2))
-* **package:** clarify description of package ([c65611e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/c65611e))
-
-
-### Features
-
-* **README:** Update for brevity and consistency ([aec7c50](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/aec7c50))
-
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v5.9.2...v5.9.3) (2020-05-01)
+**Note:** Version bump only for package @pattern-lab/core
-
-# 3.0.0-alpha.9 (2018-03-02)
-### Bug Fixes
-
-* **core:** Fix tests ([31d67a7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/31d67a7))
-* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/58beeb6))
-
-
-### Features
-
-* **core:** Add tests for help command ([62cd8fb](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/62cd8fb))
-* **package:** Hoist up tap and test command. ([6cacdb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/6cacdb6))
-* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5eb2c11))
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v5.8.0...v5.9.0) (2020-04-24)
-
-
-
-# [3.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-alpha.7...v3.0.0-alpha.8) (2018-02-22)
-
### Bug Fixes
-* **asset copy:** Resolve paths correctly. Break apart files & asyncify ([379419c](https://github.com/pattern-lab/patternlab-node/commit/379419c))
-* **event emission:** Commit failing test ([12ccbd7](https://github.com/pattern-lab/patternlab-node/commit/12ccbd7))
-* **event emission:** Only listen once to changes ([ea6b7d3](https://github.com/pattern-lab/patternlab-node/commit/ea6b7d3))
-* **loadPattern:** Check proper data file paths for modification ([b7ba5b0](https://github.com/pattern-lab/patternlab-node/commit/b7ba5b0))
-* **package** Update dependencies to reduce vulnerabilities ([367d38f](https://github.com/pattern-lab/patternlab-node/commit/367d38f))
-* **package:** Update gitignore and npmignore with current files ([581b3c4](https://github.com/pattern-lab/patternlab-node/commit/581b3c4))
-* **serve:** Reference events by constants ([9f5c143](https://github.com/pattern-lab/patternlab-node/commit/9f5c143))
-* **test configuration:** Remove vestigial configuration entries ([481fce9](https://github.com/pattern-lab/patternlab-node/commit/481fce9))
-* **watchPatternLabFiles:** Register and manager watchers ([48f0190](https://github.com/pattern-lab/patternlab-node/commit/48f0190))
-
-### Features
-
-* **docs:** Add jsdoc output to public API and events ([d45e7b9](https://github.com/pattern-lab/patternlab-node/commit/d45e7b9))
-* **docs:** Experiment with doc generation ([8e1808b](https://github.com/pattern-lab/patternlab-node/commit/8e1808b))
-* **index:** Make the cleaning of public/ an asynchronous adventure ([bd485d2](https://github.com/pattern-lab/patternlab-node/commit/bd485d2))
-* **package:** Communicate official node support ([96ca87f](https://github.com/pattern-lab/patternlab-node/commit/96ca87f))
-* **pattern lab:** Copy pattern-specific js ([99bfc02](https://github.com/pattern-lab/patternlab-node/commit/99bfc02))
-* **pattern lab:** Pass `patternPartial` as data to render ([351ea5e](https://github.com/pattern-lab/patternlab-node/commit/351ea5e))
-
-
-
-# [3.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-alpha.6...v3.0.0-alpha.7) (2018-01-19)
-
-### Bug Fixes
-
-* **lint:** Manually resolve final lint issues ([7cad1f1](https://github.com/pattern-lab/patternlab-node/commit/7cad1f1))
-* **README:** Fix npm link instructions ([ce3a7f0](https://github.com/pattern-lab/patternlab-node/commit/ce3a7f0))
-* **README:** Update npm shield to point to scoped package ([1f62617](https://github.com/pattern-lab/patternlab-node/commit/1f62617)), closes [#760](https://github.com/pattern-lab/patternlab-node/issues/760)
-* **unit test:** Fix path to fixture ([b932f14](https://github.com/pattern-lab/patternlab-node/commit/b932f14))
-
-### Features
-
-* **Contributing:** Update contributing info with prettier ([2a0ce52](https://github.com/pattern-lab/patternlab-node/commit/2a0ce52))
-* **list_item_hunter:** Re-work algorithm ([1ac77a7](https://github.com/pattern-lab/patternlab-node/commit/1ac77a7))
-* **package:** Add prettier ([b8e3e11](https://github.com/pattern-lab/patternlab-node/commit/b8e3e11))
-* **package:** Add prettier precommit hook ([a0b85b5](https://github.com/pattern-lab/patternlab-node/commit/a0b85b5))
-* **package:** Add standard version ([b2ba31c](https://github.com/pattern-lab/patternlab-node/commit/b2ba31c))
-* **README:** Add prettier badge ([7c2787b](https://github.com/pattern-lab/patternlab-node/commit/7c2787b))
-
----
-
+* **core:** do not warn about uikit-polyfills ([6bb68e7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/6bb68e763769969546542bf7aaf6d1f4235c6622))
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/core
+
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+
+### Bug Fixes
+
+* add a new method to check if PL is currently compiling + add new method to get the config PL is using ([26e886c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/26e886c93db5d135c91de648724f7278c4d5b3e9))
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+
+### Bug Fixes
+
+* **core:** re-add cleanPublic fix ([c100bbc](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/c100bbca3f339e9132acb9c482e98c1c8a66b8b5))
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **config:** add new default pattern export options ([a7487a0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/a7487a0681cb11e6f3c5c8eaefd62e5648ad5ea3))
+* **core:** fix pattern export all conflicts ([b210d82](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/b210d820ba8ac0b64c82c7ff0f18c9f8a900fce2))
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* add eslint fixes ([00d7bbe](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/00d7bbe319ea77a6ee8cc9cd0348856feaaf13ad))
+* correct typo in build logging ([96d989f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/96d989f8869630ba9f59705bfca66755f20e35ab))
+* updates to address eslint / prettier issues ([d945acc](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/d945acc13b8e4e36f3815b017fbc12266c323d1f))
+* updates to fix eslint / prettier issues; update packages/core to reuse root .eslintrc.js file ([5b7a057](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5b7a057d46ccd16b5832af1441030c7b76f237a8))
+* **1049:** Treat folders like patterns only if they're subfolders of pattern groupings ([4eb79ab](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/4eb79ab48b335a35b2e5ed3b7053974b8e8bb6b6))
+* **core:** allow plugin resolution to follow normal algorithm ([3f6b83b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/3f6b83be080c88aec1d8b73bececb76f0f57a79d))
+* **core:** find plugins from config only and with simpler args ([fe7351c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/fe7351cba346425512cbb2ef3a1b7728ab06ae60))
+* **plugin:** correct spelling error and function locations ([d4abd88](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/d4abd88cb017550002407241b5045a2ad1adb1dc))
+
+
+### Features
+
+* **core:** invoke registered plugin hooks ([a54d775](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/a54d7753b6939fe6a58da543f4fb34f64dd8901a))
+* **plugin-tab, core:** initial plugin hook exploration ([2f3d39a](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/2f3d39ac6b125ad4c6b872e27ee224ce2ea33a12))
+
+
+### BREAKING CHANGES
+
+* **core:** plugins now use async functions instead of events
+
+
+
+
+
+
+## [3.0.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.1...@pattern-lab/core@3.0.2) (2019-08-23)
+
+
+### Bug Fixes
+
+* add eslint fixes ([00d7bbe](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/00d7bbe))
+* correct typo in build logging ([96d989f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/96d989f))
+* updates to address eslint / prettier issues ([d945acc](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/d945acc))
+* updates to fix eslint / prettier issues; update packages/core to reuse root .eslintrc.js file ([5b7a057](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5b7a057))
+
+
+
+
+
+
+## [3.0.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.1-alpha.0...@pattern-lab/core@3.0.1) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/core
+
+
+
+
+
+# [3.0.0-beta.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-beta.0...@pattern-lab/core@3.0.0-beta.2) (2019-02-09)
+
+
+### Bug Fixes
+
+* **cli:** pass watch options cleanly to core ([8bf186b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/8bf186b))
+* **docs:** regenerate API documentation ([830c568](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/830c568))
+* **patterns:** find all patterns inlcuding pseudo patterns ([d0672f6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/d0672f6)), closes [#975](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/975)
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/98dfadf))
+
+
+
+
+
+
+# [3.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.16...@pattern-lab/core@3.0.0-beta.0) (2018-09-07)
+
+
+### Bug Fixes
+
+* **docs:** update event info with tab example ([0f227a3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/0f227a3))
+* **package:** Allow .json extension on annotations file (issue [#836](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/836)) ([b92e62b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/b92e62b))
+* **package:** update tap dependency ([2b70ff4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/2b70ff4))
+* **plugins:** support scoped packages ([44f0f8e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/44f0f8e))
+
+
+### Features
+
+* **API:** remove reliance on patternlab object during plugin install ([0850fd6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/0850fd6))
+* **core:** remove plugin install / disable / enable logic ([5a58824](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5a58824)), closes [#872](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/872)
+
+
+
+
+
+
+
+# [3.0.0-alpha.16](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.15...@pattern-lab/core@3.0.0-alpha.16) (2018-07-06)
+
+**Note:** Version bump only for package @pattern-lab/core
+
+
+
+# [3.0.0-alpha.15](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.14...@pattern-lab/core@3.0.0-alpha.15) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5ab3995))
+
+
+
+# [3.0.0-alpha.14](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.13...@pattern-lab/core@3.0.0-alpha.14) (2018-07-05)
+
+### Bug Fixes
+
+* **core:** rename serverModule import to avoid conflict with CLI ([f3170e7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/f3170e7))
+* **server:** remove setInterval hack ([a76e4a2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/a76e4a2))
+* **uikits:** fix generation of view all pages within uikits ([7d6bdce](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/7d6bdce))
+* **viewall:** fix viewall generation ([543558a](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/543558a))
+* **watch:** wire up serve and watch listeners correctly ([04cd18e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/04cd18e))
+
+### Features
+
+* **events:** add PATTERNLAB_BUILD_END event and rename BUILD_START ([5b7bfa3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5b7bfa3))
+* **help:** remove help. API is now documented ([2aef3a1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/2aef3a1))
+* **server:** beginning of refator ([a3d65c3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/a3d65c3))
+* **server:** continue server refactor ([8f6cd91](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/8f6cd91))
+* **watches:** add additional assets to ignore ([18e74c2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/18e74c2))
+
+
+
+# [3.0.0-alpha.13](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.12...@pattern-lab/core@3.0.0-alpha.13) (2018-05-04)
+
+### Features
+
+* **api:** expose getVersion statically ([4683cd0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/4683cd0))
+
+
+
+# [3.0.0-alpha.12](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.11...@pattern-lab/core@3.0.0-alpha.12) (2018-05-04)
+
+### Bug Fixes
+
+* **build:** improve stability of changes causing a live-server reload ([06c6123](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/06c6123))
+* **buildPatterns:** move meta processing back into function for now ([cea2c45](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/cea2c45))
+* **pattern graph:** move support and coverage of graph file to root ([bb9ef3c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/bb9ef3c))
+* **pattern watch:** Defensively add change listeners ([cdbd11f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/cdbd11f))
+* **test:** fix the test please and thank you ([cdc6c38](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/cdc6c38))
+* **test:** sledgehammer a test ([8b34be0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/8b34be0))
+* **tests:** prevent dependency graph output file from being written ([0d9c57e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/0d9c57e))
+* **uikits:** fix ui_builder_tests ([e75f434](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/e75f434))
+
+### Features
+
+* **API:** standardize v() and version() into a single call ([6309e69](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/6309e69))
+* **uikits:** add uikits to test config ([43a2017](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/43a2017))
+* **uikits:** additional test coverage ([f5b60b2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/f5b60b2))
+* **uikits:** additional test coverage of the main API ([fbcacfb](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/fbcacfb))
+* **uikits:** clean each build directory if configured ([8e11342](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/8e11342))
+* **uikits:** copy pattern-specific javascript ([3ac93dc](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/3ac93dc))
+* **uikits:** create MVP output to disk ([e1598d3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/e1598d3))
+* **uikits:** filter out excluded pattern states from uikit output ([87c9d0d](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/87c9d0d))
+* **uikits:** load uikits before build ([4565202](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/4565202))
+* **uikits:** output assets and annotations to each location ([b0a84ca](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/b0a84ca))
+* **uikits:** output pattern files to each location ([5df87b0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5df87b0))
+* **uikits:** promote dependencyGraph.json output to root ([dd3e708](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/dd3e708))
+* **uikits:** render header and footer data correctly ([f2a6f23](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/f2a6f23))
+* **uikits:** support incremental builds ([6670364](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/6670364))
+* **uikits:** support watched-asset copying ([4f05311](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/4f05311))
+* **uikits:** uikits config to default ([a393851](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/a393851))
+
+### BREAKING CHANGES
+
+* **API:** change `version()` to return a string representation of the version, removing `v()`
+
+
+
+# [3.0.0-alpha.11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.10...@pattern-lab/core@3.0.0-alpha.11) (2018-03-21)
+
+### Bug Fixes
+
+* **changes_hunter:** guard for incrementalRebuild while watching ([c652b9c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/c652b9c)), closes [#794](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/794) [#802](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/802)
+* **data_loader:** look for exact name of the file passed in ([eb46be2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/eb46be2))
+* **get:** add internal ability to omit missing pattern warning ([e3dddc6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/e3dddc6)), closes [#786](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/786)
+* **lint:** run code through prettier ([ca52fde](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/ca52fde)), closes [#825](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/issues/825)
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/337aa32))
+* **tests:** Revert annotations file back to expected legacy format ([3618f27](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/3618f27))
+
+### Features
+
+* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/7f4ce6f))
+
+
+
+# [3.0.0-alpha.10](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/compare/@pattern-lab/core@3.0.0-alpha.9...@pattern-lab/core@3.0.0-alpha.10) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/1473cd5))
+* **config:** update patch to uikit files ([5ccd0d2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5ccd0d2))
+* **package:** clarify description of package ([c65611e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/c65611e))
+
+### Features
+
+* **README:** Update for brevity and consistency ([aec7c50](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/aec7c50))
+
+
+
+# 3.0.0-alpha.9 (2018-03-02)
+
+### Bug Fixes
+
+* **core:** Fix tests ([31d67a7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/31d67a7))
+* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/58beeb6))
+
+### Features
+
+* **core:** Add tests for help command ([62cd8fb](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/62cd8fb))
+* **package:** Hoist up tap and test command. ([6cacdb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/6cacdb6))
+* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core/commit/5eb2c11))
+
+
+
+# [3.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-alpha.7...v3.0.0-alpha.8) (2018-02-22)
+
+### Bug Fixes
+
+* **asset copy:** Resolve paths correctly. Break apart files & asyncify ([379419c](https://github.com/pattern-lab/patternlab-node/commit/379419c))
+* **event emission:** Commit failing test ([12ccbd7](https://github.com/pattern-lab/patternlab-node/commit/12ccbd7))
+* **event emission:** Only listen once to changes ([ea6b7d3](https://github.com/pattern-lab/patternlab-node/commit/ea6b7d3))
+* **loadPattern:** Check proper data file paths for modification ([b7ba5b0](https://github.com/pattern-lab/patternlab-node/commit/b7ba5b0))
+* **package** Update dependencies to reduce vulnerabilities ([367d38f](https://github.com/pattern-lab/patternlab-node/commit/367d38f))
+* **package:** Update gitignore and npmignore with current files ([581b3c4](https://github.com/pattern-lab/patternlab-node/commit/581b3c4))
+* **serve:** Reference events by constants ([9f5c143](https://github.com/pattern-lab/patternlab-node/commit/9f5c143))
+* **test configuration:** Remove vestigial configuration entries ([481fce9](https://github.com/pattern-lab/patternlab-node/commit/481fce9))
+* **watchPatternLabFiles:** Register and manager watchers ([48f0190](https://github.com/pattern-lab/patternlab-node/commit/48f0190))
+
+### Features
+
+* **docs:** Add jsdoc output to public API and events ([d45e7b9](https://github.com/pattern-lab/patternlab-node/commit/d45e7b9))
+* **docs:** Experiment with doc generation ([8e1808b](https://github.com/pattern-lab/patternlab-node/commit/8e1808b))
+* **index:** Make the cleaning of public/ an asynchronous adventure ([bd485d2](https://github.com/pattern-lab/patternlab-node/commit/bd485d2))
+* **package:** Communicate official node support ([96ca87f](https://github.com/pattern-lab/patternlab-node/commit/96ca87f))
+* **pattern lab:** Copy pattern-specific js ([99bfc02](https://github.com/pattern-lab/patternlab-node/commit/99bfc02))
+* **pattern lab:** Pass `patternPartial` as data to render ([351ea5e](https://github.com/pattern-lab/patternlab-node/commit/351ea5e))
+
+
+
+# [3.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-alpha.6...v3.0.0-alpha.7) (2018-01-19)
+
+### Bug Fixes
+
+* **lint:** Manually resolve final lint issues ([7cad1f1](https://github.com/pattern-lab/patternlab-node/commit/7cad1f1))
+* **README:** Fix npm link instructions ([ce3a7f0](https://github.com/pattern-lab/patternlab-node/commit/ce3a7f0))
+* **README:** Update npm shield to point to scoped package ([1f62617](https://github.com/pattern-lab/patternlab-node/commit/1f62617)), closes [#760](https://github.com/pattern-lab/patternlab-node/issues/760)
+* **unit test:** Fix path to fixture ([b932f14](https://github.com/pattern-lab/patternlab-node/commit/b932f14))
+
+### Features
+
+* **Contributing:** Update contributing info with prettier ([2a0ce52](https://github.com/pattern-lab/patternlab-node/commit/2a0ce52))
+* **list_item_hunter:** Re-work algorithm ([1ac77a7](https://github.com/pattern-lab/patternlab-node/commit/1ac77a7))
+* **package:** Add prettier ([b8e3e11](https://github.com/pattern-lab/patternlab-node/commit/b8e3e11))
+* **package:** Add prettier precommit hook ([a0b85b5](https://github.com/pattern-lab/patternlab-node/commit/a0b85b5))
+* **package:** Add standard version ([b2ba31c](https://github.com/pattern-lab/patternlab-node/commit/b2ba31c))
+* **README:** Add prettier badge ([7c2787b](https://github.com/pattern-lab/patternlab-node/commit/7c2787b))
+
+---
+
Older releases found at https://github.com/pattern-lab/patternlab-node/wiki/ChangeLog
diff --git a/packages/core/README.md b/packages/core/README.md
index 62f5ec2cc..f6a81c7bd 100644
--- a/packages/core/README.md
+++ b/packages/core/README.md
@@ -28,9 +28,9 @@ See [Usage](#usage) for more information.
For users wanting a more pre-packaged experience several editions are available.
-* [Pattern Lab/Node: Vanilla Edition](https://github.com/pattern-lab/patternlab-node/packages/edition-node) contains info how to get started within a pure node environment.
+* [Pattern Lab/Node: Vanilla Edition](https://github.com/pattern-lab/patternlab-node/tree/dev/packages/edition-node) contains info how to get started within a pure node environment.
-* [Pattern Lab/Node: Gulp Edition](https://github.com/pattern-lab/patternlab-node/packages/edition-node-gulp) contains info how to get started within a Gulp task running environment.
+* [Pattern Lab/Node: Gulp Edition](https://github.com/pattern-lab/patternlab-node/tree/dev/packages/edition-node-gulp) contains info how to get started within a Gulp task running environment.
## Ecosystem
@@ -63,7 +63,7 @@ patternlab.serve({
* Read more about the rest of [Public API](./docs), and already implemented for you within [Editions](#editions).
-* A full-featured [command line interface](https://github.com/pattern-lab/patternlab-node/packages/cli) is also available.
+* A full-featured [command line interface](https://github.com/pattern-lab/patternlab-node/tree/dev/packages/cli) is also available.
### Events
diff --git a/packages/core/docs/README.md b/packages/core/docs/README.md
index 16ad07812..7317083f6 100644
--- a/packages/core/docs/README.md
+++ b/packages/core/docs/README.md
@@ -10,108 +10,188 @@
``` javascript
const config = require('./patternlab-config.json');
-const patternlab = require('patternlab-node')(config);
+const patternlab = require('@pattern-lab/core')(config);
```
-## Events
-
-Pattern Lab emits numerous [events](./events.md).
-
-## Functions
+
+## `patternlab` : object
+Build thoughtful, pattern-driven user interfaces using atomic design principles.
Many of these functions are exposed to users within [Editions](https://github.com/pattern-lab/patternlab-node#editions), but [direct consumption](https://github.com/pattern-lab/patternlab-node#direct-consumption) is also encouraged.
-## `getDefaultConfig()` ⇒ object
-
- Returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
-
-**Returns**: object - Returns the object representation of the `patternlab-config.json`
-## `version()` ⇒ void
-
- Logs current version to standard output
-
-**Returns**: void - current patternlab-node version as defined in `package.json`
-## `v()` ⇒ string
-
- Returns current version
-
+**Kind**: global namespace
+**See**
+
+- [patternlab.io](patternlab.io) for more documentation.
+- [https://github.com/pattern-lab/patternlab-node](https://github.com/pattern-lab/patternlab-node) for code, issues, and releases
+
+**License**: MIT
+
+* [`patternlab`](#patternlab) : object
+ * _instance_
+ * [`.version`](#patternlab+version) ⇒ string
+ * [`.build`](#patternlab+build) ⇒ Promise
+ * [`.getDefaultConfig`](#patternlab+getDefaultConfig) ⇒ object
+ * [`.getSupportedTemplateExtensions`](#patternlab+getSupportedTemplateExtensions) ⇒ Array.<string>
+ * [`.installplugin`](#patternlab+installplugin) ⇒ void
+ * [`.liststarterkits`](#patternlab+liststarterkits) ⇒ Promise
+ * [`.loadstarterkit`](#patternlab+loadstarterkit) ⇒ void
+ * [`.patternsonly`](#patternlab+patternsonly) ⇒ Promise
+ * _static_
+ * [`.getDefaultConfig`](#patternlab.getDefaultConfig) ⇒ object
+ * [`.getVersion`](#patternlab.getVersion) ⇒ string
+ * [`.server`](#patternlab.server) : object
+ * [`.serve(options)`](#patternlab.server.serve) ⇒ Promise
+ * [`.reload()`](#patternlab.server.reload) ⇒ Promise
+ * [`.refreshCSS()`](#patternlab.server.refreshCSS) ⇒ Promise
+ * [`.events`](#patternlab.events) : EventEmitter
+
+
+
+### `patternlab.version` ⇒ string
+Returns current version
+
+**Kind**: instance property of [patternlab](#patternlab)
**Returns**: string - current patternlab-node version as defined in `package.json`, as string
-## `build(options)` ⇒ Promise
+
- Builds patterns, copies assets, and constructs user interface
+### `patternlab.build` ⇒ Promise
+Builds patterns, copies assets, and constructs user interface
+**Kind**: instance property of [patternlab](#patternlab)
**Returns**: Promise - a promise fulfilled when build is complete
+**Emits**: event:PATTERNLAB_BUILD_START, event:PATTERNLAB_BUILD_END
+**See**: [all events](./events.md)
-| Param | Type | Description |
-| --- | --- | --- |
-| options | object | an object used to control build behavior |
-| options.cleanPublic | bool | whether or not to delete the configured output location (usually `public/`) before build |
-| options.data | object | additional data to be merged with global data prior to build |
-| options.watch | bool | whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild |
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| options | object | | an object used to control build behavior |
+| [options.cleanPublic] | bool | true | whether or not to delete the configured output location (usually `public/`) before build |
+| [options.data] | object | {} | additional data to be merged with global data prior to build |
+| [options.watch] | bool | true | whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild |
-## `getDefaultConfig()` ⇒ object
+
- Returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
+### `patternlab.getDefaultConfig` ⇒ object
+Returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
+**Kind**: instance property of [patternlab](#patternlab)
**Returns**: object - Returns the object representation of the `patternlab-config.json`
-## `getSupportedTemplateExtensions()` ⇒ Array.<string>
+
- Returns all file extensions supported by installed PatternEngines
+### `patternlab.getSupportedTemplateExtensions` ⇒ Array.<string>
+Returns all file extensions supported by installed PatternEngines
+**Kind**: instance property of [patternlab](#patternlab)
**Returns**: Array.<string> - all supported file extensions
-## `help()` ⇒ void
-
- Logs usage to standard output
-
-**Returns**: void - pattern lab API usage, as console output
-## `installplugin(pluginName)` ⇒ void
+
- Installs plugin already available via `node_modules/`
+### `patternlab.installplugin` ⇒ void
+Installs plugin already available via `node_modules/`
+**Kind**: instance property of [patternlab](#patternlab)
| Param | Type | Description |
| --- | --- | --- |
| pluginName | string | name of plugin |
-## `liststarterkits()` ⇒ Promise
+
- Fetches starterkit repositories from pattern-lab github org that contain 'starterkit' in their name
+### `patternlab.liststarterkits` ⇒ Promise
+Fetches starterkit repositories from pattern-lab github org that contain 'starterkit' in their name
+**Kind**: instance property of [patternlab](#patternlab)
**Returns**: Promise - Returns an Array<{name,url}> for the starterkit repos
-## `loadstarterkit(starterkitName, clean)` ⇒ void
+
- Loads starterkit already available via `node_modules/`
+### `patternlab.loadstarterkit` ⇒ void
+Loads starterkit already available via `node_modules/`
+**Kind**: instance property of [patternlab](#patternlab)
| Param | Type | Description |
| --- | --- | --- |
| starterkitName | string | name of starterkit |
| clean | boolean | whether or not to delete contents of source/ before load |
-## `patternsonly(options)` ⇒ Promise
+
- Builds patterns only, leaving existing user interface files intact
+### `patternlab.patternsonly` ⇒ Promise
+Builds patterns only, leaving existing user interface files intact
+**Kind**: instance property of [patternlab](#patternlab)
**Returns**: Promise - a promise fulfilled when build is complete
-| Param | Type | Description |
-| --- | --- | --- |
-| options | object | an object used to control build behavior |
-| options.cleanPublic | bool | whether or not to delete the configured output location (usually `public/`) before build |
-| options.data | object | additional data to be merged with global data prior to build |
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| [options.cleanPublic] | bool | true | whether or not to delete the configured output location (usually `public/`) before build |
+| [options.data] | object | {} | additional data to be merged with global data prior to build |
+| [options.watch] | bool | true | whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild |
+
+
+
+### `patternlab.getDefaultConfig` ⇒ object
+Static method that returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
-## `serve(options)` ⇒ Promise
+**Kind**: static property of [patternlab](#patternlab)
+**Returns**: object - Returns the object representation of the `patternlab-config.json`
+
+
+### `patternlab.getVersion` ⇒ string
+Static method that returns current version
+
+**Kind**: static property of [patternlab](#patternlab)
+**Returns**: string - current @pattern-lab/core version as defined in `package.json`
+
+
+### `patternlab.server` : object
+Server module
+
+**Kind**: static property of [patternlab](#patternlab)
- Build patterns, copies assets, and constructs user interface. Watches configured `source/` directories, and serves all output locally
+* [`.server`](#patternlab.server) : object
+ * [`.serve(options)`](#patternlab.server.serve) ⇒ Promise
+ * [`.reload()`](#patternlab.server.reload) ⇒ Promise
+ * [`.refreshCSS()`](#patternlab.server.refreshCSS) ⇒ Promise
+
+
+#### `server.serve(options)` ⇒ Promise
+Build patterns, copies assets, and constructs user interface. Watches configured `source/` directories, and serves all output locally
+
+**Kind**: static method of [server](#patternlab.server)
**Returns**: Promise - a promise fulfilled when build is complete
-| Param | Type | Description |
-| --- | --- | --- |
-| options | object | an object used to control build behavior |
-| options.cleanPublic | bool | whether or not to delete the configured output location (usually `public/`) before build |
-| options.data | object | additional data to be merged with global data prior to build |
-| options.watch | bool | **ALWAYS OVERRIDDEN to `true`** whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild |
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| options | object | | an object used to control build behavior |
+| [options.cleanPublic] | bool | true | whether or not to delete the configured output location (usually `public/`) before build |
+| [options.data] | object | {} | additional data to be merged with global data prior to build |
+| [options.watch] | bool | true | whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild |
+
+
+
+#### `server.reload()` ⇒ Promise
+Reloads any active live-server instances
+
+**Kind**: static method of [server](#patternlab.server)
+**Returns**: Promise - a promise fulfilled when operation is complete
+
+
+#### `server.refreshCSS()` ⇒ Promise
+Reloads CSS on any active live-server instances
+
+**Kind**: static method of [server](#patternlab.server)
+**Returns**: Promise - a promise fulfilled when operation is complete
+
+
+### `patternlab.events` : EventEmitter
+**Kind**: static property of [patternlab](#patternlab)
+**See**
+
+- [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
+- [All Pattern Lab events](./events.md)
+
* * *
diff --git a/packages/core/docs/events.md b/packages/core/docs/events.md
index 35478d3c5..2df8191d1 100644
--- a/packages/core/docs/events.md
+++ b/packages/core/docs/events.md
@@ -5,7 +5,7 @@
Pattern Lab emits numerous events during the [build](../docs/) process. Some uses of events:
* Core uses `patternlab-pattern-change` events when watching for changes in order to trigger another build
-* Plugins such as [plugin-node-tab](https://github.com/pattern-lab/plugin-node-tab) can use an event like `patternlab-pattern-write-end` to define additional code tabs to the pattern viewer / modal
+* Plugins such as [plugin-tab](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab) can use an event like `patternlab-pattern-write-end` to define additional code tabs to the pattern viewer / modal
Learn more about [Creating Plugins](https://github.com/pattern-lab/patternlab-node/wiki/Creating-Plugins).
@@ -18,9 +18,9 @@ Learn more about [Creating Plugins](https://github.com/pattern-lab/patternlab-no
### `EVENTS` ⏏
**Kind**: Exported constant
-
+
-#### `EVENTS~PATTERNLAB_BUILD_PATTERN_START`
+#### `EVENTS~PATTERNLAB_BUILD_START`
Emitted before any logic run inside `build()`, which is the entry point for single builds, pattern-only builds, run singly or when watched.
@@ -31,6 +31,19 @@ Emitted before any logic run inside `build()`, which is the entry point for sing
| ---------- | ------------------- | ----------------- |
| patternlab | object | global data store |
+
+
+#### `EVENTS~PATTERNLAB_BUILD_END`
+
+Emitted after all logic run inside `build()`, which is the entry point for single builds, pattern-only builds, run singly or when watched.
+
+**Kind**: inner property of [EVENTS](#exp_module_Events--EVENTS)
+**Properties**
+
+| Name | Type | Description |
+| ---------- | ------------------- | ----------------- |
+| patternlab | object | global data store |
+
#### `EVENTS~PATTERNLAB_PATTERN_ITERATION_END`
diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json
deleted file mode 100644
index 6d1ea01a6..000000000
--- a/packages/core/package-lock.json
+++ /dev/null
@@ -1,5174 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "requires": {
- "anymatch": "1.3.2",
- "async-each": "1.0.1",
- "glob-parent": "2.0.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0"
- },
- "dependencies": {
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "requires": {
- "micromatch": "2.3.11",
- "normalize-path": "2.1.1"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
- },
- "async-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
- "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "binary-extensions": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
- "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "requires": {
- "fill-range": "2.2.3"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
- },
- "fill-range": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "requires": {
- "binary-extensions": "1.11.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "requires": {
- "is-primitive": "2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "nan": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz",
- "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw=="
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "randomatic": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
- "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "readdirp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
- "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
- "requires": {
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "readable-stream": "2.3.5",
- "set-immediate-shim": "1.0.1"
- }
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- }
- }
- },
- "dive": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/dive/-/dive-0.5.0.tgz",
- "integrity": "sha1-BtDgft0l2oSVmLrKtE1R8oCb7Ec="
- },
- "eslint": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.5.0.tgz",
- "integrity": "sha1-IvyfeA6lvKEwb6srbTM2sPpix1Q=",
- "requires": {
- "chalk": "1.1.3",
- "concat-stream": "1.6.1",
- "debug": "2.6.9",
- "doctrine": "1.5.0",
- "escope": "3.6.0",
- "espree": "3.5.4",
- "estraverse": "4.2.0",
- "esutils": "2.0.2",
- "file-entry-cache": "2.0.0",
- "glob": "7.1.2",
- "globals": "9.18.0",
- "ignore": "3.3.7",
- "imurmurhash": "0.1.4",
- "inquirer": "0.12.0",
- "is-my-json-valid": "2.17.2",
- "is-resolvable": "1.1.0",
- "js-yaml": "3.11.0",
- "json-stable-stringify": "1.0.1",
- "levn": "0.3.0",
- "lodash": "4.17.5",
- "mkdirp": "0.5.1",
- "natural-compare": "1.4.0",
- "optionator": "0.8.2",
- "path-is-inside": "1.0.2",
- "pluralize": "1.2.1",
- "progress": "1.1.8",
- "require-uncached": "1.0.3",
- "shelljs": "0.6.1",
- "strip-bom": "3.0.0",
- "strip-json-comments": "1.0.4",
- "table": "3.8.3",
- "text-table": "0.2.0",
- "user-home": "2.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.0.tgz",
- "integrity": "sha512-arn53F07VXmls4o4pUhSzBa4fvaagPRe7AVZ8l7NHxFWUie2DsuFSBMMNAkgzRlOhEhzAnxeKyaWVzOH4xqp/g=="
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "requires": {
- "acorn": "3.3.0"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
- }
- }
- },
- "ajv": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
- "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
- "requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
- }
- },
- "ajv-keywords": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
- "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw="
- },
- "ansi-escapes": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
- "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "1.0.3"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
- "requires": {
- "callsites": "0.2.0"
- }
- },
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
- },
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
- },
- "cli-cursor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
- "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
- "requires": {
- "restore-cursor": "1.0.1"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.5",
- "typedarray": "0.0.6"
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "d": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
- "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
- "requires": {
- "es5-ext": "0.10.39"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "requires": {
- "globby": "5.0.0",
- "is-path-cwd": "1.0.0",
- "is-path-in-cwd": "1.0.0",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "rimraf": "2.6.2"
- }
- },
- "doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "requires": {
- "esutils": "2.0.2",
- "isarray": "1.0.0"
- }
- },
- "es5-ext": {
- "version": "0.10.39",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz",
- "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==",
- "requires": {
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-symbol": "3.1.1"
- }
- },
- "es6-map": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
- "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-iterator": "2.0.3",
- "es6-set": "0.1.5",
- "es6-symbol": "3.1.1",
- "event-emitter": "0.3.5"
- }
- },
- "es6-set": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
- "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1",
- "event-emitter": "0.3.5"
- }
- },
- "es6-symbol": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
- "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39"
- }
- },
- "es6-weak-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
- "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "escope": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
- "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
- "requires": {
- "es6-map": "0.1.5",
- "es6-weak-map": "2.0.2",
- "esrecurse": "4.2.1",
- "estraverse": "4.2.0"
- }
- },
- "espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
- "requires": {
- "acorn": "5.5.0",
- "acorn-jsx": "3.0.1"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39"
- }
- },
- "exit-hook": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
- "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "requires": {
- "escape-string-regexp": "1.0.5",
- "object-assign": "4.1.1"
- }
- },
- "file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
- "requires": {
- "flat-cache": "1.3.0",
- "object-assign": "4.1.1"
- }
- },
- "flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
- "requires": {
- "circular-json": "0.3.3",
- "del": "2.2.2",
- "graceful-fs": "4.1.11",
- "write": "0.2.1"
- }
- },
- "generate-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
- "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ="
- },
- "generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
- "requires": {
- "is-property": "1.0.2"
- }
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "requires": {
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "glob": "7.1.2",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "ignore": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA=="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "inquirer": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
- "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
- "requires": {
- "ansi-escapes": "1.4.0",
- "ansi-regex": "2.1.1",
- "chalk": "1.1.3",
- "cli-cursor": "1.0.2",
- "cli-width": "2.2.0",
- "figures": "1.7.0",
- "lodash": "4.17.5",
- "readline2": "1.0.1",
- "run-async": "0.1.0",
- "rx-lite": "3.1.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "through": "2.3.8"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-my-ip-valid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
- "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
- },
- "is-my-json-valid": {
- "version": "2.17.2",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
- "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
- "requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "is-my-ip-valid": "1.0.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
- }
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
- "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
- "requires": {
- "is-path-inside": "1.0.1"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "1.0.2"
- }
- },
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
- },
- "jsonpointer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mute-stream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
- "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "onetime": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "requires": {
- "deep-is": "0.1.3",
- "fast-levenshtein": "2.0.6",
- "levn": "0.3.0",
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2",
- "wordwrap": "1.0.0"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "pluralize": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
- "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU="
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "progress": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
- "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74="
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "readline2": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
- "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "mute-stream": "0.0.5"
- }
- },
- "require-uncached": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
- "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
- "requires": {
- "caller-path": "0.1.0",
- "resolve-from": "1.0.1"
- }
- },
- "resolve-from": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
- "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
- },
- "restore-cursor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
- "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
- "requires": {
- "exit-hook": "1.1.1",
- "onetime": "1.1.0"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "run-async": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
- "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
- "requires": {
- "once": "1.4.0"
- }
- },
- "rx-lite": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
- "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "shelljs": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz",
- "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg="
- },
- "slice-ansi": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
- "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU="
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
- },
- "strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
- },
- "table": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
- "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
- "requires": {
- "ajv": "4.11.8",
- "ajv-keywords": "1.5.1",
- "chalk": "1.1.3",
- "lodash": "4.17.5",
- "slice-ansi": "0.0.4",
- "string-width": "2.1.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "1.1.2"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "user-home": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
- "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
- "requires": {
- "os-homedir": "1.0.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
- "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
- "requires": {
- "mkdirp": "0.5.1"
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- }
- }
- },
- "eslint-config-prettier": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz",
- "integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==",
- "requires": {
- "get-stdin": "5.0.1"
- },
- "dependencies": {
- "get-stdin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
- "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
- }
- }
- },
- "eslint-plugin-prettier": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz",
- "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==",
- "requires": {
- "fast-diff": "1.1.2",
- "jest-docblock": "21.2.0"
- },
- "dependencies": {
- "fast-diff": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
- "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
- },
- "jest-docblock": {
- "version": "21.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz",
- "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw=="
- }
- }
- },
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "4.0.0",
- "universalify": "0.1.1"
- },
- "dependencies": {
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "universalify": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
- "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- },
- "graphlib": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz",
- "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==",
- "requires": {
- "lodash": "4.17.5"
- }
- },
- "husky": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
- "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==",
- "requires": {
- "is-ci": "1.1.0",
- "normalize-path": "1.0.0",
- "strip-indent": "2.0.0"
- },
- "dependencies": {
- "ci-info": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz",
- "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA=="
- },
- "is-ci": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
- "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
- "requires": {
- "ci-info": "1.1.2"
- }
- },
- "normalize-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
- "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k="
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g="
- }
- }
- },
- "js-beautify": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.5.tgz",
- "integrity": "sha512-9OhfAqGOrD7hoQBLJMTA+BKuKmoEtTJXzZ7WDF/9gvjtey1koVLuZqIY6c51aPDjbNdNtIXAkiWKVhziawE9Og==",
- "requires": {
- "config-chain": "1.1.11",
- "editorconfig": "0.13.3",
- "mkdirp": "0.5.1",
- "nopt": "3.0.6"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "bluebird": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
- },
- "commander": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
- "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
- },
- "config-chain": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
- "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=",
- "requires": {
- "ini": "1.3.5",
- "proto-list": "1.2.4"
- }
- },
- "editorconfig": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz",
- "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==",
- "requires": {
- "bluebird": "3.5.1",
- "commander": "2.14.1",
- "lru-cache": "3.2.0",
- "semver": "5.5.0",
- "sigmund": "1.0.1"
- }
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "lru-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
- "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
- "requires": {
- "pseudomap": "1.0.2"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "requires": {
- "abbrev": "1.1.1"
- }
- },
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
- }
- }
- },
- "js-yaml": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
- "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
- "requires": {
- "argparse": "1.0.10",
- "esprima": "4.0.0"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- }
- }
- },
- "jsdoc-to-markdown": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-3.0.4.tgz",
- "integrity": "sha512-NDD+dpLiF9SYJXFcYPutKi/K8pRtIHHmVyQJzUArYQCoVhNISKeIVK5Pe78mi7K5s16/Nk7EviN2xxlJJ+S5Bw==",
- "requires": {
- "array-back": "2.0.0",
- "command-line-tool": "0.7.0",
- "config-master": "3.1.0",
- "dmd": "3.0.11",
- "jsdoc-api": "3.0.0",
- "jsdoc-parse": "3.0.1",
- "walk-back": "3.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "requires": {
- "acorn": "3.3.0"
- }
- },
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "requires": {
- "kind-of": "3.2.2",
- "longest": "1.0.1",
- "repeat-string": "1.6.1"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
- },
- "ansi-escape-sequences": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
- "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
- "requires": {
- "array-back": "1.0.4"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "requires": {
- "typical": "2.6.1"
- }
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
- },
- "bluebird": {
- "version": "3.4.7",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz",
- "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM="
- },
- "cache-point": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-0.4.1.tgz",
- "integrity": "sha512-4TgWfe9SF+bUy5cCql8gWHqKNrviufNwSYxLjf2utB0pY4+bdcuFwMmY1hDB+67Gz/L1vmhFNhePAjJTFBtV+Q==",
- "requires": {
- "array-back": "2.0.0",
- "fs-then-native": "2.0.0",
- "mkdirp2": "1.0.3"
- }
- },
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "optional": true
- },
- "catharsis": {
- "version": "0.8.9",
- "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz",
- "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=",
- "requires": {
- "underscore-contrib": "0.3.0"
- }
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "optional": true,
- "requires": {
- "align-text": "0.1.4",
- "lazy-cache": "1.0.4"
- }
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "optional": true,
- "requires": {
- "center-align": "0.1.3",
- "right-align": "0.1.3",
- "wordwrap": "0.0.2"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "optional": true
- }
- }
- },
- "collect-all": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.3.tgz",
- "integrity": "sha512-0y0rBgoX8IzIjBAUnO73SEtSb4Mhk3IoceWJq5zZSxb9mWORhWH8xLYo4EDSOE1jRBk1LhmfjqWFFt10h/+MEA==",
- "requires": {
- "stream-connect": "1.0.2",
- "stream-via": "1.0.4"
- }
- },
- "command-line-args": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz",
- "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==",
- "requires": {
- "array-back": "2.0.0",
- "find-replace": "1.0.3",
- "typical": "2.6.1"
- }
- },
- "command-line-tool": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.7.0.tgz",
- "integrity": "sha1-yoB5KuIGnPfKpWLAy8LNEYERIqA=",
- "requires": {
- "ansi-escape-sequences": "3.0.0",
- "array-back": "1.0.4",
- "command-line-args": "4.0.7",
- "command-line-usage": "4.1.0",
- "typical": "2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "command-line-usage": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
- "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
- "requires": {
- "ansi-escape-sequences": "4.0.0",
- "array-back": "2.0.0",
- "table-layout": "0.4.2",
- "typical": "2.6.1"
- },
- "dependencies": {
- "ansi-escape-sequences": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.0.0.tgz",
- "integrity": "sha512-v+0wW9Wezwsyb0uF4aBVCjmSqit3Ru7PZFziGF0o2KwTvN2zWfTi3BRLq9EkJFdg3eBbyERXGTntVpBxH1J68Q==",
- "requires": {
- "array-back": "2.0.0"
- }
- }
- }
- },
- "common-sequence": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-1.0.2.tgz",
- "integrity": "sha1-MOB/P49vf5s97oVPILLTnu4Ibeg="
- },
- "config-master": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz",
- "integrity": "sha1-ZnZjWQUFooO/JqSE1oSJ10xUhdo=",
- "requires": {
- "walk-back": "2.0.1"
- },
- "dependencies": {
- "walk-back": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz",
- "integrity": "sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ="
- }
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "optional": true
- },
- "deep-extend": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.0.tgz",
- "integrity": "sha1-bvSgmwX5iw41jW2T1Mo8rsZnKAM="
- },
- "dmd": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/dmd/-/dmd-3.0.11.tgz",
- "integrity": "sha512-Naq/y7ME1dG8e4u0IJ2jA/G2gtbm4ZQzAG0LldwE1BCUrVWzR9VY5ayvXYSd+p9fdh5ojxayABbelDRM32xIhg==",
- "requires": {
- "array-back": "2.0.0",
- "cache-point": "0.4.1",
- "common-sequence": "1.0.2",
- "file-set": "2.0.0",
- "handlebars": "4.0.11",
- "marked": "0.3.17",
- "object-get": "2.1.0",
- "reduce-flatten": "1.0.1",
- "reduce-unique": "1.0.0",
- "reduce-without": "1.0.1",
- "test-value": "3.0.0",
- "walk-back": "3.0.0"
- },
- "dependencies": {
- "test-value": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
- "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
- "requires": {
- "array-back": "2.0.0",
- "typical": "2.6.1"
- }
- }
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "espree": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.7.tgz",
- "integrity": "sha1-/V3ux2qXpRIKnNOnyxF3oJI7EdI=",
- "requires": {
- "acorn": "3.3.0",
- "acorn-jsx": "3.0.1"
- }
- },
- "file-set": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.0.tgz",
- "integrity": "sha512-cCWXfw+nrYoIoUVmEF7Xsw91lGWuObtSnTEZ7AmdvZou1A/6Xx237HfxdQyC/ayKRvQSMbNOBwg62OjN5JxbXw==",
- "requires": {
- "array-back": "2.0.0",
- "glob": "7.1.2"
- }
- },
- "find-replace": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
- "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
- "requires": {
- "array-back": "1.0.4",
- "test-value": "2.1.0"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "fs-then-native": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz",
- "integrity": "sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc="
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
- "optional": true
- },
- "handlebars": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
- "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
- "requires": {
- "async": "1.5.2",
- "optimist": "0.6.1",
- "source-map": "0.4.4",
- "uglify-js": "2.8.29"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "js2xmlparser": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-1.0.0.tgz",
- "integrity": "sha1-WhcPLo1kds5FQF4EgjJCUTeC/jA="
- },
- "jsdoc-75lb": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/jsdoc-75lb/-/jsdoc-75lb-3.6.0.tgz",
- "integrity": "sha1-qAcRlSi0AJzLyrSbdSL2P+xs0L0=",
- "requires": {
- "bluebird": "3.4.7",
- "catharsis": "0.8.9",
- "escape-string-regexp": "1.0.5",
- "espree": "3.1.7",
- "js2xmlparser": "1.0.0",
- "klaw": "1.3.1",
- "marked": "0.3.17",
- "mkdirp": "0.5.1",
- "requizzle": "0.2.1",
- "strip-json-comments": "2.0.1",
- "taffydb": "2.6.2",
- "underscore": "1.8.3"
- }
- },
- "jsdoc-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-3.0.0.tgz",
- "integrity": "sha1-DVJwAjX4Zb1Ki61evB77Vi/IrSo=",
- "requires": {
- "array-back": "1.0.4",
- "cache-point": "0.4.1",
- "collect-all": "1.0.3",
- "file-set": "1.1.1",
- "fs-then-native": "2.0.0",
- "jsdoc-75lb": "3.6.0",
- "object-to-spawn-args": "1.1.1",
- "temp-path": "1.0.0",
- "walk-back": "2.0.1"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- },
- "file-set": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/file-set/-/file-set-1.1.1.tgz",
- "integrity": "sha1-0+xwwIDsjxjyBLod4QZ4DJBWkms=",
- "requires": {
- "array-back": "1.0.4",
- "glob": "7.1.2"
- }
- },
- "walk-back": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz",
- "integrity": "sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ="
- }
- }
- },
- "jsdoc-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-3.0.1.tgz",
- "integrity": "sha512-btZLp4wYl90vcAfgk4hoGQbO17iBVrhh3LJRMKZNtZgniO3F8H2CjxXld0owBIB1XxN+j3bAcWZnZKMnSj3iMA==",
- "requires": {
- "array-back": "2.0.0",
- "lodash.omit": "4.5.0",
- "lodash.pick": "4.4.0",
- "reduce-extract": "1.0.0",
- "sort-array": "2.0.0",
- "test-value": "3.0.0"
- },
- "dependencies": {
- "test-value": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
- "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
- "requires": {
- "array-back": "2.0.0",
- "typical": "2.6.1"
- }
- }
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "optional": true
- },
- "lodash.omit": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
- "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA="
- },
- "lodash.padend": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
- "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4="
- },
- "lodash.pick": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
- "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
- },
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
- },
- "marked": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.17.tgz",
- "integrity": "sha512-+AKbNsjZl6jFfLPwHhWmGTqE009wTKn3RTmn9K8oUKHrX/abPJjtcRtXpYB/FFrwPJRUA86LX/de3T0knkPCmQ=="
- },
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "mkdirp2": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.3.tgz",
- "integrity": "sha1-zI3YJl8fBuLY9bELblL04FC+0hs="
- },
- "object-get": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.0.tgz",
- "integrity": "sha1-ciu9tgA576R8rTxtws5RqFwCxa4="
- },
- "object-to-spawn-args": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-1.1.1.tgz",
- "integrity": "sha1-d9qIJ/Bz0BHJ4bFz+JV4FHAkZ4U="
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "requires": {
- "minimist": "0.0.10",
- "wordwrap": "0.0.3"
- }
- },
- "reduce-extract": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz",
- "integrity": "sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU=",
- "requires": {
- "test-value": "1.1.0"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- },
- "test-value": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
- "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
- "requires": {
- "array-back": "1.0.4",
- "typical": "2.6.1"
- }
- }
- }
- },
- "reduce-flatten": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
- "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc="
- },
- "reduce-unique": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-1.0.0.tgz",
- "integrity": "sha1-flhrz4ek4ytter2Cd/rWzeyfSAM="
- },
- "reduce-without": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz",
- "integrity": "sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw=",
- "requires": {
- "test-value": "2.1.0"
- }
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "requizzle": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz",
- "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=",
- "requires": {
- "underscore": "1.6.0"
- },
- "dependencies": {
- "underscore": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag="
- }
- }
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "optional": true,
- "requires": {
- "align-text": "0.1.4"
- }
- },
- "sort-array": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-2.0.0.tgz",
- "integrity": "sha1-OKnG2if9fRR7QuYFVPKBGHtN9HI=",
- "requires": {
- "array-back": "1.0.4",
- "object-get": "2.1.0",
- "typical": "2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "requires": {
- "amdefine": "1.0.1"
- }
- },
- "stream-connect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz",
- "integrity": "sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc=",
- "requires": {
- "array-back": "1.0.4"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "stream-via": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz",
- "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ=="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "table-layout": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.2.tgz",
- "integrity": "sha512-tygyl5+eSHj4chpq5Zfy6cpc7MOUBClAW9ozghFH7hg9bAUzShOYn+/vUzTRkKOSLJWKfgYtP2tAU2c0oAD8eg==",
- "requires": {
- "array-back": "2.0.0",
- "deep-extend": "0.5.0",
- "lodash.padend": "4.6.1",
- "typical": "2.6.1",
- "wordwrapjs": "3.0.0"
- }
- },
- "taffydb": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
- "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg="
- },
- "temp-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz",
- "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs="
- },
- "test-value": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
- "requires": {
- "array-back": "1.0.4",
- "typical": "2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "2.6.1"
- }
- }
- }
- },
- "typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "optional": true,
- "requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "optional": true
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "optional": true
- },
- "underscore": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
- "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
- },
- "underscore-contrib": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz",
- "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=",
- "requires": {
- "underscore": "1.6.0"
- },
- "dependencies": {
- "underscore": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag="
- }
- }
- },
- "walk-back": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-3.0.0.tgz",
- "integrity": "sha1-I1h4ejXakQMtrV6S+AsSNw2HlcU="
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "optional": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
- },
- "wordwrapjs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
- "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
- "requires": {
- "reduce-flatten": "1.0.1",
- "typical": "2.6.1"
- }
- },
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "optional": true,
- "requires": {
- "camelcase": "1.2.1",
- "cliui": "2.1.0",
- "decamelize": "1.2.0",
- "window-size": "0.1.0"
- }
- }
- }
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "markdown-it": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.1.1.tgz",
- "integrity": "sha1-ztA39Ec+6fUVOsQU933IPJG6knw=",
- "requires": {
- "argparse": "1.0.10",
- "entities": "1.1.1",
- "linkify-it": "1.2.4",
- "mdurl": "1.0.1",
- "uc.micro": "1.0.5"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
- },
- "linkify-it": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz",
- "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=",
- "requires": {
- "uc.micro": "1.0.5"
- }
- },
- "mdurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "uc.micro": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz",
- "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg=="
- }
- }
- },
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
- "requires": {
- "encoding": "0.1.12",
- "is-stream": "1.1.0"
- },
- "dependencies": {
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "0.4.19"
- }
- },
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- }
- }
- },
- "prettier": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.10.2.tgz",
- "integrity": "sha512-TcdNoQIWFoHblurqqU6d1ysopjq7UX0oRcT/hJ8qvBAELiYWn+Ugf0AXdnzISEJ7vuhNnQ98N8jR8Sh53x4IZg=="
- },
- "pretty-quick": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.4.1.tgz",
- "integrity": "sha512-Q4V2GAflSaM739kKH63utbfI2n4s2fCDCyjFC4ykxA9ueb7FknLcLAZSKa3DejHMt5q9Fq395eKTZ9wYwoILBw==",
- "requires": {
- "chalk": "2.3.2",
- "execa": "0.8.0",
- "find-up": "2.1.0",
- "ignore": "3.3.7",
- "mri": "1.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "execa": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
- "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "2.0.0"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "ignore": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "2.0.0",
- "path-exists": "3.0.0"
- }
- },
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "mri": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz",
- "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o="
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "2.0.1"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-limit": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
- "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
- "requires": {
- "p-try": "1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "1.2.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- }
- }
- },
- "recursive-copy": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.9.tgz",
- "integrity": "sha512-0AkHV+QtfS/1jW01z3m2t/TRTW56Fpc+xYbsoa/bqn8BCYPwmsaNjlYmUU/dyGg9w8MmGoUWihU5W+s+qjxvBQ==",
- "requires": {
- "del": "2.2.2",
- "emitter-mixin": "0.0.3",
- "errno": "0.1.7",
- "graceful-fs": "4.1.11",
- "junk": "1.0.3",
- "maximatch": "0.1.0",
- "mkdirp": "0.5.1",
- "pify": "2.3.0",
- "promise": "7.3.1",
- "slash": "1.0.0"
- },
- "dependencies": {
- "array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "1.0.3"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "requires": {
- "globby": "5.0.0",
- "is-path-cwd": "1.0.0",
- "is-path-in-cwd": "1.0.0",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "rimraf": "2.6.2"
- }
- },
- "emitter-mixin": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/emitter-mixin/-/emitter-mixin-0.0.3.tgz",
- "integrity": "sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw="
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "requires": {
- "prr": "1.0.1"
- }
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "requires": {
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "glob": "7.1.2",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
- "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
- "requires": {
- "is-path-inside": "1.0.1"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "1.0.2"
- }
- },
- "junk": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz",
- "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI="
- },
- "maximatch": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz",
- "integrity": "sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I=",
- "requires": {
- "array-differ": "1.0.0",
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "minimatch": "3.0.4"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "2.0.6"
- }
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
- }
- }
- },
- "rewire": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz",
- "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc="
- },
- "standard-version": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.3.0.tgz",
- "integrity": "sha512-2UJ2BIUNa7+41PH4FvYicSQED2LCt2RXjmNFis+JZlxZtwzNnGn4uuL8WBUqHoC9b+bJ0AHIAX/bilzm+pGPeA==",
- "requires": {
- "chalk": "1.1.3",
- "conventional-changelog": "1.1.18",
- "conventional-recommended-bump": "1.2.1",
- "dotgitignore": "1.0.3",
- "figures": "1.7.0",
- "fs-access": "1.0.1",
- "semver": "5.5.0",
- "yargs": "8.0.2"
- },
- "dependencies": {
- "JSONStream": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz",
- "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=",
- "requires": {
- "jsonparse": "1.3.1",
- "through": "2.3.8"
- }
- },
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "requires": {
- "kind-of": "3.2.2",
- "longest": "1.0.1",
- "repeat-string": "1.6.1"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
- },
- "array-ify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
- "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
- },
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "optional": true
- },
- "camelcase-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
- "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
- "requires": {
- "camelcase": "4.1.0",
- "map-obj": "2.0.0",
- "quick-lru": "1.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- }
- }
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "optional": true,
- "requires": {
- "align-text": "0.1.4",
- "lazy-cache": "1.0.4"
- }
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "optional": true,
- "requires": {
- "center-align": "0.1.3",
- "right-align": "0.1.3",
- "wordwrap": "0.0.2"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "optional": true
- }
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "compare-func": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
- "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
- "requires": {
- "array-ify": "1.0.0",
- "dot-prop": "3.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.5",
- "typedarray": "0.0.6"
- }
- },
- "conventional-changelog": {
- "version": "1.1.18",
- "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.18.tgz",
- "integrity": "sha512-swf5bqhm7PsY2cw6zxuPy6+rZiiGwEpQnrWki+L+z2oZI53QSYwU4brpljmmWss821AsiwmVL+7V6hP+ER+TBA==",
- "requires": {
- "conventional-changelog-angular": "1.6.6",
- "conventional-changelog-atom": "0.2.4",
- "conventional-changelog-codemirror": "0.3.4",
- "conventional-changelog-core": "2.0.5",
- "conventional-changelog-ember": "0.3.6",
- "conventional-changelog-eslint": "1.0.5",
- "conventional-changelog-express": "0.3.4",
- "conventional-changelog-jquery": "0.1.0",
- "conventional-changelog-jscs": "0.1.0",
- "conventional-changelog-jshint": "0.3.4",
- "conventional-changelog-preset-loader": "1.1.6"
- }
- },
- "conventional-changelog-angular": {
- "version": "1.6.6",
- "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
- "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==",
- "requires": {
- "compare-func": "1.3.2",
- "q": "1.5.1"
- }
- },
- "conventional-changelog-atom": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.4.tgz",
- "integrity": "sha512-4+hmbBwcAwx1XzDZ4aEOxk/ONU0iay10G0u/sld16ksgnRUHN7CxmZollm3FFaptr6VADMq1qxomA+JlpblBlg==",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-codemirror": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.4.tgz",
- "integrity": "sha512-8M7pGgQVzRU//vG3rFlLYqqBywOLxu9XM0/lc1/1Ll7RuKA79PgK9TDpuPmQDHFnqGS7D1YiZpC3Z0D9AIYExg==",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-core": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.5.tgz",
- "integrity": "sha512-lP1s7Z3NyEFcG78bWy7GG7nXsq9OpAJgo2xbyAlVBDweLSL5ghvyEZlkEamnAQpIUVK0CAVhs8nPvCiQuXT/VA==",
- "requires": {
- "conventional-changelog-writer": "3.0.4",
- "conventional-commits-parser": "2.1.5",
- "dateformat": "3.0.3",
- "get-pkg-repo": "1.4.0",
- "git-raw-commits": "1.3.4",
- "git-remote-origin-url": "2.0.0",
- "git-semver-tags": "1.3.4",
- "lodash": "4.17.5",
- "normalize-package-data": "2.4.0",
- "q": "1.5.1",
- "read-pkg": "1.1.0",
- "read-pkg-up": "1.0.1",
- "through2": "2.0.3"
- }
- },
- "conventional-changelog-ember": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.6.tgz",
- "integrity": "sha512-hBM1xb5IrjNtsjXaGryPF/Wn36cwyjkNeqX/CIDbJv/1kRFBHsWoSPYBiNVEpg8xE5fcK4DbPhGTDN2sVoPeiA==",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-eslint": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.5.tgz",
- "integrity": "sha512-7NUv+gMOS8Y49uPFRgF7kuLZqpnrKa2bQMZZsc62NzvaJmjUktnV03PYHuXhTDEHt5guvV9gyEFtUpgHCDkojg==",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-express": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.4.tgz",
- "integrity": "sha512-M+UUb715TXT6l9vyMf4HYvAepnQn0AYTcPi6KHrFsd80E0HErjQnqStBg8i3+Qm7EV9+RyATQEnIhSzHbdQ7+A==",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-jquery": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz",
- "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-jscs": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz",
- "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=",
- "requires": {
- "q": "1.5.1"
- }
- },
- "conventional-changelog-jshint": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.4.tgz",
- "integrity": "sha512-CdrqwDgL56b176FVxHmhuOvnO1dRDQvrMaHyuIVjcFlOXukATz2wVT17g8jQU3LvybVbyXvJRbdD5pboo7/1KQ==",
- "requires": {
- "compare-func": "1.3.2",
- "q": "1.5.1"
- }
- },
- "conventional-changelog-preset-loader": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.6.tgz",
- "integrity": "sha512-yWPIP9wwsCKeUSPYApnApWhKIDjWRIX/uHejGS1tYfEsQR/bwpDFET7LYiHT+ujNbrlf6h1s3NlPGheOd4yJRQ=="
- },
- "conventional-changelog-writer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.4.tgz",
- "integrity": "sha512-EUf/hWiEj3IOa5Jk8XDzM6oS0WgijlYGkUfLc+mDnLH9RwpZqhYIBwgJHWHzEB4My013wx2FhmUu45P6tQrucw==",
- "requires": {
- "compare-func": "1.3.2",
- "conventional-commits-filter": "1.1.5",
- "dateformat": "3.0.3",
- "handlebars": "4.0.11",
- "json-stringify-safe": "5.0.1",
- "lodash": "4.17.5",
- "meow": "4.0.0",
- "semver": "5.5.0",
- "split": "1.0.1",
- "through2": "2.0.3"
- }
- },
- "conventional-commits-filter": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.5.tgz",
- "integrity": "sha512-mj3+WLj8UZE72zO9jocZjx8+W4Bwnx/KHoIz1vb4F8XUXj0XSjp8Y3MFkpRyIpsRiCBX+DkDjxGKF/nfeu7BGw==",
- "requires": {
- "is-subset": "0.1.1",
- "modify-values": "1.0.0"
- }
- },
- "conventional-commits-parser": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.5.tgz",
- "integrity": "sha512-jaAP61py+ISMF3/n3yIiIuY5h6mJlucOqawu5mLB1HaQADLvg/y5UB3pT7HSucZJan34lp7+7ylQPfbKEGmxrA==",
- "requires": {
- "JSONStream": "1.3.2",
- "is-text-path": "1.0.1",
- "lodash": "4.17.5",
- "meow": "4.0.0",
- "split2": "2.2.0",
- "through2": "2.0.3",
- "trim-off-newlines": "1.0.1"
- }
- },
- "conventional-recommended-bump": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz",
- "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==",
- "requires": {
- "concat-stream": "1.6.1",
- "conventional-commits-filter": "1.1.5",
- "conventional-commits-parser": "2.1.5",
- "git-raw-commits": "1.3.4",
- "git-semver-tags": "1.3.4",
- "meow": "3.7.0",
- "object-assign": "4.1.1"
- },
- "dependencies": {
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
- },
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
- "requires": {
- "camelcase": "2.1.1",
- "map-obj": "1.0.1"
- }
- },
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "requires": {
- "repeating": "2.0.1"
- }
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
- },
- "meow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
- "requires": {
- "camelcase-keys": "2.1.0",
- "decamelize": "1.2.0",
- "loud-rejection": "1.6.0",
- "map-obj": "1.0.1",
- "minimist": "1.2.0",
- "normalize-package-data": "2.4.0",
- "object-assign": "4.1.1",
- "read-pkg-up": "1.0.1",
- "redent": "1.0.0",
- "trim-newlines": "1.0.0"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
- "requires": {
- "indent-string": "2.1.0",
- "strip-indent": "1.0.1"
- }
- },
- "strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
- "requires": {
- "get-stdin": "4.0.1"
- }
- },
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
- }
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- }
- },
- "currently-unhandled": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
- "requires": {
- "array-find-index": "1.0.2"
- }
- },
- "dargs": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
- "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "requires": {
- "decamelize": "1.2.0",
- "map-obj": "1.0.1"
- },
- "dependencies": {
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
- }
- }
- },
- "dot-prop": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
- "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
- "requires": {
- "is-obj": "1.0.1"
- }
- },
- "dotgitignore": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-1.0.3.tgz",
- "integrity": "sha512-eu5XjSstm0WXQsARgo6kPjkINYZlOUW+z/KtAAIBjHa5mUpMPrxJytbPIndWz6GubBuuuH5ljtVcXKnVnH5q8w==",
- "requires": {
- "find-up": "2.1.0",
- "minimatch": "3.0.4"
- }
- },
- "error-ex": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
- "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
- "requires": {
- "is-arrayish": "0.2.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- }
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "requires": {
- "escape-string-regexp": "1.0.5",
- "object-assign": "4.1.1"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "2.0.0"
- }
- },
- "fs-access": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
- "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
- "requires": {
- "null-check": "1.0.0"
- }
- },
- "get-caller-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
- "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
- },
- "get-pkg-repo": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
- "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
- "requires": {
- "hosted-git-info": "2.5.0",
- "meow": "3.7.0",
- "normalize-package-data": "2.4.0",
- "parse-github-repo-url": "1.4.1",
- "through2": "2.0.3"
- },
- "dependencies": {
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
- },
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
- "requires": {
- "camelcase": "2.1.1",
- "map-obj": "1.0.1"
- }
- },
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "requires": {
- "repeating": "2.0.1"
- }
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
- },
- "meow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
- "requires": {
- "camelcase-keys": "2.1.0",
- "decamelize": "1.2.0",
- "loud-rejection": "1.6.0",
- "map-obj": "1.0.1",
- "minimist": "1.2.0",
- "normalize-package-data": "2.4.0",
- "object-assign": "4.1.1",
- "read-pkg-up": "1.0.1",
- "redent": "1.0.0",
- "trim-newlines": "1.0.0"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
- "requires": {
- "indent-string": "2.1.0",
- "strip-indent": "1.0.1"
- }
- },
- "strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
- "requires": {
- "get-stdin": "4.0.1"
- }
- },
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
- }
- }
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "git-raw-commits": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.4.tgz",
- "integrity": "sha512-G3O+41xHbscpgL5nA0DUkbFVgaAz5rd57AMSIMew8p7C8SyFwZDyn08MoXHkTl9zcD0LmxsLFPxbqFY4YPbpPA==",
- "requires": {
- "dargs": "4.1.0",
- "lodash.template": "4.4.0",
- "meow": "4.0.0",
- "split2": "2.2.0",
- "through2": "2.0.3"
- }
- },
- "git-remote-origin-url": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
- "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
- "requires": {
- "gitconfiglocal": "1.0.0",
- "pify": "2.3.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "git-semver-tags": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.4.tgz",
- "integrity": "sha512-Xe2Z74MwXZfAezuaO6e6cA4nsgeCiARPzaBp23gma325c/OXdt//PhrknptIaynNeUp2yWtmikV7k5RIicgGIQ==",
- "requires": {
- "meow": "4.0.0",
- "semver": "5.5.0"
- }
- },
- "gitconfiglocal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
- "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
- "requires": {
- "ini": "1.3.5"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "handlebars": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
- "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
- "requires": {
- "async": "1.5.2",
- "optimist": "0.6.1",
- "source-map": "0.4.4",
- "uglify-js": "2.8.29"
- }
- },
- "hosted-git-info": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
- "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
- },
- "indent-string": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
- "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "is-builtin-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
- "requires": {
- "builtin-modules": "1.1.1"
- }
- },
- "is-finite": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-subset": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
- "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY="
- },
- "is-text-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
- "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
- "requires": {
- "text-extensions": "1.7.0"
- }
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "json-parse-better-errors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz",
- "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw=="
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "optional": true
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "requires": {
- "invert-kv": "1.0.0"
- }
- },
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "4.0.0",
- "pify": "3.0.0",
- "strip-bom": "3.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "2.0.0",
- "path-exists": "3.0.0"
- }
- },
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
- },
- "lodash.template": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
- "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
- "requires": {
- "lodash._reinterpolate": "3.0.0",
- "lodash.templatesettings": "4.1.0"
- }
- },
- "lodash.templatesettings": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
- "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
- "requires": {
- "lodash._reinterpolate": "3.0.0"
- }
- },
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
- },
- "loud-rejection": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
- "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
- "requires": {
- "currently-unhandled": "0.4.1",
- "signal-exit": "3.0.2"
- }
- },
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "map-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
- "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk="
- },
- "mem": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
- "requires": {
- "mimic-fn": "1.2.0"
- }
- },
- "meow": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz",
- "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==",
- "requires": {
- "camelcase-keys": "4.2.0",
- "decamelize-keys": "1.1.0",
- "loud-rejection": "1.6.0",
- "minimist": "1.2.0",
- "minimist-options": "3.0.2",
- "normalize-package-data": "2.4.0",
- "read-pkg-up": "3.0.0",
- "redent": "2.0.0",
- "trim-newlines": "2.0.0"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "requires": {
- "load-json-file": "4.0.0",
- "normalize-package-data": "2.4.0",
- "path-type": "3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
- "requires": {
- "find-up": "2.1.0",
- "read-pkg": "3.0.0"
- }
- }
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
- },
- "minimist-options": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
- "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
- "requires": {
- "arrify": "1.0.1",
- "is-plain-obj": "1.1.0"
- }
- },
- "modify-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.0.tgz",
- "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI="
- },
- "normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
- "requires": {
- "hosted-git-info": "2.5.0",
- "is-builtin-module": "1.0.0",
- "semver": "5.5.0",
- "validate-npm-package-license": "3.0.3"
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "2.0.1"
- }
- },
- "null-check": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
- "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0="
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "requires": {
- "minimist": "0.0.10",
- "wordwrap": "0.0.3"
- }
- },
- "os-locale": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
- "requires": {
- "execa": "0.7.0",
- "lcid": "1.0.0",
- "mem": "1.1.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-limit": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
- "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
- "requires": {
- "p-try": "1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "1.2.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "parse-github-repo-url": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
- "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A="
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "1.3.1",
- "json-parse-better-errors": "1.0.1"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "requires": {
- "pify": "3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
- },
- "quick-lru": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
- "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g="
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "requires": {
- "load-json-file": "1.1.0",
- "normalize-package-data": "2.4.0",
- "path-type": "1.1.0"
- },
- "dependencies": {
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "strip-bom": "2.0.0"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "1.3.1"
- }
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "requires": {
- "graceful-fs": "4.1.11",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "requires": {
- "is-utf8": "0.2.1"
- }
- }
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "requires": {
- "find-up": "1.1.2",
- "read-pkg": "1.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "requires": {
- "path-exists": "2.1.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "requires": {
- "pinkie-promise": "2.0.1"
- }
- }
- }
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "redent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
- "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
- "requires": {
- "indent-string": "3.2.0",
- "strip-indent": "2.0.0"
- }
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "requires": {
- "is-finite": "1.0.2"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "optional": true,
- "requires": {
- "align-text": "0.1.4"
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "requires": {
- "amdefine": "1.0.1"
- }
- },
- "spdx-correct": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
- "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
- "requires": {
- "spdx-expression-parse": "3.0.0",
- "spdx-license-ids": "3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
- "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
- "requires": {
- "spdx-exceptions": "2.1.0",
- "spdx-license-ids": "3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
- "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
- },
- "split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "requires": {
- "through": "2.3.8"
- }
- },
- "split2": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
- "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
- "requires": {
- "through2": "2.0.3"
- }
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- }
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g="
- },
- "text-extensions": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz",
- "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg=="
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
- "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
- "requires": {
- "readable-stream": "2.3.5",
- "xtend": "4.0.1"
- }
- },
- "trim-newlines": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
- "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA="
- },
- "trim-off-newlines": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
- "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM="
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "optional": true,
- "requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "optional": true
- },
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "optional": true,
- "requires": {
- "camelcase": "1.2.1",
- "cliui": "2.1.0",
- "decamelize": "1.2.0",
- "window-size": "0.1.0"
- }
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "optional": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "validate-npm-package-license": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
- "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
- "requires": {
- "spdx-correct": "3.0.0",
- "spdx-expression-parse": "3.0.0"
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "optional": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1"
- },
- "dependencies": {
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- }
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yargs": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
- "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
- "requires": {
- "camelcase": "4.1.0",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "get-caller-file": "1.0.2",
- "os-locale": "2.1.0",
- "read-pkg-up": "2.0.0",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "2.1.1",
- "which-module": "2.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "7.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
- },
- "dependencies": {
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- }
- }
- },
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "requires": {
- "graceful-fs": "4.1.11",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "strip-bom": "3.0.0"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "1.3.1"
- }
- },
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "requires": {
- "pify": "2.3.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "requires": {
- "load-json-file": "2.0.0",
- "normalize-package-data": "2.4.0",
- "path-type": "2.0.0"
- }
- },
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "requires": {
- "find-up": "2.1.0",
- "read-pkg": "2.0.0"
- }
- }
- }
- },
- "yargs-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
- "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
- "requires": {
- "camelcase": "4.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- }
- }
- }
- }
- },
- "update-notifier": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
- "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
- "requires": {
- "boxen": "1.3.0",
- "chalk": "2.3.2",
- "configstore": "3.1.1",
- "import-lazy": "2.1.0",
- "is-installed-globally": "0.1.0",
- "is-npm": "1.0.0",
- "latest-version": "3.1.0",
- "semver-diff": "2.1.0",
- "xdg-basedir": "3.0.0"
- },
- "dependencies": {
- "ansi-align": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
- "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
- "requires": {
- "string-width": "2.1.1"
- }
- },
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "1.9.1"
- }
- },
- "boxen": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
- "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
- "requires": {
- "ansi-align": "2.0.0",
- "camelcase": "4.1.0",
- "chalk": "2.3.2",
- "cli-boxes": "1.0.0",
- "string-width": "2.1.1",
- "term-size": "1.2.0",
- "widest-line": "2.0.0"
- }
- },
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- },
- "capture-stack-trace": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
- "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0="
- },
- "chalk": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.3.0"
- }
- },
- "cli-boxes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
- "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
- },
- "color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "configstore": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
- "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
- "requires": {
- "dot-prop": "4.2.0",
- "graceful-fs": "4.1.11",
- "make-dir": "1.2.0",
- "unique-string": "1.0.0",
- "write-file-atomic": "2.3.0",
- "xdg-basedir": "3.0.0"
- }
- },
- "create-error-class": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
- "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
- "requires": {
- "capture-stack-trace": "1.0.0"
- }
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "4.1.1",
- "shebang-command": "1.2.0",
- "which": "1.3.0"
- }
- },
- "crypto-random-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
- "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
- },
- "deep-extend": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
- "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
- },
- "dot-prop": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
- "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
- "requires": {
- "is-obj": "1.0.1"
- }
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "requires": {
- "cross-spawn": "5.1.0",
- "get-stream": "3.0.0",
- "is-stream": "1.1.0",
- "npm-run-path": "2.0.2",
- "p-finally": "1.0.0",
- "signal-exit": "3.0.2",
- "strip-eof": "1.0.0"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "global-dirs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
- "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
- "requires": {
- "ini": "1.3.5"
- }
- },
- "got": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
- "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
- "requires": {
- "create-error-class": "3.0.2",
- "duplexer3": "0.1.4",
- "get-stream": "3.0.0",
- "is-redirect": "1.0.0",
- "is-retry-allowed": "1.1.0",
- "is-stream": "1.1.0",
- "lowercase-keys": "1.0.0",
- "safe-buffer": "5.1.1",
- "timed-out": "4.0.1",
- "unzip-response": "2.0.1",
- "url-parse-lax": "1.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-installed-globally": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
- "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
- "requires": {
- "global-dirs": "0.1.1",
- "is-path-inside": "1.0.1"
- }
- },
- "is-npm": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
- "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "1.0.2"
- }
- },
- "is-redirect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
- "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
- },
- "is-retry-allowed": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
- "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "latest-version": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
- "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
- "requires": {
- "package-json": "4.0.1"
- }
- },
- "lowercase-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
- "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
- },
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "requires": {
- "pseudomap": "1.0.2",
- "yallist": "2.1.2"
- }
- },
- "make-dir": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
- "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
- "requires": {
- "pify": "3.0.0"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "2.0.1"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "package-json": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
- "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
- "requires": {
- "got": "6.7.1",
- "registry-auth-token": "3.3.2",
- "registry-url": "3.1.0",
- "semver": "5.5.0"
- }
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "rc": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz",
- "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=",
- "requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.5",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
- }
- },
- "registry-auth-token": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
- "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
- "requires": {
- "rc": "1.2.5",
- "safe-buffer": "5.1.1"
- }
- },
- "registry-url": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
- "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
- "requires": {
- "rc": "1.2.5"
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "semver-diff": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
- "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
- "requires": {
- "semver": "5.5.0"
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "supports-color": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
- "requires": {
- "has-flag": "3.0.0"
- }
- },
- "term-size": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
- "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
- "requires": {
- "execa": "0.7.0"
- }
- },
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
- },
- "unique-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
- "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
- "requires": {
- "crypto-random-string": "1.0.0"
- }
- },
- "unzip-response": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
- "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
- },
- "url-parse-lax": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
- "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
- "requires": {
- "prepend-http": "1.0.4"
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "widest-line": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
- "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
- "requires": {
- "string-width": "2.1.1"
- }
- },
- "write-file-atomic": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
- "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
- "requires": {
- "graceful-fs": "4.1.11",
- "imurmurhash": "0.1.4",
- "signal-exit": "3.0.2"
- }
- },
- "xdg-basedir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
- "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- }
- }
- }
- }
-}
diff --git a/packages/core/package.json b/packages/core/package.json
index d162def7f..866ea172d 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,36 +1,42 @@
{
"name": "@pattern-lab/core",
"description": "Create atomic design systems with Pattern Lab. This is the core API and orchestrator of the ecosystem.",
- "version": "3.0.0-alpha.11",
+ "version": "5.9.3",
"main": "./src/index.js",
"dependencies": {
- "@pattern-lab/engine-mustache": "^2.0.0-alpha.5",
- "@pattern-lab/live-server": "^1.3.3-alpha.2",
- "chalk": "^1.1.3",
- "chokidar": "^1.7.0",
- "dive": "^0.5.0",
- "fs-extra": "^5.0.0",
- "glob": "^7.0.0",
- "graphlib": "^2.1.1",
- "js-beautify": "^1.6.3",
- "js-yaml": "^3.6.1",
- "lodash": "~4.17.5",
- "markdown-it": "^6.0.1",
- "node-fetch": "^1.6.0",
- "recursive-copy": "^2.0.8",
- "update-notifier": "^2.2.0"
+ "@pattern-lab/engine-mustache": "^5.0.0",
+ "@pattern-lab/live-server": "^5.9.3",
+ "chalk": "1.1.3",
+ "chokidar": "1.7.0",
+ "dive": "0.5.0",
+ "fs-extra": "5.0.0",
+ "glob": "7.0.0",
+ "graphlib": "2.1.1",
+ "js-beautify": "1.6.3",
+ "js-yaml": "3.13.1",
+ "lodash": "4.17.15",
+ "markdown-it": "6.0.1",
+ "node-fetch": "1.6.0",
+ "recursive-copy": "2.0.8",
+ "update-notifier": "2.2.0"
},
"devDependencies": {
- "eslint": "4.18.2",
- "eslint-config-prettier": "2.9.0",
- "eslint-plugin-prettier": "2.6.0",
- "husky": "^0.14.3",
- "jsdoc-to-markdown": "^3.0.0",
- "prettier": "1.11.1",
- "pretty-quick": "^1.2.2",
+ "@babel/core": "^7.5.5",
+ "@babel/plugin-proposal-decorators": "^7.4.4",
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "babel-eslint": "^10.0.2",
+ "eslint": "^6.1.0",
+ "eslint-config-airbnb-base": "^14.0.0",
+ "eslint-config-prettier": "^6.0.0",
+ "eslint-plugin-import": "^2.18.2",
+ "eslint-plugin-prettier": "^3.1.0",
+ "husky": "0.14.3",
+ "jsdoc-to-markdown": "5.0.1",
+ "prettier": "^1.14.3",
+ "pretty-quick": "^1.11.1",
"rewire": "2.5.2",
- "standard-version": "^4.3.0",
- "tap": "11.1.1"
+ "standard-version": "4.3.0",
+ "tap": "14.6.4"
},
"keywords": [
"Pattern Lab",
@@ -59,13 +65,13 @@
"license": "MIT",
"scripts": {
"docs": "node ./scripts/docs.js",
- "lint": "eslint src/**/*.js",
+ "lint": "eslint -c ../../.eslintrc.js src/**/*.js",
"pretest": "npm run lint",
"release": "standard-version",
"test": "tap test/*_tests.js --reporter spec --coverage"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/core/patternlab-config.json b/packages/core/patternlab-config.json
index 70b86544f..39eed54fd 100644
--- a/packages/core/patternlab-config.json
+++ b/packages/core/patternlab-config.json
@@ -32,41 +32,49 @@
"markupOnly": ".markup-only"
},
"paths" : {
- "source" : {
+ "source": {
"root": "./source/",
- "patterns" : "./source/_patterns/",
- "data" : "./source/_data/",
+ "patterns": "./source/_patterns/",
+ "data": "./source/_data/",
"meta": "./source/_meta/",
- "annotations" : "./source/_annotations/",
- "styleguide" : "./node_modules/@pattern-lab/uikit-workshop/dist/",
- "patternlabFiles" : {
- "general-header": "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-header.mustache",
- "general-footer": "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-footer.mustache",
- "patternSection": "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSection.mustache",
- "patternSectionSubtype": "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSectionSubtype.mustache",
- "viewall": "./node_modules/@pattern-lab/uikit-workshop/views/viewall.mustache"
+ "annotations": "./source/_annotations/",
+ "styleguide": "dist/",
+ "patternlabFiles": {
+ "general-header":
+ "views/partials/general-header.mustache",
+ "general-footer":
+ "views/partials/general-footer.mustache",
+ "patternSection":
+ "views/partials/patternSection.mustache",
+ "patternSectionSubtype":
+ "views/partials/patternSectionSubtype.mustache",
+ "viewall":
+ "views/viewall.mustache"
},
- "js" : "./source/js",
- "images" : "./source/images",
- "fonts" : "./source/fonts",
- "css" : "./source/css/"
+ "js": "./source/js",
+ "images": "./source/images",
+ "fonts": "./source/fonts",
+ "css": "./source/css"
},
- "public" : {
- "root" : "./public/",
- "patterns" : "./public/patterns/",
- "data" : "./public/styleguide/data/",
- "annotations" : "./public/annotations/",
- "styleguide" : "./public/styleguide/",
- "js" : "./public/js",
- "images" : "./public/images",
- "fonts" : "./public/fonts",
- "css" : "./public/css"
+ "public": {
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
}
},
"patternExtension": "mustache",
"patternStateCascade": ["inprogress", "inreview", "complete"],
- "patternExportDirectory": "./pattern_exports/",
+ "patternExportAll": false,
+ "patternExportDirectory": "pattern_exports",
"patternExportPatternPartials": [],
+ "patternExportPreserveDirectoryStructure": true,
+ "patternExportRaw": false,
"serverOptions": {
"wait": 1000
},
@@ -77,5 +85,14 @@
"color": "dark",
"density": "compact",
"layout": "horizontal"
- }
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ]
}
diff --git a/packages/core/scripts/api.handlebars b/packages/core/scripts/api.handlebars
index 599102f62..8959ef5cf 100644
--- a/packages/core/scripts/api.handlebars
+++ b/packages/core/scripts/api.handlebars
@@ -10,50 +10,10 @@
``` javascript
const config = require('./patternlab-config.json');
-const patternlab = require('patternlab-node')(config);
+const patternlab = require('@pattern-lab/core')(config);
```
-## Events
-
-Pattern Lab emits numerous [events](./events.md).
-
-## Functions
-
-Many of these functions are exposed to users within [Editions](https://github.com/pattern-lab/patternlab-node#editions), but [direct consumption](https://github.com/pattern-lab/patternlab-node#direct-consumption) is also encouraged.
-
-{{#orphans ~}}
- {{>heading-indent}}{{>sig-name}}
-
- {{>deprecated~}}
- {{>description~}}
- {{>summary~}}
- {{>augments~}}
- {{>implements~}}
- {{>mixes~}}
- {{>default~}}
- {{>chainable~}}
- {{>overrides~}}
- {{>returns~}}
- {{>category~}}
- {{>throws~}}
- {{>fires~}}
- {{>this~}}
- {{>access~}}
- {{>readOnly~}}
- {{>requires~}}
- {{>customTags~}}
- {{>see~}}
- {{>since~}}
- {{>version~}}
- {{>authors~}}
- {{>license~}}
- {{>copyright~}}
- {{>todo~}}
- {{>params~}}
- {{>properties~}}
- {{>examples~}}
-
-{{/orphans~}}
+{{>main}}
* * *
diff --git a/packages/core/scripts/events.handlebars b/packages/core/scripts/events.handlebars
index ca564fd52..667e8c9bf 100644
--- a/packages/core/scripts/events.handlebars
+++ b/packages/core/scripts/events.handlebars
@@ -5,7 +5,7 @@
Pattern Lab emits numerous events during the [build](../docs/) process. Some uses of events:
* Core uses `patternlab-pattern-change` events when watching for changes in order to trigger another build
-* Plugins such as [plugin-node-tab](https://github.com/pattern-lab/plugin-node-tab) can use an event like `patternlab-pattern-write-end` to define additional code tabs to the pattern viewer / modal
+* Plugins such as [plugin-tab](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab) can use an event like `patternlab-pattern-write-end` to define additional code tabs to the pattern viewer / modal
Learn more about [Creating Plugins](https://github.com/pattern-lab/patternlab-node/wiki/Creating-Plugins).
diff --git a/packages/core/src/index.js b/packages/core/src/index.js
index bd78281af..1c575c3ab 100644
--- a/packages/core/src/index.js
+++ b/packages/core/src/index.js
@@ -1,44 +1,33 @@
-/*
- * patternlab-node https://github.com/pattern-lab/patternlab-node
- *
- * Brian Muenzenmeyer, Geoff Pursell, Raphael Okon, tburny and the web community.
- * Licensed under the MIT license.
- *
- * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice.
+/**
+ * Build thoughtful, pattern-driven user interfaces using atomic design principles.
+ * Many of these functions are exposed to users within {@link https://github.com/pattern-lab/patternlab-node#editions|Editions}, but {@link https://github.com/pattern-lab/patternlab-node#direct-consumption|direct consumption} is also encouraged.
*
+ * @namespace patternlab
+ * @see {@link patternlab.io} for more documentation.
+ * @see {@link https://github.com/pattern-lab/patternlab-node} for code, issues, and releases
+ * @license MIT
*/
'use strict';
-const packageInfo = require('../package.json');
-
-const { concat } = require('lodash');
-const copy = require('recursive-copy');
const path = require('path');
+
const updateNotifier = require('update-notifier');
-const help = require('./lib/help');
+const packageInfo = require('../package.json');
const events = require('./lib/events');
-const logger = require('./lib/log');
-const PatternGraph = require('./lib/pattern_graph').PatternGraph;
-const CompileState = require('./lib/object_factory').CompileState;
const pe = require('./lib/pattern_exporter');
-const lh = require('./lib/lineage_hunter');
-const markModifiedPatterns = require('./lib/markModifiedPatterns');
-const parseAllLinks = require('./lib/parseAllLinks');
-const processMetaPattern = require('./lib/processMetaPattern');
-const render = require('./lib/render');
-const Pattern = require('./lib/object_factory').Pattern;
+const pm = require('./lib/plugin_manager');
const defaultConfig = require('../patternlab-config.json');
+let buildPatterns = require('./lib/buildPatterns'); // eslint-disable-line
+let logger = require('./lib/log'); // eslint-disable-line
let fs = require('fs-extra'); // eslint-disable-line
let ui_builder = require('./lib/ui_builder'); // eslint-disable-line
let copier = require('./lib/copier'); // eslint-disable-line
let pattern_exporter = new pe(); // eslint-disable-line
-let serve = require('./lib/serve'); // eslint-disable-line
-
-const lineage_hunter = new lh();
+let serverModule = require('./lib/server'); // eslint-disable-line
//bootstrap update notifier
updateNotifier({
@@ -47,257 +36,95 @@ updateNotifier({
}).notify();
/**
- * Returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
+ * Static method that returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
*
+ * @memberof patternlab
+ * @name getDefaultConfig
+ * @static
* @return {object} Returns the object representation of the `patternlab-config.json`
*/
const getDefaultConfig = function() {
return defaultConfig;
};
-const patternlab_module = function(config) {
- const PatternLab = require('./lib/patternlab');
- const patternlab = new PatternLab(config);
- const paths = patternlab.config.paths;
-
- /**
- * If a graph was serialized and then {@code deletePatternDir == true}, there is a mismatch in the
- * pattern metadata and not all patterns might be recompiled.
- * For that reason an empty graph is returned in this case, so every pattern will be flagged as
- * "needs recompile". Otherwise the pattern graph is loaded from the meta data.
- *
- * @param patternlab
- * @param {boolean} deletePatternDir When {@code true}, an empty graph is returned
- * @return {PatternGraph}
- */
- function loadPatternGraph(deletePatternDir) {
- // Sanity check to prevent problems when code is refactored
- if (deletePatternDir) {
- return PatternGraph.empty();
- }
- return PatternGraph.loadFromFile(patternlab);
- }
-
- function cleanBuildDirectory(incrementalBuildsEnabled) {
- if (incrementalBuildsEnabled) {
- logger.info('Incremental builds enabled.');
- return Promise.resolve();
- } else {
- // needs to be done BEFORE processing patterns
- return fs
- .emptyDir(paths.public.patterns)
- .then(() => {
- return Promise.resolve();
- })
- .catch(reason => {
- logger.error(reason);
- });
- }
- }
-
- function buildPatterns(deletePatternDir, additionalData) {
- patternlab.events.emit(events.PATTERNLAB_BUILD_PATTERN_START, patternlab);
-
- //
- // CHECK INCREMENTAL BUILD GRAPH
- //
- const graph = (patternlab.graph = loadPatternGraph(deletePatternDir));
- const graphNeedsUpgrade = !PatternGraph.checkVersion(graph);
- if (graphNeedsUpgrade) {
- logger.info(
- 'Due to an upgrade, a complete rebuild is required and the public/patterns directory was deleted. ' +
- 'Incremental build is available again on the next successful run.'
- );
-
- // Ensure that the freshly built graph has the latest version again.
- patternlab.graph.upgradeVersion();
- }
-
- // Flags
- patternlab.incrementalBuildsEnabled = !(
- deletePatternDir || graphNeedsUpgrade
- );
-
- //
- // CLEAN BUILD DIRECTORY, maybe
- //
- return cleanBuildDirectory(patternlab.incrementalBuildsEnabled).then(() => {
- patternlab.buildGlobalData(additionalData);
-
- return patternlab
- .processAllPatternsIterative(paths.source.patterns)
- .then(() => {
- patternlab.events.emit(
- events.PATTERNLAB_PATTERN_ITERATION_END,
- patternlab
- );
-
- //now that all the main patterns are known, look for any links that might be within data and expand them
- //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference
- parseAllLinks(patternlab);
-
- //dive again to recursively include partials, filling out the
- //extendedTemplate property of the patternlab.patterns elements
-
- return patternlab
- .processAllPatternsRecursive(paths.source.patterns)
- .then(() => {
- //take the user defined head and foot and process any data and patterns that apply
- const headPatternPromise = processMetaPattern(
- `_00-head.${patternlab.config.patternExtension}`,
- 'userHead',
- patternlab
- );
- const footPatternPromise = processMetaPattern(
- `_01-foot.${patternlab.config.patternExtension}`,
- 'userFoot',
- patternlab
- );
-
- return Promise.all([headPatternPromise, footPatternPromise])
- .then(() => {
- //cascade any patternStates
- lineage_hunter.cascade_pattern_states(patternlab);
-
- //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
- return render(
- Pattern.createEmpty({
- extendedTemplate: patternlab.header,
- }),
- {
- cacheBuster: patternlab.cacheBuster,
- }
- )
- .then(results => {
- patternlab.data.patternLabHead = results;
-
- // If deletePatternDir == true or graph needs to be updated
- // rebuild all patterns
- let patternsToBuild = null;
-
- // If deletePatternDir == true or graph needs to be updated
- // rebuild all patterns
- patternsToBuild = null;
-
- if (patternlab.incrementalBuildsEnabled) {
- // When the graph was loaded from file, some patterns might have been moved/deleted between runs
- // so the graph data become out of sync
- patternlab.graph.sync().forEach(n => {
- logger.info('[Deleted/Moved] ' + n);
- });
-
- // TODO Find created or deleted files
- const now = new Date().getTime();
- markModifiedPatterns(now, patternlab);
- patternsToBuild = patternlab.graph.compileOrder();
- } else {
- // build all patterns, mark all to be rebuilt
- patternsToBuild = patternlab.patterns;
- for (const p of patternsToBuild) {
- p.compileState = CompileState.NEEDS_REBUILD;
- }
- }
- //render all patterns last, so lineageR works
- const allPatternsPromise = patternsToBuild.map(pattern =>
- patternlab.renderSinglePattern(pattern)
- );
- //copy non-pattern files like JavaScript
- const allJS = patternsToBuild.map(pattern => {
- const { name, patternPartial, subdir } = pattern;
- const {
- source: { patterns: sourceDir },
- public: { patterns: publicDir },
- } = patternlab.config.paths;
- const src = path.join(sourceDir, subdir);
- const dest = path.join(publicDir, name);
- return copy(src, dest, {
- overwrite: true,
- filter: ['*.js'],
- rename: () => {
- return `${patternPartial}.js`;
- },
- }).on(copy.events.COPY_FILE_COMPLETE, () => {
- logger.debug(
- `Copied JavaScript files from ${src} to ${dest}`
- );
- });
- });
- return Promise.all(concat(allPatternsPromise, allJS))
- .then(() => {
- // Saves the pattern graph when all files have been compiled
- PatternGraph.storeToFile(patternlab);
- if (patternlab.config.exportToGraphViz) {
- PatternGraph.exportToDot(
- patternlab,
- 'dependencyGraph.dot'
- );
- logger.info(
- `Exported pattern graph to ${path.join(
- config.paths.public.root,
- 'dependencyGraph.dot'
- )}`
- );
- }
+/**
+ * Static method that returns current version
+ *
+ * @memberof patternlab
+ * @name getVersion
+ * @static
+ * @returns {string} current @pattern-lab/core version as defined in `package.json`
+ */
+const getVersion = function() {
+ return packageInfo.version;
+};
- //export patterns if necessary
- pattern_exporter.export_patterns(patternlab);
- })
- .catch(reason => {
- console.log(reason);
- logger.error('Error rendering patterns');
- });
- })
- .catch(reason => {
- console.log(reason);
- logger.error('Error rendering pattern lab header');
- });
- })
- .catch(reason => {
- console.log(reason);
- logger.error('Error processing meta patterns');
- });
- })
- .catch(reason => {
- console.log(reason);
- logger.error('Error processing patterns recursively');
- });
- })
- .catch(reason => {
- console.log(reason);
- logger.error('Error in buildPatterns()');
- });
- });
- }
+const patternlab_module = function(config) {
+ const PatternLabClass = require('./lib/patternlab');
+ const patternlab = new PatternLabClass(config);
+ const server = serverModule(patternlab);
- return {
+ const _api = {
/**
- * Logs current version to standard output
+ * Returns current version
*
- * @returns {void} current patternlab-node version as defined in `package.json`
+ * @memberof patternlab
+ * @name version
+ * @instance
+ * @returns {string} current patternlab-node version as defined in `package.json`, as string
*/
version: function() {
- return patternlab.logVersion();
+ return patternlab.getVersion();
},
/**
- * Returns current version
+ * Returns the current pattern lab configuration being used
*
- * @returns {string} current patternlab-node version as defined in `package.json`, as string
+ * @memberof patternlab
+ * @name getConfig
+ * @instance
+ * @returns {object} the current patternlab-node config (defaults + customizations)
*/
- v: function() {
- return patternlab.getVersion();
+ getConfig() {
+ return config;
+ },
+
+ /**
+ * Returns if Pattern Lab is busy compiling or not
+ *
+ * @memberof patternlab
+ * @name isBusy
+ * @instance
+ * @returns {boolean} if pattern lab is currently busy compiling
+ */
+ isBusy: function() {
+ return patternlab.isBusy;
},
/**
* Builds patterns, copies assets, and constructs user interface
*
+ * @memberof patternlab
+ * @name build
+ * @instance
* @param {object} options an object used to control build behavior
- * @param {bool} options.cleanPublic whether or not to delete the configured output location (usually `public/`) before build
- * @param {object} options.data additional data to be merged with global data prior to build
- * @param {bool} options.watch whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild
+ * @param {bool} [options.cleanPublic=true] whether or not to delete the configured output location (usually `public/`) before build
+ * @param {object} [options.data={}] additional data to be merged with global data prior to build
+ * @param {bool} [options.watch=true] whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild
+ * @emits PATTERNLAB_BUILD_START
+ * @emits PATTERNLAB_BUILD_END
+ * @see {@link ./events.md|all events}
* @returns {Promise} a promise fulfilled when build is complete
*/
- build: function(options) {
+ build: async function(options) {
+ // process.on('unhandledRejection', (reason, p) => {
+ // console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
+ // // application specific logging, throwing an error, or other logic here
+
+ // console.log(reason.stack);
+ // debugger;
+ // });
+
if (patternlab && patternlab.isBusy) {
logger.info(
'Pattern Lab is busy building a previous run - returning early.'
@@ -305,28 +132,49 @@ const patternlab_module = function(config) {
return Promise.resolve();
}
patternlab.isBusy = true;
- return buildPatterns(options.cleanPublic, options.data).then(() => {
+
+ return await buildPatterns(
+ options.cleanPublic,
+ patternlab,
+ options.data
+ ).then(() => {
return new ui_builder().buildFrontend(patternlab).then(() => {
copier()
.copyAndWatch(patternlab.config.paths, patternlab, options)
.then(() => {
- this.events.once(events.PATTERNLAB_PATTERN_CHANGE, () => {
- if (!patternlab.isBusy) {
- return this.build(options);
- }
- return Promise.resolve();
- });
-
- this.events.once(events.PATTERNLAB_GLOBAL_CHANGE, () => {
- if (!patternlab.isBusy) {
- return this.build(
- Object.assign({}, options, { cleanPublic: true }) // rebuild everything
- );
- }
- return Promise.resolve();
- });
-
patternlab.isBusy = false;
+ // only wire up this listener and the one inside serve.js
+ // figure out how to detect if serve was called. we should not assume it was
+ if (
+ patternlab.serverReady //check for server presence
+ ? this.events.listenerCount(
+ events.PATTERNLAB_PATTERN_CHANGE
+ ) === 1 //if the server is started, it has already setup one listener
+ : !this.events.listenerCount(events.PATTERNLAB_PATTERN_CHANGE) // else, check for the presnce of none
+ ) {
+ this.events.on(events.PATTERNLAB_PATTERN_CHANGE, () => {
+ if (!patternlab.isBusy) {
+ return this.build(options).then(() => {
+ patternlab.isBusy = false;
+ });
+ }
+ return Promise.resolve();
+ });
+ }
+
+ if (!this.events.listenerCount(events.PATTERNLAB_GLOBAL_CHANGE)) {
+ this.events.on(events.PATTERNLAB_GLOBAL_CHANGE, () => {
+ if (!patternlab.isBusy) {
+ return this.build(
+ Object.assign({}, options, { cleanPublic: true }) // rebuild everything
+ );
+ }
+ return Promise.resolve();
+ });
+ }
+ })
+ .then(() => {
+ this.events.emit(events.PATTERNLAB_BUILD_END, patternlab);
});
});
});
@@ -335,6 +183,9 @@ const patternlab_module = function(config) {
/**
* Returns the standardized default config used to run Pattern Lab. This method can be called statically or after instantiation.
*
+ * @memberof patternlab
+ * @name getDefaultConfig
+ * @instance
* @return {object} Returns the object representation of the `patternlab-config.json`
*/
getDefaultConfig: function() {
@@ -344,34 +195,38 @@ const patternlab_module = function(config) {
/**
* Returns all file extensions supported by installed PatternEngines
*
+ * @memberof patternlab
+ * @name getSupportedTemplateExtensions
+ * @instance
* @returns {Array} all supported file extensions
*/
getSupportedTemplateExtensions: function() {
return patternlab.getSupportedTemplateExtensions();
},
- /**
- * Logs usage to standard output
- *
- * @returns {void} pattern lab API usage, as console output
- */
- help: function() {
- logger.info(help(patternlab.package.version));
- },
-
/**
* Installs plugin already available via `node_modules/`
*
+ * @memberof patternlab
+ * @name installplugin
+ * @instance
* @param {string} pluginName name of plugin
* @returns {void}
*/
installplugin: function(pluginName) {
- patternlab.installPlugin(pluginName);
+ //get the config
+ const configPath = path.resolve(process.cwd(), 'patternlab-config.json');
+ const plugin_manager = new pm();
+
+ plugin_manager.install_plugin(pluginName);
},
/**
* Fetches starterkit repositories from pattern-lab github org that contain 'starterkit' in their name
*
+ * @memberof patternlab
+ * @name liststarterkits
+ * @instance
* @returns {Promise} Returns an Array<{name,url}> for the starterkit repos
*/
liststarterkits: function() {
@@ -381,6 +236,9 @@ const patternlab_module = function(config) {
/**
* Loads starterkit already available via `node_modules/`
*
+ * @memberof patternlab
+ * @name loadstarterkit
+ * @instance
* @param {string} starterkitName name of starterkit
* @param {boolean} clean whether or not to delete contents of source/ before load
* @returns {void}
@@ -392,12 +250,15 @@ const patternlab_module = function(config) {
/**
* Builds patterns only, leaving existing user interface files intact
*
- * @param {object} options an object used to control build behavior
- * @param {bool} options.cleanPublic whether or not to delete the configured output location (usually `public/`) before build
- * @param {object} options.data additional data to be merged with global data prior to build
+ * @memberof patternlab
+ * @name patternsonly
+ * @instance
+ * @param {bool} [options.cleanPublic=true] whether or not to delete the configured output location (usually `public/`) before build
+ * @param {object} [options.data={}] additional data to be merged with global data prior to build
+ * @param {bool} [options.watch=true] whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild
* @returns {Promise} a promise fulfilled when build is complete
*/
- patternsonly: function(options) {
+ patternsonly: async function(options) {
if (patternlab && patternlab.isBusy) {
logger.info(
'Pattern Lab is busy building a previous run - returning early.'
@@ -405,32 +266,72 @@ const patternlab_module = function(config) {
return Promise.resolve();
}
patternlab.isBusy = true;
- return buildPatterns(options.cleanPublic, options.data).then(() => {
+ return await buildPatterns(
+ options.cleanPublic,
+ patternlab,
+ options.data
+ ).then(() => {
patternlab.isBusy = false;
});
},
/**
- * Build patterns, copies assets, and constructs user interface. Watches configured `source/` directories, and serves all output locally
+ * Server module
*
- * @param {object} options an object used to control build behavior
- * @param {bool} options.cleanPublic whether or not to delete the configured output location (usually `public/`) before build
- * @param {object} options.data additional data to be merged with global data prior to build
- * @param {bool} options.watch **ALWAYS OVERRIDDEN to `true`** whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild
- * @returns {Promise} a promise fulfilled when build is complete
+ * @memberof patternlab
+ * @type {object}
*/
- serve: function(options) {
- options.watch = true;
- return this.build(options).then(function() {
- serve(patternlab);
- return Promise.resolve();
- });
+ server: {
+ /**
+ * Build patterns, copies assets, and constructs user interface. Watches configured `source/` directories, and serves all output locally
+ *
+ * @method serve
+ * @memberof patternlab.server
+ * @param {object} options an object used to control build behavior
+ * @param {bool} [options.cleanPublic=true] whether or not to delete the configured output location (usually `public/`) before build
+ * @param {object} [options.data={}] additional data to be merged with global data prior to build
+ * @param {bool} [options.watch=true] whether or not Pattern Lab should watch configured `source/` directories for changes to rebuild
+ * @returns {Promise} a promise fulfilled when build is complete
+ */
+ serve: options => {
+ return _api
+ .build(options)
+ .then(() => server.serve())
+ .catch(e =>
+ logger.error(`error inside core index.js server serve: ${e}`)
+ );
+ },
+ /**
+ * Reloads any active live-server instances
+ *
+ * @method reload
+ * @memberof patternlab.server
+ * @returns {Promise} a promise fulfilled when operation is complete
+ */
+ reload: server.reload,
+ /**
+ * Reloads CSS on any active live-server instances
+ *
+ * @method refreshCSS
+ * @memberof patternlab.server
+ * @returns {Promise} a promise fulfilled when operation is complete
+ */
+ refreshCSS: server.refreshCSS,
},
+ /**
+ * @memberof patternlab
+ * @type {EventEmitter}
+ * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter|EventEmitter}
+ * @see {@link ./events.md|All Pattern Lab events}
+ */
events: patternlab.events,
};
+
+ return _api;
};
patternlab_module.getDefaultConfig = getDefaultConfig;
+patternlab_module.getVersion = getVersion;
module.exports = patternlab_module;
diff --git a/packages/core/src/lib/addPattern.js b/packages/core/src/lib/addPattern.js
index 6cc5e0266..12c0c9429 100644
--- a/packages/core/src/lib/addPattern.js
+++ b/packages/core/src/lib/addPattern.js
@@ -1,7 +1,5 @@
'use strict';
-const _ = require('lodash');
-
const logger = require('./log');
module.exports = function(pattern, patternlab) {
@@ -41,12 +39,7 @@ module.exports = function(pattern, patternlab) {
patternlab.partials[pattern.patternPartial] = pattern.patternDesc;
}
- //patterns sorted by name so the patterntype and patternsubtype is adhered to for menu building
- patternlab.patterns.splice(
- _.sortedIndexBy(patternlab.patterns, pattern, 'name'),
- 0,
- pattern
- );
+ patternlab.patterns.push(pattern);
patternlab.graph.add(pattern);
}
};
diff --git a/packages/core/src/lib/annotation_exporter.js b/packages/core/src/lib/annotation_exporter.js
index 8fb22470d..7ed86da28 100644
--- a/packages/core/src/lib/annotation_exporter.js
+++ b/packages/core/src/lib/annotation_exporter.js
@@ -23,9 +23,7 @@ const annotations_exporter = function(pl) {
);
} catch (ex) {
logger.debug(
- `annotations.js file missing from ${
- paths.source.annotations
- }. This may be expected if you do not use annotations or are using markdown.`
+ `annotations.js file missing from ${paths.source.annotations}. This may be expected if you do not use annotations or are using markdown.`
);
return [];
}
@@ -39,9 +37,7 @@ const annotations_exporter = function(pl) {
return oldAnnotationsJSON.comments;
} catch (ex) {
logger.error(
- `There was an error parsing JSON for ${
- paths.source.annotations
- }annotations.js`
+ `There was an error parsing JSON for ${paths.source.annotations}annotations.js`
);
return [];
}
diff --git a/packages/core/src/lib/buildFooter.js b/packages/core/src/lib/buildFooter.js
index 888b36634..5a3eb6217 100644
--- a/packages/core/src/lib/buildFooter.js
+++ b/packages/core/src/lib/buildFooter.js
@@ -13,9 +13,9 @@ let render = require('./render'); //eslint-disable-line prefer-const
* @param patternPartial - the partial key to build this for, either viewall-patternPartial or a viewall-patternType-all
* @returns A promise which resolves with the HTML
*/
-module.exports = function(patternlab, patternPartial) {
+module.exports = function(patternlab, patternPartial, uikit) {
//first render the general footer
- return render(Pattern.createEmpty({ extendedTemplate: patternlab.footer }), {
+ return render(Pattern.createEmpty({ extendedTemplate: uikit.footer }), {
patternData: JSON.stringify({
patternPartial: patternPartial,
}),
diff --git a/packages/core/src/lib/buildPatterns.js b/packages/core/src/lib/buildPatterns.js
new file mode 100644
index 000000000..c550a6880
--- /dev/null
+++ b/packages/core/src/lib/buildPatterns.js
@@ -0,0 +1,229 @@
+'use strict';
+
+const { concat, map } = require('lodash');
+const copy = require('recursive-copy');
+const path = require('path');
+
+const cleanBuildDirectory = require('./cleanBuildDirectory');
+const compose = require('./compose');
+const events = require('./events');
+const loadPatternGraph = require('./loadPatternGraph');
+const logger = require('./log');
+const PatternGraph = require('./pattern_graph').PatternGraph;
+const CompileState = require('./object_factory').CompileState;
+const processMetaPattern = require('./processMetaPattern');
+const pe = require('./pattern_exporter');
+const lh = require('./lineage_hunter');
+const pm = require('./plugin_manager');
+const pluginMananger = new pm();
+const markModifiedPatterns = require('./markModifiedPatterns');
+const parseAllLinks = require('./parseAllLinks');
+const render = require('./render');
+const Pattern = require('./object_factory').Pattern;
+
+let fs = require('fs-extra'); // eslint-disable-line
+let pattern_exporter = new pe(); // eslint-disable-line
+
+const lineage_hunter = new lh();
+
+module.exports = async (deletePatternDir, patternlab, additionalData) => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_BUILD_START,
+ patternlab
+ );
+
+ const paths = patternlab.config.paths;
+
+ //
+ // CHECK INCREMENTAL BUILD GRAPH
+ //
+ const graph = (patternlab.graph = loadPatternGraph(
+ patternlab,
+ patternlab.config.cleanPublic
+ ));
+ const graphNeedsUpgrade = !PatternGraph.checkVersion(graph);
+ if (graphNeedsUpgrade) {
+ logger.info(
+ 'Due to an upgrade, a complete rebuild is required and the public/patterns directory was deleted. ' +
+ 'Incremental build is available again on the next successful run.'
+ );
+
+ // Ensure that the freshly built graph has the latest version again.
+ patternlab.graph.upgradeVersion();
+ }
+
+ // Flags
+ patternlab.incrementalBuildsEnabled = !(
+ patternlab.config.cleanPublic || graphNeedsUpgrade
+ );
+
+ //
+ // CLEAN BUILD DIRECTORY, maybe
+ //
+ return cleanBuildDirectory(
+ patternlab.incrementalBuildsEnabled,
+ patternlab
+ ).then(() => {
+ patternlab.buildGlobalData(additionalData);
+
+ return patternlab
+ .processAllPatternsIterative(paths.source.patterns)
+ .then(async () => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_ITERATION_END,
+ patternlab
+ );
+
+ //now that all the main patterns are known, look for any links that might be within data and expand them
+ //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference
+ parseAllLinks(patternlab);
+
+ //dive again to recursively include partials, filling out the
+ //extendedTemplate property of the patternlab.patterns elements
+
+ return patternlab
+ .processAllPatternsRecursive(paths.source.patterns)
+ .then(() => {
+ //take the user defined head and foot and process any data and patterns that apply
+
+ //todo this need to be made aware of multiple ui kits
+ //perhaps we can check for a convention like [uikitname]_00-head.mustache, and if found, add them to patternlab.uikits[uikitname].userFoot
+ //then, if present, use those during compose()
+ const headPatternPromise = processMetaPattern(
+ `_00-head.${patternlab.config.patternExtension}`,
+ 'userHead',
+ patternlab
+ );
+ const footPatternPromise = processMetaPattern(
+ `_01-foot.${patternlab.config.patternExtension}`,
+ 'userFoot',
+ patternlab
+ );
+
+ return Promise.all([headPatternPromise, footPatternPromise])
+ .then(() => {
+ //cascade any patternStates
+ lineage_hunter.cascade_pattern_states(patternlab);
+
+ //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
+ return render(
+ Pattern.createEmpty({
+ // todo should this be uikit.header?
+ extendedTemplate: patternlab.header,
+ }),
+ {
+ cacheBuster: patternlab.cacheBuster,
+ }
+ )
+ .then(results => {
+ patternlab.data.patternLabHead = results;
+
+ // If deletePatternDir == true or graph needs to be updated
+ // rebuild all patterns
+ let patternsToBuild = null;
+
+ // If deletePatternDir == true or graph needs to be updated
+ // rebuild all patterns
+ patternsToBuild = null;
+
+ if (patternlab.incrementalBuildsEnabled) {
+ // When the graph was loaded from file, some patterns might have been moved/deleted between runs
+ // so the graph data become out of sync
+ patternlab.graph.sync().forEach(n => {
+ logger.info('[Deleted/Moved] ' + n);
+ });
+
+ // TODO Find created or deleted files
+ const now = new Date().getTime();
+ markModifiedPatterns(now, patternlab);
+ patternsToBuild = patternlab.graph.compileOrder();
+ } else {
+ // build all patterns, mark all to be rebuilt
+ patternsToBuild = patternlab.patterns;
+ for (const p of patternsToBuild) {
+ p.compileState = CompileState.NEEDS_REBUILD;
+ }
+ }
+ //render all patterns last, so lineageR works
+ const allPatternsPromise = patternsToBuild.map(
+ async pattern =>
+ await compose(
+ pattern,
+ patternlab
+ )
+ );
+ //copy non-pattern files like JavaScript
+ const allJS = patternsToBuild.map(pattern => {
+ const { name, patternPartial, subdir } = pattern;
+ const {
+ source: { patterns: sourceDir },
+ public: { patterns: publicDir },
+ } = patternlab.config.paths;
+ const src = path.join(sourceDir, subdir);
+ const dest = path.join(publicDir, name);
+ return map(patternlab.uikits, uikit => {
+ return copy(
+ src,
+ path.resolve(process.cwd(), uikit.outputDir, dest),
+ {
+ overwrite: true,
+ filter: ['*.js'],
+ rename: () => {
+ return `${patternPartial}.js`;
+ },
+ }
+ ).on(copy.events.COPY_FILE_COMPLETE, () => {
+ logger.debug(
+ `Copied JavaScript files from ${src} to ${dest}`
+ );
+ });
+ });
+ });
+ return Promise.all(concat(allPatternsPromise, allJS))
+ .then(() => {
+ // Saves the pattern graph when all files have been compiled
+ PatternGraph.storeToFile(patternlab);
+ if (patternlab.config.exportToGraphViz) {
+ PatternGraph.exportToDot(
+ patternlab,
+ 'dependencyGraph.dot'
+ );
+ logger.info(
+ `Exported pattern graph to ${path.join(
+ patternlab.config.paths.public.root,
+ 'dependencyGraph.dot'
+ )}`
+ );
+ }
+
+ //export patterns if necessary
+ pattern_exporter.export_patterns(patternlab);
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('Error rendering patterns');
+ });
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('Error rendering pattern lab header');
+ });
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('Error processing meta patterns');
+ });
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('Error processing patterns recursively');
+ });
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('Error in buildPatterns()');
+ });
+ });
+};
diff --git a/packages/core/src/lib/changes_hunter.js b/packages/core/src/lib/changes_hunter.js
index a2bcec0a3..038be8b41 100644
--- a/packages/core/src/lib/changes_hunter.js
+++ b/packages/core/src/lib/changes_hunter.js
@@ -1,4 +1,8 @@
'use strict';
+
+const path = require('path');
+const _ = require('lodash');
+
const CompileState = require('./object_factory').CompileState;
//this is mocked in unit tests
@@ -36,25 +40,33 @@ ChangesHunter.prototype = {
pattern.compileState = CompileState.NEEDS_REBUILD;
}
- try {
- // renderedTemplatePath required to display a single element
- // Markup only is required for "View All" pages. It will get loaded later on.
- // If any of these is missing, mark pattern for recompile
- [renderedTemplatePath, markupOnlyPath].forEach(renderedFile =>
- // Prevent error message if file does not exist
- fs.accessSync(renderedFile, fs.F_OK)
- );
- const outputLastModified = fs
- .statSync(renderedTemplatePath)
- .mtime.getTime();
-
- if (pattern.lastModified && outputLastModified > pattern.lastModified) {
- pattern.compileState = CompileState.CLEAN;
+ _.each(patternlab.uikits, uikit => {
+ try {
+ // renderedTemplatePath required to display a single element
+ // Markup only is required for "View All" pages. It will get loaded later on.
+ // If any of these is missing, mark pattern for recompile
+ [renderedTemplatePath, markupOnlyPath].forEach(renderedFile => {
+ // Prevent error message if file does not exist
+ fs.accessSync(
+ path.join(process.cwd(), uikit.outputDir, renderedFile),
+ fs.F_OK
+ );
+ });
+
+ const outputLastModified = fs
+ .statSync(
+ path.join(process.cwd(), uikit.outputDir, renderedTemplatePath)
+ )
+ .mtime.getTime();
+
+ if (pattern.lastModified && outputLastModified > pattern.lastModified) {
+ pattern.compileState = CompileState.CLEAN;
+ }
+ } catch (e) {
+ // Output does not exist yet, force recompile
+ pattern.compileState = CompileState.NEEDS_REBUILD;
}
- } catch (e) {
- // Output does not exist yet, force recompile
- pattern.compileState = CompileState.NEEDS_REBUILD;
- }
+ });
const node = patternlab.graph.node(pattern);
diff --git a/packages/core/src/lib/cleanBuildDirectory.js b/packages/core/src/lib/cleanBuildDirectory.js
new file mode 100644
index 000000000..11d78c01e
--- /dev/null
+++ b/packages/core/src/lib/cleanBuildDirectory.js
@@ -0,0 +1,27 @@
+'use strict';
+
+const _ = require('lodash');
+const path = require('path');
+
+const logger = require('./log');
+
+let fs = require('fs-extra'); // eslint-disable-line
+
+module.exports = (incrementalBuildsEnabled, patternlab) => {
+ const paths = patternlab.config.paths;
+
+ if (incrementalBuildsEnabled) {
+ logger.info('Incremental builds enabled.');
+ return Promise.resolve();
+ } else {
+ return Promise.all(
+ _.map(patternlab.uikits, uikit => {
+ return fs.emptyDir(
+ path.join(process.cwd(), uikit.outputDir, paths.public.patterns)
+ );
+ })
+ ).catch(reason => {
+ logger.error(reason);
+ });
+ }
+};
diff --git a/packages/core/src/lib/compose.js b/packages/core/src/lib/compose.js
new file mode 100644
index 000000000..07c202ce7
--- /dev/null
+++ b/packages/core/src/lib/compose.js
@@ -0,0 +1,213 @@
+'use strict';
+
+const _ = require('lodash');
+
+const events = require('./events');
+const jsonCopy = require('./json_copy');
+const logger = require('./log');
+const parseLink = require('./parseLink');
+const render = require('./render');
+const uikitExcludePattern = require('./uikitExcludePattern');
+const pm = require('./plugin_manager');
+const pluginMananger = new pm();
+
+const Pattern = require('./object_factory').Pattern;
+const CompileState = require('./object_factory').CompileState;
+
+module.exports = async function(pattern, patternlab) {
+ // Pattern does not need to be built and recompiled more than once
+ if (!pattern.isPattern || pattern.compileState === CompileState.CLEAN) {
+ return Promise.resolve(false);
+ }
+
+ // Allows serializing the compile state
+ patternlab.graph.node(pattern).compileState = pattern.compileState =
+ CompileState.BUILDING;
+
+ //todo move this into lineage_hunter
+ pattern.patternLineages = pattern.lineage;
+ pattern.patternLineageExists = pattern.lineage.length > 0;
+ pattern.patternLineagesR = pattern.lineageR;
+ pattern.patternLineageRExists = pattern.lineageR.length > 0;
+ pattern.patternLineageEExists =
+ pattern.patternLineageExists || pattern.patternLineageRExists;
+
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_BEFORE_DATA_MERGE,
+ patternlab,
+ pattern
+ );
+
+ return Promise.all(
+ _.map(patternlab.uikits, uikit => {
+ // exclude pattern from uikit rendering
+ if (uikitExcludePattern(pattern, uikit)) {
+ return Promise.resolve();
+ }
+
+ //render the pattern, but first consolidate any data we may have
+ let allData;
+
+ let allListItems = _.merge({}, patternlab.listitems, pattern.listitems);
+ allListItems = parseLink(
+ patternlab,
+ allListItems,
+ 'listitems.json + any pattern listitems.json'
+ );
+
+ allData = _.merge({}, patternlab.data, pattern.jsonFileData);
+ allData = _.merge({}, allData, allListItems);
+ allData.cacheBuster = patternlab.cacheBuster;
+ allData.patternPartial = pattern.patternPartial;
+
+ ///////////////
+ // HEADER
+ ///////////////
+
+ //re-rendering the headHTML each time allows pattern-specific data to influence the head of the pattern
+ let headPromise;
+ if (patternlab.userHead) {
+ headPromise = render(patternlab.userHead, allData);
+ } else {
+ headPromise = render(
+ Pattern.createEmpty({ extendedTemplate: uikit.header }),
+ allData
+ );
+ }
+
+ ///////////////
+ // PATTERN
+ ///////////////
+
+ //render the extendedTemplate with all data
+ const patternPartialPromise = render(
+ pattern,
+ allData,
+ patternlab.partials
+ );
+
+ ///////////////
+ // FOOTER
+ ///////////////
+
+ // stringify this data for individual pattern rendering and use on the styleguide
+ // see if patternData really needs these other duped values
+
+ // construct our extraOutput dump
+ const extraOutput = Object.assign(
+ {},
+ pattern.extraOutput,
+ pattern.allMarkdown
+ );
+ delete extraOutput.title;
+ delete extraOutput.state;
+ delete extraOutput.markdown;
+
+ pattern.patternData = JSON.stringify({
+ cssEnabled: false,
+ patternLineageExists: pattern.patternLineageExists,
+ patternLineages: pattern.patternLineages,
+ lineage: pattern.patternLineages,
+ patternLineageRExists: pattern.patternLineageRExists,
+ patternLineagesR: pattern.patternLineagesR,
+ lineageR: pattern.patternLineagesR,
+ patternLineageEExists:
+ pattern.patternLineageExists || pattern.patternLineageRExists,
+ patternDesc: pattern.patternDescExists ? pattern.patternDesc : '',
+ patternBreadcrumb:
+ pattern.patternGroup === pattern.patternSubGroup
+ ? {
+ patternType: pattern.patternGroup,
+ }
+ : {
+ patternType: pattern.patternGroup,
+ patternSubtype: pattern.patternSubGroup,
+ },
+ patternExtension: pattern.fileExtension.substr(1), //remove the dot because styleguide asset default adds it for us
+ patternName: pattern.patternName,
+ patternPartial: pattern.patternPartial,
+ patternState: pattern.patternState,
+ patternEngineName: pattern.engine.engineName,
+ extraOutput: extraOutput,
+ });
+
+ //set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer
+ const footerPartialPromise = render(
+ Pattern.createEmpty({ extendedTemplate: uikit.footer }),
+ {
+ isPattern: pattern.isPattern,
+ patternData: pattern.patternData,
+ cacheBuster: patternlab.cacheBuster,
+ }
+ );
+
+ return Promise.all([
+ headPromise,
+ patternPartialPromise,
+ footerPartialPromise,
+ ])
+ .then(intermediateResults => {
+ // retrieve results of promises
+ const headHTML = intermediateResults[0]; //headPromise
+ pattern.patternPartialCode = intermediateResults[1]; //patternPartialPromise
+ const footerPartial = intermediateResults[2]; //footerPartialPromise
+
+ //finish up our footer data
+ let allFooterData;
+ try {
+ allFooterData = jsonCopy(
+ patternlab.data,
+ 'config.paths.source.data global data'
+ );
+ } catch (err) {
+ logger.info(
+ 'There was an error parsing JSON for ' + pattern.relPath
+ );
+ logger.info(err);
+ }
+ allFooterData = _.merge(allFooterData, pattern.jsonFileData);
+ allFooterData.cacheBuster = patternlab.cacheBuster;
+ allFooterData.patternLabFoot = footerPartial;
+
+ return render(patternlab.userFoot, allFooterData).then(
+ async footerHTML => {
+ ///////////////
+ // WRITE FILES
+ ///////////////
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_WRITE_BEGIN,
+ patternlab,
+ pattern
+ );
+
+ //write the compiled template to the public patterns directory
+ patternlab.writePatternFiles(
+ headHTML,
+ pattern,
+ footerHTML,
+ uikit.outputDir
+ );
+
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_WRITE_END,
+ patternlab,
+ pattern
+ );
+
+ // Allows serializing the compile state
+ patternlab.graph.node(
+ pattern
+ ).compileState = pattern.compileState = CompileState.CLEAN;
+ logger.info('Built pattern: ' + pattern.patternPartial);
+ }
+ );
+ })
+ .catch(reason => {
+ console.log(reason);
+ });
+ })
+ );
+};
diff --git a/packages/core/src/lib/copier.js b/packages/core/src/lib/copier.js
index 9957f5362..441ffdf5b 100644
--- a/packages/core/src/lib/copier.js
+++ b/packages/core/src/lib/copier.js
@@ -18,6 +18,7 @@ const copier = () => {
'meta',
'annotations',
'patternlabFiles',
+ 'styleguide',
];
_.each(directories.source, (dir, key) => {
if (blackList.includes(key)) {
@@ -37,6 +38,7 @@ const copier = () => {
// add public key path
dirs[key].public = directories.public[key];
});
+
return dirs;
};
@@ -63,27 +65,42 @@ const copier = () => {
watchAssets(patternlab, basePath, dir, key, copyOptions);
} else {
//just copy
- const destination = path.resolve(basePath, dir.public);
- copyPromises.push(copyFile(dir.source, destination, copyOptions));
+ copyPromises.push(
+ _.map(patternlab.uikits, uikit => {
+ copyFile(
+ dir.source,
+ path.join(basePath, uikit.outputDir, dir.public),
+ copyOptions
+ );
+ })
+ );
}
});
// copy the styleguide
copyPromises.push(
- copyFile(
- assetDirectories.source.styleguide,
- assetDirectories.public.root,
- copyOptions
- )
+ _.map(patternlab.uikits, uikit => {
+ copyFile(
+ path.join(uikit.modulePath, assetDirectories.source.styleguide),
+ path.join(basePath, uikit.outputDir, assetDirectories.public.root),
+ copyOptions
+ );
+ })
);
// copy the favicon
copyPromises.push(
- copyFile(
- `${assetDirectories.source.root}/favicon.ico`,
- `${assetDirectories.public.root}/favicon.ico`,
- copyOptions
- )
+ _.map(patternlab.uikits, uikit => {
+ copyFile(
+ `${assetDirectories.source.root}/favicon.ico`,
+ path.join(
+ basePath,
+ uikit.outputDir,
+ `${assetDirectories.public.root}/favicon.ico`
+ ),
+ copyOptions
+ );
+ })
);
return Promise.all(copyPromises).then(() => {
diff --git a/packages/core/src/lib/events.js b/packages/core/src/lib/events.js
index faa71496b..b1653b3c8 100644
--- a/packages/core/src/lib/events.js
+++ b/packages/core/src/lib/events.js
@@ -14,7 +14,14 @@ const EVENTS = Object.freeze({
* @property {object} patternlab - global data store
*
*/
- PATTERNLAB_BUILD_PATTERN_START: 'patternlab-build-pattern-start',
+ PATTERNLAB_BUILD_START: 'patternlab-build-start',
+
+ /**
+ * @desc Emitted after all logic run inside `build()`, which is the entry point for single builds, pattern-only builds, run singly or when watched.
+ * @property {object} patternlab - global data store
+ *
+ */
+ PATTERNLAB_BUILD_END: 'patternlab-build-end',
/**
* @desc Emitted after patterns are iterated over to gather data about them. Right before Pattern Lab processes and renders patterns into HTML
diff --git a/packages/core/src/lib/expandPartials.js b/packages/core/src/lib/expandPartials.js
index a42df2cbc..0a9200052 100644
--- a/packages/core/src/lib/expandPartials.js
+++ b/packages/core/src/lib/expandPartials.js
@@ -60,11 +60,7 @@ module.exports = function(currentPattern, patternlab) {
//this is what we came here for
logger.debug(
- `within ${
- currentPattern.patternPartial
- }, replacing extendedTemplate partial ${foundPartial} with ${
- cleanPartialPattern.patternPartial
- }'s extendedTemplate`
+ `within ${currentPattern.patternPartial}, replacing extendedTemplate partial ${foundPartial} with ${cleanPartialPattern.patternPartial}'s extendedTemplate`
);
currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(
diff --git a/packages/core/src/lib/exportData.js b/packages/core/src/lib/exportData.js
index eab91d189..9a8468ce5 100644
--- a/packages/core/src/lib/exportData.js
+++ b/packages/core/src/lib/exportData.js
@@ -2,6 +2,7 @@
const eol = require('os').EOL;
const path = require('path');
+const _ = require('lodash');
const ae = require('./annotation_exporter');
@@ -70,15 +71,42 @@ module.exports = function(patternlab) {
const annotationsJSON = annotation_exporter.gather();
const annotations =
'var comments = { "comments" : ' + JSON.stringify(annotationsJSON) + '};';
- fs.outputFileSync(
- path.resolve(paths.public.annotations, 'annotations.js'),
- annotations
- );
+ _.each(patternlab.uikits, uikit => {
+ fs.outputFileSync(
+ path.resolve(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ paths.public.annotations,
+ 'annotations.js'
+ )
+ ),
+ annotations
+ );
+ });
+
+ // add module.export to the Nodejs-specific file generated.
+ const exportedOutput =
+ output +
+ 'module.exports = { config, ishControls, navItems, patternPaths, viewAllPaths, plugins, defaultShowPatternInfo, defaultPattern };';
//write all output to patternlab-data
- fs.outputFileSync(
- path.resolve(paths.public.data, 'patternlab-data.js'),
- output
- );
+ _.each(patternlab.uikits, uikit => {
+ fs.outputFileSync(
+ path.resolve(
+ path.join(process.cwd(), uikit.outputDir, paths.public.data),
+ 'patternlab-data.js'
+ ),
+ output
+ );
+ fs.outputFileSync(
+ path.resolve(
+ path.join(process.cwd(), uikit.outputDir, paths.public.data),
+ 'patternlab-data.cjs.js'
+ ),
+ exportedOutput
+ );
+ });
+
return output;
};
diff --git a/packages/core/src/lib/findModules.js b/packages/core/src/lib/findModules.js
new file mode 100644
index 000000000..246612ec8
--- /dev/null
+++ b/packages/core/src/lib/findModules.js
@@ -0,0 +1,60 @@
+'use strict';
+
+const path = require('path');
+
+const isScopedPackage = require('./isScopedPackage');
+
+let fs = require('fs-extra'); // eslint-disable-line
+
+const isDir = fPath => {
+ const stats = fs.lstatSync(fPath);
+ return stats.isDirectory() || stats.isSymbolicLink();
+};
+
+module.exports = (dir, filter) => {
+ /**
+ * @name findModules
+ * @desc Traverse the given path and gather possible engines
+ * @param {string} fPath - The file path to traverse
+ * @param {Array} foundModules - An array of modules
+ * @return {Array} - The final array of engines
+ */
+ const findModules = (fPath, foundModules) => {
+ /**
+ * @name dirList
+ * @desc A list of all directories in the given path
+ * @type {Array}
+ */
+ const dirList = fs
+ .readdirSync(fPath)
+ .filter(p => isDir(path.join(fPath, p)));
+
+ /**
+ * @name m
+ * @desc For the current dir get all modules
+ * @type {Array}
+ */
+ const m = foundModules.concat(
+ dirList.filter(filter).map(mod => {
+ return {
+ name: filter(mod),
+ modulePath: path.join(fPath, mod),
+ };
+ })
+ );
+
+ /**
+ * 1. Flatten all engines from inner recursions and current dir
+ * 2. Filter the dirList for scoped packages
+ * 3. Map over every scoped package and recurse into it to find scoped modules
+ */
+ return [].concat(
+ ...m,
+ ...dirList
+ .filter(isScopedPackage) // 2
+ .map(scope => findModules(path.join(fPath, scope), m)) // 3
+ );
+ };
+
+ return findModules(dir, []);
+};
diff --git a/packages/core/src/lib/help.js b/packages/core/src/lib/help.js
deleted file mode 100644
index 8dc6869e2..000000000
--- a/packages/core/src/lib/help.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-/**
- * @function help
- * @desc A small helper function returning the man page string
- * @param {string} version - The version to include in the string literal
- * @return {string} - The man string
- */
-const help = version => `
- Pattern Lab Node v${version}
-
- Usage: patternlab.()
-
- Functions:
-
- build Builds patterns, copies assets, and constructs ui into config.paths.public
- patternsonly Builds patterns only, leaving existing public files intact
- liststarterkits Fetches starterkit repos from pattern-lab github org
- loadstarterkit Loads starterkit already available via node_modules/ into config.paths.source/*
- NOTE: In most cases, npm install starterkit-name will precede this call.
- Parameters:
- kit The name of the starter kit to load (string)
- clean Whether or not to remove all files from config.paths.source/ prior to load (bool)
- NOTE: Overwrites existing content. Prunes existing directory if --clean=true argument is passed.
- version Logs current version to stdout
- v Return current version as a string
-
- ===============================
- - More info about Pattern Lab: http://patternlab.io/
- - Open an issue: https://github.com/pattern-lab/patternlab-node/issues
- - View the changelog, roadmap, and other info: https://github.com/pattern-lab/patternlab-node/wiki
- ===============================`;
-module.exports = help;
diff --git a/packages/core/src/lib/isScopedPackage.js b/packages/core/src/lib/isScopedPackage.js
new file mode 100644
index 000000000..cffd1d811
--- /dev/null
+++ b/packages/core/src/lib/isScopedPackage.js
@@ -0,0 +1,16 @@
+'use strict';
+
+const path = require('path');
+
+const scopeMatch = /^@(.*)$/;
+
+/**
+ * @name isScopedPackage
+ * @desc Checks whether a path in modules belongs to a scoped package
+ * @param {string} filePath - The pathname to check
+ * @return {Boolean} - Returns a bool when found, false othersie
+ */
+module.exports = filePath => {
+ const baseName = path.basename(filePath);
+ return scopeMatch.test(baseName);
+};
diff --git a/packages/core/src/lib/lineage_hunter.js b/packages/core/src/lib/lineage_hunter.js
index c90e6cdd6..657897d21 100644
--- a/packages/core/src/lib/lineage_hunter.js
+++ b/packages/core/src/lib/lineage_hunter.js
@@ -1,5 +1,4 @@
'use strict';
-const extend = require('util')._extend;
const getPartial = require('./get');
const logger = require('./log');
@@ -57,7 +56,7 @@ const lineage_hunter = function() {
}
ancestorPattern.lineageR.push(lr);
- extend(patternlab.graph.node(ancestorPattern), lr);
+ Object.assign(patternlab.graph.node(ancestorPattern), lr);
}
}
});
@@ -132,13 +131,7 @@ const lineage_hunter = function() {
? '<>'
: lineageRPattern.patternState;
logger.info(
- `Found a lower common denominator pattern state: ${
- pattern.patternState
- } on ${
- pattern.patternPartial
- }. Setting reverse lineage pattern ${
- lineageRPattern.patternPartial
- } from ${oldState}`
+ `Found a lower common denominator pattern state: ${pattern.patternState} on ${pattern.patternPartial}. Setting reverse lineage pattern ${lineageRPattern.patternPartial} from ${oldState}`
);
lineageRPattern.patternState = pattern.patternState;
diff --git a/packages/core/src/lib/list_item_hunter.js b/packages/core/src/lib/list_item_hunter.js
index 167c8e55c..e6fd3818b 100644
--- a/packages/core/src/lib/list_item_hunter.js
+++ b/packages/core/src/lib/list_item_hunter.js
@@ -11,9 +11,7 @@ const list_item_hunter = function() {
return matches.reduce((previousMatchPromise, liMatchStart) => {
return previousMatchPromise.then(() => {
logger.debug(
- `found listItem of size ${liMatchStart} inside ${
- pattern.patternPartial
- }`
+ `found listItem of size ${liMatchStart} inside ${pattern.patternPartial}`
);
//we found a listitem match
diff --git a/packages/core/src/lib/loadPattern.js b/packages/core/src/lib/loadPattern.js
index 6eae3843e..c0fb1d6a5 100644
--- a/packages/core/src/lib/loadPattern.js
+++ b/packages/core/src/lib/loadPattern.js
@@ -23,13 +23,13 @@ let fs = require('fs-extra'); //eslint-disable-line prefer-const
// all its associated files, and records it in patternlab.patterns[]
module.exports = function(relPath, patternlab) {
const relativeDepth = (relPath.match(/\w(?=\\)|\w(?=\/)/g) || []).length;
- if (relativeDepth > 2) {
+ if (relativeDepth > 3) {
logger.warning('');
logger.warning('Warning:');
logger.warning(
'A pattern file: ' +
relPath +
- ' was found greater than 2 levels deep from ' +
+ ' was found greater than 3 levels deep from ' +
patternlab.config.paths.source.patterns +
'.'
);
@@ -39,6 +39,10 @@ module.exports = function(relPath, patternlab) {
logger.warning(
'[patternType]/[patternSubtype]/[patternName].[patternExtension]'
);
+ logger.warning('or');
+ logger.warning(
+ '[patternType]/[patternSubtype]/[patternName]/[patternName].[patternExtension]'
+ );
logger.warning('');
logger.warning(
'While Pattern Lab may still function, assets may 404 and frontend links may break. Consider yourself warned. '
@@ -148,18 +152,14 @@ module.exports = function(relPath, patternlab) {
if (listItemsData) {
logger.debug(
- `found pattern-specific listitems data for ${
- currentPattern.patternPartial
- }`
+ `found pattern-specific listitems data for ${currentPattern.patternPartial}`
);
currentPattern.listitems = listItemsData;
buildListItems(currentPattern);
}
} catch (err) {
logger.warning(
- `There was an error parsing sibling listitem JSON for ${
- currentPattern.relPath
- }`
+ `There was an error parsing sibling listitem JSON for ${currentPattern.relPath}`
);
logger.warning(err);
}
diff --git a/packages/core/src/lib/loadPatternGraph.js b/packages/core/src/lib/loadPatternGraph.js
new file mode 100644
index 000000000..c1f4ab851
--- /dev/null
+++ b/packages/core/src/lib/loadPatternGraph.js
@@ -0,0 +1,21 @@
+'use strict';
+
+const PatternGraph = require('./pattern_graph').PatternGraph;
+
+/**
+ * If a graph was serialized and then {@code deletePatternDir == true}, there is a mismatch in the
+ * pattern metadata and not all patterns might be recompiled.
+ * For that reason an empty graph is returned in this case, so every pattern will be flagged as
+ * "needs recompile". Otherwise the pattern graph is loaded from the meta data.
+ *
+ * @param patternlab
+ * @param {boolean} deletePatternDir When {@code true}, an empty graph is returned
+ * @return {PatternGraph}
+ */
+module.exports = (patternlab, deletePatternDir) => {
+ // Sanity check to prevent problems when code is refactored
+ if (deletePatternDir) {
+ return PatternGraph.empty();
+ }
+ return PatternGraph.loadFromFile();
+};
diff --git a/packages/core/src/lib/loaduikits.js b/packages/core/src/lib/loaduikits.js
new file mode 100644
index 000000000..dc152ae3d
--- /dev/null
+++ b/packages/core/src/lib/loaduikits.js
@@ -0,0 +1,99 @@
+'use strict';
+
+const path = require('path');
+const _ = require('lodash');
+
+const logger = require('./log');
+
+let findModules = require('./findModules'); //eslint-disable-line prefer-const
+let fs = require('fs-extra'); // eslint-disable-line
+
+const uiKitMatcher = /^uikit-(.*)$/;
+const nodeModulesPath = path.join(process.cwd(), 'node_modules');
+
+/**
+ * Given a path: return the uikit name if the path points to a valid uikit
+ * module directory, or false if it doesn't.
+ * @param filePath
+ * @returns UIKit name if exists or FALSE
+ */
+const isUIKitModule = filePath => {
+ const baseName = path.basename(filePath);
+ const engineMatch = baseName.match(uiKitMatcher);
+
+ if (engineMatch) {
+ return engineMatch[1];
+ }
+ return false;
+};
+
+const readModuleFile = (kit, subPath) => {
+ return fs.readFileSync(
+ path.resolve(path.join(kit.modulePath, subPath)),
+ 'utf8'
+ );
+};
+
+/**
+ * Loads uikits, connecting configuration and installed modules
+ * [1] Looks in node_modules for uikits.
+ * [2] Filter out our uikit-polyfills package.
+ * [3] Only continue if uikit is enabled in patternlab-config.json
+ * [4] Reads files from uikit that apply to every template
+ * @param {object} patternlab
+ */
+module.exports = patternlab => {
+ const paths = patternlab.config.paths;
+
+ const uikits = findModules(nodeModulesPath, isUIKitModule) // [1]
+ .filter(kit => kit.name !== 'polyfills'); // [2]
+ uikits.forEach(kit => {
+ const configEntry = _.find(_.filter(patternlab.config.uikits, 'enabled'), {
+ name: `uikit-${kit.name}`,
+ }); // [3]
+
+ if (!configEntry) {
+ logger.warning(
+ `Could not find uikit with name uikit-${kit.name} defined within patternlab-config.json, or it is not enabled.`
+ );
+ return;
+ }
+
+ try {
+ patternlab.uikits[`uikit-${kit.name}`] = {
+ name: `uikit-${kit.name}`,
+ modulePath: kit.modulePath,
+ enabled: true,
+ outputDir: configEntry.outputDir,
+ excludedPatternStates: configEntry.excludedPatternStates,
+ excludedTags: configEntry.excludedTags,
+ header: readModuleFile(
+ kit,
+ paths.source.patternlabFiles['general-header']
+ ),
+ footer: readModuleFile(
+ kit,
+ paths.source.patternlabFiles['general-footer']
+ ),
+ patternSection: readModuleFile(
+ kit,
+ paths.source.patternlabFiles.patternSection
+ ),
+ patternSectionSubType: readModuleFile(
+ kit,
+ paths.source.patternlabFiles.patternSectionSubtype
+ ),
+ viewAll: readModuleFile(kit, paths.source.patternlabFiles.viewall),
+ }; // [4]
+ } catch (ex) {
+ logger.error(ex);
+ logger.error(
+ '\nERROR: missing an essential file from ' +
+ kit.modulePath +
+ paths.source.patternlabFiles +
+ ". Pattern Lab won't work without this file.\n"
+ );
+ }
+ });
+ return Promise.resolve();
+};
diff --git a/packages/core/src/lib/markModifiedPatterns.js b/packages/core/src/lib/markModifiedPatterns.js
index f48094bc6..aa80b25bb 100644
--- a/packages/core/src/lib/markModifiedPatterns.js
+++ b/packages/core/src/lib/markModifiedPatterns.js
@@ -28,21 +28,23 @@ module.exports = function(lastModified, patternlab) {
array.forEach(func);
}
};
- const modifiedOrNot = _.groupBy(
- patternlab.patterns,
- p =>
- changes_hunter.needsRebuild(lastModified, p) ? 'modified' : 'notModified'
+ const modifiedOrNot = _.groupBy(patternlab.patterns, p =>
+ changes_hunter.needsRebuild(lastModified, p) ? 'modified' : 'notModified'
);
// For all unmodified patterns load their rendered template output
forEachExisting(modifiedOrNot.notModified, cleanPattern => {
- const xp = path.join(
- patternlab.config.paths.public.patterns,
- cleanPattern.getPatternLink(patternlab, 'markupOnly')
- );
+ _.each(patternlab.uikits, uikit => {
+ const xp = path.join(
+ process.cwd(),
+ uikit.outputDir,
+ patternlab.config.paths.public.patterns,
+ cleanPattern.getPatternLink(patternlab, 'markupOnly')
+ );
- // Pattern with non-existing markupOnly files were already marked for rebuild and thus are not "CLEAN"
- cleanPattern.patternPartialCode = fs.readFileSync(xp, 'utf8');
+ // Pattern with non-existing markupOnly files were already marked for rebuild and thus are not "CLEAN"
+ cleanPattern.patternPartialCode = fs.readFileSync(xp, 'utf8');
+ });
});
// For all patterns that were modified, schedule them for rebuild
diff --git a/packages/core/src/lib/object_factory.js b/packages/core/src/lib/object_factory.js
index 0c3ffe5d2..83524a9c7 100644
--- a/packages/core/src/lib/object_factory.js
+++ b/packages/core/src/lib/object_factory.js
@@ -1,7 +1,6 @@
'use strict';
const patternEngines = require('./pattern_engines');
const path = require('path');
-const extend = require('util')._extend;
// patternPrefixMatcher is intended to match the leading maybe-underscore,
// zero or more digits, and maybe-dash at the beginning of a pattern file name we can hack them
@@ -22,14 +21,40 @@ const Pattern = function(relPath, data, patternlab) {
* @param {patternlab} rendered html files for the pattern
*/
const pathObj = path.parse(path.normalize(relPath));
+ const info = {};
+ // 00-colors(.mustache) is subbed in 00-atoms-/00-global/00-colors
+ info.hasDir =
+ path.basename(pathObj.dir).replace(patternPrefixMatcher, '') ===
+ pathObj.name.replace(patternPrefixMatcher, '') ||
+ path.basename(pathObj.dir).replace(patternPrefixMatcher, '') ===
+ pathObj.name.split('~')[0].replace(patternPrefixMatcher, '');
+
+ info.dir = info.hasDir ? pathObj.dir.split(path.sep).pop() : '';
+ info.dirLevel = pathObj.dir.split(path.sep).length;
+
this.relPath = path.normalize(relPath); // '00-atoms/00-global/00-colors.mustache'
this.fileName = pathObj.name; // '00-colors'
this.subdir = pathObj.dir; // '00-atoms/00-global'
+ if ((this.subdir.match(/\w(?=\\)|\w(?=\/)/g) || []).length > 1) {
+ this.subdir = this.subdir.split(/\/|\\/, 2).join(path.sep); // '00-atoms/03-controls/00-button' -> '00-atoms/03-controls'
+ }
this.fileExtension = pathObj.ext; // '.mustache'
// this is the unique name, subDir + fileName (sans extension)
- this.name =
- this.subdir.replace(path.sep, '-') + '-' + this.fileName.replace('~', '-'); // '00-atoms-00-global-00-colors'
+ this.name = '';
+ if (info.hasDir && info.dirLevel > 2) {
+ let variant = '';
+
+ if (this.fileName.indexOf('~') !== -1) {
+ variant = '-' + this.fileName.split('~')[1];
+ }
+ this.name = this.subdir.replace(/[\/\\]/g, '-') + variant;
+ } else {
+ this.name =
+ this.subdir.replace(/[\/\\]/g, '-') +
+ '-' +
+ this.fileName.replace('~', '-'); // '00-atoms-00-global-00-colors'
+ }
// the JSON used to render values in the pattern
this.jsonFileData = data || {};
@@ -53,30 +78,33 @@ const Pattern = function(relPath, data, patternlab) {
}, '')
.trim(); //this is the display name for the ui. strip numeric + hyphen prefixes
- // the top-level pattern group this pattern belongs to. 'atoms'
- this.patternGroup = this.subdir
- .split(path.sep)[0]
- .replace(patternPrefixMatcher, '');
-
//00-atoms if needed
- this.patternType = this.subdir.split(path.sep)[0];
+ this.patternType = this.getDirLevel(0);
- // the sub-group this pattern belongs to.
- this.patternSubGroup = path
- .basename(this.subdir)
- .replace(patternPrefixMatcher, ''); // 'global'
+ // the top-level pattern group this pattern belongs to. 'atoms'
+ this.patternGroup = this.patternType.replace(patternPrefixMatcher, '');
//00-colors if needed
- this.patternSubType = path.basename(this.subdir);
+ this.patternSubType = this.getDirLevel(1);
+
+ // the sub-group this pattern belongs to.
+ this.patternSubGroup = this.patternSubType.replace(patternPrefixMatcher, ''); // 'global'
// the joined pattern group and subgroup directory
- this.flatPatternPath = this.subdir.replace(/[\/\\]/g, '-'); // '00-atoms-00-global'
+ this.flatPatternPath =
+ info.hasDir && info.dirLevel > 2
+ ? this.subdir
+ .replace(/[/\\]/g, '-')
+ .replace(new RegExp('-' + info.dir + '$'), '')
+ : this.subdir.replace(/[\/\\]/g, '-'); // '00-atoms-00-global'
// calculated path from the root of the public directory to the generated
// (rendered!) html file for this pattern, to be shown in the iframe
this.patternLink = this.patternSectionSubtype
? `$${this.name}/index.html`
- : patternlab ? this.getPatternLink(patternlab, 'rendered') : null;
+ : patternlab
+ ? this.getPatternLink(patternlab, 'rendered')
+ : null;
// The canonical "key" by which this pattern is known. This is the callable
// name of the pattern. UPDATE: this.key is now known as this.patternPartial
@@ -189,6 +217,18 @@ Pattern.prototype = {
findPartial: function(partialString) {
return this.engine.findPartial(partialString);
},
+
+ getDirLevel: function(level) {
+ const items = this.subdir.split(path.sep);
+
+ if (items[level]) {
+ return items[level];
+ } else if (items[level - 1]) {
+ return items[level - 1];
+ } else {
+ return '';
+ }
+ },
};
// Pattern static methods
@@ -206,7 +246,7 @@ Pattern.createEmpty = function(customProps, patternlab) {
}
const pattern = new Pattern(relPath, null, patternlab);
- return extend(pattern, customProps);
+ return Object.assign(pattern, customProps);
};
// factory: creates an Pattern object on-demand from a hash; the hash accepts
@@ -214,7 +254,7 @@ Pattern.createEmpty = function(customProps, patternlab) {
// constructor takes.
Pattern.create = function(relPath, data, customProps, patternlab) {
const newPattern = new Pattern(relPath || '', data || null, patternlab);
- return extend(newPattern, customProps);
+ return Object.assign(newPattern, customProps);
};
const CompileState = {
diff --git a/packages/core/src/lib/pattern_engines.js b/packages/core/src/lib/pattern_engines.js
index 6181b8bba..cde010125 100644
--- a/packages/core/src/lib/pattern_engines.js
+++ b/packages/core/src/lib/pattern_engines.js
@@ -1,13 +1,12 @@
// special shoutout to Geoffrey Pursell for single-handedly making Pattern Lab Node Pattern Engines possible! aww thanks :)
'use strict';
-const { existsSync, lstatSync, readdirSync } = require('fs');
+const { existsSync } = require('fs');
const path = require('path');
+
+const findModules = require('./findModules');
+
const engineMatcher = /^engine-(.*)$/;
-const scopeMatch = /^@(.*)$/;
-const isDir = fPath => {
- const stats = lstatSync(fPath);
- return stats.isDirectory() || stats.isSymbolicLink();
-};
+
const logger = require('./log');
const enginesDirectories = [
@@ -37,17 +36,6 @@ function isEngineModule(filePath) {
return false;
}
-/**
- * @name isScopedPackage
- * @desc Checks whether a path in modules belongs to a scoped package
- * @param {string} filePath - The pathname to check
- * @return {Boolean} - Returns a bool when found, false othersie
- */
-function isScopedPackage(filePath) {
- const baseName = path.basename(filePath);
- return scopeMatch.test(baseName);
-}
-
/**
* @name resolveEngines
* @desc Creates an array of all available patternlab engines
@@ -60,49 +48,7 @@ function resolveEngines(dir) {
return []; // Silence is golden …
}
- /**
- * @name walk
- * @desc Traverse the given path and gather possible engines
- * @param {string} fPath - The file path to traverse
- * @param {Array} engines - An array of engines from the inner most matches
- * @return {Array} - The final array of engines
- */
- const walk = (fPath, engines) => {
- /**
- * @name dirList
- * @desc A list of all directories in the given path
- * @type {Array}
- */
- const dirList = readdirSync(fPath).filter(p => isDir(path.join(fPath, p)));
-
- /**
- * @name e
- * @desc For the current dir get all engines
- * @type {Array}
- */
- const e = engines.concat(
- dirList.filter(isEngineModule).map(engine => {
- return {
- name: isEngineModule(engine),
- modulePath: path.join(fPath, engine),
- };
- })
- );
-
- /**
- * 1. Flatten all engines from inner recursions and current dir
- * 2. Filter the dirList for scoped packages
- * 3. Map over every scoped package and recurse into it to find scoped engines
- */
- return [].concat(
- ...e,
- ...dirList
- .filter(isScopedPackage) // 2
- .map(scope => walk(path.join(fPath, scope), e)) // 3
- );
- };
-
- return walk(dir, []);
+ return findModules(dir, isEngineModule);
}
function findEngineModulesInDirectory(dir) {
diff --git a/packages/core/src/lib/pattern_exporter.js b/packages/core/src/lib/pattern_exporter.js
index 9bfc85ce3..8eb4e1a88 100644
--- a/packages/core/src/lib/pattern_exporter.js
+++ b/packages/core/src/lib/pattern_exporter.js
@@ -1,6 +1,35 @@
'use strict';
const fs = require('fs-extra');
+const path = require('path');
+
+function exportSinglePattern(patternlab, pattern) {
+ const preserveDirStructure =
+ patternlab.config.patternExportPreserveDirectoryStructure;
+ let patternName = pattern.patternPartial;
+ let patternDir = patternlab.config.patternExportDirectory;
+ let patternCode = pattern.patternPartialCode;
+ let patternFileExtension = '.html';
+ if (preserveDirStructure) {
+ // Extract the first part of the pattern partial as the directory in which
+ // it should go.
+ patternDir = path.join(patternDir, pattern.patternPartial.split('-')[0]);
+ patternName = pattern.patternPartial
+ .split('-')
+ .slice(1)
+ .join('-');
+ }
+
+ if (patternlab.config.patternExportRaw) {
+ patternCode = pattern.extendedTemplate;
+ patternFileExtension = `.${patternlab.config.patternExtension}`;
+ }
+
+ fs.outputFileSync(
+ path.join(patternDir, patternName) + patternFileExtension,
+ patternCode
+ );
+}
const pattern_exporter = function() {
/**
@@ -13,18 +42,24 @@ const pattern_exporter = function() {
function exportPatterns(patternlab) {
//read the config export options
const exportPartials = patternlab.config.patternExportPatternPartials;
+ const exportAll = patternlab.config.patternExportAll;
+
+ if (exportAll) {
+ for (let i = 0; i < patternlab.patterns.length; i++) {
+ if (!patternlab.patterns[i].patternPartial.startsWith('-')) {
+ exportSinglePattern(patternlab, patternlab.patterns[i]);
+ }
+ }
+
+ return;
+ }
//find the chosen patterns to export
for (let i = 0; i < exportPartials.length; i++) {
for (let j = 0; j < patternlab.patterns.length; j++) {
if (exportPartials[i] === patternlab.patterns[j].patternPartial) {
//write matches to the desired location
- fs.outputFileSync(
- patternlab.config.patternExportDirectory +
- patternlab.patterns[j].patternPartial +
- '.html',
- patternlab.patterns[j].patternPartialCode
- );
+ exportSinglePattern(patternlab, patternlab.patterns[j]);
}
}
}
diff --git a/packages/core/src/lib/pattern_graph.js b/packages/core/src/lib/pattern_graph.js
index ad24c0ee1..6ad17d012 100644
--- a/packages/core/src/lib/pattern_graph.js
+++ b/packages/core/src/lib/pattern_graph.js
@@ -356,29 +356,29 @@ PatternGraph.fromJson = function(o) {
/**
* Resolve the path to the file containing the serialized graph
- * @param {object} patternlab
- * @param {string} [file='dependencyGraph.json'] Path to the graph file
+ * @param {string} [filePath='process.cwd()'] Path to the graph file
+ * @param {string} [fileName='dependencyGraph.json'] Name of the graph file
* @return {string}
*/
-PatternGraph.resolveJsonGraphFile = function(patternlab, file) {
- return path.resolve(
- patternlab.config.paths.public.root,
- file || 'dependencyGraph.json'
- );
+PatternGraph.resolveJsonGraphFile = function(
+ filePath = process.cwd(),
+ fileName = 'dependencyGraph.json'
+) {
+ return path.resolve(filePath, fileName);
};
/**
* Loads a graph from the file. Does not add any patterns from the patternlab object,
* i.e. graph.patterns will be still empty until all patterns have been processed.
*
- * @param {object} patternlab
- * @param {string} [file] Optional path to the graph json file
+ * @param {string} [filePath] path to the graph json file
+ * @param {string} [fileName] optional name of the graph json file
*
* @see {@link PatternGraph.fromJson}
* @see {@link PatternGraph.resolveJsonGraphFile}
*/
-PatternGraph.loadFromFile = function(patternlab, file) {
- const jsonGraphFile = this.resolveJsonGraphFile(patternlab, file);
+PatternGraph.loadFromFile = function(filePath, fileName) {
+ const jsonGraphFile = this.resolveJsonGraphFile(filePath, fileName);
// File is fresh, so simply construct an empty graph in memory
if (!fs.existsSync(jsonGraphFile)) {
@@ -399,8 +399,11 @@ PatternGraph.loadFromFile = function(patternlab, file) {
*
* @see {@link PatternGraph.resolveJsonGraphFile}
*/
-PatternGraph.storeToFile = function(patternlab, file) {
- const jsonGraphFile = this.resolveJsonGraphFile(patternlab, file);
+PatternGraph.storeToFile = function(patternlab) {
+ if (process.env.PATTERNLAB_ENV === 'CI') {
+ return;
+ }
+ const jsonGraphFile = this.resolveJsonGraphFile();
patternlab.graph.timestamp = new Date().getTime();
fs.writeJSONSync(jsonGraphFile, patternlab.graph.toJson());
};
@@ -408,10 +411,10 @@ PatternGraph.storeToFile = function(patternlab, file) {
/**
* Exports this graph to a GraphViz file.
* @param patternlab
- @ @param {string} file Output file
+ @ @param {string} fileName Output filename
*/
-PatternGraph.exportToDot = function(patternlab, file) {
- const dotFile = this.resolveJsonGraphFile(patternlab, file);
+PatternGraph.exportToDot = function(patternlab, fileName) {
+ const dotFile = this.resolveJsonGraphFile(undefined, fileName);
const g = PatternGraphDot.generate(patternlab.graph);
fs.outputFileSync(dotFile, g);
};
diff --git a/packages/core/src/lib/patternlab.js b/packages/core/src/lib/patternlab.js
index 0b28a8baf..cd89c64c4 100644
--- a/packages/core/src/lib/patternlab.js
+++ b/packages/core/src/lib/patternlab.js
@@ -7,20 +7,19 @@ const cleanHtml = require('js-beautify').html;
const inherits = require('util').inherits;
const pm = require('./plugin_manager');
+const plugin_manager = new pm();
const packageInfo = require('../../package.json');
const events = require('./events');
const buildListItems = require('./buildListItems');
const dataLoader = require('./data_loader')();
+const loaduikits = require('./loaduikits');
const logger = require('./log');
-const parseLink = require('./parseLink');
const processIterative = require('./processIterative');
const processRecursive = require('./processRecursive');
-const jsonCopy = require('./json_copy');
-const render = require('./render');
+
const loadPattern = require('./loadPattern');
const sm = require('./starterkit_manager');
-const Pattern = require('./object_factory').Pattern;
-const CompileState = require('./object_factory').CompileState;
+
const patternEngines = require('./pattern_engines');
//these are mocked in unit tests, so let them be overridden
@@ -48,6 +47,7 @@ module.exports = class PatternLab {
// Load up engines please
this.engines = patternEngines;
this.engines.loadAllEngines(config);
+ this.isBusy = false;
//
// INITIALIZE EMPTY GLOBAL DATA STRUCTURES
@@ -65,16 +65,22 @@ module.exports = class PatternLab {
// Make ye olde event emitter
this.events = new PatternLabEventEmitter();
+ this.hooks = {};
+ this.hooks[events.PATTERNLAB_PATTERN_WRITE_END] = [];
+
// Make a place for the pattern graph to sit
this.graph = null;
// Make a place to attach known watchers so we can manage them better during serve and watch
this.watchers = {};
+ // make a place to register any uikits
+ this.uikits = {};
+ loaduikits(this);
+
// Verify correctness of configuration (?)
this.checkConfiguration(this);
- // TODO: determine if this is the best place to wire up plugins
this.initializePlugins(this);
}
@@ -105,9 +111,7 @@ module.exports = class PatternLab {
if (typeof patternlab.config.paths.source.patternlabFiles === 'string') {
logger.warning('');
logger.warning(
- `Configuration key [paths.source.patternlabFiles] inside patternlab-config.json was found as the string '${
- patternlab.config.paths.source.patternlabFiles
- }'`
+ `Configuration key [paths.source.patternlabFiles] inside patternlab-config.json was found as the string '${patternlab.config.paths.source.patternlabFiles}'`
);
logger.warning(
'Since Pattern Lab Node Core 3.0.0 this key is an object. Suggest you update this key following this issue: https://github.com/pattern-lab/patternlab-node/issues/683.'
@@ -131,29 +135,11 @@ module.exports = class PatternLab {
* Finds and calls the main method of any found plugins.
* @param patternlab - global data store
*/
- //todo, move this to plugin_manager
initializePlugins(patternlab) {
if (!patternlab.config.plugins) {
return;
}
-
- const plugin_manager = new pm(
- patternlab.config,
- path.resolve(__dirname, '../../patternlab-config.json')
- );
- const foundPlugins = plugin_manager.detect_plugins();
-
- if (foundPlugins && foundPlugins.length > 0) {
- for (let i = 0; i < foundPlugins.length; i++) {
- const pluginKey = foundPlugins[i];
-
- logger.info(`Found plugin: ${pluginKey}`);
- logger.info(`Attempting to load and initialize plugin.`);
-
- const plugin = plugin_manager.load_plugin(pluginKey);
- plugin(patternlab);
- }
- }
+ plugin_manager.intialize_plugins(patternlab);
}
buildGlobalData(additionalData) {
@@ -190,37 +176,6 @@ module.exports = class PatternLab {
this.listitems = {};
}
- // load up all the necessary files from pattern lab that apply to every template
- try {
- this.header = fs.readFileSync(
- path.resolve(paths.source.patternlabFiles['general-header']),
- 'utf8'
- );
- this.footer = fs.readFileSync(
- path.resolve(paths.source.patternlabFiles['general-footer']),
- 'utf8'
- );
- this.patternSection = fs.readFileSync(
- path.resolve(paths.source.patternlabFiles.patternSection),
- 'utf8'
- );
- this.patternSectionSubType = fs.readFileSync(
- path.resolve(paths.source.patternlabFiles.patternSectionSubtype),
- 'utf8'
- );
- this.viewAll = fs.readFileSync(
- path.resolve(paths.source.patternlabFiles.viewall),
- 'utf8'
- );
- } catch (ex) {
- logger.error(ex);
- logger.error(
- '\nERROR: missing an essential file from ' +
- paths.source.patternlabFiles +
- ". Pattern Lab won't work without this file.\n"
- );
- }
-
this.data = Object.assign({}, this.data, additionalData);
this.setCacheBust();
@@ -255,14 +210,11 @@ module.exports = class PatternLab {
getVersion() {
return this.package.version;
}
- logVersion() {
- logger.info(this.package.version);
- }
getSupportedTemplateExtensions() {
return this.engines.getSupportedFileExtensions();
}
- writePatternFiles(headHTML, pattern, footerHTML) {
+ writePatternFiles(headHTML, pattern, footerHTML, outputBasePath) {
const nullFormatter = str => str;
const defaultFormatter = codeString =>
cleanHtml(codeString, { indent_size: 2 });
@@ -307,7 +259,10 @@ module.exports = class PatternLab {
//write the compiled template to the public patterns directory
outputFiles.forEach(outFile =>
- fs.outputFileSync(outFile.path, outFile.content)
+ fs.outputFileSync(
+ path.join(process.cwd(), outputBasePath, outFile.path),
+ outFile.content
+ )
);
}
@@ -339,189 +294,6 @@ module.exports = class PatternLab {
}
}
- renderSinglePattern(pattern) {
- // Pattern does not need to be built and recompiled more than once
- if (!pattern.isPattern || pattern.compileState === CompileState.CLEAN) {
- return Promise.resolve(false);
- }
-
- // Allows serializing the compile state
- this.graph.node(pattern).compileState = pattern.compileState =
- CompileState.BUILDING;
-
- //todo move this into lineage_hunter
- pattern.patternLineages = pattern.lineage;
- pattern.patternLineageExists = pattern.lineage.length > 0;
- pattern.patternLineagesR = pattern.lineageR;
- pattern.patternLineageRExists = pattern.lineageR.length > 0;
- pattern.patternLineageEExists =
- pattern.patternLineageExists || pattern.patternLineageRExists;
-
- this.events.emit(
- events.PATTERNLAB_PATTERN_BEFORE_DATA_MERGE,
- this,
- pattern
- );
-
- //render the pattern, but first consolidate any data we may have
- let allData;
-
- let allListItems = _.merge({}, this.listitems, pattern.listitems);
- allListItems = parseLink(
- this,
- allListItems,
- 'listitems.json + any pattern listitems.json'
- );
-
- allData = _.merge({}, this.data, pattern.jsonFileData);
- allData = _.merge({}, allData, allListItems);
- allData.cacheBuster = this.cacheBuster;
- allData.patternPartial = pattern.patternPartial;
-
- ///////////////
- // HEADER
- ///////////////
-
- //re-rendering the headHTML each time allows pattern-specific data to influence the head of the pattern
- let headPromise;
- if (this.userHead) {
- headPromise = render(this.userHead, allData);
- } else {
- headPromise = render(
- Pattern.createEmpty({ extendedTemplate: this.header }),
- allData
- );
- }
-
- ///////////////
- // PATTERN
- ///////////////
-
- //render the extendedTemplate with all data
- const patternPartialPromise = render(pattern, allData, this.partials);
-
- ///////////////
- // FOOTER
- ///////////////
-
- // stringify this data for individual pattern rendering and use on the styleguide
- // see if patternData really needs these other duped values
-
- // construct our extraOutput dump
- const extraOutput = Object.assign(
- {},
- pattern.extraOutput,
- pattern.allMarkdown
- );
- delete extraOutput.title;
- delete extraOutput.state;
- delete extraOutput.markdown;
-
- pattern.patternData = JSON.stringify({
- cssEnabled: false,
- patternLineageExists: pattern.patternLineageExists,
- patternLineages: pattern.patternLineages,
- lineage: pattern.patternLineages,
- patternLineageRExists: pattern.patternLineageRExists,
- patternLineagesR: pattern.patternLineagesR,
- lineageR: pattern.patternLineagesR,
- patternLineageEExists:
- pattern.patternLineageExists || pattern.patternLineageRExists,
- patternDesc: pattern.patternDescExists ? pattern.patternDesc : '',
- patternBreadcrumb:
- pattern.patternGroup === pattern.patternSubGroup
- ? {
- patternType: pattern.patternGroup,
- }
- : {
- patternType: pattern.patternGroup,
- patternSubtype: pattern.patternSubGroup,
- },
- patternExtension: pattern.fileExtension.substr(1), //remove the dot because styleguide asset default adds it for us
- patternName: pattern.patternName,
- patternPartial: pattern.patternPartial,
- patternState: pattern.patternState,
- patternEngineName: pattern.engine.engineName,
- extraOutput: extraOutput,
- });
-
- //set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer
- const footerPartialPromise = render(
- Pattern.createEmpty({ extendedTemplate: this.footer }),
- {
- isPattern: pattern.isPattern,
- patternData: pattern.patternData,
- cacheBuster: this.cacheBuster,
- }
- );
-
- const self = this;
-
- return Promise.all([
- headPromise,
- patternPartialPromise,
- footerPartialPromise,
- ])
- .then(intermediateResults => {
- // retrieve results of promises
- const headHTML = intermediateResults[0]; //headPromise
- pattern.patternPartialCode = intermediateResults[1]; //patternPartialPromise
- const footerPartial = intermediateResults[2]; //footerPartialPromise
-
- //finish up our footer data
- let allFooterData;
- try {
- allFooterData = jsonCopy(
- self.data,
- 'config.paths.source.data global data'
- );
- } catch (err) {
- logger.info('There was an error parsing JSON for ' + pattern.relPath);
- logger.info(err);
- }
- allFooterData = _.merge(allFooterData, pattern.jsonFileData);
- allFooterData.patternLabFoot = footerPartial;
-
- return render(self.userFoot, allFooterData).then(footerHTML => {
- ///////////////
- // WRITE FILES
- ///////////////
-
- self.events.emit(
- events.PATTERNLAB_PATTERN_WRITE_BEGIN,
- self,
- pattern
- );
-
- //write the compiled template to the public patterns directory
- self.writePatternFiles(headHTML, pattern, footerHTML);
-
- self.events.emit(events.PATTERNLAB_PATTERN_WRITE_END, self, pattern);
-
- // Allows serializing the compile state
- self.graph.node(pattern).compileState = pattern.compileState =
- CompileState.CLEAN;
- logger.info('Built pattern: ' + pattern.patternPartial);
- });
- })
- .catch(reason => {
- console.log(reason);
- });
- }
-
- /**
- * Installs a given plugin. Assumes it has already been pulled down via npm
- * @param pluginName - the name of the plugin
- */
- installPlugin(pluginName) {
- //get the config
- const configPath = path.resolve(process.cwd(), 'patternlab-config.json');
- const config = fs.readJSONSync(path.resolve(configPath), 'utf8');
- const plugin_manager = new pm(config, configPath);
-
- plugin_manager.install_plugin(pluginName);
- }
-
/**
* Given a path, load info from the folder to compile into a single config object.
* @param dataFilesPath
@@ -564,7 +336,12 @@ module.exports = class PatternLab {
this.patterns.map(pattern => {
return processIterative(pattern, self);
})
- );
+ ).then(() => {
+ // patterns sorted by name so the patterntype and patternsubtype is adhered to for menu building
+ this.patterns.sort((pattern1, pattern2) =>
+ pattern1.name.localeCompare(pattern2.name)
+ );
+ });
});
}
diff --git a/packages/core/src/lib/plugin_manager.js b/packages/core/src/lib/plugin_manager.js
index 6a5103b82..9816ff99d 100644
--- a/packages/core/src/lib/plugin_manager.js
+++ b/packages/core/src/lib/plugin_manager.js
@@ -1,133 +1,74 @@
'use strict';
-const plugin_manager = function(config, configPath) {
+const plugin_manager = function() {
const path = require('path');
- const fs = require('fs-extra');
const logger = require('./log');
+ const pluginMatcher = /^plugin-(.*)$/;
+
/**
* Loads a plugin
*
- * @param pluginName {string} the name of the plugin
+ * @param modulePath {string} the path to the plugin
* @return {object} the loaded plugin
*/
- function loadPlugin(pluginName) {
- return require(path.join(process.cwd(), 'node_modules', pluginName));
+ function loadPlugin(modulePath) {
+ return require(modulePath);
}
/**
- * Installs a plugin
- *
- * @param pluginName {string} the name of the plugin
+ * Given a path: return the plugin name if the path points to a valid plugin
+ * module directory, or false if it doesn't.
+ * @param filePath
+ * @returns Plugin name if exists or FALSE
*/
- function installPlugin(pluginName) {
- try {
- const pluginPath = path.resolve(
- path.join(process.cwd(), 'node_modules', pluginName)
- );
- logger.debug(`Attempting to load plugin from ${pluginPath}`);
- let pluginDirStats;
- try {
- pluginDirStats = fs.statSync(pluginPath);
- } catch (ex) {
- logger.warning(`${pluginName} not found, use npm to install it first.`);
- logger.warning(`${pluginName} not loaded.`);
- return;
- }
- const pluginPathDirExists = pluginDirStats.isDirectory();
- if (pluginPathDirExists) {
- const diskConfig = fs.readJSONSync(path.resolve(configPath), 'utf8');
-
- //add the plugin entry to patternlab-config.json
- if (!diskConfig.plugins) {
- diskConfig.plugins = {};
- }
-
- if (!diskConfig.plugins[pluginName]) {
- diskConfig.plugins[pluginName] = {
- enabled: true,
- initialized: false,
- };
- }
+ function isPlugin(filePath) {
+ const baseName = path.basename(filePath);
+ const pluginMatch = baseName.match(pluginMatcher);
- const pluginPathConfig = path.resolve(pluginPath, 'config.json');
- try {
- const pluginConfigJSON = require(pluginPathConfig);
- if (!diskConfig.plugins[pluginName].options) {
- diskConfig.plugins[pluginName].options = pluginConfigJSON;
- }
- } catch (ex) {
- //a config.json file is not required at this time
- }
-
- //write config entry back
- fs.outputFileSync(
- path.resolve(configPath),
- JSON.stringify(diskConfig, null, 2)
- );
-
- logger.info('Plugin ' + pluginName + ' installed.');
- logger.info('Plugin configration added to patternlab-config.json.');
- }
- } catch (ex) {
- logger.warning(
- `An error occurred during plugin installation for plugin ${pluginName}`
- );
- logger.warning(ex);
+ if (pluginMatch) {
+ return pluginMatch[1];
}
+ return false;
}
/**
- * Detect installed plugins
- *
- * @return {array} list of installed plugins
+ * Looks for installed plugins, loads them, and invokes them
+ * @param {object} patternlab
*/
- function detectPlugins() {
- const node_modules_path = path.join(process.cwd(), 'node_modules');
- return fs.readdirSync(node_modules_path).filter(function(dir) {
- const module_path = path.join(process.cwd(), 'node_modules', dir);
- return (
- fs.statSync(module_path).isDirectory() &&
- dir.indexOf('plugin-node-') === 0
- );
+ function initializePlugins(patternlab) {
+ const foundPlugins = Object.keys(patternlab.config.plugins || {});
+ foundPlugins.forEach(plugin => {
+ logger.info(`Found plugin: ${plugin}`);
+ logger.info(`Attempting to load and initialize plugin.`);
+ const pluginModule = loadPlugin(plugin);
+ pluginModule(patternlab);
});
}
- /**
- * Disables an installed plugin
- * Not implemented yet
- */
- function disablePlugin(pluginName) {
- logger.warning(
- `disablePlugin() not implemented yet. No change made to state of plugin ${pluginName}`
- );
- }
+ async function raiseEvent(patternlab, eventName, args) {
+ patternlab.events.emit(eventName, args);
+ await (async function() {
+ const hookHandlers = (patternlab.hooks[eventName] || []).map(h =>
+ h(args)
+ );
- /**
- * Enables an installed plugin
- * Not implemented yet
- */
- function enablePlugin(pluginName) {
- logger.warning(
- `enablePlugin() not implemented yet. No change made to state of plugin ${pluginName}`
- );
+ await Promise.all(hookHandlers);
+ })();
}
return {
- install_plugin: function(pluginName) {
- installPlugin(pluginName);
- },
- load_plugin: function(pluginName) {
- return loadPlugin(pluginName);
+ intialize_plugins: patternlab => {
+ initializePlugins(patternlab);
},
- detect_plugins: function() {
- return detectPlugins();
+ load_plugin: modulePath => {
+ return loadPlugin(modulePath);
},
- disable_plugin: function(pluginName) {
- disablePlugin(pluginName);
+ is_plugin: filePath => {
+ return isPlugin(filePath);
},
- enable_plugin: function(pluginName) {
- enablePlugin(pluginName);
+ raiseEvent: async (patternlab, eventName, ...args) => {
+ await raiseEvent(patternlab, eventName, args);
},
};
};
diff --git a/packages/core/src/lib/processMetaPattern.js b/packages/core/src/lib/processMetaPattern.js
index 66ca99586..f793a103a 100644
--- a/packages/core/src/lib/processMetaPattern.js
+++ b/packages/core/src/lib/processMetaPattern.js
@@ -21,9 +21,7 @@ module.exports = function(fileName, metaType, patternlab) {
})
.catch(reason => {
logger.warning(
- `Could not find the user-editable template ${fileName}, currently configured to be at ${
- patternlab.config.paths.source.meta
- }. Your configured path may be incorrect (check paths.source.meta in your config file), the file may have been deleted, or it may have been left in the wrong place during a migration or update.`
+ `Could not find the user-editable template ${fileName}, currently configured to be at ${patternlab.config.paths.source.meta}. Your configured path may be incorrect (check paths.source.meta in your config file), the file may have been deleted, or it may have been left in the wrong place during a migration or update.`
);
logger.warning(reason);
});
diff --git a/packages/core/src/lib/pseudopattern_hunter.js b/packages/core/src/lib/pseudopattern_hunter.js
index 33c7d2ee2..b95dd37f1 100644
--- a/packages/core/src/lib/pseudopattern_hunter.js
+++ b/packages/core/src/lib/pseudopattern_hunter.js
@@ -12,6 +12,7 @@ const logger = require('./log');
const readDocumentation = require('./readDocumentation');
const lineage_hunter = new lh();
const changes_hunter = new ch();
+const yaml = require('js-yaml');
const pseudopattern_hunter = function() {};
@@ -22,9 +23,12 @@ pseudopattern_hunter.prototype.find_pseudopatterns = function(
const paths = patternlab.config.paths;
//look for a pseudo pattern by checking if there is a file containing same
- //name, with ~ in it, ending in .json
+ //name, with ~ in it, ending in .json, .yml or .yaml
const needle =
- currentPattern.subdir + '/' + currentPattern.fileName + '~*.json';
+ currentPattern.subdir +
+ '/' +
+ currentPattern.fileName +
+ '~*.{json,yml,yaml}';
const pseudoPatterns = glob.sync(needle, {
cwd: paths.source.patterns,
debug: false,
@@ -45,12 +49,12 @@ pseudopattern_hunter.prototype.find_pseudopatterns = function(
paths.source.patterns,
pseudoPatterns[i]
);
- variantFileData = fs.readJSONSync(variantFileFullPath);
+ variantFileData = yaml.safeLoad(
+ fs.readFileSync(variantFileFullPath, 'utf8')
+ );
} catch (err) {
logger.warning(
- `There was an error parsing pseudopattern JSON for ${
- currentPattern.relPath
- }`
+ `There was an error parsing pseudopattern JSON for ${currentPattern.relPath}`
);
logger.warning(err);
}
@@ -65,9 +69,13 @@ pseudopattern_hunter.prototype.find_pseudopatterns = function(
const variantName = pseudoPatterns[i]
.substring(pseudoPatterns[i].indexOf('~') + 1)
.split('.')[0];
+ const variantExtension = pseudoPatterns[i]
+ .split('.')
+ .slice(-1)
+ .pop();
const variantFilePath = path.join(
currentPattern.subdir,
- currentPattern.fileName + '~' + variantName + '.json'
+ currentPattern.fileName + '~' + variantName + '.' + variantExtension
);
const lm = fs.statSync(variantFileFullPath);
const patternVariant = Pattern.create(
diff --git a/packages/core/src/lib/readDocumentation.js b/packages/core/src/lib/readDocumentation.js
index d22c6fa88..2670bb307 100644
--- a/packages/core/src/lib/readDocumentation.js
+++ b/packages/core/src/lib/readDocumentation.js
@@ -64,9 +64,7 @@ module.exports = function(pattern, patternlab) {
// do nothing when file not found
if (err.code !== 'ENOENT') {
logger.warning(
- `'there was an error setting pattern keys after markdown parsing of the companion file for pattern ${
- pattern.patternPartial
- }`
+ `'there was an error setting pattern keys after markdown parsing of the companion file for pattern ${pattern.patternPartial}`
);
logger.warning(err);
}
diff --git a/packages/core/src/lib/serve.js b/packages/core/src/lib/serve.js
deleted file mode 100644
index 998e0a796..000000000
--- a/packages/core/src/lib/serve.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-const path = require('path');
-const liveServer = require('@pattern-lab/live-server');
-
-const events = require('./events');
-const logger = require('./log');
-
-const serve = patternlab => {
- let serverReady = false;
-
- // our default liveserver config
- const defaults = {
- root: patternlab.config.paths.public.root,
- open: true,
- ignore: path.join(path.resolve(patternlab.config.paths.public.root)),
- file: 'index.html',
- logLevel: 0, // errors only
- wait: 1000,
- port: 3000,
- };
-
- // allow for overrides should they exist inside patternlab-config.json
- const liveServerConfig = Object.assign(
- {},
- defaults,
- patternlab.config.serverOptions
- );
-
- // watch for asset changes, and reload appropriately
- patternlab.events.on(events.PATTERNLAB_PATTERN_ASSET_CHANGE, data => {
- if (serverReady) {
- if (data.file.indexOf('css') > -1) {
- liveServer.refreshCSS();
- } else {
- liveServer.reload();
- }
- }
- });
-
- //watch for pattern changes, and reload
- patternlab.events.on(events.PATTERNLAB_PATTERN_CHANGE, () => {
- if (serverReady) {
- liveServer.reload();
- }
- });
-
- //start!
- setTimeout(() => {
- liveServer.start(liveServerConfig);
- logger.info(
- `Pattern Lab is being served from http://127.0.0.1:${
- liveServerConfig.port
- }`
- );
- serverReady = true;
- }, liveServerConfig.wait);
-};
-
-module.exports = serve;
diff --git a/packages/core/src/lib/server.js b/packages/core/src/lib/server.js
new file mode 100644
index 000000000..c55e2c4ab
--- /dev/null
+++ b/packages/core/src/lib/server.js
@@ -0,0 +1,140 @@
+'use strict';
+
+const path = require('path');
+const liveServer = require('@pattern-lab/live-server');
+
+const events = require('./events');
+const logger = require('./log');
+
+const server = patternlab => {
+ const _module = {
+ serve: () => {
+ let serverReady = false;
+
+ // our default liveserver config
+ const defaults = {
+ open: true,
+ file: 'index.html',
+ logLevel: 0, // errors only
+ wait: 1000,
+ port: 3000,
+ };
+
+ const servers = Object.keys(patternlab.uikits).map(kit => {
+ const uikit = patternlab.uikits[kit];
+ defaults.root = path.resolve(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ patternlab.config.paths.public.root
+ )
+ );
+ defaults.ignore = path.resolve(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ patternlab.config.paths.public.root
+ )
+ );
+ defaults.assets = [
+ path.resolve(
+ path.join(
+ process.cwd(),
+ patternlab.config.paths.source.js,
+ '**',
+ '*.js' // prevent preprocessors like typescript from reloading
+ )
+ ),
+ path.resolve(
+ path.join(process.cwd(), patternlab.config.paths.source.images)
+ ),
+ path.resolve(
+ path.join(process.cwd(), patternlab.config.paths.source.fonts)
+ ),
+ path.resolve(
+ path.join(
+ process.cwd(),
+ patternlab.config.paths.source.css,
+ '**',
+ '*.css' // prevent preprocessors from reloading
+ )
+ ),
+ ];
+
+ // allow for overrides should they exist inside patternlab-config.json
+ const liveServerConfig = Object.assign(
+ {},
+ defaults,
+ patternlab.config.serverOptions
+ );
+
+ const setupEventWatchers = () => {
+ //watch for builds to complete
+ patternlab.events.on(events.PATTERNLAB_BUILD_END, () => {
+ if (serverReady) {
+ _module.reload({
+ file: '',
+ action: 'reload',
+ });
+ }
+ });
+ };
+
+ //start!
+ //There is a new server instance for each uikit
+ const serveKit = new Promise((resolve, reject) => {
+ let resolveMsg = '';
+ setTimeout(() => {
+ try {
+ liveServer.start(liveServerConfig);
+ resolveMsg = `Pattern Lab is being served from http://127.0.0.1:${liveServerConfig.port}`;
+ logger.info(resolveMsg);
+ } catch (e) {
+ const err = `Pattern Lab serve failed to start: ${e}`;
+ logger.error(`Pattern Lab serve failed to start: ${e}`);
+ reject(err);
+ }
+ setupEventWatchers();
+ serverReady = true;
+ resolve(resolveMsg);
+ }, liveServerConfig.wait);
+ });
+ return serveKit;
+ });
+
+ return Promise.all(servers);
+ },
+ reload: data => {
+ const _data = data || {
+ file: '',
+ action: '',
+ };
+ return new Promise((resolve, reject) => {
+ let action;
+ try {
+ if (!patternlab.isBusy) {
+ if (_data.file.indexOf('css') > -1 || _data.action === 'refresh') {
+ action = 'refreshed CSS';
+ liveServer.refreshCSS();
+ } else {
+ action = 'reloaded';
+ liveServer.reload();
+ }
+ resolve(`Server ${action} successfully`);
+ }
+ } catch (e) {
+ reject(`Server reload or refresh failed: ${e}`);
+ }
+ });
+ },
+ refreshCSS: () => {
+ return _module.reload({
+ file: '',
+ action: 'refresh',
+ });
+ },
+ };
+ return _module;
+};
+
+module.exports = server;
diff --git a/packages/core/src/lib/starterkit_manager.js b/packages/core/src/lib/starterkit_manager.js
index 7ebd38501..d11e5f2a4 100644
--- a/packages/core/src/lib/starterkit_manager.js
+++ b/packages/core/src/lib/starterkit_manager.js
@@ -38,16 +38,12 @@ const starterkit_manager = function(config) {
if (kitPathDirExists) {
if (clean) {
logger.info(
- `Deleting contents of ${
- paths.source.root
- } prior to starterkit load.`
+ `Deleting contents of ${paths.source.root} prior to starterkit load.`
);
fs.emptyDirSync(paths.source.root);
} else {
logger.info(
- `Overwriting contents of ${
- paths.source.root
- } during starterkit load.`
+ `Overwriting contents of ${paths.source.root} during starterkit load.`
);
}
@@ -112,6 +108,7 @@ const starterkit_manager = function(config) {
*
* @return {array} List of starter kits installed
*/
+ //TODO review for deletion or convert callers to use findModules()
function detectStarterKits() {
const node_modules_path = path.join(process.cwd(), 'node_modules');
const npm_modules = fs.readdirSync(node_modules_path).filter(function(dir) {
diff --git a/packages/core/src/lib/ui_builder.js b/packages/core/src/lib/ui_builder.js
index 4f780e92d..5dcb36986 100644
--- a/packages/core/src/lib/ui_builder.js
+++ b/packages/core/src/lib/ui_builder.js
@@ -6,6 +6,7 @@ const _ = require('lodash');
const of = require('./object_factory');
const Pattern = of.Pattern;
const logger = require('./log');
+const uikitExcludePattern = require('./uikitExcludePattern');
//these are mocked in unit tests, so let them be overridden
let render = require('./render'); //eslint-disable-line prefer-const
@@ -64,18 +65,26 @@ const ui_builder = function() {
* Returns whether or not the pattern should be excluded from direct rendering or navigation on the front end
* @param pattern - the pattern to test for inclusion/exclusion
* @param patternlab - global data store
+ * @param uikit - the current uikit being built
* @returns boolean - whether or not the pattern is excluded
*/
- function isPatternExcluded(pattern, patternlab) {
+ function isPatternExcluded(pattern, patternlab, uikit) {
let isOmitted;
+ // skip patterns that the uikit does not want to render
+ isOmitted = uikitExcludePattern(pattern, uikit);
+ if (isOmitted) {
+ logger.info(
+ `Omitting ${pattern.patternPartial} from styleguide patterns because its pattern state or tag is excluded within ${uikit.name}.`
+ );
+ return true;
+ }
+
// skip underscore-prefixed files
isOmitted = pattern.isPattern && pattern.fileName.charAt(0) === '_';
if (isOmitted) {
- logger.debug(
- `Omitting ${
- pattern.patternPartial
- } from styleguide patterns because it has an underscore suffix.`
+ logger.info(
+ `Omitting ${pattern.patternPartial} from styleguide patterns because it has an underscore prefix.`
);
return true;
}
@@ -83,10 +92,8 @@ const ui_builder = function() {
//this is meant to be a homepage that is not present anywhere else
isOmitted = pattern.patternPartial === patternlab.config.defaultPattern;
if (isOmitted) {
- logger.debug(
- `Omitting ${
- pattern.patternPartial
- } from styleguide patterns because it is defined as a defaultPattern.`
+ logger.info(
+ `Omitting ${pattern.patternPartial} from styleguide patterns because it is defined as a defaultPattern.`
);
patternlab.defaultPattern = pattern;
return true;
@@ -97,10 +104,8 @@ const ui_builder = function() {
pattern.relPath.charAt(0) === '_' ||
pattern.relPath.indexOf(path.sep + '_') > -1;
if (isOmitted) {
- logger.debug(
- `Omitting ${
- pattern.patternPartial
- } from styleguide patterns because its contained within an underscored directory.`
+ logger.info(
+ `Omitting ${pattern.patternPartial} from styleguide patterns because its contained within an underscored directory.`
);
return true;
}
@@ -108,10 +113,8 @@ const ui_builder = function() {
//this pattern is a head or foot pattern
isOmitted = pattern.isMetaPattern;
if (isOmitted) {
- logger.debug(
- `Omitting ${
- pattern.patternPartial
- } from styleguide patterns because its a meta pattern.`
+ logger.info(
+ `Omitting ${pattern.patternPartial} from styleguide patterns because its a meta pattern.`
);
return true;
}
@@ -197,9 +200,7 @@ const ui_builder = function() {
if (!patternType) {
logger.error(
- `Could not find patternType ${
- pattern.patternType
- }. This is a critical error.`
+ `Could not find patternType ${pattern.patternType}. This is a critical error.`
);
}
@@ -221,9 +222,7 @@ const ui_builder = function() {
if (!patternSubType) {
logger.error(
- `Could not find patternType ${pattern.patternType}-${
- pattern.patternType
- }. This is a critical error.`
+ `Could not find patternType ${pattern.patternType}-${pattern.patternType}. This is a critical error.`
);
}
@@ -333,9 +332,7 @@ const ui_builder = function() {
const patternType = getPatternType(patternlab, pattern);
if (!patternType) {
logger.error(
- `Could not find patternType ${
- pattern.patternType
- }. This is a critical error.`
+ `Could not find patternType ${pattern.patternType}. This is a critical error.`
);
}
@@ -427,16 +424,21 @@ const ui_builder = function() {
/**
* Returns an object representing how the front end styleguide and navigation is structured
* @param patternlab - global data store
+ * @param uikit - the current uikit being built
* @returns ptterns grouped by type -> subtype like atoms -> global -> pattern, pattern, pattern
*/
- function groupPatterns(patternlab) {
+ function groupPatterns(patternlab, uikit) {
const groupedPatterns = {
patternGroups: {},
};
_.forEach(patternlab.patterns, function(pattern) {
//ignore patterns we can omit from rendering directly
- pattern.omitFromStyleguide = isPatternExcluded(pattern, patternlab);
+ pattern.omitFromStyleguide = isPatternExcluded(
+ pattern,
+ patternlab,
+ uikit
+ );
if (pattern.omitFromStyleguide) {
return;
}
@@ -497,9 +499,9 @@ const ui_builder = function() {
* @param patternPartial - a key used to identify the viewall page
* @returns A promise which resolves with the HTML
*/
- function buildViewAllHTML(patternlab, patterns, patternPartial) {
+ function buildViewAllHTML(patternlab, patterns, patternPartial, uikit) {
return render(
- Pattern.createEmpty({ extendedTemplate: patternlab.viewAll }),
+ Pattern.createEmpty({ extendedTemplate: uikit.viewAll }),
{
//data
partials: patterns,
@@ -508,8 +510,8 @@ const ui_builder = function() {
},
{
//templates
- patternSection: patternlab.patternSection,
- patternSectionSubtype: patternlab.patternSectionSubType,
+ patternSection: uikit.patternSection,
+ patternSectionSubtype: uikit.patternSectionSubType,
}
).catch(reason => {
console.log(reason);
@@ -524,7 +526,12 @@ const ui_builder = function() {
* @param styleguidePatterns - the grouped set of patterns
* @returns every built pattern and set of viewall patterns, so the styleguide can use it
*/
- function buildViewAllPages(mainPageHeadHtml, patternlab, styleguidePatterns) {
+ function buildViewAllPages(
+ mainPageHeadHtml,
+ patternlab,
+ styleguidePatterns,
+ uikit
+ ) {
const paths = patternlab.config.paths;
let patterns = [];
let writeViewAllFile = true;
@@ -533,20 +540,26 @@ const ui_builder = function() {
const allPatternTypePromises = _.map(
styleguidePatterns.patternGroups,
(patternGroup, patternType) => {
- let p;
let typePatterns = [];
let styleguideTypePatterns = [];
const styleGuideExcludes =
patternlab.config.styleGuideExcludes ||
patternlab.config.styleguideExcludes;
-
const subTypePromises = _.map(
_.values(patternGroup),
- (patternSubtypes, patternSubtype) => {
- const patternPartial = patternType + '-' + patternSubtype;
+ (patternSubtypes, patternSubtype, originalPatternGroup) => {
+ let p;
+ const samplePattern = _.find(patternSubtypes, st => {
+ return !st.patternPartial.startsWith('viewall-');
+ });
+ const patternName = Object.keys(
+ _.values(originalPatternGroup)[patternSubtype]
+ )[1];
+ const patternPartial =
+ patternType + '-' + samplePattern.patternSubType;
//do not create a viewall page for flat patterns
- if (patternType === patternSubtype) {
+ if (patternType === patternName) {
writeViewAllFile = false;
logger.debug(
`skipping ${patternType} as flat patterns do not have view all pages`
@@ -555,7 +568,7 @@ const ui_builder = function() {
}
//render the footer needed for the viewall template
- return buildFooter(patternlab, 'viewall-' + patternPartial)
+ return buildFooter(patternlab, `viewall-${patternPartial}`, uikit)
.then(footerHTML => {
//render the viewall template by finding these smallest subtype-grouped patterns
const subtypePatterns = sortPatterns(_.values(patternSubtypes));
@@ -570,11 +583,11 @@ const ui_builder = function() {
styleGuideExcludes &&
styleGuideExcludes.length &&
_.some(styleGuideExcludes, function(exclude) {
- return exclude === patternType + '/' + patternSubtype;
+ return exclude === patternType + '/' + patternName;
});
if (omitPatternType) {
logger.debug(
- `Omitting ${patternType}/${patternSubtype} from building a viewall page because its patternSubGroup is specified in styleguideExcludes.`
+ `Omitting ${patternType}/${patternName} from building a viewall page because its patternSubGroup is specified in styleguideExcludes.`
);
} else {
styleguideTypePatterns = styleguideTypePatterns.concat(
@@ -588,11 +601,18 @@ const ui_builder = function() {
return buildViewAllHTML(
patternlab,
subtypePatterns,
- patternPartial
+ patternPartial,
+ uikit
)
.then(viewAllHTML => {
- fs.outputFileSync(
- paths.public.patterns + p.flatPatternPath + '/index.html',
+ return fs.outputFile(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ paths.public.patterns +
+ p.flatPatternPath +
+ '/index.html'
+ ),
mainPageHeadHtml + viewAllHTML + footerHTML
);
})
@@ -613,7 +633,8 @@ const ui_builder = function() {
//render the footer needed for the viewall template
return buildFooter(
patternlab,
- 'viewall-' + patternType + '-all'
+ 'viewall-' + patternType + '-all',
+ uikit
)
.then(footerHTML => {
//add any flat patterns
@@ -638,13 +659,18 @@ const ui_builder = function() {
return buildViewAllHTML(
patternlab,
typePatterns,
- patternType
+ patternType,
+ uikit
)
.then(viewAllHTML => {
fs.outputFileSync(
- paths.public.patterns +
- anyPatternOfType.patternType +
- '/index.html',
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ paths.public.patterns +
+ anyPatternOfType.patternType +
+ '/index.html'
+ ),
mainPageHeadHtml + viewAllHTML + footerHTML
);
@@ -713,132 +739,160 @@ const ui_builder = function() {
const paths = patternlab.config.paths;
- //determine which patterns should be included in the front-end rendering
- const styleguidePatterns = groupPatterns(patternlab);
-
- //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
- const headerPromise = render(
- Pattern.createEmpty({ extendedTemplate: patternlab.header }),
- {
- cacheBuster: patternlab.cacheBuster,
- }
- )
- .then(headerPartial => {
- const headFootData = patternlab.data;
- headFootData.patternLabHead = headerPartial;
- headFootData.cacheBuster = patternlab.cacheBuster;
- return render(patternlab.userHead, headFootData);
- })
- .catch(reason => {
- console.log(reason);
- logger.error('error during header render()');
- });
+ const uikitPromises = _.map(patternlab.uikits, uikit => {
+ //determine which patterns should be included in the front-end rendering
+ const styleguidePatterns = groupPatterns(patternlab, uikit);
- //set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer
- const footerPromise = render(
- Pattern.createEmpty({ extendedTemplate: patternlab.footer }),
- {
- patternData: '{}',
- cacheBuster: patternlab.cacheBuster,
- }
- )
- .then(footerPartial => {
- const headFootData = patternlab.data;
- headFootData.patternLabFoot = footerPartial;
- return render(patternlab.userFoot, headFootData);
- })
- .catch(reason => {
- console.log(reason);
- logger.error('error during footer render()');
- });
+ return new Promise(resolve => {
+ //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
+ const headerPromise = render(
+ Pattern.createEmpty({ extendedTemplate: uikit.header }),
+ {
+ cacheBuster: patternlab.cacheBuster,
+ }
+ )
+ .then(headerPartial => {
+ const headFootData = patternlab.data;
+ headFootData.patternLabHead = headerPartial;
+ headFootData.cacheBuster = patternlab.cacheBuster;
+ return render(patternlab.userHead, headFootData);
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('error during header render()');
+ });
- return Promise.all([headerPromise, footerPromise]).then(
- headFootPromiseResults => {
- //build the viewall pages
- return buildViewAllPages(
- headFootPromiseResults[0],
- patternlab,
- styleguidePatterns
+ //set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer
+ const footerPromise = render(
+ Pattern.createEmpty({ extendedTemplate: uikit.footer }),
+ {
+ patternData: '{}',
+ cacheBuster: patternlab.cacheBuster,
+ }
)
- .then(allPatterns => {
- //todo track down why we need to make this unique in the first place
- const uniquePatterns = _.uniq(
- _.flatMapDeep(allPatterns, pattern => {
- return pattern;
- })
- );
+ .then(footerPartial => {
+ const headFootData = patternlab.data;
+ headFootData.patternLabFoot = footerPartial;
+ return render(patternlab.userFoot, headFootData);
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('error during footer render()');
+ });
- //add the defaultPattern if we found one
- if (patternlab.defaultPattern) {
- uniquePatterns.push(patternlab.defaultPattern);
- addToPatternPaths(patternlab, patternlab.defaultPattern);
- }
+ return Promise.all([headerPromise, footerPromise]).then(
+ headFootPromiseResults => {
+ //build the viewall pages
- //build the main styleguide page
- return render(
- Pattern.createEmpty({ extendedTemplate: patternlab.viewAll }),
- {
- partials: uniquePatterns,
- },
- {
- patternSection: patternlab.patternSection,
- patternSectionSubtype: patternlab.patternSectionSubType,
- }
+ return buildViewAllPages(
+ headFootPromiseResults[0],
+ patternlab,
+ styleguidePatterns,
+ uikit
)
- .then(styleguideHtml => {
- fs.outputFileSync(
- path.resolve(paths.public.styleguide, 'html/styleguide.html'),
- headFootPromiseResults[0] +
- styleguideHtml +
- headFootPromiseResults[1]
+ .then(allPatterns => {
+ //todo track down why we need to make this unique in the first place
+ const uniquePatterns = _.uniq(
+ _.flatMapDeep(allPatterns, pattern => {
+ return pattern;
+ })
);
- logger.info('Built Pattern Lab front end');
-
- //move the index file from its asset location into public root
- let patternlabSiteHtml;
- try {
- patternlabSiteHtml = fs.readFileSync(
- path.resolve(paths.source.styleguide, 'index.html'),
- 'utf8'
- );
- } catch (err) {
- logger.error(
- `Could not load one or more styleguidekit assets from ${
- paths.source.styleguide
- }`
- );
+ //add the defaultPattern if we found one
+ if (patternlab.defaultPattern) {
+ uniquePatterns.push(patternlab.defaultPattern);
+ addToPatternPaths(patternlab, patternlab.defaultPattern);
}
- fs.outputFileSync(
- path.resolve(paths.public.root, 'index.html'),
- patternlabSiteHtml
- );
- //write out patternlab.data object to be read by the client
- exportData(patternlab);
+ //build the main styleguide page
+ return render(
+ Pattern.createEmpty({
+ extendedTemplate: uikit.viewAll,
+ }),
+ {
+ partials: uniquePatterns,
+ },
+ {
+ patternSection: uikit.patternSection,
+ patternSectionSubtype: uikit.patternSectionSubType,
+ }
+ )
+ .then(styleguideHtml => {
+ fs.outputFileSync(
+ path.resolve(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ paths.public.styleguide,
+ 'html/styleguide.html'
+ )
+ ),
+ headFootPromiseResults[0] +
+ styleguideHtml +
+ headFootPromiseResults[1]
+ );
+
+ logger.info('Built Pattern Lab front end');
+
+ //move the index file from its asset location into public root
+ let patternlabSiteHtml;
+ try {
+ patternlabSiteHtml = fs.readFileSync(
+ path.resolve(
+ path.join(
+ uikit.modulePath,
+ paths.source.styleguide,
+ 'index.html'
+ )
+ ),
+ 'utf8'
+ );
+ } catch (err) {
+ logger.error(
+ `Could not load one or more styleguidekit assets from ${paths.source.styleguide}`
+ );
+ }
+ fs.outputFileSync(
+ path.resolve(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ paths.public.root,
+ 'index.html'
+ )
+ ),
+ patternlabSiteHtml
+ );
+
+ //write out patternlab.data object to be read by the client
+ exportData(patternlab);
+ resolve();
+ })
+ .catch(reason => {
+ console.log(reason);
+ logger.error('error during buildFrontend()');
+ });
})
.catch(reason => {
console.log(reason);
- logger.error('error during buildFrontend()');
+ logger.error('error during buildViewAllPages()');
});
- })
- .catch(reason => {
- console.log(reason);
- logger.error('error during buildViewAllPages()');
- });
- }
- );
+ }
+ );
+ });
+ });
+ return Promise.all(uikitPromises);
}
return {
buildFrontend: function(patternlab) {
return buildFrontend(patternlab);
},
- isPatternExcluded: function(pattern, patternlab) {
- return isPatternExcluded(pattern, patternlab);
+ isPatternExcluded: function(pattern, patternlab, uikit) {
+ return isPatternExcluded(pattern, patternlab, uikit);
},
- groupPatterns: function(patternlab) {
- return groupPatterns(patternlab);
+ groupPatterns: function(patternlab, uikit) {
+ return groupPatterns(patternlab, uikit);
},
resetUIBuilderState: function(patternlab) {
resetUIBuilderState(patternlab);
@@ -846,12 +900,14 @@ const ui_builder = function() {
buildViewAllPages: function(
mainPageHeadHtml,
patternlab,
- styleguidePatterns
+ styleguidePatterns,
+ uikit
) {
return buildViewAllPages(
mainPageHeadHtml,
patternlab,
- styleguidePatterns
+ styleguidePatterns,
+ uikit
);
},
};
diff --git a/packages/core/src/lib/uikitExcludePattern.js b/packages/core/src/lib/uikitExcludePattern.js
new file mode 100644
index 000000000..61cddcb57
--- /dev/null
+++ b/packages/core/src/lib/uikitExcludePattern.js
@@ -0,0 +1,7 @@
+'use strict';
+
+const uikitExcludePattern = (pattern, uikit) => {
+ const state = pattern.patternState;
+ return uikit.excludedPatternStates.includes(state);
+};
+module.exports = uikitExcludePattern;
diff --git a/packages/core/src/lib/watchAssets.js b/packages/core/src/lib/watchAssets.js
index e0585edf5..f087b8a28 100644
--- a/packages/core/src/lib/watchAssets.js
+++ b/packages/core/src/lib/watchAssets.js
@@ -1,16 +1,23 @@
'use strict';
const path = require('path');
+const _ = require('lodash');
const chokidar = require('chokidar');
const logger = require('./log');
let copyFile = require('./copyFile'); // eslint-disable-line prefer-const
-function onWatchTripped(p, assetBase, basePath, dir, copyOptions) {
+function onWatchTripped(patternlab, p, assetBase, basePath, dir, copyOptions) {
const subPath = p.replace(assetBase, '');
- const destination = path.resolve(basePath, dir.public + '/' + subPath);
- copyFile(p, destination, copyOptions);
+ _.each(patternlab.uikits, uikit => {
+ const destination = path.resolve(
+ basePath,
+ uikit.outputDir,
+ dir.public + '/' + subPath
+ );
+ copyFile(p, destination, copyOptions);
+ });
}
const watchAssets = (
@@ -22,13 +29,24 @@ const watchAssets = (
watchOnce
) => {
const assetBase = path.resolve(basePath, dir.source);
+ const assetsToIgnore = patternlab.config.transformedAssetTypes
+ ? patternlab.config.transformedAssetTypes.join('|')
+ : '';
logger.debug(`Pattern Lab is watching ${assetBase} for changes`);
if (patternlab.watchers[key]) {
patternlab.watchers[key].close();
}
const assetWatcher = chokidar.watch(assetBase, {
- ignored: /(^|[\/\\])\../,
+ // *ignored* combines file types that the wrapper is watching, passed to pl config
+ // regex string escapes backslashes for JS
+ // second part of regex is holdover from existing ignore regex for '/index.html' and other
+ // files meant to be ignored, not based on file type
+ ignored: new RegExp(
+ `(?:(?:.*\\.(?:${assetsToIgnore})$)|(?:(^|[\\/\\\\])\\..))`,
+ 'i'
+ ),
+ // ignored: /(^|[\/\\])\../, //old version
ignoreInitial: false,
awaitWriteFinish: {
stabilityThreshold: 200,
@@ -40,10 +58,10 @@ const watchAssets = (
//watch for changes and copy
assetWatcher
.on('add', p => {
- onWatchTripped(p, assetBase, basePath, dir, copyOptions);
+ onWatchTripped(patternlab, p, assetBase, basePath, dir, copyOptions);
})
.on('change', p => {
- onWatchTripped(p, assetBase, basePath, dir, copyOptions);
+ onWatchTripped(patternlab, p, assetBase, basePath, dir, copyOptions);
});
patternlab.watchers[key] = assetWatcher;
diff --git a/packages/core/src/lib/watchPatternLabFiles.js b/packages/core/src/lib/watchPatternLabFiles.js
index 7a1c390c2..f5ab0c1aa 100644
--- a/packages/core/src/lib/watchPatternLabFiles.js
+++ b/packages/core/src/lib/watchPatternLabFiles.js
@@ -4,6 +4,8 @@ const path = require('path');
const logger = require('./log');
const events = require('./events');
+const pm = require('./plugin_manager');
+const pluginMananger = new pm();
let chokidar = require('chokidar'); // eslint-disable-line prefer-const
@@ -19,11 +21,11 @@ const watchPatternLabFiles = (
assetDirectories.source.meta,
];
const globalPaths = globalSources.map(globalSource =>
- path.join(basePath, globalSource, '*')
+ path.join(path.resolve(basePath, globalSource), '*')
);
_.each(globalPaths, globalPath => {
- logger.debug(`Pattern Lab is watching ${globalPath} for changes`);
+ logger.debug(`Pattern Lab is watching ${globalPath} for changes!`);
if (patternlab.watchers[globalPath]) {
patternlab.watchers[globalPath].close();
@@ -41,20 +43,32 @@ const watchPatternLabFiles = (
//watch for changes and rebuild
globalWatcher
- .on('addDir', p => {
- patternlab.events.emit(events.PATTERNLAB_GLOBAL_CHANGE, {
- file: p,
- });
+ .on('addDir', async p => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_GLOBAL_CHANGE,
+ {
+ file: p,
+ }
+ );
})
- .on('add', p => {
- patternlab.events.emit(events.PATTERNLAB_GLOBAL_CHANGE, {
- file: p,
- });
+ .on('add', async p => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_GLOBAL_CHANGE,
+ {
+ file: p,
+ }
+ );
})
- .on('change', p => {
- patternlab.events.emit(events.PATTERNLAB_GLOBAL_CHANGE, {
- file: p,
- });
+ .on('change', async p => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_GLOBAL_CHANGE,
+ {
+ file: p,
+ }
+ );
});
patternlab.watchers[globalPath] = globalWatcher;
@@ -66,13 +80,14 @@ const watchPatternLabFiles = (
.concat(patternlab.engines.getSupportedFileExtensions())
.map(dotExtension =>
path.join(
- basePath,
- assetDirectories.source.patterns,
+ path.resolve(basePath, assetDirectories.source.patterns),
`/**/*${dotExtension}`
)
);
_.each(patternWatches, patternWatchPath => {
- logger.debug(`Pattern Lab is watching ${patternWatchPath} for changes`);
+ logger.debug(
+ `Pattern Lab is watching ${patternWatchPath} for changes - local!`
+ );
if (patternlab.watchers[patternWatchPath]) {
patternlab.watchers[patternWatchPath].close();
@@ -90,29 +105,39 @@ const watchPatternLabFiles = (
//watch for changes and rebuild
patternWatcher
- .on('addDir', p => {
- patternlab.events.emit(events.PATTERNLAB_PATTERN_CHANGE, {
- file: p,
- });
+ .on('addDir', async p => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_CHANGE,
+ {
+ file: p,
+ }
+ );
})
- .on('add', p => {
- patternlab.events.emit(events.PATTERNLAB_PATTERN_CHANGE, {
- file: p,
- });
+ .on('add', async p => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_CHANGE,
+ {
+ file: p,
+ }
+ );
})
- .on('change', p => {
- patternlab.events.emit(events.PATTERNLAB_PATTERN_CHANGE, {
- file: p,
- });
+ .on('change', async p => {
+ await pluginMananger.raiseEvent(
+ patternlab,
+ events.PATTERNLAB_PATTERN_CHANGE,
+ {
+ file: p,
+ }
+ );
});
patternlab.watchers[patternWatchPath] = patternWatcher;
});
logger.info(
- `Pattern Lab is watching for changes to files under ${
- assetDirectories.source.root
- }`
+ `Pattern Lab is watching for changes to files under ${assetDirectories.source.root}`
);
return Promise.resolve();
};
diff --git a/packages/core/test/help_tests.js b/packages/core/test/help_tests.js
deleted file mode 100644
index 847c77a52..000000000
--- a/packages/core/test/help_tests.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-const tap = require('tap');
-const help = require('../src/lib/help');
-
-tap.test('help - includes passed in version number', function(test) {
- //arrange
- const version = '⚡';
-
- //act
- const result = help(version).trim();
-
- //assert
- test.ok(result.startsWith(`Pattern Lab Node v${version}`));
- test.end();
-});
diff --git a/packages/core/test/index_tests.js b/packages/core/test/index_tests.js
index 496a99a90..d2e98895e 100644
--- a/packages/core/test/index_tests.js
+++ b/packages/core/test/index_tests.js
@@ -3,11 +3,15 @@ const rewire = require('rewire');
const _ = require('lodash');
const fs = require('fs-extra');
const get = require('../src/lib/get');
+const events = require('../src/lib/events');
const util = require('./util/test_utils.js');
const entry = rewire('../src/index');
const defaultConfig = require('../patternlab-config.json');
-var testConfig = require('./util/patternlab-config.json');
+const testConfig = require('./util/patternlab-config.json');
+const packageInfo = require('./../package');
+
+process.env.PATTERNLAB_ENV = 'CI';
//set up a global mocks - we don't want to be writing/rendering any files right now
@@ -42,6 +46,10 @@ const fsMock = {
},
};
+const buildPatternsMock = () => {
+ return Promise.resolve();
+};
+
//set our mocks in place of usual require()
entry.__set__({
ui_builder: uiBuilderMock,
@@ -49,19 +57,102 @@ entry.__set__({
copier: copierMock,
});
-tap.test('getDefaultConfig - should return the default config object', function(
- test
-) {
- const requestedConfig = entry.getDefaultConfig();
- test.type(requestedConfig, 'object');
- test.equals(requestedConfig, defaultConfig);
+tap.test('version - should call patternlab.getVersion', test => {
+ //arrange
+ const pl = new entry(testConfig);
+
+ //act
+ //assert
+ test.equals(pl.version(), packageInfo.version);
test.end();
});
-tap.test('buildPatterns', function() {
+tap.test(
+ 'getDefaultConfig - static method should return the default config object',
+ test => {
+ const requestedConfig = entry.getDefaultConfig();
+ test.type(requestedConfig, 'object');
+ test.equals(requestedConfig, defaultConfig);
+ test.end();
+ }
+);
+
+tap.test(
+ 'getDefaultConfig - instance method should return the default config object',
+ test => {
+ //arrange
+ const pl = new entry(testConfig);
+
+ //act
+ //assert
+ const requestedConfig = pl.getDefaultConfig();
+ test.type(requestedConfig, 'object');
+ test.equals(requestedConfig, defaultConfig);
+ test.end();
+ }
+);
+
+tap.test('patternsonly a promise', test => {
+ //arrange
+ const revert = entry.__set__('buildPatterns', buildPatternsMock);
+ const pl = new entry(testConfig);
+
+ //act
+ test.resolves(pl.patternsonly({})).then(() => {
+ revert();
+ test.end();
+ });
+});
+
+tap.test('patternsonly calls buildPatterns', test => {
+ //arrange
+ const revert = entry.__set__(
+ 'buildPatterns',
+ (cleanPublic, patternlab, data) => {
+ test.type(cleanPublic, 'boolean');
+ test.ok(cleanPublic);
+ test.type(patternlab, 'object');
+ test.type(data, 'object');
+ test.equals(data.foo, 'bar');
+ return Promise.resolve();
+ }
+ );
+ const pl = new entry(testConfig);
+
+ //act
+ test
+ .resolves(pl.patternsonly({ cleanPublic: true, data: { foo: 'bar' } }))
+ .then(() => {
+ revert();
+ test.end();
+ });
+});
+
+tap.test('serve calls serve', test => {
+ //arrange
+ const revert = entry.__set__('serverModule', patternlab => {
+ return {
+ serve: () => {
+ test.ok(1);
+ test.type(patternlab, 'object');
+ },
+ reload: () => {},
+ };
+ });
+
+ const pl = new entry(testConfig);
+
+ //act
+ test.resolves(pl.server.serve({})).then(() => {
+ revert();
+ test.end();
+ });
+});
+
+tap.test('buildPatterns suite', test => {
//arrange
- var patternExporterMock = {
+ const patternExporterMock = {
/*
In this suite, we actually take advantage of the pattern export functionality post-build to inspect what
the contents of the patterns look like. This, coupled with a mocking of fs and the ui_builder, allow us to focus
@@ -130,7 +221,6 @@ tap.test('buildPatterns', function() {
tap.test('uses global listItem property', test => {
var pattern = get('test-listWithPartial', patternlab);
- console.log(pattern.patternPartialCode);
let assertionCount = 0;
['dA', 'dB', 'dC'].forEach(d => {
if (pattern.patternPartialCode.indexOf(d) > -1) {
@@ -212,6 +302,8 @@ tap.test('buildPatterns', function() {
// test.equals(util.sanitized(pattern.patternPartialCode), util.sanitized(`Single-quoted
Double-quoted
With attributes
`));
// test.end();
// });
+
+ process.env.PATTERNLAB_ENV = '';
},
};
@@ -220,14 +312,26 @@ tap.test('buildPatterns', function() {
});
testConfig.patternExportPatternPartials = ['test-paramParent'];
- var pl = new entry(testConfig);
+ const pl = new entry(testConfig);
+
+ test.equals(pl.events.eventNames().length, 0);
//act
- return pl.build({
- cleanPublic: true,
- data: {
- foo: 'Bar',
- description: 'Baz',
- },
- });
+ return pl
+ .build({
+ cleanPublic: true,
+ data: {
+ foo: 'Bar',
+ description: 'Baz',
+ },
+ })
+ .then(() => {
+ test.equals(
+ pl.events.eventNames().length,
+ 2,
+ 'should register two events'
+ );
+ test.equals(pl.events.listenerCount(events.PATTERNLAB_PATTERN_CHANGE), 1);
+ test.equals(pl.events.listenerCount(events.PATTERNLAB_GLOBAL_CHANGE), 1);
+ });
});
diff --git a/packages/core/test/loaduitkits_tests.js b/packages/core/test/loaduitkits_tests.js
new file mode 100644
index 000000000..23bdcd656
--- /dev/null
+++ b/packages/core/test/loaduitkits_tests.js
@@ -0,0 +1,150 @@
+'use strict';
+
+const tap = require('tap');
+const rewire = require('rewire');
+
+const logger = require('../src/lib/log');
+const loaduikits = rewire('../src/lib/loaduikits');
+
+const testConfig = require('./util/patternlab-config.json');
+
+const findModulesMock = function() {
+ return [
+ {
+ name: 'foo',
+ modulePath: 'node_modules/@pattern-lab/uikit-foo',
+ },
+ {
+ name: 'bar',
+ modulePath: 'node_modules/@pattern-lab/uikit-bar',
+ },
+ {
+ name: 'baz',
+ modulePath: 'node_modules/@pattern-lab/uikit-baz',
+ },
+ {
+ name: 'polyfills',
+ modulePath: 'node_modules/@pattern-lab/uikit-polyfills',
+ },
+ ];
+};
+
+const fsMock = {
+ readFileSync: function(path, encoding) {
+ return 'file';
+ },
+};
+
+loaduikits.__set__({
+ findModules: findModulesMock,
+ fs: fsMock,
+});
+
+logger;
+
+tap.test('loaduitkits - does not warn on uikit-polyfills', test => {
+ //arrange
+ const patternlab = {
+ config: testConfig,
+ uikits: {},
+ };
+
+ patternlab.config.logLevel = 'warning';
+ logger.log.on('warning', msg => test.notOk(msg.includes('uikit-polyfills')));
+
+ const uikitFoo = {
+ name: 'uikit-foo',
+ enabled: true,
+ outputDir: 'foo',
+ excludedPatternStates: ['legacy'],
+ excludedTags: ['baz'],
+ };
+
+ patternlab.config.uikits = [uikitFoo];
+
+ //act
+ loaduikits(patternlab).then(() => {
+ logger.warning = () => {};
+ test.done();
+ });
+});
+
+tap.test('loaduikits - maps fields correctly', function(test) {
+ //arrange
+ const patternlab = {
+ config: testConfig,
+ uikits: {},
+ };
+
+ const uikitFoo = {
+ name: 'uikit-foo',
+ enabled: true,
+ outputDir: 'foo',
+ excludedPatternStates: ['legacy'],
+ excludedTags: ['baz'],
+ };
+
+ patternlab.config.uikits = [uikitFoo];
+
+ //act
+ loaduikits(patternlab).then(() => {
+ //assert
+ test.equals(patternlab.uikits['uikit-foo'].name, uikitFoo.name);
+ test.equals(
+ patternlab.uikits['uikit-foo'].modulePath,
+ 'node_modules/@pattern-lab/uikit-foo'
+ );
+ test.ok(patternlab.uikits['uikit-foo'].enabled);
+ test.equals(patternlab.uikits['uikit-foo'].outputDir, uikitFoo.outputDir);
+ test.equals(
+ patternlab.uikits['uikit-foo'].excludedPatternStates,
+ uikitFoo.excludedPatternStates
+ );
+ test.equals(
+ patternlab.uikits['uikit-foo'].excludedTags,
+ uikitFoo.excludedTags
+ );
+ test.end();
+ });
+});
+
+tap.test('loaduikits - only adds files for enabled uikits', function(test) {
+ //arrange
+ const patternlab = {
+ config: testConfig,
+ uikits: {},
+ };
+
+ patternlab.config.uikits = [
+ {
+ name: 'uikit-foo',
+ enabled: true,
+ outputDir: 'foo',
+ excludedPatternStates: ['legacy'],
+ excludedTags: ['baz'],
+ },
+ {
+ name: 'uikit-bar',
+ enabled: true,
+ outputDir: 'bar',
+ excludedPatternStates: ['development'],
+ excludedTags: ['baz', 'foo'],
+ },
+ {
+ name: 'uikit-baz',
+ enabled: false,
+ outputDir: 'baz',
+ excludedPatternStates: [''],
+ excludedTags: [],
+ },
+ ];
+
+ //act
+ loaduikits(patternlab).then(() => {
+ //assert
+ test.ok(patternlab.uikits['uikit-foo']);
+ test.ok(patternlab.uikits['uikit-bar']);
+ test.notOk(patternlab.uikits['uikit-baz']);
+ test.end();
+ });
+});
diff --git a/packages/core/test/object_factory_tests.js b/packages/core/test/object_factory_tests.js
index 463dce978..910c02d89 100644
--- a/packages/core/test/object_factory_tests.js
+++ b/packages/core/test/object_factory_tests.js
@@ -63,6 +63,60 @@ tap.test('test Pattern initializes correctly', function(test) {
test.end();
});
+tap.test(
+ 'test Pattern initializes correctly with pattern in sepatated directory',
+ function(test) {
+ var p = new Pattern('00-atoms/00-global/00-colors/colors.mustache', {
+ d: 123,
+ });
+ test.equals(
+ p.relPath,
+ '00-atoms' +
+ path.sep +
+ '00-global' +
+ path.sep +
+ '00-colors' +
+ path.sep +
+ 'colors.mustache'
+ );
+ test.equals(p.name, '00-atoms-00-global');
+ test.equals(p.subdir, '00-atoms' + path.sep + '00-global');
+ test.equals(p.fileName, 'colors');
+ test.equals(p.fileExtension, '.mustache');
+ test.equals(p.jsonFileData.d, 123);
+ test.equals(p.patternBaseName, 'colors');
+ test.equals(p.patternName, 'Colors');
+ test.equals(
+ p.getPatternLink(pl),
+ '00-atoms-00-global' + path.sep + '00-atoms-00-global.rendered.html'
+ );
+ test.equals(p.patternGroup, 'atoms');
+ test.equals(p.patternSubGroup, 'global'); //because of p.info.hasDir
+ test.equals(p.flatPatternPath, '00-atoms-00-global');
+ test.equals(p.patternPartial, 'atoms-colors');
+ test.equals(p.template, '');
+ test.equals(p.patternPartialCode, '');
+ test.equals(p.lineage.length, 0);
+ test.equals(p.lineageIndex.length, 0);
+ test.equals(p.lineageR.length, 0);
+ test.equals(p.lineageRIndex.length, 0);
+ test.equals(p.patternState, '');
+ test.end();
+ }
+);
+
+tap.test('test Pattern name for variants correctly initialzed', function(test) {
+ var p1 = new Pattern('00-atoms/00-global/colors~variant.mustache', {
+ d: 123,
+ });
+ var p2 = new Pattern('00-atoms/00-global/colors~variant-minus.json', {
+ d: 123,
+ });
+ test.equals(p1.name, '00-atoms-00-global-colors-variant');
+ test.equals(p2.name, '00-atoms-00-global-colors-variant-minus');
+ test.end();
+});
+
tap.test('test Pattern with one-directory subdir works as expected', function(
test
) {
@@ -118,6 +172,58 @@ tap.test('test Pattern capitalizes patternDisplayName correctly', function(
test.end();
});
+tap.test('test Pattern get dir level no separated pattern directory', function(
+ test
+) {
+ var p = new Pattern('00-atoms/00-global/00-colors-alt.mustache', { d: 123 });
+ console.log(p);
+ test.equals(p.getDirLevel(0, { hasDir: false, dirLevel: 2 }), '00-atoms');
+ test.equals(p.getDirLevel(1, { hasDir: false, dirLevel: 2 }), '00-global');
+ test.equals(p.getDirLevel(3, { hasDir: false, dirLevel: 2 }), '');
+ var p = new Pattern('00-atoms/00-colors-alt.mustache', { d: 123 });
+ test.equals(p.getDirLevel(0, { hasDir: false, dirLevel: 1 }), '00-atoms');
+ test.equals(p.getDirLevel(1, { hasDir: false, dirLevel: 1 }), '00-atoms');
+ test.equals(p.getDirLevel(3, { hasDir: false, dirLevel: 1 }), '');
+ var p = new Pattern('00-colors-alt.mustache', { d: 123 });
+ test.equals(p.getDirLevel(0, { hasDir: false, dirLevel: 0 }), '');
+ test.equals(p.getDirLevel(1, { hasDir: false, dirLevel: 0 }), '');
+ test.equals(p.getDirLevel(3, { hasDir: false, dirLevel: 0 }), '');
+ test.end();
+});
+
+tap.test(
+ 'test Pattern get dir level with separated pattern directory',
+ function(test) {
+ var p = new Pattern(
+ '00-atoms/00-global/00-colors-alt/colors-alt.mustache',
+ { d: 123 }
+ );
+ test.equals(p.getDirLevel(0, { hasDir: true, dirLevel: 3 }), '00-atoms');
+ test.equals(p.getDirLevel(1, { hasDir: true, dirLevel: 3 }), '00-global');
+ test.equals(p.getDirLevel(3, { hasDir: true, dirLevel: 3 }), '');
+ var p = new Pattern('00-atoms/00-colors-alt/colors-alt.mustache', {
+ d: 123,
+ });
+ test.equals(p.getDirLevel(0, { hasDir: true, dirLevel: 2 }), '00-atoms');
+ test.equals(
+ p.getDirLevel(1, { hasDir: true, dirLevel: 2 }),
+ '00-colors-alt'
+ );
+ test.equals(p.getDirLevel(3, { hasDir: true, dirLevel: 2 }), '');
+ var p = new Pattern('00-colors-alt/colors-alt.mustache', { d: 123 });
+ test.equals(
+ p.getDirLevel(0, { hasDir: true, dirLevel: 1 }),
+ '00-colors-alt'
+ );
+ test.equals(
+ p.getDirLevel(1, { hasDir: true, dirLevel: 1 }),
+ '00-colors-alt'
+ );
+ test.equals(p.getDirLevel(3, { hasDir: true, dirLevel: 1 }), '');
+ test.end();
+ }
+);
+
tap.test('The forms of Pattern.getPatternLink() work as expected', function(
test
) {
@@ -146,5 +252,11 @@ tap.test('The forms of Pattern.getPatternLink() work as expected', function(
path.sep +
'00-atoms-00-global-00-colors.markup-only.html'
);
+ test.equals(
+ p.getPatternLink(pl, 'custom', '.custom-extension'),
+ '00-atoms-00-global-00-colors' +
+ path.sep +
+ '00-atoms-00-global-00-colors.custom-extension'
+ );
test.end();
});
diff --git a/packages/core/test/parseAllLinks_tests.js b/packages/core/test/parseAllLinks_tests.js
index 450229b94..271b3ee5b 100644
--- a/packages/core/test/parseAllLinks_tests.js
+++ b/packages/core/test/parseAllLinks_tests.js
@@ -1,22 +1,25 @@
'use strict';
+const path = require('path');
const tap = require('tap');
+const fs = require('fs-extra');
-var loadPattern = require('../src/lib/loadPattern');
const addPattern = require('../src/lib/addPattern');
const parseAllLinks = require('../src/lib/parseAllLinks');
-var Pattern = require('../src/lib/object_factory').Pattern;
-var PatternGraph = require('../src/lib/pattern_graph').PatternGraph;
+const Pattern = require('../src/lib/object_factory').Pattern;
+const PatternGraph = require('../src/lib/pattern_graph').PatternGraph;
+const da = require('../src/lib/data_loader');
+const dataLoader = new da();
-var plMain = require('../src/lib/patternlab');
-var config = require('./util/patternlab-config.json');
+const util = require('./util/test_utils.js');
+const patterns_dir = './test/files/_patterns';
tap.test(
'parseDataLinks - replaces found link.* data for their expanded links',
function(test) {
//arrange
- var patternlab = new plMain(config);
+ const patternlab = util.fakePatternLab(patterns_dir);
patternlab.graph = PatternGraph.empty();
patternlab.patterns = [
@@ -26,7 +29,18 @@ tap.test(
];
patternlab.data.link = {};
- var navPattern = loadPattern('00-test/nav.mustache', patternlab);
+ // copies essential logic from loadPattern
+ const navPattern = new Pattern('00-test/nav.mustache');
+ const patternData = dataLoader.loadDataFromFile(
+ path.resolve(
+ __dirname,
+ 'files/_patterns',
+ navPattern.subdir,
+ navPattern.fileName
+ ),
+ fs
+ );
+ navPattern.jsonFileData = patternData;
addPattern(navPattern, patternlab);
//for the sake of the test, also imagining I have the following pages...
@@ -38,8 +52,8 @@ tap.test(
patternlab.data.dave = { url: 'link.twitter-dave' };
patternlab.data.brian = { url: 'link.twitter-brian' };
- var pattern;
- for (var i = 0; i < patternlab.patterns.length; i++) {
+ let pattern;
+ for (let i = 0; i < patternlab.patterns.length; i++) {
if (patternlab.patterns[i].patternPartial === 'test-nav') {
pattern = patternlab.patterns[i];
}
diff --git a/packages/core/test/pattern_graph_tests.js b/packages/core/test/pattern_graph_tests.js
index f0e066da8..a2618031c 100644
--- a/packages/core/test/pattern_graph_tests.js
+++ b/packages/core/test/pattern_graph_tests.js
@@ -1,10 +1,12 @@
'use strict';
+var path = require('path');
+var tap = require('tap');
+
var PatternGraph = require('../src/lib/pattern_graph').PatternGraph;
var VERSION = require('../src/lib/pattern_graph').PATTERN_GRAPH_VERSION;
var Pattern = require('../src/lib/object_factory').Pattern;
var CompileState = require('../src/lib/object_factory').CompileState;
-var tap = require('tap');
const posixPath = require('./util/test_utils.js').posixPath;
var config = require('./util/patternlab-config.json');
var engineLoader = require('../src/lib/pattern_engines');
@@ -35,13 +37,19 @@ tap.test('checkVersion - Older version returns false', test => {
});
tap.test('Loading an empty graph works', test => {
- var g = PatternGraph.loadFromFile(patternlab, 'does not exist');
+ var g = PatternGraph.loadFromFile(
+ path.resolve(__dirname, 'public'),
+ 'does not exist'
+ );
tap.equal(g.graph.nodes().length, 0, 'foo');
test.end();
});
tap.test('PatternGraph.fromJson() - Loading a graph from JSON', test => {
- var graph = PatternGraph.loadFromFile(patternlab, 'testDependencyGraph.json');
+ var graph = PatternGraph.loadFromFile(
+ path.resolve(__dirname, 'public'),
+ 'testDependencyGraph.json'
+ );
test.same(graph.timestamp, 1337);
test.same(graph.graph.nodes(), ['atom-foo', 'molecule-foo']);
test.same(graph.graph.edges(), [{ v: 'molecule-foo', w: 'atom-foo' }]);
diff --git a/packages/core/test/ui_builder_tests.js b/packages/core/test/ui_builder_tests.js
index cbf2dc86d..607d9fd95 100644
--- a/packages/core/test/ui_builder_tests.js
+++ b/packages/core/test/ui_builder_tests.js
@@ -16,6 +16,7 @@ engineLoader.loadAllEngines(config);
//set up a global mocks - we don't want to be writing/rendering any files right now
var fsMock = {
outputFileSync: function(path, data, cb) {},
+ outputFile: function(path, data, cb) {},
};
var renderMock = function(template, data, partials) {
@@ -32,6 +33,13 @@ uiModule.__set__({
buildFooter: buildFooterMock,
});
+const uikit = {
+ name: 'uikit-workshop',
+ modulePath: '',
+ outputDir: 'test/output',
+ excludedPatternStates: [],
+};
+
var ui = uiModule();
function createFakePatternLab(customProps) {
@@ -42,7 +50,7 @@ function createFakePatternLab(customProps) {
patterns: './test/files/_patterns',
},
public: {
- patterns: './test/output',
+ patterns: '',
},
},
styleGuideExcludes: ['templates'],
@@ -54,6 +62,7 @@ function createFakePatternLab(customProps) {
},
},
data: {},
+ uikits: [uikit],
};
return extend(pl, customProps);
}
@@ -66,7 +75,7 @@ tap.test(
var pattern = new Pattern('00-test/_ignored-pattern.mustache');
//act
- var result = ui.isPatternExcluded(pattern, patternlab);
+ var result = ui.isPatternExcluded(pattern, patternlab, uikit);
//assert
test.equals(result, true);
@@ -83,7 +92,7 @@ tap.test(
patternlab.config.defaultPattern = 'test-foo';
//act
- var result = ui.isPatternExcluded(pattern, patternlab);
+ var result = ui.isPatternExcluded(pattern, patternlab, uikit);
//assert
test.equals(result, true);
@@ -110,7 +119,7 @@ tap.test(
});
//act
- var result = ui.isPatternExcluded(pattern, patternlab);
+ var result = ui.isPatternExcluded(pattern, patternlab, uikit);
//assert
test.equals(result, true);
@@ -132,7 +141,32 @@ tap.test(
});
//act
- var result = ui.isPatternExcluded(pattern, patternlab);
+ var result = ui.isPatternExcluded(pattern, patternlab, uikit);
+
+ //assert
+ test.equals(result, true);
+ test.end();
+ }
+);
+
+tap.test(
+ 'isPatternExcluded - returns true when pattern state found withing uikit exclusions',
+ function(test) {
+ //arrange
+ var patternlab = createFakePatternLab({});
+ var pattern = Pattern.createEmpty({
+ relPath:
+ 'shown' + path.sep + '_patternsubtype' + path.sep + 'foo.mustache',
+ isPattern: true,
+ fileName: 'foo.mustache',
+ patternPartial: 'shown-foo',
+ patternState: 'complete',
+ });
+
+ //act
+ var result = ui.isPatternExcluded(pattern, patternlab, {
+ excludedPatternStates: 'complete',
+ });
//assert
test.equals(result, true);
@@ -161,7 +195,7 @@ tap.test('groupPatterns - creates pattern groups correctly', function(test) {
ui.resetUIBuilderState(patternlab);
//act
- var result = ui.groupPatterns(patternlab);
+ var result = ui.groupPatterns(patternlab, uikit);
test.equals(
result.patternGroups.patternType1.patternSubType1.blue.patternPartial,
@@ -224,7 +258,7 @@ tap.test('groupPatterns - orders patterns when provided from md', function(
patternlab.patterns[1].order = 1;
//act
- ui.groupPatterns(patternlab);
+ ui.groupPatterns(patternlab, uikit);
let patternType = _.find(patternlab.patternTypes, [
'patternType',
@@ -264,7 +298,7 @@ tap.test(
patternlab.patterns[1].order = 'notanumber!';
//act
- ui.groupPatterns(patternlab);
+ ui.groupPatterns(patternlab, uikit);
let patternType = _.find(patternlab.patternTypes, [
'patternType',
@@ -307,7 +341,7 @@ tap.test(
patternlab.patterns[2].order = 2;
//act
- ui.groupPatterns(patternlab);
+ ui.groupPatterns(patternlab, uikit);
let patternType = _.find(patternlab.patternTypes, [
'patternType',
@@ -355,7 +389,7 @@ tap.test(
ui.resetUIBuilderState(patternlab);
//act
- var result = ui.groupPatterns(patternlab);
+ var result = ui.groupPatterns(patternlab, uikit);
//assert
test.equals(
@@ -398,7 +432,7 @@ tap.test(
ui.resetUIBuilderState(patternlab);
//act
- var result = ui.groupPatterns(patternlab);
+ var result = ui.groupPatterns(patternlab, uikit);
//assert
test.equals(patternlab.patternPaths['test']['foo'], '00-test-foo');
@@ -455,7 +489,7 @@ tap.test(
ui.resetUIBuilderState(patternlab);
//act
- var result = ui.groupPatterns(patternlab);
+ var result = ui.groupPatterns(patternlab, uikit);
//assert
test.equals('todo', 'todo');
@@ -509,11 +543,16 @@ tap.test(
);
ui.resetUIBuilderState(patternlab);
- const styleguidePatterns = ui.groupPatterns(patternlab);
+ const styleguidePatterns = ui.groupPatterns(patternlab, uikit);
//act
ui
- .buildViewAllPages(mainPageHeadHtml, patternlab, styleguidePatterns)
+ .buildViewAllPages(
+ mainPageHeadHtml,
+ patternlab,
+ styleguidePatterns,
+ uikit
+ )
.then(allPatterns => {
//assert
//this was a nuanced one. buildViewAllPages() had return false; statements
diff --git a/packages/core/test/uikitExcludePattern_tests.js b/packages/core/test/uikitExcludePattern_tests.js
new file mode 100644
index 000000000..a31f4c3f3
--- /dev/null
+++ b/packages/core/test/uikitExcludePattern_tests.js
@@ -0,0 +1,53 @@
+'use strict';
+
+const tap = require('tap');
+
+const uikitExcludePattern = require('../src/lib/uikitExcludePattern');
+
+tap.test(
+ 'uikitExcludePattern - returns false when uikit has no excluded states',
+ test => {
+ //arrange
+ const uikit = { excludedPatternStates: [] };
+ const pattern = { patternState: 'complete' };
+
+ //act
+ const result = uikitExcludePattern(pattern, uikit);
+
+ //assert
+ test.false(result);
+ test.end();
+ }
+);
+
+tap.test(
+ 'uikitExcludePattern - returns false pattern does not have same state as uikit exclusions',
+ test => {
+ //arrange
+ const uikit = { excludedPatternStates: ['complete'] };
+ const pattern = { patternState: 'inprogress' };
+
+ //act
+ const result = uikitExcludePattern(pattern, uikit);
+
+ //assert
+ test.false(result);
+ test.end();
+ }
+);
+
+tap.test(
+ 'uikitExcludePattern - returns true when uikit has same state as pattern',
+ test => {
+ //arrange
+ const uikit = { excludedPatternStates: ['inreview', 'complete'] };
+ const pattern = { patternState: 'complete' };
+
+ //act
+ const result = uikitExcludePattern(pattern, uikit);
+
+ //assert
+ test.true(result);
+ test.end();
+ }
+);
diff --git a/packages/core/test/util/patternlab-config.json b/packages/core/test/util/patternlab-config.json
index e6b5fed4d..c2edf9561 100644
--- a/packages/core/test/util/patternlab-config.json
+++ b/packages/core/test/util/patternlab-config.json
@@ -1,33 +1,33 @@
{
"paths": {
"source": {
- "root": "./packages/core/test/files/",
- "patterns": "./packages/core/test/files/_patterns/",
- "data": "./packages/core/test/files/_data/",
- "meta": "./packages/core/test/files/_meta/",
- "styleguide": "./packages/core/test/files/styleguide/",
+ "root": "test/files/",
+ "patterns": "./test/files/_patterns/",
+ "data": "./test/files/_data/",
+ "meta": "./test/files/_meta/",
+ "styleguide": "./test/files/styleguide/",
"patternlabFiles": {
- "general-header": "./packages/core/test/files/partials/general-header.mustache",
- "general-footer": "./packages/core/test/files/partials/general-footer.mustache",
- "patternSection": "./packages/core/test/files/partials/patternSection.mustache",
+ "general-header": "./test/files/partials/general-header.mustache",
+ "general-footer": "./test/files/partials/general-footer.mustache",
+ "patternSection": "./test/files/partials/patternSection.mustache",
"patternSectionSubtype":
- "./packages/core/test/files/partials/patternSectionSubtype.mustache",
- "viewall": "./packages/core/test/files/viewall.mustache"
+ "./test/files/partials/patternSectionSubtype.mustache",
+ "viewall": "./test/files/viewall.mustache"
},
- "js": "./packages/core/test/files/js",
- "images": "./packages/core/test/files/images",
- "fonts": "./packages/core/test/files/fonts",
- "css": "./packages/core/test/files/css/"
+ "js": "./test/files/js",
+ "images": "./test/files/images",
+ "fonts": "./test/files/fonts",
+ "css": "./test/files/css/"
},
"public": {
- "root": "./packages/core/test/public/",
- "patterns": "./packages/core/test/public/patterns/",
- "data": "./packages/core/test/public/data/",
- "styleguide": "./packages/core/test/public/styleguide/",
- "js": "./packages/core/test/public/js",
- "images": "./packages/core/test/public/images",
- "fonts": "./packages/core/test/public/fonts",
- "css": "./packages/core/test/public/css"
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/data/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
}
},
"styleGuideExcludes": ["templates", "pages"],
@@ -70,5 +70,14 @@
"color": "dark",
"density": "compact",
"layout": "horizontal"
- }
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "packages/core/test/",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ]
}
diff --git a/packages/create/CHANGELOG.md b/packages/create/CHANGELOG.md
new file mode 100644
index 000000000..f964faba6
--- /dev/null
+++ b/packages/create/CHANGELOG.md
@@ -0,0 +1,100 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/compare/v5.9.0...v5.9.1) (2020-04-24)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+
+## [1.0.11](https://github.com/pattern-lab/patternlab-node/compare/create-pattern-lab@1.0.10...create-pattern-lab@1.0.11) (2019-10-14)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+
+## [1.0.8](https://github.com/pattern-lab/patternlab-node/compare/create-pattern-lab@1.0.7...create-pattern-lab@1.0.8) (2019-08-23)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+## [1.0.7](https://github.com/pattern-lab/patternlab-node/compare/create-pattern-lab@1.0.6...create-pattern-lab@1.0.7) (2019-08-23)
+
+**Note:** Version bump only for package create-pattern-lab
+
+
+
+
+
+
+## [1.0.6](https://github.com/sghoweri/patternlab-node/compare/create-pattern-lab@1.0.5...create-pattern-lab@1.0.6) (2019-05-16)
+
+**Note:** Version bump only for package create-pattern-lab
diff --git a/packages/create/README.md b/packages/create/README.md
new file mode 100644
index 000000000..53e6f5770
--- /dev/null
+++ b/packages/create/README.md
@@ -0,0 +1,16 @@
+# Create Pattern Lab
+
+To get started, simply run:
+
+```bash
+npm create pattern-lab
+```
+
+Then follow the prompts.
+
+This is the same as using the main Pattern Lab CLI's `init` command:
+
+```bash
+npm i -g @pattern-lab/cli
+pattern-lab init
+```
diff --git a/packages/create/index.js b/packages/create/index.js
new file mode 100755
index 000000000..ac811a7ba
--- /dev/null
+++ b/packages/create/index.js
@@ -0,0 +1,4 @@
+#! /usr/bin/env node
+const init = require('@pattern-lab/cli/bin/cli-actions/init');
+
+init({});
diff --git a/packages/create/package.json b/packages/create/package.json
new file mode 100644
index 000000000..e09874fee
--- /dev/null
+++ b/packages/create/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "create-pattern-lab",
+ "version": "5.9.3",
+ "description": "",
+ "bin": "index.js",
+ "main": "index.js",
+ "scripts": {},
+ "dependencies": {
+ "@pattern-lab/cli": "^5.9.3"
+ },
+ "author": "",
+ "license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/development-edition-engine-handlebars/.gitignore b/packages/development-edition-engine-handlebars/.gitignore
new file mode 100644
index 000000000..0679bd2b5
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/.gitignore
@@ -0,0 +1,9 @@
+node_modules/
+.DS_Store
+patternlab.json
+.sass-cache/*
+/sass-cache
+Thumbs.db
+.idea/
+public
+dependencyGraph.json
diff --git a/packages/development-edition-engine-handlebars/.npmrc b/packages/development-edition-engine-handlebars/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/development-edition-engine-handlebars/.nvmrc b/packages/development-edition-engine-handlebars/.nvmrc
new file mode 100644
index 000000000..7f976a5ae
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/.nvmrc
@@ -0,0 +1 @@
+12.12.0
diff --git a/packages/development-edition-engine-handlebars/CHANGELOG.md b/packages/development-edition-engine-handlebars/CHANGELOG.md
new file mode 100644
index 000000000..2aba60593
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/CHANGELOG.md
@@ -0,0 +1,256 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.9.2](https://github.com/pattern-lab/patternlab-node/compare/v5.9.1...v5.9.2) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/compare/v5.9.0...v5.9.1) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.7.2](https://github.com/pattern-lab/patternlab-node/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/patternlab-node/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/patternlab-node/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.4.2](https://github.com/pattern-lab/patternlab-node/compare/v5.4.1...v5.4.2) (2019-11-27)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.4.1](https://github.com/pattern-lab/patternlab-node/compare/v5.4.0...v5.4.1) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+
+### Features
+
+* major improvements to local UIKit workflow ([4dc9173](https://github.com/pattern-lab/patternlab-node/commit/4dc9173a5a44b422e9677824de3728048b7c4f05))
+
+
+
+
+
+## [5.3.3](https://github.com/pattern-lab/patternlab-node/compare/v5.3.2...v5.3.3) (2019-11-22)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+
+## [5.3.2](https://github.com/pattern-lab/patternlab-node/compare/v5.3.1...v5.3.2) (2019-11-14)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.3.1](https://github.com/pattern-lab/patternlab-node/compare/v5.3.0...v5.3.1) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/patternlab-node/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **config:** add new default pattern export options ([a7487a0](https://github.com/pattern-lab/patternlab-node/commit/a7487a0681cb11e6f3c5c8eaefd62e5648ad5ea3))
+
+
+
+
+
+## [5.0.2](https://github.com/pattern-lab/patternlab-node/compare/v5.0.1...v5.0.2) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## [5.0.1](https://github.com/pattern-lab/patternlab-node/compare/v5.0.0...v5.0.1) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/commit/74e5af28c4e714fdfc1db535b94c52f3dc14a3a4))
+* update the default pattern that displays in the Handlebars demo ([ff1d85f](https://github.com/pattern-lab/patternlab-node/commit/ff1d85f2852fc4f210841e8e0aaf14b55165ce58))
+
+
+### Features
+
+* **engine-handlebars:** Demonstration of custom Handlebars helper ([f330b5b](https://github.com/pattern-lab/patternlab-node/commit/f330b5bca72f2f34bfafe5c2c64e6b0b8823eb1c))
+* **plugin-tab, core:** initial plugin hook exploration ([2f3d39a](https://github.com/pattern-lab/patternlab-node/commit/2f3d39ac6b125ad4c6b872e27ee224ce2ea33a12))
+* introduce netlify preview ([6c5d332](https://github.com/pattern-lab/patternlab-node/commit/6c5d332479fb6836bd8bd5530a074d13440f8ae4))
+
+
+
+
+
+
+## [0.1.6](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/development-edition-engine-handlebars@0.1.5...@pattern-lab/development-edition-engine-handlebars@0.1.6) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+
+## [0.1.5](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/development-edition-engine-handlebars@0.1.4...@pattern-lab/development-edition-engine-handlebars@0.1.5) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+
+## [0.1.1](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/development-edition-engine-handlebars@0.1.0...@pattern-lab/development-edition-engine-handlebars@0.1.1) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+# [0.1.0](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/development-edition-engine-handlebars@0.0.3...@pattern-lab/development-edition-engine-handlebars@0.1.0) (2019-08-23)
+
+
+### Bug Fixes
+
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/commit/74e5af2))
+
+
+### Features
+
+* **engine-handlebars:** Demonstration of custom Handlebars helper ([f330b5b](https://github.com/pattern-lab/patternlab-node/commit/f330b5b))
+
+
+
+
+
+
+## [0.0.3](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/development-edition-engine-handlebars@0.0.3-alpha.0...@pattern-lab/development-edition-engine-handlebars@0.0.3) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-handlebars
+
+
+
+
+
+## 0.0.1-beta.0 (2019-02-09)
+
+
+### Bug Fixes
+
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/patternlab-node/commit/98dfadf))
+
+
+### Features
+
+* **package:** add handlebars development edition ([454095d](https://github.com/pattern-lab/patternlab-node/commit/454095d))
diff --git a/packages/development-edition-engine-handlebars/README.md b/packages/development-edition-engine-handlebars/README.md
new file mode 100644
index 000000000..5bb88ff96
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/README.md
@@ -0,0 +1,28 @@
+
+
+# Pattern Lab Node - Development Edition Engine Handlebars
+
+_here be dragons_
+
+This Development Edition is a variant of [Edition Node](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node) for convience purposes only, loaded with the Handlebars Engine. The goals of this Development Edition are two-fold:
+
+* Develop the [Handlebars Engine](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars)
+* Build and test against Handlebars pattern tree
+
+> Development Editions of Pattern Lab provide the ability to work on and commit changes to select packages within the overall Pattern Lab [ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). This Edition is NOT stable.
+
+
+## Working on Pattern Lab's UI Locally
+
+### Step 1: Install Dependencies
+Run the following in the root of the Pattern Lab repo:
+
+```
+yarn run setup
+```
+
+### Step 2 (Optional)
+If you want to build using a fuller set of examples than what comes with this default Handlebars demo, run `yarn run preview:hbs`. Otherwise skip to step 3.
+
+### Step 3
+Finally, go back into this folder, `cd packages/development-edition-engine-handlebars`, and start up the local dev server which watches UIKit and the local Pattern Lab instance for changes, live reloads, etc by running `yarn dev`
diff --git a/packages/development-edition-engine-handlebars/helpers/test.js b/packages/development-edition-engine-handlebars/helpers/test.js
new file mode 100644
index 000000000..8b32ed799
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/helpers/test.js
@@ -0,0 +1,5 @@
+module.exports = function(Handlebars) {
+ Handlebars.registerHelper('test', function() {
+ return 'This is a test helper';
+ });
+};
diff --git a/packages/development-edition-engine-handlebars/package.json b/packages/development-edition-engine-handlebars/package.json
new file mode 100644
index 000000000..6ede6103f
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "@pattern-lab/development-edition-engine-handlebars",
+ "private": true,
+ "version": "5.9.3",
+ "description": "The tree of components we use to test, develop and validate the Handlebars engine",
+ "scripts": {
+ "pl:build": "patternlab build --config ./patternlab-config.json",
+ "pl:help": "patternlab --help",
+ "pl:install": "patternlab install --config ./patternlab-config.json",
+ "pl:serve": "patternlab serve --config ./patternlab-config.json",
+ "pl:version": "patternlab --version",
+ "dev": "node ./node_modules/@pattern-lab/uikit-workshop/build-tools.js"
+ },
+ "keywords": [
+ "Pattern Lab",
+ "Atomic Web Design",
+ "Node",
+ "Handlebars",
+ "Edition"
+ ],
+ "author": "Brian Muenzenmeye",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/pattern-lab/patternlab-node.git"
+ },
+ "engines": {
+ "node": ">=12.12.0"
+ },
+ "dependencies": {
+ "@pattern-lab/cli": "^5.9.3",
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/engine-handlebars": "^5.5.0",
+ "@pattern-lab/engine-mustache": "^5.0.0",
+ "@pattern-lab/plugin-tab": "^5.9.3",
+ "@pattern-lab/starterkit-mustache-demo": "^5.0.0",
+ "@pattern-lab/uikit-workshop": "^5.9.3"
+ }
+}
diff --git a/packages/development-edition-engine-handlebars/patternlab-config.json b/packages/development-edition-engine-handlebars/patternlab-config.json
new file mode 100644
index 000000000..5b9e9a0c2
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/patternlab-config.json
@@ -0,0 +1,107 @@
+{
+ "cacheBust": true,
+ "cleanPublic": true,
+ "defaultPattern": "all",
+ "defaultShowPatternInfo": false,
+ "ishControlsHide": {
+ "s": false,
+ "m": false,
+ "l": false,
+ "full": false,
+ "random": true,
+ "disco": true,
+ "hay": true,
+ "mqs": true,
+ "find": true,
+ "views-all": false,
+ "views-annotations": false,
+ "views-code": false,
+ "views-new": false,
+ "tools-all": false,
+ "tools-docs": false
+ },
+ "ishViewportRange": {
+ "s": [240, 500],
+ "m": [500, 800],
+ "l": [800, 2600]
+ },
+ "logLevel": "info",
+ "outputFileSuffixes": {
+ "rendered": ".rendered",
+ "rawTemplate": "",
+ "markupOnly": ".markup-only"
+ },
+ "paths": {
+ "source": {
+ "root": "source/",
+ "patterns": "source/_patterns/",
+ "data": "source/_data/",
+ "meta": "source/_meta/",
+ "annotations": "source/_annotations/",
+ "styleguide": "dist/",
+ "patternlabFiles": {
+ "general-header": "views/partials/general-header.mustache",
+ "general-footer": "views/partials/general-footer.mustache",
+ "patternSection": "views/partials/patternSection.mustache",
+ "patternSectionSubtype": "views/partials/patternSectionSubtype.mustache",
+ "viewall": "views/viewall.mustache"
+ },
+ "js": "source/js",
+ "images": "source/images",
+ "fonts": "source/fonts",
+ "css": "source/css"
+ },
+ "public": {
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
+ }
+ },
+ "patternExtension": "hbs",
+ "patternStateCascade": ["inprogress", "inreview", "complete"],
+ "patternExportAll": false,
+ "patternExportDirectory": "pattern_exports",
+ "patternExportPatternPartials": [],
+ "patternExportPreserveDirectoryStructure": true,
+ "patternExportRaw": false,
+ "serverOptions": {
+ "wait": 1000
+ },
+ "starterkitSubDir": "dist",
+ "styleGuideExcludes": [],
+ "theme": {
+ "color": "dark",
+ "density": "compact",
+ "layout": "horizontal",
+ "noViewAll": false
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ],
+ "engines": {
+ "handlebars": {
+ "extend": "helpers/*.js"
+ }
+ },
+ "plugins": {
+ "@pattern-lab/plugin-tab": {
+ "enabled": true,
+ "initialized": false,
+ "options": {
+ "tabsToAdd": ["scss"]
+ }
+ }
+ }
+}
diff --git a/packages/development-edition-engine-handlebars/source/_annotations/annotations.json b/packages/development-edition-engine-handlebars/source/_annotations/annotations.json
new file mode 100644
index 000000000..a0d0268f8
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_annotations/annotations.json
@@ -0,0 +1,3 @@
+{
+ "comments": []
+}
diff --git a/packages/development-edition-engine-handlebars/source/_data/data.json b/packages/development-edition-engine-handlebars/source/_data/data.json
new file mode 100644
index 000000000..250376db0
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_data/data.json
@@ -0,0 +1,34 @@
+{
+ "version": "2",
+ "swatches": [
+ {
+ "color": {
+ "hex": "#031636",
+ "cmyk": "94 59 0 79"
+ },
+ "label": "dark blue"
+ },
+ {
+ "color": {
+ "hex": "#0D80F0",
+ "cmyk": "95 47 0 6"
+ },
+ "label": "light blue"
+ },
+ {
+ "color": {
+ "hex": "#4c4c4c",
+ "cmyk": "0 0 0 70"
+ },
+ "label": "dark grey"
+ },
+ {
+ "color": {
+ "hex": "#b2b2b2",
+ "cmyk": "0 0 0 30"
+ },
+ "label": "light grey",
+ "inverted": true
+ }
+ ]
+}
diff --git a/packages/development-edition-engine-handlebars/source/_data/listitems.json b/packages/development-edition-engine-handlebars/source/_data/listitems.json
new file mode 100644
index 000000000..c35d1076d
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_data/listitems.json
@@ -0,0 +1,6 @@
+{
+ "1": {},
+ "2": {},
+ "3": {},
+ "4": {}
+}
diff --git a/packages/development-edition-engine-handlebars/source/_meta/README.md b/packages/development-edition-engine-handlebars/source/_meta/README.md
new file mode 100644
index 000000000..c6c8c3b8e
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_meta/README.md
@@ -0,0 +1,5 @@
+This is the default location to place meta files, otherwise known a pattern's header and footer.
+
+Pattern Lab builds each pattern while prepending and appending the header and footer. Read more about [pattern headers and footers](http://patternlab.io/docs/pattern-header-footer.html).
+
+If you wish to rename this directory, make sure you update the `paths.source.meta` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-handlebars/source/_meta/_00-head.hbs b/packages/development-edition-engine-handlebars/source/_meta/_00-head.hbs
new file mode 100644
index 000000000..9058b6521
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_meta/_00-head.hbs
@@ -0,0 +1,19 @@
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
+
diff --git a/packages/development-edition-engine-handlebars/source/_meta/_00-head.mustache b/packages/development-edition-engine-handlebars/source/_meta/_00-head.mustache
new file mode 100644
index 000000000..45ce3bb7d
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_meta/_00-head.mustache
@@ -0,0 +1,17 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
+
diff --git a/packages/development-edition-engine-handlebars/source/_meta/_01-foot.hbs b/packages/development-edition-engine-handlebars/source/_meta/_01-foot.hbs
new file mode 100644
index 000000000..797d9418d
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_meta/_01-foot.hbs
@@ -0,0 +1,6 @@
+
+
+{{{ patternLabFoot }}}
+
+
+
diff --git a/packages/development-edition-engine-handlebars/source/_meta/_01-foot.mustache b/packages/development-edition-engine-handlebars/source/_meta/_01-foot.mustache
new file mode 100644
index 000000000..797d9418d
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/_meta/_01-foot.mustache
@@ -0,0 +1,6 @@
+
+
+{{{ patternLabFoot }}}
+
+
+
diff --git a/packages/development-edition-engine-handlebars/source/css/pattern-scaffolding.css b/packages/development-edition-engine-handlebars/source/css/pattern-scaffolding.css
new file mode 100644
index 000000000..f6c2da29d
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/css/pattern-scaffolding.css
@@ -0,0 +1,52 @@
+/**
+ * This stylesheet is for styles you want to include only when displaying demo
+ * styles for grids, animations, color swatches, etc.
+ * These styles will not be your production CSS.
+ */
+
+#sg-patterns {
+ -webkit-box-sizing: border-box !important;
+ box-sizing: border-box !important;
+ max-width: 100%;
+ padding: 0 0.5em;
+}
+
+.sg-colors {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ list-style: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sg-colors li {
+ -webkit-box-flex: 1;
+ -ms-flex: auto;
+ flex: auto;
+ margin: 0 0 0.5em 0.5em;
+ width: 14em;
+}
+
+.sg-swatch {
+ display: flex;
+ flex-direction: column;
+ height: 6em;
+ margin-bottom: 0.3em;
+ padding: 0.5rem;
+}
+
+.sg-label {
+ font-size: 90%;
+ line-height: 1;
+ color: white;
+}
+
+.sg-label__inverted {
+ color: black;
+}
+
+.sg-label__top {
+ margin-bottom: auto;
+}
diff --git a/packages/development-edition-engine-handlebars/source/css/style.css b/packages/development-edition-engine-handlebars/source/css/style.css
new file mode 100644
index 000000000..7f25a7fe6
--- /dev/null
+++ b/packages/development-edition-engine-handlebars/source/css/style.css
@@ -0,0 +1,3 @@
+.annotation {
+ color: #b2b2b2;
+}
diff --git a/packages/development-edition-engine-handlebars/source/favicon.ico b/packages/development-edition-engine-handlebars/source/favicon.ico
new file mode 100644
index 000000000..eee4aa78f
Binary files /dev/null and b/packages/development-edition-engine-handlebars/source/favicon.ico differ
diff --git a/packages/development-edition-engine-handlebars/source/fonts/.gitkeep b/packages/development-edition-engine-handlebars/source/fonts/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/cli/.editorconfig b/packages/development-edition-engine-react/.editorconfig
similarity index 77%
rename from packages/cli/.editorconfig
rename to packages/development-edition-engine-react/.editorconfig
index 98a761ddc..8951c3929 100644
--- a/packages/cli/.editorconfig
+++ b/packages/development-edition-engine-react/.editorconfig
@@ -1,12 +1,11 @@
+# editorconfig.org
root = true
[*]
-indent_style = tab
+indent_style = space
+indent_size = 2
+tab_width = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
-
-[{package.json,*.yml}]
-indent_style = space
-indent_size = 2
diff --git a/packages/development-edition-engine-react/.gitignore b/packages/development-edition-engine-react/.gitignore
new file mode 100644
index 000000000..f5ffa0899
--- /dev/null
+++ b/packages/development-edition-engine-react/.gitignore
@@ -0,0 +1,8 @@
+node_modules/
+.DS_Store
+patternlab.json
+.sass-cache/*
+/sass-cache
+Thumbs.db
+.idea/
+public
diff --git a/packages/development-edition-engine-react/.npmrc b/packages/development-edition-engine-react/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/development-edition-engine-react/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/development-edition-engine-react/.nvmrc b/packages/development-edition-engine-react/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/development-edition-engine-react/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/development-edition-engine-react/CHANGELOG.md b/packages/development-edition-engine-react/CHANGELOG.md
new file mode 100644
index 000000000..611fa23a3
--- /dev/null
+++ b/packages/development-edition-engine-react/CHANGELOG.md
@@ -0,0 +1,266 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/edition-node-gulp/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.9.2](https://github.com/pattern-lab/edition-node-gulp/compare/v5.9.1...v5.9.2) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.7.2](https://github.com/pattern-lab/edition-node-gulp/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/edition-node-gulp/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.4.2](https://github.com/pattern-lab/edition-node-gulp/compare/v5.4.1...v5.4.2) (2019-11-27)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.4.1](https://github.com/pattern-lab/edition-node-gulp/compare/v5.4.0...v5.4.1) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.3.3](https://github.com/pattern-lab/edition-node-gulp/compare/v5.3.2...v5.3.3) (2019-11-22)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+## [5.3.2](https://github.com/pattern-lab/edition-node-gulp/compare/v5.3.1...v5.3.2) (2019-11-14)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.3.1](https://github.com/pattern-lab/edition-node-gulp/compare/v5.3.0...v5.3.1) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/edition-node-gulp/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **core:** fix pattern export all conflicts ([b210d82](https://github.com/pattern-lab/edition-node-gulp/commit/b210d820ba8ac0b64c82c7ff0f18c9f8a900fce2))
+
+
+
+
+
+## [5.0.2](https://github.com/pattern-lab/edition-node-gulp/compare/v5.0.1...v5.0.2) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [5.0.1](https://github.com/pattern-lab/edition-node-gulp/compare/v5.0.0...v5.0.1) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/edition-node-gulp/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+## [0.1.8](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.7...@pattern-lab/engine-react-testing-tree@0.1.8) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+## [0.1.7](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.6...@pattern-lab/engine-react-testing-tree@0.1.7) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+## [0.1.3](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.2...@pattern-lab/engine-react-testing-tree@0.1.3) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+## [0.1.2](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.2-alpha.0...@pattern-lab/engine-react-testing-tree@0.1.2) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+## [0.1.1-beta.1](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.1-alpha.4...@pattern-lab/engine-react-testing-tree@0.1.1-beta.1) (2019-02-09)
+
+
+### Bug Fixes
+
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/edition-node-gulp/commit/98dfadf))
+
+
+
+
+
+
+## [0.1.1-beta.0](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.1-alpha.4...@pattern-lab/engine-react-testing-tree@0.1.1-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+
+
+
+
+## [0.1.1-alpha.4](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.1-alpha.3...@pattern-lab/engine-react-testing-tree@0.1.1-alpha.4) (2018-07-06)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+## [0.1.1-alpha.3](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.1-alpha.2...@pattern-lab/engine-react-testing-tree@0.1.1-alpha.3) (2018-07-06)
+
+### Bug Fixes
+
+* **package:** fix fat-fingered dependency ([e439f4e](https://github.com/pattern-lab/edition-node-gulp/commit/e439f4e))
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/edition-node-gulp/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/edition-node-gulp/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/edition-node-gulp/commit/5ab3995))
+
+
+
+## [0.1.1-alpha.2](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.1-alpha.1...@pattern-lab/engine-react-testing-tree@0.1.1-alpha.2) (2018-07-05)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+## [0.1.1-alpha.1](https://github.com/pattern-lab/edition-node-gulp/compare/@pattern-lab/engine-react-testing-tree@0.1.1-alpha.0...@pattern-lab/engine-react-testing-tree@0.1.1-alpha.1) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-react-testing-tree
+
+
+
+## 0.1.1-alpha.0 (2018-05-04)
+
+### Features
+
+* **README:** clarify purpose of development edition ([d90df0e](https://github.com/pattern-lab/edition-node-gulp/commit/d90df0e))
diff --git a/packages/development-edition-engine-react/LICENSE b/packages/development-edition-engine-react/LICENSE
new file mode 100644
index 000000000..0e6363fb1
--- /dev/null
+++ b/packages/development-edition-engine-react/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Pattern Lab
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/development-edition-engine-react/README.md b/packages/development-edition-engine-react/README.md
new file mode 100644
index 000000000..bdb531d95
--- /dev/null
+++ b/packages/development-edition-engine-react/README.md
@@ -0,0 +1,14 @@
+
+
+# Pattern Lab Node - Development Edition Engine React
+
+_here be dragons_
+
+This Development Edition is a variant of [Edition Node Gulp](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp) for convience purposes only, loaded with the React Engine. The goals of this Development Edition are two-fold:
+
+* Develop the [React Engine](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react)
+* Build and test against React pattern tree
+
+If you'd like to help with the React Engine, please reference the [contribution guidelines](https://github.com/pattern-lab/patternlab-node/blob/master/.github/CONTRIBUTING.md).
+
+> Development Editions of Pattern Lab provide the ability to work on and commit changes to select packages within the overall Pattern Lab [ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). This Edition is NOT stable.
diff --git a/packages/development-edition-engine-react/gulpfile.js b/packages/development-edition-engine-react/gulpfile.js
new file mode 100644
index 000000000..8d8653659
--- /dev/null
+++ b/packages/development-edition-engine-react/gulpfile.js
@@ -0,0 +1,72 @@
+/******************************************************
+ * PATTERN LAB NODE
+ * EDITION-NODE-GULP
+ * The gulp wrapper around patternlab-node core, providing tasks to interact with the core library.
+ ******************************************************/
+const gulp = require('gulp');
+const argv = require('minimist')(process.argv.slice(2));
+
+/******************************************************
+ * PATTERN LAB NODE WRAPPER TASKS with core library
+ ******************************************************/
+const config = require('./patternlab-config.json');
+const patternlab = require('@pattern-lab/core')(config);
+
+function build() {
+ return patternlab
+ .build({
+ watch: argv.watch,
+ cleanPublic: config.cleanPublic,
+ })
+ .then(() => {
+ // do something else when this promise resolves
+ });
+}
+
+function serve() {
+ return patternlab
+ .serve({
+ cleanPublic: config.cleanPublic,
+ })
+ .then(() => {
+ // do something else when this promise resolves
+ });
+}
+
+gulp.task('patternlab:version', function() {
+ patternlab.version();
+});
+
+gulp.task('patternlab:help', function() {
+ patternlab.help();
+});
+
+gulp.task('patternlab:patternsonly', function() {
+ patternlab.patternsonly(config.cleanPublic);
+});
+
+gulp.task('patternlab:liststarterkits', function() {
+ patternlab.liststarterkits();
+});
+
+gulp.task('patternlab:loadstarterkit', function() {
+ patternlab.loadstarterkit(argv.kit, argv.clean);
+});
+
+gulp.task('patternlab:build', function() {
+ build().then(() => {
+ // do something else when this promise resolves
+ });
+});
+
+gulp.task('patternlab:serve', function() {
+ serve().then(() => {
+ // do something else when this promise resolves
+ });
+});
+
+gulp.task('patternlab:installplugin', function() {
+ patternlab.installplugin(argv.plugin);
+});
+
+gulp.task('default', ['patternlab:help']);
diff --git a/packages/development-edition-engine-react/package.json b/packages/development-edition-engine-react/package.json
new file mode 100644
index 000000000..e17c489fd
--- /dev/null
+++ b/packages/development-edition-engine-react/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@pattern-lab/engine-react-testing-tree",
+ "description": "The tree of components we use to test, develop and validate the React engine",
+ "version": "5.9.3",
+ "private": true,
+ "main": "gulpfile.js",
+ "dependencies": {
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/engine-mustache": "^5.0.0",
+ "@pattern-lab/engine-react": "^5.0.0",
+ "@pattern-lab/uikit-workshop": "^5.9.3",
+ "gulp": "3.9.1",
+ "minimist": "^1.2.0",
+ "react": "16.2.0"
+ },
+ "keywords": [
+ "Pattern Lab",
+ "Atomic Web Design",
+ "Node",
+ "Gulp",
+ "Javascript"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/pattern-lab/edition-node-gulp.git"
+ },
+ "bugs": "https://github.com/pattern-lab/edition-node-gulp/issues",
+ "author": "Brian Muenzenmeyer",
+ "scripts": {
+ "gulp": "gulp -- "
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0"
+ }
+}
diff --git a/packages/development-edition-engine-react/patternlab-config.json b/packages/development-edition-engine-react/patternlab-config.json
new file mode 100644
index 000000000..23b459f2d
--- /dev/null
+++ b/packages/development-edition-engine-react/patternlab-config.json
@@ -0,0 +1,95 @@
+{
+ "cacheBust": true,
+ "cleanPublic" : true,
+ "defaultPattern": "all",
+ "defaultShowPatternInfo": false,
+ "ishControlsHide": {
+ "s": false,
+ "m": false,
+ "l": false,
+ "full": false,
+ "random": false,
+ "disco": false,
+ "hay": true,
+ "mqs": false,
+ "find": false,
+ "views-all": false,
+ "views-annotations": false,
+ "views-code": false,
+ "views-new": false,
+ "tools-all": false,
+ "tools-docs": false
+ },
+ "ishViewportRange": {
+ "s": [240, 500],
+ "m": [500, 800],
+ "l": [800, 2600]
+ },
+<<<<<<< HEAD:packages/development-edition-engine-react/patternlab-config.json
+ "logLevel": "info",
+=======
+ "patternExportAll": false,
+ "patternExportPreserveDirectoryStructure": false,
+ "patternExportRaw": false,
+ "patternExportPatternPartials": [],
+ "patternExportDirectory": "./pattern_exports/",
+ "cacheBust": true,
+>>>>>>> 436dd99e50d808cd14691593b927209f1ecb663e:patternlab-config.json
+ "outputFileSuffixes": {
+ "rendered": ".rendered",
+ "rawTemplate": "",
+ "markupOnly": ".markup-only"
+ },
+ "paths" : {
+ "source" : {
+ "root": "./source/",
+ "patterns" : "./source/_patterns/",
+ "data" : "./source/_data/",
+ "meta": "./source/_meta/",
+ "annotations" : "./source/_annotations/",
+ "styleguide": "./node_modules/@pattern-lab/uikit-workshop/dist/",
+ "patternlabFiles": {
+ "general-header":
+ "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-header.mustache",
+ "general-footer":
+ "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-footer.mustache",
+ "patternSection":
+ "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSection.mustache",
+ "patternSectionSubtype":
+ "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSectionSubtype.mustache",
+ "viewall":
+ "./node_modules/@pattern-lab/uikit-workshop/views/viewall.mustache"
+ },
+ "js" : "./source/js",
+ "images" : "./source/images",
+ "fonts" : "./source/fonts",
+ "css" : "./source/css/"
+ },
+ "public" : {
+ "root" : "./public/",
+ "patterns" : "./public/patterns/",
+ "data" : "./public/styleguide/data/",
+ "annotations" : "./public/annotations/",
+ "styleguide" : "./public/styleguide/",
+ "js" : "./public/js",
+ "images" : "./public/images",
+ "fonts" : "./public/fonts",
+ "css" : "./public/css"
+ }
+ },
+ "patternExtension": "mustache",
+ "patternStateCascade": ["inprogress", "inreview", "complete"],
+ "patternExportDirectory": "./pattern_exports/",
+ "patternExportPatternPartials": [],
+ "serverOptions": {
+ "wait": 1000
+ },
+ "starterkitSubDir": "dist",
+ "styleGuideExcludes": [
+ ],
+ "theme": {
+ "color": "dark",
+ "density": "compact",
+ "layout": "horizontal"
+ }
+}
diff --git a/packages/development-edition-engine-react/source/_annotations/README.md b/packages/development-edition-engine-react/source/_annotations/README.md
new file mode 100644
index 000000000..42592a09b
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_annotations/README.md
@@ -0,0 +1,5 @@
+This is the default location to place annotations.
+
+Pattern Lab uses annotations defined here to markup the UI. Read more about [annotations](http://patternlab.io/docs/pattern-adding-annotations.html).
+
+If you wish to rename this directory, make sure you update the `paths.source.annotations` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/_data/README.md b/packages/development-edition-engine-react/source/_data/README.md
new file mode 100644
index 000000000..3b9ea1ea4
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_data/README.md
@@ -0,0 +1,5 @@
+This is the default location to place global data files.
+
+Pattern Lab uses data defined here as the global fallback if a template does not provide its own data. Read more about [data](http://patternlab.io/docs/data-overview.html).
+
+If you wish to rename this directory, make sure you update the `paths.source.data` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/_meta/README.md b/packages/development-edition-engine-react/source/_meta/README.md
new file mode 100644
index 000000000..c6c8c3b8e
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/README.md
@@ -0,0 +1,5 @@
+This is the default location to place meta files, otherwise known a pattern's header and footer.
+
+Pattern Lab builds each pattern while prepending and appending the header and footer. Read more about [pattern headers and footers](http://patternlab.io/docs/pattern-header-footer.html).
+
+If you wish to rename this directory, make sure you update the `paths.source.meta` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/_meta/_00-head.hbs b/packages/development-edition-engine-react/source/_meta/_00-head.hbs
new file mode 100644
index 000000000..cf826617a
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/_00-head.hbs
@@ -0,0 +1,16 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
diff --git a/packages/development-edition-engine-react/source/_meta/_00-head.html b/packages/development-edition-engine-react/source/_meta/_00-head.html
new file mode 100644
index 000000000..cf826617a
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/_00-head.html
@@ -0,0 +1,16 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
diff --git a/packages/development-edition-engine-react/source/_meta/_00-head.mustache b/packages/development-edition-engine-react/source/_meta/_00-head.mustache
new file mode 100644
index 000000000..069727248
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/_00-head.mustache
@@ -0,0 +1,17 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
+
diff --git a/packages/development-edition-engine-react/source/_meta/_01-foot.hbs b/packages/development-edition-engine-react/source/_meta/_01-foot.hbs
new file mode 100644
index 000000000..2feb91336
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/_01-foot.hbs
@@ -0,0 +1,6 @@
+
+
+{{{ patternLabFoot }}}
+
+
+
diff --git a/packages/development-edition-engine-react/source/_meta/_01-foot.html b/packages/development-edition-engine-react/source/_meta/_01-foot.html
new file mode 100644
index 000000000..2feb91336
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/_01-foot.html
@@ -0,0 +1,6 @@
+
+
+{{{ patternLabFoot }}}
+
+
+
diff --git a/packages/development-edition-engine-react/source/_meta/_01-foot.mustache b/packages/development-edition-engine-react/source/_meta/_01-foot.mustache
new file mode 100644
index 000000000..7c15d6a74
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_meta/_01-foot.mustache
@@ -0,0 +1,6 @@
+
+
+ {{{ patternLabFoot }}}
+
+
+
diff --git a/packages/development-edition-engine-react/source/_patterns/00-atoms/00-general/HelloWorld.jsx b/packages/development-edition-engine-react/source/_patterns/00-atoms/00-general/HelloWorld.jsx
new file mode 100644
index 000000000..9790e5af0
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_patterns/00-atoms/00-general/HelloWorld.jsx
@@ -0,0 +1,5 @@
+import React from 'react';
+
+const HelloWorld = () => Hello world!
;
+
+export default HelloWorld;
diff --git a/packages/development-edition-engine-react/source/_patterns/01-molecules/00-general/HelloIncluder.jsx b/packages/development-edition-engine-react/source/_patterns/01-molecules/00-general/HelloIncluder.jsx
new file mode 100644
index 000000000..6b2f3c985
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_patterns/01-molecules/00-general/HelloIncluder.jsx
@@ -0,0 +1,30 @@
+import React, { Component } from 'react';
+
+import HelloWorld from '../../00-atoms/00-general/HelloWorld';
+
+// const HelloWorld = () => (
+//
+// Hello world!
+//
+// );
+
+class HelloIncluder extends Component {
+ constructor() {
+ super();
+ this.state = {
+ bgColor: 'transparent',
+ };
+ setTimeout(() => this.setState({ bgColor: 'red' }), 2000);
+ }
+
+ render() {
+ return (
+
+
Hey! Here's the Hello World component:
+
+
+ );
+ }
+}
+
+export default HelloIncluder;
diff --git a/packages/development-edition-engine-react/source/_patterns/README.md b/packages/development-edition-engine-react/source/_patterns/README.md
new file mode 100644
index 000000000..2f89266bf
--- /dev/null
+++ b/packages/development-edition-engine-react/source/_patterns/README.md
@@ -0,0 +1,5 @@
+This is the default location to place pattern files.
+
+Pattern Lab builds patterns and the ui from the structure defined within. Read more about [pattern organization](http://patternlab.io/docs/pattern-organization.html).
+
+If you wish to rename this directory, make sure you update the `paths.source.patterns` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/css/README.md b/packages/development-edition-engine-react/source/css/README.md
new file mode 100644
index 000000000..a6ce7bf27
--- /dev/null
+++ b/packages/development-edition-engine-react/source/css/README.md
@@ -0,0 +1,5 @@
+This is the default location to place global css files.
+
+The entire contents of this directory will be recursively copied to your configured `public/` directory.
+
+If you wish to rename this directory, make sure you update the `paths.source.css` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/css/pattern-scaffolding.css b/packages/development-edition-engine-react/source/css/pattern-scaffolding.css
new file mode 100644
index 000000000..b09172fc8
--- /dev/null
+++ b/packages/development-edition-engine-react/source/css/pattern-scaffolding.css
@@ -0,0 +1,54 @@
+/**
+ * This stylesheet is for styles you want to include only when displaying demo
+ * styles for grids, animations, color swatches, etc.
+ * These styles will not be your production CSS.
+ */
+#sg-patterns {
+ -webkit-box-sizing: border-box !important;
+ box-sizing: border-box !important;
+ max-width: 100%;
+ padding: 0 0.5em;
+}
+
+.demo-animate {
+ background: #ddd;
+ padding: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+ border-radius: 8px;
+ cursor: pointer;
+}
+
+.sg-colors {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ list-style: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sg-colors li {
+ -webkit-box-flex: 1;
+ -ms-flex: auto;
+ flex: auto;
+ padding: 0.3em;
+ margin: 0 0.5em 0.5em 0;
+ min-width: 5em;
+ max-width: 14em;
+ border: 1px solid #ddd;
+ border-radius: 8px;
+}
+
+.sg-swatch {
+ display: block;
+ height: 4em;
+ margin-bottom: 0.3em;
+ border-radius: 5px;
+}
+
+.sg-label {
+ font-size: 90%;
+ line-height: 1;
+}
diff --git a/packages/development-edition-engine-react/source/css/style.css b/packages/development-edition-engine-react/source/css/style.css
new file mode 100644
index 000000000..04f745349
--- /dev/null
+++ b/packages/development-edition-engine-react/source/css/style.css
@@ -0,0 +1,3 @@
+/*
+ * YOUR STYLES HERE
+ */
diff --git a/packages/development-edition-engine-react/source/favicon.ico b/packages/development-edition-engine-react/source/favicon.ico
new file mode 100644
index 000000000..eee4aa78f
Binary files /dev/null and b/packages/development-edition-engine-react/source/favicon.ico differ
diff --git a/packages/development-edition-engine-react/source/fonts/README.md b/packages/development-edition-engine-react/source/fonts/README.md
new file mode 100644
index 000000000..ff4d4dee0
--- /dev/null
+++ b/packages/development-edition-engine-react/source/fonts/README.md
@@ -0,0 +1,5 @@
+This is the default location to place global font files.
+
+The entire contents of this directory will be recursively copied to your configured `public/` directory.
+
+If you wish to rename this directory, make sure you update the `paths.source.fonts` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/images/README.md b/packages/development-edition-engine-react/source/images/README.md
new file mode 100644
index 000000000..86c91d567
--- /dev/null
+++ b/packages/development-edition-engine-react/source/images/README.md
@@ -0,0 +1,5 @@
+This is the default location to place global image files.
+
+The entire contents of this directory will be recursively copied to your configured `public/` directory.
+
+If you wish to rename this directory, make sure you update the `paths.source.images` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-react/source/js/README.md b/packages/development-edition-engine-react/source/js/README.md
new file mode 100644
index 000000000..857893854
--- /dev/null
+++ b/packages/development-edition-engine-react/source/js/README.md
@@ -0,0 +1,5 @@
+This is the default location to place global javascript files.
+
+The entire contents of this directory will be recursively copied to your configured `public/` directory.
+
+If you wish to rename this directory, make sure you update the `paths.source.js` property within `patternlab-config.json`.
diff --git a/packages/development-edition-engine-twig/.gitignore b/packages/development-edition-engine-twig/.gitignore
new file mode 100644
index 000000000..0679bd2b5
--- /dev/null
+++ b/packages/development-edition-engine-twig/.gitignore
@@ -0,0 +1,9 @@
+node_modules/
+.DS_Store
+patternlab.json
+.sass-cache/*
+/sass-cache
+Thumbs.db
+.idea/
+public
+dependencyGraph.json
diff --git a/packages/development-edition-engine-twig/CHANGELOG.md b/packages/development-edition-engine-twig/CHANGELOG.md
new file mode 100644
index 000000000..f1bda1063
--- /dev/null
+++ b/packages/development-edition-engine-twig/CHANGELOG.md
@@ -0,0 +1,40 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-twig
+
+
+
+
+
+## [5.9.2](https://github.com/pattern-lab/patternlab-node/compare/v5.9.1...v5.9.2) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-twig
+
+
+
+
+
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/compare/v5.9.0...v5.9.1) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-twig
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-twig
+
+
+
+
+
+# [5.8.0](https://github.com/pattern-lab/patternlab-node/compare/v5.7.2...v5.8.0) (2020-04-03)
+
+**Note:** Version bump only for package @pattern-lab/development-edition-engine-twig
diff --git a/packages/development-edition-engine-twig/README.md b/packages/development-edition-engine-twig/README.md
new file mode 100644
index 000000000..5ea6dce7b
--- /dev/null
+++ b/packages/development-edition-engine-twig/README.md
@@ -0,0 +1,25 @@
+
+
+# Pattern Lab Node - Development Edition Engine Twig
+
+_here be dragons_
+
+This Development Edition is a variant of [Edition Node](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node) for convience purposes only, loaded with the Twig Engine. The goals of this Development Edition are two-fold:
+
+* Develop the [Twig Engine](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig)
+* Build and test against Twig pattern tree
+
+> Development Editions of Pattern Lab provide the ability to work on and commit changes to select packages within the overall Pattern Lab [ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). This Edition is NOT stable.
+
+
+## Working on Pattern Lab's UI Locally
+
+### Step 1: Install Dependencies
+Run the following in the root of the Pattern Lab repo:
+
+```
+yarn run setup
+```
+
+### Step 2
+Finally, go back into this folder, `cd packages/development-edition-engine-twig`, and start up the local dev server which watches UIKit and the local Pattern Lab instance for changes, live reloads, etc by running `yarn dev`
diff --git a/packages/development-edition-engine-twig/package.json b/packages/development-edition-engine-twig/package.json
new file mode 100644
index 000000000..949ac8f24
--- /dev/null
+++ b/packages/development-edition-engine-twig/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "@pattern-lab/development-edition-engine-twig",
+ "private": true,
+ "version": "5.9.3",
+ "description": "The tree of components we use to test, develop and validate the twig engine (not engine-twig-php)",
+ "scripts": {
+ "postbootstrap": "patternlab install --starterkits @pattern-lab/starterkit-twig-demo",
+ "pl:build": "patternlab build --config ./patternlab-config.json",
+ "pl:help": "patternlab --help",
+ "pl:install": "patternlab install --config ./patternlab-config.json",
+ "pl:serve": "patternlab serve --config ./patternlab-config.json",
+ "pl:version": "patternlab --version",
+ "dev": "node ./node_modules/@pattern-lab/uikit-workshop/build-tools.js"
+ },
+ "keywords": [
+ "Pattern Lab",
+ "Atomic Web Design",
+ "Node",
+ "Twig",
+ "Edition"
+ ],
+ "author": "Ringo De Smet",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/pattern-lab/patternlab-node.git"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "dependencies": {
+ "@pattern-lab/cli": "^5.9.3",
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/engine-twig": "^5.9.3",
+ "@pattern-lab/starterkit-twig-demo": "^5.8.0",
+ "@pattern-lab/uikit-workshop": "^5.9.3"
+ },
+ "workspaces": {
+ "nohoist": [
+ "**/@pattern-lab/starterkit-twig-demo"
+ ]
+ }
+}
diff --git a/packages/development-edition-engine-twig/patternlab-config.json b/packages/development-edition-engine-twig/patternlab-config.json
new file mode 100644
index 000000000..3c18bd403
--- /dev/null
+++ b/packages/development-edition-engine-twig/patternlab-config.json
@@ -0,0 +1,114 @@
+{
+ "cacheBust": true,
+ "cleanPublic": true,
+ "defaultPattern": "pages-homepage",
+ "defaultShowPatternInfo": false,
+ "ishControlsHide": {
+ "s": false,
+ "m": false,
+ "l": false,
+ "full": false,
+ "random": false,
+ "disco": false,
+ "hay": true,
+ "mqs": false,
+ "find": false,
+ "views-all": false,
+ "views-annotations": false,
+ "views-code": false,
+ "views-new": false,
+ "tools-all": false,
+ "tools-docs": false
+ },
+ "ishViewportRange": {
+ "s": [
+ 240,
+ 500
+ ],
+ "m": [
+ 500,
+ 800
+ ],
+ "l": [
+ 800,
+ 2600
+ ]
+ },
+ "logLevel": "info",
+ "outputFileSuffixes": {
+ "rendered": ".rendered",
+ "rawTemplate": "",
+ "markupOnly": ".markup-only"
+ },
+ "paths": {
+ "source": {
+ "root": "source/",
+ "patterns": "source/_patterns/",
+ "data": "source/_data/",
+ "meta": "source/_meta/",
+ "annotations": "source/_annotations/",
+ "styleguide": "dist/",
+ "patternlabFiles": {
+ "general-header": "views/partials/general-header.mustache",
+ "general-footer": "views/partials/general-footer.mustache",
+ "patternSection": "views/partials/patternSection.mustache",
+ "patternSectionSubtype": "views/partials/patternSectionSubtype.mustache",
+ "viewall": "views/viewall.mustache"
+ },
+ "js": "source/js",
+ "images": "source/images",
+ "fonts": "source/fonts",
+ "css": "source/css"
+ },
+ "public": {
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
+ }
+ },
+ "patternExtension": "twig",
+ "patternStateCascade": [
+ "inprogress",
+ "inreview",
+ "complete"
+ ],
+ "patternExportDirectory": "pattern_exports",
+ "patternExportPatternPartials": [],
+ "serverOptions": {
+ "wait": 1000
+ },
+ "starterkitSubDir": "dist",
+ "styleGuideExcludes": [],
+ "theme": {
+ "color": "dark",
+ "density": "compact",
+ "layout": "horizontal"
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ],
+ "engines": {
+ "twig": {
+ "namespaces": {
+ "atoms": "source/_patterns/00-atoms/",
+ "molecules": "source/_patterns/01-molecules/",
+ "organisms": "source/_patterns/02-organisms/",
+ "templates": "source/_patterns/03-templates/",
+ "pages": "source/_patterns/04-pages/",
+ "macros": "source/_macros/"
+ }
+ }
+ }
+}
diff --git a/packages/development-edition-engine-twig/source/.gitignore b/packages/development-edition-engine-twig/source/.gitignore
new file mode 100644
index 000000000..d6b7ef32c
--- /dev/null
+++ b/packages/development-edition-engine-twig/source/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/packages/docs/.eleventy.js b/packages/docs/.eleventy.js
new file mode 100644
index 000000000..9e8b8feaa
--- /dev/null
+++ b/packages/docs/.eleventy.js
@@ -0,0 +1,96 @@
+const rssPlugin = require('@11ty/eleventy-plugin-rss');
+const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight');
+const eleventyNavigationPlugin = require('@11ty/eleventy-navigation');
+const fs = require('fs');
+
+// Import filters
+const dateFilter = require('./src/filters/date-filter.js');
+const markdownFilter = require('./src/filters/markdown-filter.js');
+const w3DateFilter = require('./src/filters/w3-date-filter.js');
+
+// Import transforms
+const htmlMinTransform = require('./src/transforms/html-min-transform.js');
+const parseTransform = require('./src/transforms/parse-transform.js');
+
+// Import data files
+const site = require('./src/_data/site.json');
+
+module.exports = function(config) {
+ // Filters
+ config.addFilter('dateFilter', dateFilter);
+ config.addFilter('markdownFilter', markdownFilter);
+ config.addFilter('w3DateFilter', w3DateFilter);
+
+ // Layout aliases
+ config.addLayoutAlias('home', 'layouts/home.njk');
+
+ // Transforms
+ config.addTransform('htmlmin', htmlMinTransform);
+ config.addTransform('parse', parseTransform);
+
+ // Passthrough copy
+ config.addPassthroughCopy('src/images');
+ config.addPassthroughCopy('src/js');
+ config.addPassthroughCopy('src/admin/config.yml');
+ config.addPassthroughCopy('src/admin/previews.js');
+ config.addPassthroughCopy('node_modules/nunjucks/browser/nunjucks-slim.js');
+
+ const now = new Date();
+
+ // Custom collections
+ const livePosts = post => post.date <= now && !post.data.draft;
+ config.addCollection('posts', collection => {
+ return [
+ ...collection.getFilteredByGlob('./src/posts/*.md').filter(livePosts)
+ ].reverse();
+ });
+
+ config.addCollection('demos', collection => {
+ return [...collection.getFilteredByGlob('./src/demos/*.md')].reverse();
+ });
+
+ config.addCollection('postFeed', collection => {
+ return [...collection.getFilteredByGlob('./src/posts/*.md').filter(livePosts)]
+ .reverse()
+ .slice(0, site.maxPostsPerPage);
+ });
+
+ config.addCollection('docs', collection => {
+ return [...collection.getFilteredByGlob('./src/docs/*.md')].reverse();
+ });
+
+ config.addCollection('docsOrdered', collection => {
+ const docs = collection.getFilteredByGlob('src/docs/*.md').sort((a, b) => {
+ return Number(a.data.order) - Number(b.data.order);
+ });
+ return docs;
+ });
+
+ // Plugins
+ config.addPlugin(rssPlugin);
+ config.addPlugin(syntaxHighlight);
+ config.addPlugin(eleventyNavigationPlugin);
+
+ // 404
+ config.setBrowserSyncConfig({
+ callbacks: {
+ ready: function(err, browserSync) {
+ const content_404 = fs.readFileSync('dist/404.html');
+
+ browserSync.addMiddleware('*', (req, res) => {
+ // Provides the 404 content without redirect.
+ res.write(content_404);
+ res.end();
+ });
+ }
+ }
+ });
+
+ return {
+ dir: {
+ input: 'src',
+ output: 'dist'
+ },
+ passthroughFileCopy: true
+ };
+};
diff --git a/packages/docs/.gitignore b/packages/docs/.gitignore
new file mode 100644
index 000000000..a54bbf4b4
--- /dev/null
+++ b/packages/docs/.gitignore
@@ -0,0 +1,17 @@
+*.log
+npm-debug.*
+*.scssc
+*.log
+*.swp
+.DS_Store
+.sass-cache
+node_modules
+dist
+
+# Specifics
+
+# Hide design tokens
+src/scss/_tokens.scss
+
+# Hide compiled CSS
+src/_includes/assets/*
diff --git a/packages/docs/.prettierrc b/packages/docs/.prettierrc
new file mode 100644
index 000000000..a20fac227
--- /dev/null
+++ b/packages/docs/.prettierrc
@@ -0,0 +1,7 @@
+{
+ "printWidth": 90,
+ "useTabs": true,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "bracketSpacing": false
+}
diff --git a/packages/docs/.vscode/launch.json b/packages/docs/.vscode/launch.json
new file mode 100644
index 000000000..2359da6e9
--- /dev/null
+++ b/packages/docs/.vscode/launch.json
@@ -0,0 +1,17 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Launch Program",
+ "skipFiles": [
+ "/**"
+ ],
+ "program": "${workspaceFolder}/index.js"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md
new file mode 100644
index 000000000..3bf4e3f5c
--- /dev/null
+++ b/packages/docs/CHANGELOG.md
@@ -0,0 +1,19 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/bradfrost/pl-website-eleventy/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package patternlab-website
+
+
+
+
+
+# [5.9.0](https://github.com/bradfrost/pl-website-eleventy/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+
+### Features
+
+* **docs:** yarnify ([5a47dc7](https://github.com/bradfrost/pl-website-eleventy/commit/5a47dc7b90dc5c43c12a51143b41943dcbd8564c))
diff --git a/packages/docs/LICENSE.txt b/packages/docs/LICENSE.txt
new file mode 100644
index 000000000..312f7109c
--- /dev/null
+++ b/packages/docs/LICENSE.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 andy-bell.design and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/docs/README.md b/packages/docs/README.md
new file mode 100644
index 000000000..7b191158a
--- /dev/null
+++ b/packages/docs/README.md
@@ -0,0 +1,32 @@
+# Pattern Lab Website
+
+This is the website for patternlab.io. This site was build using the [Hylia starter kit](https://hylia.website/), which is a lightweight [Eleventy](https://11ty.io) starter kit.
+
+---
+
+## How to work with this project
+
+1. Clone this repository
+2. `cd` into the project directory and run `yarn`
+3. Once all the dependencies are installed run `yarn start`
+4. Open your browser at `http://localhost:8080`
+
+## Terminal commands
+
+### Serve the site locally
+
+```bash
+yarn start
+```
+
+### Build a production version of the site
+
+```bash
+yarn production
+```
+
+### Compile Sass
+
+```bash
+yarn sass:process
+```
diff --git a/packages/docs/package.json b/packages/docs/package.json
new file mode 100755
index 000000000..801697fa9
--- /dev/null
+++ b/packages/docs/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "patternlab-website",
+ "version": "5.9.3",
+ "description": "The website for patternlab.io",
+ "main": "index.js",
+ "dependencies": {
+ "@11ty/eleventy": "^0.8.3",
+ "@11ty/eleventy-plugin-rss": "^1.0.6",
+ "@11ty/eleventy-plugin-syntaxhighlight": "^2.0.3",
+ "@tbranyen/jsdom": "^13.0.0",
+ "concurrently": "^4.1.0",
+ "html-minifier": "^4.0.0",
+ "json-to-scss": "^1.3.1",
+ "sass": "^1.21.0",
+ "semver": "^6.3.0",
+ "slugify": "^1.3.4",
+ "stalfos": "github:hankchizljaw/stalfos#c8971d22726326cfc04089b2da4d51eeb1ebb0eb"
+ },
+ "devDependencies": {
+ "@11ty/eleventy-navigation": "^0.1.5",
+ "@erquhart/rollup-plugin-node-builtins": "^2.1.5",
+ "bl": "^3.0.0",
+ "chokidar-cli": "^2.0.0",
+ "cross-env": "^5.2.0",
+ "make-dir-cli": "^2.0.0",
+ "prettier": "^1.18.2",
+ "rollup": "^1.16.1",
+ "rollup-plugin-commonjs": "^10.0.0",
+ "rollup-plugin-json": "^4.0.0",
+ "rollup-plugin-node-resolve": "^5.0.3"
+ },
+ "scripts": {
+ "sass:tokens": "npx json-to-scss src/_data/tokens.json src/scss/_tokens.scss",
+ "sass:process": "yarn sass:tokens && sass src/scss/style.scss dist/css/style.css --style=compressed",
+ "cms:precompile": "make-dir dist/admin && nunjucks-precompile src/_includes > dist/admin/templates.js -i \"\\.(njk|css|svg)$\"",
+ "cms:bundle": "rollup --config",
+ "start": "concurrently \"yarn sass:process -- --watch\" \"yarn cms:bundle -- --watch\" \"chokidar \\\"src/_includes/**\\\" -c \\\"yarn cms:precompile\\\"\" \"yarn serve\"",
+ "serve": "cross-env ELEVENTY_ENV=development npx eleventy --serve",
+ "production": "yarn sass:process && yarn cms:precompile && yarn cms:bundle && npx eleventy"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/bradfrost/pl-website-eleventy.git"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/bradfrost/pl-website-eleventy/issues"
+ },
+ "homepage": "https://github.com/bradfrost/pl-website-eleventy/#readme"
+}
diff --git a/packages/docs/php-docs/advanced-auto-regenerate.md b/packages/docs/php-docs/advanced-auto-regenerate.md
new file mode 100644
index 000000000..fc6985825
--- /dev/null
+++ b/packages/docs/php-docs/advanced-auto-regenerate.md
@@ -0,0 +1,55 @@
+---
+title: Watching for Changes and Auto Regenerating Patterns
+tags:
+ - docs
+---
+
+Pattern Lab can watch for changes to files in `./source/` and automatically rebuild the entire Pattern Lab website for you. Make your changes, save the file, and Pattern Lab takes care of the rest.
+
+## How to Start Watching for Changes
+
+To start watching for changes do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --watch`
+
+To stop watching files use `CTRL+C` in the same terminal window.
+
+### Only Watch for Changes to Pattern Lab Files
+
+If you use a task runner like Gulp or Grunt to compile Sass, JavaScript or images you may want Pattern Lab to only concern itself with its own files. To limit Pattern Lab to watch and move only its files do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --watch --patternsonly`
+
+Or, better yet, use this command within your Gulp or Grunt script.
+
+### Start the Web Server & Watch for Changes at the Same Time
+
+If you're relying on Pattern Lab's server to view your content you'll want to run the watch and server with the same command. Do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --server --with-watch`
+
+You can also start the server and watch only patterns:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --server --with-watch --patternsonly`
+
+To stop the server and watching files use `CTRL+C` in the same terminal window.
+
+### Start the Web Server, Watch for Changes, and Reload the Browser at the Same Time
+
+The ultimate solution for working with Pattern Lab if you're not using a task runner is Pattern Lab's [Auto-Reload Plugin](https://github.com/pattern-lab/plugin-php-reload). Do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Install the [Auto-Reload Plugin](https://github.com/pattern-lab/plugin-php-reload) using `composer require pattern-lab/plugin-reload`
+3. Type `php core/console --server --with-watch`
+
+The Auto-Reload Plugin is automatically enabled when you install it. You can always [disable the plugin](https://github.com/pattern-lab/plugin-php-reload#disabling-the-plugin) if you need to.
+
+To stop the server, watching files, and auto-reload service use `CTRL+C` in the same terminal window.
+
+## What Pattern Lab Will Watch
+
+By default, the PHP version of Pattern Lab will watch all files in `./source` except those that match the "ignore" configuration options in `config/config.yml`. When using `--patternsonly` Pattern Lab will only watch those directories in `./source` that start with an underscore. For example, `_patterns`. To learn how to modify what is ignored check out "[Managing Assets for a Pattern](/docs/pattern-managing-assets.html)".
diff --git a/packages/docs/php-docs/advanced-clean-public.md b/packages/docs/php-docs/advanced-clean-public.md
new file mode 100644
index 000000000..408e3ed37
--- /dev/null
+++ b/packages/docs/php-docs/advanced-clean-public.md
@@ -0,0 +1,5 @@
+---
+title: Stopping public/ from Being "Cleaned"
+tags:
+ - docs
+---
diff --git a/packages/docs/php-docs/advanced-config-options.md b/packages/docs/php-docs/advanced-config-options.md
new file mode 100644
index 000000000..e21791b71
--- /dev/null
+++ b/packages/docs/php-docs/advanced-config-options.md
@@ -0,0 +1,7 @@
+---
+title: Editing the Configuration Options
+tags:
+ - docs
+---
+
+Pattern Lab comes with a simple configuration file that allows you to modify certain aspects of the system. The configuration file can be found in `./config/config.yml`.
diff --git a/packages/docs/php-docs/advanced-exporting-patterns.md b/packages/docs/php-docs/advanced-exporting-patterns.md
new file mode 100644
index 000000000..49f4857d1
--- /dev/null
+++ b/packages/docs/php-docs/advanced-exporting-patterns.md
@@ -0,0 +1,17 @@
+---
+title: Exporting Patterns
+tags:
+ - docs
+---
+
+Pattern Lab can export all of your patterns for you sans Pattern Lab's CSS and JavaScript. To export your patterns do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --export`
+
+If you require your patterns to be exported without your global header and footer (_e.g. to export a clean molecule_) do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --export --clean`
+
+In both cases the patterns will be exported to `./export/patterns`. The export directory is one of the many directories that can be [configured and changed](/docs/editing-source-files.html).
diff --git a/packages/docs/php-docs/advanced-page-follow.md b/packages/docs/php-docs/advanced-page-follow.md
new file mode 100644
index 000000000..3e38bebfc
--- /dev/null
+++ b/packages/docs/php-docs/advanced-page-follow.md
@@ -0,0 +1,7 @@
+---
+title: Multi browser & Multi device Testing with Page Follow
+tags:
+ - docs
+---
+
+An auto-reload service was built into Pattern Lab 1. With Pattern Lab 2 this feature has been removed. This feature may return as a plugin in the same way that the [Auto-Reload service](/docs/advanced-reload-browser.html) did.
diff --git a/packages/docs/php-docs/advanced-pattern-lab-nav.md b/packages/docs/php-docs/advanced-pattern-lab-nav.md
new file mode 100644
index 000000000..2bd2c28c5
--- /dev/null
+++ b/packages/docs/php-docs/advanced-pattern-lab-nav.md
@@ -0,0 +1,29 @@
+---
+title: Modifying Pattern Lab's Navigation
+tags:
+ - docs
+---
+
+When sharing Pattern Lab with a client it may be beneficial to turn-off certain elements in the default navigation. To turn-off navigation elements do the following:
+
+1. Open `./config/config.yml`
+2. Add the keys for the elements you'd like to hide to the `ishControlsHide` configuration option
+3. Re-generate your Pattern Lab site
+
+The following keys are supported and will hide their respective elements:
+
+```
+s
+m
+l
+full
+random
+disco
+hay
+find
+views-new
+tools-all
+tools-docs
+```
+
+`hay` is disabled by default.
diff --git a/packages/docs/php-docs/advanced-reload-browser.md b/packages/docs/php-docs/advanced-reload-browser.md
new file mode 100644
index 000000000..4da045d5f
--- /dev/null
+++ b/packages/docs/php-docs/advanced-reload-browser.md
@@ -0,0 +1,14 @@
+---
+title: Auto Reloading the Browser Window When Changes Are Made
+tags:
+ - docs
+---
+
+An auto-reload service was built into Pattern Lab 1. With Pattern Lab 2 this feature has been turned into the [Auto-Reload Plugin](https://github.com/pattern-lab/plugin-php-reload). To install this plugin do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `composer require pattern-lab/plugin-reload`
+
+The Auto-Reload Plugin is automatically enabled when you install it. You can always [disable the plugin](https://github.com/pattern-lab/plugin-php-reload#disabling-the-plugin) if you need to.
+
+This service is enabled when using the `--watch` or `--server --with-watch` commands. Learn more about [watching for changes](/docs/advanced-auto-regenerate.html).
diff --git a/packages/docs/php-docs/advanced-starterkits.md b/packages/docs/php-docs/advanced-starterkits.md
new file mode 100644
index 000000000..5a90e0bdf
--- /dev/null
+++ b/packages/docs/php-docs/advanced-starterkits.md
@@ -0,0 +1,21 @@
+---
+title: Starterkits
+tags:
+ - docs
+---
+
+StarterKits can be installed via the following commands:
+
+```
+php core/console --starterkit --install [starterkit-name]
+```
+
+where [starterkit-name] is the name of the Starterkit.
+
+so... a complete example:
+
+```
+php core/console --starterkit --install pattern-lab/starterkit-mustache-demo
+```
+
+It is recommended that you do not install this StarterKit as a dependency for your Pattern Lab project via Composer.
diff --git a/packages/docs/php-docs/changes-1-to-2.md b/packages/docs/php-docs/changes-1-to-2.md
new file mode 100644
index 000000000..38ec38bee
--- /dev/null
+++ b/packages/docs/php-docs/changes-1-to-2.md
@@ -0,0 +1,46 @@
+---
+title: Pattern Lab 1 to Pattern Lab 2 Changes
+tags:
+ - docs
+---
+
+With Pattern Lab 2 in development for almost two years many under-the-hood changes have been implemented. For the most part a Pattern Lab 1 project should work with minimal changes in Pattern Lab 2. Here is a non-exhaustive list of new features in Pattern Lab 2:
+
+* complete rebuilding of core
+* support for Composer
+* support for more template languages (_currently Mustache and Twig_)
+* support for StarterKits allowing separation of a team's unique needs from Pattern Lab proper
+* event notification system, getters, setters, and a clean install process to allow for plugins
+* redesigned and rebuilt modal view
+* redesigned and rebuilt styleguide view
+* multi-source directory support
+* support for YAML in global data, pattern-specific data, and pseudo-patterns
+* can have multiple JSON/YAML files in `./_data/`
+* support for JSON/YAML linting to find errors
+* can set multiple classes using the style modifier
+* can use link.[pattern-name] within data to link to other patterns
+* pattern parameters support simple lists
+* pattern parameters act more like mustache (_but not exactly!_)
+* patternParameters can over listItem loop numbers
+* global pattern header and footer is now in `./source/_meta`
+* upgraded console utility
+* patterns and pattern subtypes can be documented in the styleguide by using `[pattern-name].md` or `[pattern-subtype].md`
+* view all pages for pattern sub-types
+* annotations can be defined using Markdown
+* patterns can be exported minus Pattern Lab mark-up
+* can hide individual patterns from "view all" view still available via the nav
+* can set a pattern to be the default pattern when loading Pattern Lab
+* can turn on modal view by default
+* implemented server
+* sayings can now be defined in the config
+* install process that makes it easier to install various components
+
+These are the features of Pattern Lab 1 that have become plugins:
+
+* Automatic Browser Reload
+
+These are the features of Pattern Lab 1 that have been removed in Pattern Lab 2:
+
+* QR Code Generator
+* Page Follow
+* MQs
diff --git a/packages/docs/php-docs/command-line.md b/packages/docs/php-docs/command-line.md
new file mode 100644
index 000000000..264d235c3
--- /dev/null
+++ b/packages/docs/php-docs/command-line.md
@@ -0,0 +1,22 @@
+---
+title: Using The Command Line Options
+tags:
+ - docs
+---
+
+To use Pattern Lab you must use the command line interface. To view the available commands when using Pattern Lab do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --help`
+
+To get the options for a particular command, for example the `--generate` command, you can type:
+
+ php core/console --help --generate
+
+## A Special Note About Windows
+
+To access the command prompt on Windows you can [follow the directions from Microsoft](http://windows.microsoft.com/en-us/windows-vista/open-a-command-prompt-window). After getting to the command prompt type the following to make sure you have PHP installed:
+
+ php -v
+
+If you get an error and know that you've installed PHP you may need to [update your path variable so Windows can find PHP](http://willj.co/2012/10/run-wamp-php-windows-7-command-line/).
diff --git a/packages/docs/php-docs/generating-pattern-lab.md b/packages/docs/php-docs/generating-pattern-lab.md
new file mode 100644
index 000000000..b9831d371
--- /dev/null
+++ b/packages/docs/php-docs/generating-pattern-lab.md
@@ -0,0 +1,14 @@
+---
+title: Generating Pattern Lab
+tags:
+ - docs
+---
+
+Pattern Lab consists of an empty shell when you first install it. To populate the public-facing side of Pattern Lab with your content and patterns do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --generate`
+
+Your Pattern Lab install should now be populated and [available for viewing](/docs/viewing-patterns.html). As you [make changes to your patterns](/docs/editing-source-files.html) you'll need re-generate your site using step 2 above.
+
+Manually re-generating your site after each change or collection of changes can be cumbersome. Pattern Lab can [watch files in the `./source/` directory for changes and re-generate the site automatically](/docs/advanced-auto-regenerate.html). The Pattern Lab website can also be [automatically reloaded](/docs/advanced-reload-browser.html).
diff --git a/packages/docs/php-docs/installation.md b/packages/docs/php-docs/installation.md
new file mode 100644
index 000000000..23b3ec3c4
--- /dev/null
+++ b/packages/docs/php-docs/installation.md
@@ -0,0 +1,5 @@
+---
+title: Installing Pattern Lab
+tags:
+ - docs
+---
diff --git a/packages/docs/php-docs/pattern-managing-assets.md b/packages/docs/php-docs/pattern-managing-assets.md
new file mode 100644
index 000000000..1f6927cde
--- /dev/null
+++ b/packages/docs/php-docs/pattern-managing-assets.md
@@ -0,0 +1,41 @@
+---
+title: Managing Pattern Assets
+tags:
+ - docs
+---
+
+Assets for patterns - including JavaScript, CSS, and images - should be stored and edited in the `./source/` directory. Pattern Lab will move these assets to the `./public/` directory for you when you generate your site or when you watch the `./source/` directory for changes. **You can name and organize your assets however you like.** If you would like to use `./source/stylesheets/` to store your styles instead of `./source/css/` you can do that. There is nothing to configure. The structure will be maintained when they're moved to the `./public/` directory.
+
+## Ignoring and Not Moving Assets Based on File Extension
+
+By default, Pattern Lab will not move assets with the following file extensions:
+
+- `.less`
+- `.scss`
+- `.DS_Store`
+
+To ignore more file extensions edit the `ie` configuration option in `./config/config.yml`. For example, to ignore `*.png` files your `ie` configuration option would look like:
+
+ ie:
+ - DS_Store
+ - less
+ - scss
+ - png
+
+## Ignoring and Not Moving Assets Based on Directory
+
+By default, the PHP version of Pattern Lab will ignore **all** assets in directories that exactly match:
+
+- `scss`
+
+To ignore more directories just edit the `id` configuration option in `./config/config.yml`. For example, to ignore directories named `test/` your `id` configuration option would look like:
+
+ id:
+ - scss
+ - test
+
+**Important:** Pattern Lab will only ignore exact matches of ignored directories. For example, if you had a directory named `cool_scss/` it, and the assets underneath it, _would_ be moved to `./public/` even though `scss` was in the name of the directory.
+
+## Adding Assets to the Pattern Header & Footer
+
+Static assets like Javascript and CSS **are not** added automagically to your patterns. You need to add them manually to the [shared pattern header and footer](/docs/pattern-header-footer.html).
diff --git a/packages/docs/php-docs/pattern-states.md b/packages/docs/php-docs/pattern-states.md
new file mode 100644
index 000000000..cebea9de9
--- /dev/null
+++ b/packages/docs/php-docs/pattern-states.md
@@ -0,0 +1,45 @@
+---
+title: Using Pattern States
+tags:
+ - docs
+---
+
+Pattern states provide your team and client a simple visual of the current state of patterns in Pattern Lab. Pattern states can track progress of a pattern from development, through client review, to completion or they can be used to give certain patterns specific classes. It's important to note that the state of a pattern can be influenced by its pattern partials.
+
+## The Default Pattern States
+
+Pattern Lab comes with the following default pattern states:
+
+- **inprogress**: pattern is in development or being worked upon. a red dot.
+- **inreview**: pattern is ready for a client to look at and comment upon. a yellow dot.
+- **complete**: pattern is ready to be moved to production. a green dot.
+
+Any pattern that includes a pattern partial that has a lower pattern state will inherit that state. For example, a pattern with the state of `inreview` that includes a pattern partial with the state of `inprogress` will have its state overridden and set to `inprogress`. It will not change to `inreview` until the pattern partial has a state of `inreview` or `complete`.
+
+## Giving Patterns a State
+
+Giving patterns a state is simply a matter of modifying the file name. If we wanted to give our `molecules-media-block` pattern a state of `inprogress` we'd change the file name from:
+
+```
+./source/_patterns/01-molecules/02-blocks/00-media-block.mustache
+```
+
+to:
+
+```
+./source/_patterns/01-molecules/02-blocks/00-media-block@inprogress.mustache
+```
+
+## Adding Customized States
+
+The three default states included with Pattern Lab might not be enough for everyone. To add customized states you should modify your own CSS files. **DO NOT** modify `states.css` in `public/styleguide/css/`. This is because `states.css` will be overwritten in future upgrades.
+
+You can use the following as your CSS template for new pattern states:
+
+```css
+{% raw %}.newpatternstate:before {
+ color: #B10DC9 !important;
+}{% endraw %}
+```
+
+Then add `@newpatternstate` to your patterns to have the new look show up. If you want to add it to the cascade of the default patterns you can modify `./config/config.yml`. Simply add your new pattern state to the `patternStates` list.
diff --git a/packages/docs/php-docs/requirements.md b/packages/docs/php-docs/requirements.md
new file mode 100644
index 000000000..7a741bb60
--- /dev/null
+++ b/packages/docs/php-docs/requirements.md
@@ -0,0 +1,22 @@
+---
+title: Requirements
+tags:
+ - docs
+---
+
+
+
+The requirements for Pattern Lab 2 vary depending on what features you want to use.
+
+## Minimum Requirements
+
+To use the basic features of Pattern Lab to compile patterns, you must have **PHP 5.4+** installed. On Mac OS X Pattern Lab should work "out of the box." If you're on Windows you can [download PHP from PHP.net](http://windows.php.net/download/). Pattern Lab comes with its own built-in web server.
+
+Because Pattern Lab's output consists of HTML, CSS, and JavaScript there are **no requirements** for hosting your Pattern Lab site. Simply upload the `./public/` directory to your host and you should be good to go.
+
+## Highly Recommended: Composer
+
+Pattern Lab uses [Composer](https://getcomposer.org/) to manage project dependencies. While Pattern Lab can be downloaded as a Zip we highly recommend installing Composer so you can easily update your project in the future. Please follow the directions for [installing Composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx) on the Composer website. We recommend you [install it globally](https://getcomposer.org/doc/00-intro.md#globally).
+
+
+
diff --git a/packages/docs/php-docs/upgrading.md b/packages/docs/php-docs/upgrading.md
new file mode 100644
index 000000000..8daf7ab1d
--- /dev/null
+++ b/packages/docs/php-docs/upgrading.md
@@ -0,0 +1,52 @@
+---
+title: Upgrading Pattern Lab
+tags:
+ - docs
+---
+
+
+
+Pattern Lab 2 uses [Composer](https://getcomposer.org) to manage project dependencies. To upgrade an edition based on Pattern Lab 2 do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `composer update`
+
+During the upgrade process Pattern Lab 2 will move or add any files that are required for the new version to work. It will also update your configuration as appropriate. If you don't have Composer installed please [follow the directions for installing Composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx) that are available on the Composer website. We recommend you [install it globally](https://getcomposer.org/doc/00-intro.md#globally).
+
+## Upgrading Pattern Lab 1 to Pattern Lab 2
+
+Pattern Lab 2 was a complete rewrite and reorganization of Pattern Lab 1. [Learn about the changes](/docs/changes-1-to-2.html). To upgrade do the following:
+
+1. [Download](http://patternlab.io/download.html) the PHP edition that matches your needs
+
+If you chose a Mustache-based edition do the following:
+
+1. Copy `./source` from your old project to your new edition
+2. Copy `./source/_patterns/00-atoms/00-meta/_00-head.mustache` to `./source/_meta/_00-head.mustache`
+3. Copy `./source/_patterns/00-atoms/00-meta/_01-foot.mustache` to `./source/_meta/_00-foot.mustache` (you can then delete `source/_patterns/00-atoms/00-meta/` directory)
+4. In `./source/_meta/_00-head.mustache`, replace `{% raw %}{% pattern-lab-head %}{% endraw %}` with `{% raw %}{{{ patternLabHead }}}{% endraw %}`
+5. In `./source/_meta/_00-foot.mustache` replace `{% raw %}{% pattern-lab-foot %}{% endraw %}` with `{% raw %}{{{ patternLabFoot }}}{% endraw %}`
+6. Copy `./source/_data/annotations.js` to `./source/_annotations/annotations.js`
+7. Remove the underscore in front of the JSON files in `source/data` (i.e. `data.json` not `_data.json`).
+
+
+
+If you chose another version do the above and convert the templates as appropriate.
+
+## Learning About Upgrades
+
+New releases and upgrades are announced in Pattern Lab's [PHP room on Gitter](https://gitter.im/pattern-lab/php) and on Twitter at [@patternlabio](https://twitter.com/patternlabio).
+
+You can also determine if your version of Pattern Lab 2 can be upgraded yourself by doing the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `composer outdated`
+
+Two components of Pattern Lab 2 maintain CHANGELOGs as part of their "Releases" page on GitHub:
+
+* [pattern-lab/core](https://github.com/pattern-lab/patternlab-php-core/releases)
+* [pattern-lab/styleguidekit-assets-default](https://github.com/pattern-lab/styleguidekit-assets-default/releases)
+
+
+
+
diff --git a/packages/docs/php-docs/viewing-patterns.html b/packages/docs/php-docs/viewing-patterns.html
new file mode 100644
index 000000000..ebc7461d4
--- /dev/null
+++ b/packages/docs/php-docs/viewing-patterns.html
@@ -0,0 +1,17 @@
+---
+title: Viewing Patterns
+tags:
+ - docs
+---
+
+
+
+Pattern Lab utilizes PHP's [built-in web server](http://php.net/manual/en/features.commandline.webserver.php) to let you browse your generated patterns. To start the server do the following:
+
+1. In a terminal window navigate to the root of your project
+2. Type `php core/console --server`
+
+Your local Pattern Lab install should now be available for browsing at [http://localhost:8080](http://localhost:8080).
+
+
+
diff --git a/packages/docs/rollup.config.js b/packages/docs/rollup.config.js
new file mode 100644
index 000000000..7f62e07f4
--- /dev/null
+++ b/packages/docs/rollup.config.js
@@ -0,0 +1,19 @@
+const builtins = require('@erquhart/rollup-plugin-node-builtins');
+const commonjs = require('rollup-plugin-commonjs');
+const nodeResolve = require('rollup-plugin-node-resolve');
+const json = require('rollup-plugin-json');
+
+export default {
+ input: 'src/admin/util',
+ output: {
+ file: 'dist/admin/util.js',
+ format: 'iife',
+ name: 'previewUtil',
+ },
+ plugins: [
+ builtins(),
+ nodeResolve(),
+ commonjs(),
+ json(),
+ ]
+};
diff --git a/packages/docs/src/404.md b/packages/docs/src/404.md
new file mode 100644
index 000000000..eccd5a45c
--- /dev/null
+++ b/packages/docs/src/404.md
@@ -0,0 +1,17 @@
+---
+title: '404 - not found'
+layout: layouts/page.njk
+permalink: 404.html
+eleventyExcludeFromCollections: true
+---
+
+We’re sorry, but that content can’t be found. Please go [back to home](/).
+
+{% comment %}
+Read more: https://www.11ty.io/docs/quicktips/not-found/
+
+This will work for both GitHub pages and Netlify:
+
+- https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
+- https://www.netlify.com/docs/redirects/#custom-404
+ {% endcomment %}
diff --git a/packages/docs/src/_data/global.js b/packages/docs/src/_data/global.js
new file mode 100644
index 000000000..683a0a332
--- /dev/null
+++ b/packages/docs/src/_data/global.js
@@ -0,0 +1,9 @@
+module.exports = {
+ random() {
+ const segment = () => {
+ return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
+ };
+ return `${segment()}-${segment()}-${segment()}`;
+ },
+ now: Date.now()
+};
diff --git a/packages/docs/src/_data/helpers.js b/packages/docs/src/_data/helpers.js
new file mode 100644
index 000000000..9ae9b7883
--- /dev/null
+++ b/packages/docs/src/_data/helpers.js
@@ -0,0 +1,10 @@
+module.exports = {
+ getNextHeadingLevel(currentLevel) {
+ return parseInt(currentLevel, 10) + 1;
+ },
+ getReadingTime(text) {
+ const wordsPerMinute = 200;
+ const numberOfWords = text.split(/\s/g).length;
+ return Math.ceil(numberOfWords / wordsPerMinute);
+ }
+};
diff --git a/packages/docs/src/_data/navigation.json b/packages/docs/src/_data/navigation.json
new file mode 100644
index 000000000..8838d1f0b
--- /dev/null
+++ b/packages/docs/src/_data/navigation.json
@@ -0,0 +1,66 @@
+{
+ "items": [
+ {
+ "label": "Getting Started",
+ "url": "/docs/installing-pattern-lab/"
+ },
+ {
+ "label": "Documentation",
+ "url": "/docs/",
+ "subnavIsClosed": true,
+ "subnav": [
+ {
+ "label": "Getting Started",
+ "category": "getting-started"
+ },
+ {
+ "label": "Working with Patterns",
+ "category": "patterns"
+ },
+ {
+ "label": "Working with Data",
+ "category": "data"
+ },
+ {
+ "label": "Advanced",
+ "category": "advanced"
+ }
+ ]
+ },
+ {
+ "label": "Demos",
+ "url": "/demos/"
+ },
+ {
+ "label": "Support",
+ "url": "/support/"
+ },
+ {
+ "label": "Resources",
+ "url": "/resources/"
+ },
+ {
+ "label": "On Github",
+ "url": "https://github.com/pattern-lab/patternlab-node",
+ "external": true
+ }
+ ],
+ "footerNav": [
+ {
+ "label": "Resources",
+ "url": "/resources"
+ },
+ {
+ "label": "Updates",
+ "url": "/updates"
+ },
+ {
+ "label": "Demos",
+ "url": "/demos"
+ },
+ {
+ "label": "On Github",
+ "url": "https://github.com/pattern-lab/patternlab-node"
+ }
+ ]
+}
diff --git a/packages/docs/src/_data/site.json b/packages/docs/src/_data/site.json
new file mode 100644
index 000000000..8a5e4ce23
--- /dev/null
+++ b/packages/docs/src/_data/site.json
@@ -0,0 +1,13 @@
+{
+ "showThemeCredit": true,
+ "name": "Pattern Lab",
+ "shortDesc": "Pattern Lab is a frontend workshop environment that helps you build, view, test, and showcase your design system's UI components.",
+ "url": "https://patternlab.io/",
+ "authorEmail": "brad@bradfrost.com",
+ "authorHandle": "@bradfrost",
+ "authorName": "Brad Frost",
+ "enableThirdPartyComments": false,
+ "maxPostsPerPage": 5,
+ "paymentPointer": "$coil.xrptipbot.com/c1f8f05d-8d8c-4f37-b1ad-25677ae129da",
+ "faviconPath": "/images/favicon.ico"
+}
diff --git a/packages/docs/src/_data/styleguide.js b/packages/docs/src/_data/styleguide.js
new file mode 100644
index 000000000..4969bec39
--- /dev/null
+++ b/packages/docs/src/_data/styleguide.js
@@ -0,0 +1,28 @@
+const tokens = require('./tokens.json');
+
+module.exports = {
+ colors() {
+ let response = [];
+
+ Object.keys(tokens.colors).forEach(key => {
+ response.push({
+ value: tokens.colors[key],
+ key
+ });
+ });
+
+ return response;
+ },
+ sizes() {
+ let response = [];
+
+ Object.keys(tokens['size-scale']).forEach(key => {
+ response.push({
+ value: tokens['size-scale'][key],
+ key
+ });
+ });
+
+ return response;
+ }
+};
diff --git a/packages/docs/src/_data/tokens.json b/packages/docs/src/_data/tokens.json
new file mode 100644
index 000000000..b5bf4b3ae
--- /dev/null
+++ b/packages/docs/src/_data/tokens.json
@@ -0,0 +1,26 @@
+{
+ "size-scale": {
+ "base": "1rem",
+ "300": "0.8rem",
+ "500": "1.25rem",
+ "600": "1.56rem",
+ "700": "1.95rem",
+ "800": "2.44rem",
+ "900": "3.05rem",
+ "max": "4rem"
+ },
+ "colors": {
+ "primary": "#173854",
+ "primary-shade": "#102538",
+ "primary-glare": "#22547c",
+ "highlight": "#fedb8b",
+ "light": "#ffffff",
+ "mid": "#cccccc",
+ "dark": "#333333",
+ "slate": "#404040"
+ },
+ "fonts": {
+ "base": "\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'\"",
+ "serif": "\"'Lora', serif\""
+ }
+}
diff --git a/packages/docs/src/_includes/components/footer-nav.njk b/packages/docs/src/_includes/components/footer-nav.njk
new file mode 100644
index 000000000..54a448266
--- /dev/null
+++ b/packages/docs/src/_includes/components/footer-nav.njk
@@ -0,0 +1,10 @@
+
diff --git a/packages/docs/src/_includes/components/footer.njk b/packages/docs/src/_includes/components/footer.njk
new file mode 100644
index 000000000..7764312d2
--- /dev/null
+++ b/packages/docs/src/_includes/components/footer.njk
@@ -0,0 +1,10 @@
+
diff --git a/packages/docs/src/_includes/components/header.njk b/packages/docs/src/_includes/components/header.njk
new file mode 100644
index 000000000..5e9ebd5de
--- /dev/null
+++ b/packages/docs/src/_includes/components/header.njk
@@ -0,0 +1,21 @@
+
+
+
diff --git a/packages/docs/src/_includes/components/hero.njk b/packages/docs/src/_includes/components/hero.njk
new file mode 100644
index 000000000..7053c247c
--- /dev/null
+++ b/packages/docs/src/_includes/components/hero.njk
@@ -0,0 +1,16 @@
+
+
+
+
Create atomic design systems with Pattern Lab
+
+
+ Pattern Lab is a frontend workshop environment that helps you build, view, test, and showcase your design system's UI components.
+
+
+
+ Run the following command in your terminal and read the installation guide to get started:
+
+
npm create pattern-lab
+
+
+
\ No newline at end of file
diff --git a/packages/docs/src/_includes/components/icon-chevron-down.njk b/packages/docs/src/_includes/components/icon-chevron-down.njk
new file mode 100644
index 000000000..37c8e757a
--- /dev/null
+++ b/packages/docs/src/_includes/components/icon-chevron-down.njk
@@ -0,0 +1,4 @@
+
+cheveron-down
+
+
\ No newline at end of file
diff --git a/packages/docs/src/_includes/components/logo.njk b/packages/docs/src/_includes/components/logo.njk
new file mode 100644
index 000000000..b8b528064
--- /dev/null
+++ b/packages/docs/src/_includes/components/logo.njk
@@ -0,0 +1,11 @@
+
+
+
diff --git a/packages/docs/src/_includes/components/meta-info.njk b/packages/docs/src/_includes/components/meta-info.njk
new file mode 100644
index 000000000..c7d6a3aa0
--- /dev/null
+++ b/packages/docs/src/_includes/components/meta-info.njk
@@ -0,0 +1,41 @@
+{% set pageTitle = title + ' - ' + site.name %}
+{% set pageDesc = '' %}
+{% set siteTitle = site.name %}
+{% set currentUrl = site.url + page.url %}
+
+{% if metaTitle %}
+ {% set pageTitle = metaTitle %}
+{% endif %}
+
+{% if metaDesc %}
+ {% set pageDesc = metaDesc %}
+{% endif %}
+
+{{ pageTitle }}
+
+
+
+
+
+
+
+{% if site.authorHandle %}
+
+{% endif %}
+
+{% if metaDesc %}
+
+
+
+{% endif %}
+
+{% if socialImage %}
+
+
+
+
+{% endif %}
+
+{% if site.paymentPointer %}
+
+{% endif %}
diff --git a/packages/docs/src/_includes/components/page-header.njk b/packages/docs/src/_includes/components/page-header.njk
new file mode 100644
index 000000000..8fbae6236
--- /dev/null
+++ b/packages/docs/src/_includes/components/page-header.njk
@@ -0,0 +1,13 @@
+
diff --git a/packages/docs/src/_includes/components/stacked-block.njk b/packages/docs/src/_includes/components/stacked-block.njk
new file mode 100644
index 000000000..24c79fb1f
--- /dev/null
+++ b/packages/docs/src/_includes/components/stacked-block.njk
@@ -0,0 +1,6 @@
+
+
+ {{ title }}
+
+
{{ description }}
+
\ No newline at end of file
diff --git a/packages/docs/src/_includes/components/tile.njk b/packages/docs/src/_includes/components/tile.njk
new file mode 100644
index 000000000..a2aeb04cf
--- /dev/null
+++ b/packages/docs/src/_includes/components/tile.njk
@@ -0,0 +1,9 @@
+
+
+
+
{{ description | safe }}
+
+
+
\ No newline at end of file
diff --git a/packages/docs/src/_includes/components/tree-nav.njk b/packages/docs/src/_includes/components/tree-nav.njk
new file mode 100644
index 000000000..83492e7f0
--- /dev/null
+++ b/packages/docs/src/_includes/components/tree-nav.njk
@@ -0,0 +1,33 @@
+
+
+
+
+ {% for item in navigation.items %}
+
+ {% if item.subnav %}
+
+ {{ item.label }}
+ {% set className = "c-tree-nav__icon" %}
+ {% include "components/icon-chevron-down.njk" %}
+
+
+
+ {% for subnav in item.subnav %}
+
+
+
+ {{ subnav.label }}
+
+ {% set subnavCategory = subnav.category %}
+ {% include "components/tree-subnav.njk" %}
+
+ {% endfor %}
+
+ {% else %}
+ {{ item.label }}
+ {% endif %}
+
+ {% endfor %}
+
+
+
diff --git a/packages/docs/src/_includes/components/tree-subnav.njk b/packages/docs/src/_includes/components/tree-subnav.njk
new file mode 100644
index 000000000..9265520ab
--- /dev/null
+++ b/packages/docs/src/_includes/components/tree-subnav.njk
@@ -0,0 +1,11 @@
+{% set navPages = collections.docs | eleventyNavigation %}
+
+{% for entry in navPages %}
+ {% if entry.key == subnavCategory %}
+
+ {{ entry.title }}
+
+ {% endif %}
+{% endfor %}
+
+
diff --git a/packages/docs/src/_includes/icons/arrow.svg b/packages/docs/src/_includes/icons/arrow.svg
new file mode 100644
index 000000000..153b9eed7
--- /dev/null
+++ b/packages/docs/src/_includes/icons/arrow.svg
@@ -0,0 +1,13 @@
+
+
+
diff --git a/packages/docs/src/_includes/layouts/archive.njk b/packages/docs/src/_includes/layouts/archive.njk
new file mode 100644
index 000000000..d1b328ed8
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/archive.njk
@@ -0,0 +1,17 @@
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Post Archive' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+{% set introSummary %}{{ content | safe }}{% endset %}
+
+{# Post list content #}
+{% set postListHeading = 'All posts' %}
+{% set postListItems = collections.posts %}
+
+{% block content %}
+
+ {% include "partials/components/intro.njk" %}
+ {% include "partials/components/post-list.njk" %}
+
+{% endblock %}
diff --git a/packages/docs/src/_includes/layouts/base.njk b/packages/docs/src/_includes/layouts/base.njk
new file mode 100644
index 000000000..6d21c8837
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/base.njk
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+ {% include "components/meta-info.njk" %}
+
+
+ {% block head %}
+ {% endblock %}
+
+
+
+
+
+
+
+
+ {% block content %}
+ {% endblock content %}
+
+
+ {% include "components/footer.njk" %}
+ {% block foot %}
+ {% endblock %}
+
+
+
+
+
+
diff --git a/packages/docs/src/_includes/layouts/blog.njk b/packages/docs/src/_includes/layouts/blog.njk
new file mode 100644
index 000000000..bc7b10eef
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/blog.njk
@@ -0,0 +1,17 @@
+{% extends 'layouts/base.njk' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+{% set introDescription = description %}
+
+{# Post list content #}
+{% set postListItems = collections.posts %}
+
+{% block content %}
+
+
+ {% include "components/page-header.njk" %}
+ {% include "partials/components/post-list.njk" %}
+
+
+{% endblock %}
diff --git a/packages/docs/src/_includes/layouts/demos.njk b/packages/docs/src/_includes/layouts/demos.njk
new file mode 100644
index 000000000..f16878645
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/demos.njk
@@ -0,0 +1,25 @@
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Post Archive' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+{% set introSummary %}{{ content | safe }}{% endset %}
+
+{# Post list content #}
+{% set demoListItems = collections.demos %}
+
+{% block content %}
+
+
+ {% include "components/page-header.njk" %}
+
+
+ {% set demoListCategory = 'example' %}
+ {% include "partials/components/demo-list.njk" %}
+
+
+ {% set demoListCategory = 'starterkit' %}
+ {% include "partials/components/demo-list.njk" %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/packages/docs/src/_includes/layouts/docs.njk b/packages/docs/src/_includes/layouts/docs.njk
new file mode 100644
index 000000000..e29cc063e
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/docs.njk
@@ -0,0 +1,28 @@
+---
+permalink: docs/{{ title | slug }}/
+---
+
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Docs' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+{% set introSummary %}
+
+{% endset %}
+
+{% block content %}
+
+
+
+ {% include "components/page-header.njk" %}
+
+ {{ content | safe }}
+
+
+
+
+
+{% endblock %}
+
+{{ content | safe }}
diff --git a/packages/docs/src/_includes/layouts/home.njk b/packages/docs/src/_includes/layouts/home.njk
new file mode 100644
index 000000000..1172fcd55
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/home.njk
@@ -0,0 +1,93 @@
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Homepage' %}
+
+{% block content %}
+
+ {% include "components/hero.njk" %}
+
+
+
+
+ {% set styleModifier = 'c-tile--green' %}
+ {% set title = 'Read the docs' %}
+ {% set link = '/docs/installing-pattern-lab' %}
+ {% set description = "Learn how to get up and running with Pattern Lab, work with patterns, design with dynamic data, and use Pattern Lab's advanced features." %}
+ {% include "components/tile.njk" %}
+
+
+ {% set styleModifier = 'c-tile--orange' %}
+ {% set title = 'Demos' %}
+ {% set link = '/demos' %}
+ {% set description = "Demos of pattern starterkits for your project as well as a gallery of Pattern Lab projects in the wild" %}
+ {% include "components/tile.njk" %}
+
+
+ {% set styleModifier = 'c-tile--purple' %}
+ {% set title = 'Resources' %}
+ {% set link = '/resources' %}
+ {% set description = "Links to articles and resources around Pattern Lab and design systems" %}
+ {% include "components/tile.njk" %}
+
+
+
+
+
+
Pattern Lab features
+
At its core, Pattern Lab is a Node-powered static site generator that stitches together UI components. But there's a whole lot more to it than that!
+
+
+ {% set title="Nested Patterns" %}
+ {% set description="Include UI patterns inside each other like Russian nesting dolls. Make a change to a pattern and immediately see those changes reflected anywhere it is included." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Design With Dynamic Data" %}
+ {% set description="Create living UI prototypes using dynamic data to ensure your components can handle the dynamic nature of your content." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Tool Agnostic" %}
+ {% set description="Pattern Lab doesn't impose any tools or libraries on you, which means you have full control over how author your project." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Language Agnostic" %}
+ {% set description="Use atomic design language, or don't! it's totally up to you how you name, structure, and organize your Pattern Lab project." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Pattern Documentation" %}
+ {% set description="Define and describe your UI patterns so your entire team can start speaking the same language to collaborate more effectively." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Viewport Resizer Tools" %}
+ {% set description="Pattern Lab includes viewport resizing tools to ensure your design system's components and pages are fully responsive." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Pattern Lineage" %}
+ {% set description="X-ray vision! Quickly view where patterns where components are used, speeding up design, development, and QA time." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Pattern Starter Kits" %}
+ {% set description="Start your Pattern Lab project with a blank slate, a few sample components, or a full-on demo project." %}
+ {% include "components/stacked-block.njk" %}
+
+
+ {% set title="Flexible and Extensible" %}
+ {% set description="Pattern Lab supports Handlebars and Twig templating engines. Also you can or build a plugin to extend Pattern Lab's capabilities even further." %}
+ {% include "components/stacked-block.njk" %}
+
+
+
+ {% set styleModifier = 'c-tile--orange' %}
+ {% set title = 'Open source and community driven' %}
+ {% set link = '/support' %}
+ {% set description = "Pattern Lab is (and will always be) an open source project. Check out the project on
GitHub and join the
Pattern Lab Gitter community for conversation and support." %}
+ {% include "components/tile.njk" %}
+
+
+
+{% endblock %}
diff --git a/packages/docs/src/_includes/layouts/page-base.njk b/packages/docs/src/_includes/layouts/page-base.njk
new file mode 100644
index 000000000..4a921e27f
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/page-base.njk
@@ -0,0 +1,24 @@
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Resources' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+{% set introSummary %}
+
+{% endset %}
+
+{% block content %}
+
+
+
+ {% include "components/page-header.njk" %}
+
+ {{ content | safe }}
+
+
+
+
+
+{% endblock %}
+
+{{ content | safe }}
diff --git a/packages/docs/src/_includes/layouts/page.njk b/packages/docs/src/_includes/layouts/page.njk
new file mode 100644
index 000000000..0714fa10c
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/page.njk
@@ -0,0 +1,19 @@
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Page' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+
+{% block content %}
+
+
+
+ {% include "components/page-header.njk" %}
+ {{ content | safe }}
+
+
+
+
+{% endblock %}
+
+{{ content | safe }}
diff --git a/packages/docs/src/_includes/layouts/post.njk b/packages/docs/src/_includes/layouts/post.njk
new file mode 100644
index 000000000..6a4702769
--- /dev/null
+++ b/packages/docs/src/_includes/layouts/post.njk
@@ -0,0 +1,25 @@
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Post' %}
+
+{# Intro content #}
+{% if date %}
+{% set introKicker = date | dateFilter %}
+{% endif %}
+{% set introHeading = title %}
+
+
+{% block content %}
+
+
+
+ {% include "components/page-header.njk" %}
+
+
+ {{ content | safe }}
+
+
+
+
+{% endblock %}
+
+{{ content | safe }}
diff --git a/packages/docs/src/_includes/partials/components/demo-list.njk b/packages/docs/src/_includes/partials/components/demo-list.njk
new file mode 100644
index 000000000..d220b7a9a
--- /dev/null
+++ b/packages/docs/src/_includes/partials/components/demo-list.njk
@@ -0,0 +1,25 @@
+{% if demoListItems.length %}
+
+
+ {% for item in demoListItems %}
+
+ {% if item.data.category == demoListCategory %}
+
+
+
+
+
+ {{ item.data.title }}
+
+
+ {{ item.data.description}}
+
+
+
+
+ {% endif %}
+
+ {% endfor %}
+
+
+{% endif %}
diff --git a/packages/docs/src/_includes/partials/components/intro.njk b/packages/docs/src/_includes/partials/components/intro.njk
new file mode 100644
index 000000000..e5cc10c13
--- /dev/null
+++ b/packages/docs/src/_includes/partials/components/intro.njk
@@ -0,0 +1,8 @@
+
diff --git a/packages/docs/src/_includes/partials/components/nav.njk b/packages/docs/src/_includes/partials/components/nav.njk
new file mode 100644
index 000000000..0b9cbcf6f
--- /dev/null
+++ b/packages/docs/src/_includes/partials/components/nav.njk
@@ -0,0 +1,22 @@
+{% if navigation.items %}
+
+
+ {% for item in navigation.items %}
+ {% set relAttribute = '' %}
+ {% set currentAttribute = '' %}
+
+ {% if item.rel %}
+ {% set relAttribute = ' rel="' + item.rel + '"' %}
+ {% endif %}
+
+ {% if page.url == item.url %}
+ {% set currentAttribute = ' aria-current="page"' %}
+ {% endif %}
+
+
+ {{ item.text }}
+
+ {% endfor %}
+
+
+{% endif %}
diff --git a/packages/docs/src/_includes/partials/components/pagination.njk b/packages/docs/src/_includes/partials/components/pagination.njk
new file mode 100644
index 000000000..d78236a2a
--- /dev/null
+++ b/packages/docs/src/_includes/partials/components/pagination.njk
@@ -0,0 +1,23 @@
+{% set paginationLinkTokens = 'leading-tight text-500 weight-mid box-inline-flex align-center pad-bottom-300' %}
+
+{% if paginationNextUrl or paginationPrevUrl %}
+
+
+
+
+{% endif %}
diff --git a/packages/docs/src/_includes/partials/components/post-list.njk b/packages/docs/src/_includes/partials/components/post-list.njk
new file mode 100644
index 000000000..7a241e2e1
--- /dev/null
+++ b/packages/docs/src/_includes/partials/components/post-list.njk
@@ -0,0 +1,22 @@
+
+{% if postListItems.length %}
+
+
+ {% for item in postListItems %}
+
+
+ {{ item.data.date | dateFilter }}
+
+
+ {{ item.data.title }}
+
+
+ {{ item.data.description}}
+
+
+
+
+ {% endfor %}
+
+
+{% endif %}
diff --git a/packages/docs/src/admin.njk b/packages/docs/src/admin.njk
new file mode 100644
index 000000000..c1c5517d1
--- /dev/null
+++ b/packages/docs/src/admin.njk
@@ -0,0 +1,22 @@
+---
+permalink: '/admin/index.html'
+---
+
+
+
+
+
+ Content Manager
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/admin/config.yml b/packages/docs/src/admin/config.yml
new file mode 100644
index 000000000..15abea8bc
--- /dev/null
+++ b/packages/docs/src/admin/config.yml
@@ -0,0 +1,243 @@
+backend:
+ name: git-gateway
+ branch: master
+publish_mode: editorial_workflow
+site_url: 'https://example.com'
+media_folder: 'src/images'
+public_folder: 'images'
+collections:
+ - name: 'pages'
+ label: 'Pages'
+ files:
+ - name: 'home'
+ label: 'Homepage'
+ delete: false
+ file: 'src/index.md'
+ slug: '{{slug}}'
+ create: false
+ fields:
+ - {
+ label: 'Layout',
+ name: 'layout',
+ widget: 'hidden',
+ default: 'layouts/njk.njk',
+ }
+ - {label: 'Title', name: 'title', widget: 'string'}
+ - {
+ label: 'SEO Meta Title',
+ name: 'metaTitle',
+ widget: 'string',
+ required: false,
+ }
+ - {
+ label: 'SEO Meta Description',
+ name: 'metaDesc',
+ widget: 'string',
+ required: false,
+ }
+ - {
+ label: 'Post Feed Heading',
+ name: 'postsHeading',
+ widget: 'string',
+ default: 'Latest posts',
+ }
+ - {
+ label: 'Archive Link Text',
+ name: 'archiveButtonText',
+ widget: 'string',
+ default: 'See all posts',
+ }
+ - {label: 'Social Image', name: 'socialImage', widget: 'image', required: false}
+ - {label: 'Body', name: 'body', widget: 'markdown'}
+ - name: 'generic_pages'
+ label: 'Generic Pages'
+ folder: 'src/pages'
+ slug: '{{slug}}'
+ preview_path: 'pages/{{slug}}'
+ create: true
+ fields:
+ - {label: 'Layout', name: 'layout', widget: 'hidden', default: 'layouts/page.njk'}
+ - {label: 'Title', name: 'title', widget: 'string'}
+ - {
+ label: "Permalink Override (Pattern: '/your-slug/index.html')",
+ name: 'permalink',
+ widget: 'string',
+ required: false,
+ }
+ - {label: 'SEO Meta Title', name: 'metaTitle', widget: 'string', required: false}
+ - {
+ label: 'SEO Meta Description',
+ name: 'metaDesc',
+ widget: 'string',
+ required: false,
+ }
+ - {label: 'Social Image', name: 'socialImage', widget: 'image', required: false}
+ - {label: 'Body', name: 'body', widget: 'markdown'}
+ - name: 'posts'
+ label: 'Posts'
+ folder: 'src/posts'
+ slug: '{{slug}}'
+ preview_path: 'posts/{{slug}}'
+ create: true
+ fields:
+ - {label: 'Layout', name: 'layout', widget: 'hidden', default: 'layouts/post.njk'}
+ - {label: 'Title', name: 'title', widget: 'string'}
+ - {label: 'SEO Meta Title', name: 'metaTitle', widget: 'string', required: false}
+ - {
+ label: 'SEO Meta Description',
+ name: 'metaDesc',
+ widget: 'string',
+ required: false,
+ }
+ - {label: 'Social Image', name: 'socialImage', widget: 'image', required: false}
+ - {label: 'Publish Date', name: 'date', widget: 'datetime'}
+ - {label: 'Tags', name: 'tags', widget: 'list', allow_add: true}
+ - {label: 'Body', name: 'body', widget: 'markdown'}
+ - name: 'docs'
+ label: 'Docs'
+ folder: 'src/docs'
+ slug: '{{slug}}'
+ preview_path: 'docs/{{slug}}'
+ create: true
+ fields:
+ - {label: 'Layout', name: 'layout', widget: 'hidden', default: 'layouts/post.njk'}
+ - {label: 'Title', name: 'title', widget: 'string'}
+ - {label: 'Publish Date', name: 'date', widget: 'datetime'}
+ - {label: 'Tags', name: 'tags', widget: 'list', allow_add: true}
+ - {label: 'Body', name: 'body', widget: 'markdown'}
+ - label: 'Globals'
+ name: 'globals'
+ files:
+ - label: 'Site Data'
+ name: 'site_data'
+ delete: false
+ file: 'src/_data/site.json'
+ fields:
+ - {label: 'Site Name', name: 'name', widget: 'string'}
+ - {label: 'Site Url', name: 'url', widget: 'string'}
+ - {label: 'Author Name', name: 'authorName', widget: 'string'}
+ - {label: 'Author Email Address', name: 'authorEmail', widget: 'string'}
+ - {
+ label: 'Author Twitter Handle',
+ name: 'authorHandle',
+ widget: 'string',
+ required: false,
+ }
+ - {label: 'Footer Short Description', name: 'shortDesc', widget: 'string'}
+ - {
+ label: 'Maximum Posts Per Page',
+ name: 'maxPostsPerPage',
+ widget: 'number',
+ default: 5,
+ }
+ - {
+ label: 'Show Theme Credit',
+ name: 'showThemeCredit',
+ widget: 'boolean',
+ default: true,
+ }
+ - {
+ label: 'Enable Third Party Comments Area',
+ name: 'enableThirdPartyComments',
+ widget: 'boolean',
+ default: false,
+ }
+ - {
+ label: 'Payment Pointer (Web Monetization: https://bit.ly/2kTRI1b)',
+ name: 'paymentPointer',
+ widget: 'string',
+ }
+ - {
+ label: 'Favicon path (EG: /images/favicon.png)',
+ name: 'faviconPath',
+ widget: 'string',
+ }
+ - label: 'Navigation'
+ name: 'nav'
+ delete: false
+ file: 'src/_data/navigation.json'
+ fields:
+ - label: 'Items'
+ name: 'items'
+ widget: 'list'
+ fields:
+ - {label: 'Text', name: 'text', widget: 'string'}
+ - {label: 'Url', name: 'url', widget: 'string'}
+ - {
+ label: 'Is url to external site?',
+ name: 'external',
+ widget: 'boolean',
+ required: false,
+ }
+ - label: 'Theme Settings'
+ name: 'theme'
+ delete: false
+ file: 'src/_data/tokens.json'
+ fields:
+ - label: 'Size Scale'
+ name: 'size-scale'
+ widget: 'object'
+ fields:
+ - {label: 'Base Size', name: 'base', widget: 'string', default: '1rem'}
+ - {label: 'Ratio: 300', name: '300', widget: 'string', default: '0.8rem'}
+ - {label: 'Ratio: 500', name: '500', widget: 'string', default: '1.25rem'}
+ - {label: 'Ratio: 600', name: '600', widget: 'string', default: '1.56rem'}
+ - {label: 'Ratio: 700', name: '700', widget: 'string', default: '1.95rem'}
+ - {label: 'Ratio: 800', name: '800', widget: 'string', default: '2.44rem'}
+ - {label: 'Ratio: 900', name: '900', widget: 'string', default: '3.05rem'}
+ - {label: 'Max Size', name: 'max', widget: 'string', default: '4rem'}
+ - label: 'Colors'
+ name: 'colors'
+ widget: 'object'
+ fields:
+ - {
+ label: 'Primary',
+ name: 'primary',
+ widget: 'string',
+ default: 'hsl(208, 57%, 21%)',
+ }
+ - {
+ label: 'Primary Shade (darker)',
+ name: 'primary-shade',
+ widget: 'string',
+ default: 'hsl(208, 56%, 14%)',
+ }
+ - {
+ label: 'Primary Glare (lighter)',
+ name: 'primary-glare',
+ widget: 'string',
+ default: 'hsl(207, 57%, 31%)',
+ }
+ - {
+ label: 'Highlight',
+ name: 'highlight',
+ widget: 'string',
+ default: 'hsl(42, 98%, 77%)',
+ }
+ - {
+ label: 'Light',
+ name: 'light',
+ widget: 'string',
+ default: 'hsl(0, 0%, 100%)',
+ }
+ - {label: 'Mid', name: 'mid', widget: 'string', default: 'hsl(0, 0%, 80%)'}
+ - {
+ label: 'Dark',
+ name: 'dark',
+ widget: 'string',
+ default: 'hsl(0, 0%, 20%)',
+ }
+ - {
+ label: 'Slate',
+ name: 'slate',
+ widget: 'string',
+ default: 'hsl(0, 0%, 25%)',
+ }
+ - label: 'Fonts'
+ name: 'fonts'
+ widget: 'hidden'
+ default:
+ {
+ 'base': '"-apple-system, BlinkMacSystemFont, ''Segoe UI'', Roboto, Helvetica, Arial, sans-serif, ''Apple Color Emoji'', ''Segoe UI Emoji'', ''Segoe UI Symbol''"',
+ 'serif': '"''Lora'', serif"',
+ }
diff --git a/packages/docs/src/admin/previews.js b/packages/docs/src/admin/previews.js
new file mode 100644
index 000000000..82dcd1f2c
--- /dev/null
+++ b/packages/docs/src/admin/previews.js
@@ -0,0 +1,92 @@
+const {w3DateFilter, markdownFilter, dateFilter, helpers} = previewUtil;
+
+const env = nunjucks.configure();
+
+env.addFilter('w3DateFilter', w3DateFilter);
+env.addFilter('markdownFilter', markdownFilter);
+env.addFilter('dateFilter', dateFilter);
+
+const Preview = ({entry, path, context}) => {
+ const data = context(entry.get('data').toJS());
+ const html = env.render(path, {...data, helpers});
+ return
;
+};
+
+const Home = ({entry}) => (
+ ({
+ title,
+ content: markdownFilter(body),
+ postsHeading,
+ archiveButtonText,
+ collections: {
+ postFeed: [
+ {
+ url: 'javascript:void(0)',
+ date: new Date(),
+ data: {
+ title: 'Sample Post'
+ }
+ }
+ ]
+ }
+ })}
+ />
+);
+
+const Post = ({entry}) => (
+ ({
+ title,
+ date,
+ content: markdownFilter(body || '')
+ })}
+ />
+);
+
+const Page = ({entry}) => (
+ ({
+ title,
+ content: markdownFilter(body || '')
+ })}
+ />
+);
+
+const SiteData = ({entry}) => (
+ ({
+ site: {
+ name,
+ shortDesc,
+ showThemeCredit
+ }
+ })}
+ />
+);
+
+const Nav = ({entry}) => (
+ ({
+ navigation: {
+ items
+ }
+ })}
+ />
+);
+
+CMS.registerPreviewTemplate('home', Home);
+CMS.registerPreviewTemplate('posts', Post);
+CMS.registerPreviewTemplate('generic_pages', Page);
+CMS.registerPreviewTemplate('site_data', SiteData);
+CMS.registerPreviewTemplate('nav', Nav);
diff --git a/packages/docs/src/admin/util.js b/packages/docs/src/admin/util.js
new file mode 100644
index 000000000..302b159cf
--- /dev/null
+++ b/packages/docs/src/admin/util.js
@@ -0,0 +1,11 @@
+import helpers from '../_data/helpers';
+import dateFilter from '../filters/date-filter';
+import markdownFilter from '../filters/markdown-filter';
+import w3DateFilter from '../filters/w3-date-filter';
+
+export {
+ helpers,
+ dateFilter,
+ markdownFilter,
+ w3DateFilter,
+};
diff --git a/packages/docs/src/archive.md b/packages/docs/src/archive.md
new file mode 100644
index 000000000..76533c10f
--- /dev/null
+++ b/packages/docs/src/archive.md
@@ -0,0 +1,4 @@
+---
+title: 'Posts Archive'
+layout: 'layouts/archive.njk'
+---
diff --git a/packages/docs/src/demos.md b/packages/docs/src/demos.md
new file mode 100644
index 000000000..441563fc1
--- /dev/null
+++ b/packages/docs/src/demos.md
@@ -0,0 +1,13 @@
+---
+layout: layouts/demos.njk
+title: Pattern Lab Demos
+category: getting-started
+---
+
+
+
+Here’s a list of Pattern Lab’s UI starterkits that you can use to kickstart your UI design system project, as well as a list of Pattern Labs from around the web.
+
+
+
+
diff --git a/packages/docs/src/demos/bolt-design-systems.md b/packages/docs/src/demos/bolt-design-systems.md
new file mode 100644
index 000000000..54d091aa6
--- /dev/null
+++ b/packages/docs/src/demos/bolt-design-systems.md
@@ -0,0 +1,11 @@
+---
+title: Bolt Design System
+description: The Bolt Design System provides robust Twig and Web Component-powered UI components, reusable visual styles, and powerful tooling to help developers, designers, and content authors build, maintain, and scale best of class digital experiences.
+url: https://boltdesignsystem.com/
+category: example
+tags:
+ - demo-in-the-wild
+ - demo-content
+ - code
+image: /images/800x600.png
+---
diff --git a/packages/docs/src/demos/brad-frosts-website-pl.md b/packages/docs/src/demos/brad-frosts-website-pl.md
new file mode 100644
index 000000000..41bbe38c1
--- /dev/null
+++ b/packages/docs/src/demos/brad-frosts-website-pl.md
@@ -0,0 +1,11 @@
+---
+title: Brad Frost’s website PL
+description: Pattern Lab helps you and your team build thoughtful, pattern-driven user interfaces using atomic design principles.
+url: https://bradfrostdotcom-pl.netlify.com/
+category: example
+tags:
+ - demo-in-the-wild
+ - demo-content
+ - code
+image: /images/800x600.png
+---
diff --git a/packages/docs/src/demos/handlebars-base-starterkit.md b/packages/docs/src/demos/handlebars-base-starterkit.md
new file mode 100644
index 000000000..44ea634e4
--- /dev/null
+++ b/packages/docs/src/demos/handlebars-base-starterkit.md
@@ -0,0 +1,11 @@
+---
+title: Handlebars Base Starter Kit
+description: The StarterKit for Handlebars is meant to be used as a demonstration of a Handlebars-based project in Pattern Lab.
+url: https://patternlab-handlebars-preview.netlify.com/?p=all
+category: starterkit
+tags:
+ - demo-hbs-starter-kits
+ - demo-content
+ - code
+image: /images/800x600.png
+---
diff --git a/packages/docs/src/demos/handlebars-demo-starterkit.md b/packages/docs/src/demos/handlebars-demo-starterkit.md
new file mode 100644
index 000000000..28387c606
--- /dev/null
+++ b/packages/docs/src/demos/handlebars-demo-starterkit.md
@@ -0,0 +1,11 @@
+---
+title: Handlebars Demo Starter Kit
+description: The Demo StarterKit for Handlebars is meant to be used as a demonstration of a Handlebars-based project in Pattern Lab.
+url: https://www.npmjs.com/package/@pattern-lab/starterkit-handlebars-demo
+category: starterkit
+tags:
+ - demo-hbs-starter-kits
+ - demo-content
+ - code
+image: /images/800x600.png
+---
diff --git a/packages/docs/src/demos/handlebars-vanilla-starterkit.md b/packages/docs/src/demos/handlebars-vanilla-starterkit.md
new file mode 100644
index 000000000..4f7485a52
--- /dev/null
+++ b/packages/docs/src/demos/handlebars-vanilla-starterkit.md
@@ -0,0 +1,11 @@
+---
+title: Handlebars Vanilla Starter Kit
+description: The Vanilla StarterKit for Handlebars is meant to be used as a demonstration of a Handlebars-based project in Pattern Lab.
+url: https://www.npmjs.com/package/@pattern-lab/starterkit-handlebars-vanilla
+category: starterkit
+tags:
+ - demo-hbs-starter-kits
+ - demo-content
+ - code
+image: /images/800x600.png
+---
diff --git a/packages/docs/src/demos/pattern-lab-two-mustache-demo.md b/packages/docs/src/demos/pattern-lab-two-mustache-demo.md
new file mode 100644
index 000000000..56fda1e32
--- /dev/null
+++ b/packages/docs/src/demos/pattern-lab-two-mustache-demo.md
@@ -0,0 +1,11 @@
+---
+title: Pattern Lab 2 Mustache Demo
+description: Pattern Lab 1 projects should work with minimal changes in Pattern Lab 2.
+url: http://demo.patternlab.io/
+category: starterkit
+tags:
+ - demo-PL2
+ - demo-content
+ - code
+image: /images/800x600.png
+---
diff --git a/packages/docs/src/demos/twig-base.md b/packages/docs/src/demos/twig-base.md
new file mode 100644
index 000000000..0da6259b6
--- /dev/null
+++ b/packages/docs/src/demos/twig-base.md
@@ -0,0 +1,13 @@
+---
+title: Twig Base
+description: The Base StarterKit for Twig is meant to be used as a near-blank starting point for Twig-based projects in Pattern Lab.
+url: https://github.com/pattern-lab/starterkit-twig-base
+category: starterkit
+tags:
+ - demo-twig
+ - demo-content
+ - code
+image: /images/800x600.png
+---
+
+loremi
diff --git a/packages/docs/src/docs/a-post-with-code-samples.md b/packages/docs/src/docs/a-post-with-code-samples.md
new file mode 100644
index 000000000..d5c83f6c7
--- /dev/null
+++ b/packages/docs/src/docs/a-post-with-code-samples.md
@@ -0,0 +1,67 @@
+---
+title: DOCS DOCS DOCS
+tags:
+ - demo-content
+ - code
+ - blog
+eleventyNavigation:
+ key: DOCS DOCS DOCS
+ order: 300
+---
+
+The best way to demo a code post is to display a real life post, so check out this one from [andy-bell.design](https://andy-bell.design/wrote/creating-a-full-bleed-css-utility/) about a full bleed CSS utility.
+
+---
+
+Sometimes you want to break your components out of the constraints that they find themselves in. A common situation where this occurs is when you don’t have much control of the container that it exists in, such as a CMS main content area.
+
+This is even more the case with editing tools such as the [WordPress Gutenberg editor](https://wordpress.org/gutenberg/), where in theory, you could pull in a component from a design system and utilise it in the main content of your web page. In these situations, it can be pretty darn handy to have a little utility that makes the element 100% of the viewport’s width _and_ still maintain its flow within its parent container.
+
+This is when I normally pull the `.full-bleed` utility class out of my back pocket.
+
+## The `.full-bleed` utility
+
+It’s small, but hella mighty:
+
+```css
+.full-bleed {
+ width: 100vw;
+ margin-left: 50%;
+ transform: translateX(-50%);
+}
+```
+
+Here it is in a context where it makes a fancy `` and a `` element bleed out of their parent container.
+
+
+
+The `.full-bleed` utility gives those elements prominence and _importantly_ keeps their semantic place in the page. Just how I like it.
+
+---
+
+🔥 **Pro tip**: When working with a utility like `.full-bleed`, it’s a good idea to add an inner container that has a max-width and auto horizontal margin. For this, I normal create a shared `.wrapper` component like this:
+
+```css
+.wrapper {
+ max-width: 50rem;
+ margin-left: auto;
+ margin-right: auto;
+}
+```
+
+Having a container like `.wrapper` helps to create consistent, centred content.
+
+---
+
+### How the `.full-bleed` utility works
+
+We set the container to be `width: 100vw`, which equates to the full viewport width. We couldn’t set it to `width: 100%` because it would only fill the space of its parent element. The parent element’s width _is_ useful though, because by setting `margin-left: 50%`, we are telling the component to align its **left edge** to the center of its parent element, because `50%` is half of the **parent element’s** width.
+
+Finally, we use CSS transforms to `translateX(-50%)`. Because the transform works off the element’s dimensions and not the parent’s dimensions, it’ll pull the element back `50vw`, because it’s `100vw` wide, thus making it sit perfectly flush with the viewport’s edges.
+
+## Wrapping up
+
+Hopefully this short and sweet trick will help you out on your projects. If it does, [drop me a tweet](https://twitter.com/andybelldesign), because I’d love to see it!
diff --git a/packages/docs/src/docs/advanced-auto-regenerate.md b/packages/docs/src/docs/advanced-auto-regenerate.md
new file mode 100644
index 000000000..291b675d6
--- /dev/null
+++ b/packages/docs/src/docs/advanced-auto-regenerate.md
@@ -0,0 +1,44 @@
+---
+title: Watching for Changes and Auto Regenerating Patterns
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ key: Watching for Changes and Auto Regenerating Patterns
+ parent: advanced
+ order: 300
+---
+
+Pattern Lab has the ability to watch for changes to patterns and frontend assets. When these files change, it will automatically rebuild the entire Pattern Lab website. You simply make your changes, save the file, and Pattern Lab will take care of the rest.
+
+## How to Start the Watch
+
+Open your terminal and navigate to the root of your project. Type:
+
+```
+gulp patternlab:build --watch
+```
+
+> If using grunt, substitute `grunt` for `gulp` above.
+
+## How to Start the Watch and Self-Host the Pattern Lab Website
+
+Rather than manually refreshing your browser when your patterns or frontend assets change you can have Pattern Lab watch for changes and [auto-reload your browser window](/docs/viewing-patterns.html#node) for you when it’s in watch mode.
+
+## How to Stop the Watch
+
+To stop watching files on Mac OS X and Windows you can press`CTRL+C` in the command line window where the process is running.
+
+## The Default Files That Are Watched
+
+By default, Pattern Lab monitors the following files:
+
+- all of the JSON files under `source/_annotations/`
+- all of the JSON files under `source/_data/`
+- all of the files under `source/_meta/`
+- all of the pattern templates under `source/_patterns/`
+- all of the CSS files under `source/css/`
+- all of the files under `source/images/` and `source/fonts/`
+- all of the Javascript files under `source/js/`
+
+The watch configuration is found within the Gruntfile or Gulpfile at the root of the project.
diff --git a/packages/docs/src/docs/advanced-config-options.md b/packages/docs/src/docs/advanced-config-options.md
new file mode 100644
index 000000000..fcbe07f5b
--- /dev/null
+++ b/packages/docs/src/docs/advanced-config-options.md
@@ -0,0 +1,299 @@
+---
+title: Editing the Configuration Options
+tags:
+ - docs
+category: getting-started
+eleventyNavigation:
+ key: getting-started
+ title: Editing the Configuration Options
+ order: 30
+---
+
+Pattern Lab Node comes with a configuration file [(`patternlab-config.json`)](https://github.com/pattern-lab/patternlab-node/blob/master/packages/core/patternlab-config.json) that allows you to modify certain aspects of the system. The latest default values are included within. This file is shipped within [the editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node) or can be supplied from core and the command line interface. Below is a description of each configuration option and how it affects Pattern Lab Node.
+
+### cacheBust
+
+Instructs Pattern Lab to append a unique query string to Javascript and CSS assets throughout the frontend.
+
+```javascript
+"cacheBust": true
+```
+
+**default**: `true`
+
+### cleanPublic
+
+Sets whether or not to delete `public.patterns/` upon each build of Pattern Lab. When set to false, [incremental builds](https://github.com/pattern-lab/patternlab-node/wiki/Incremental-Builds) are also enabled.
+
+**default**: `true`
+
+### defaultPattern
+
+Sets a specific pattern upon launch of the styleguide. This pattern will not be available in the navigation, or in view all pages. The only way to get to it will be via a refresh. Set it using the [short-hand pattern-include syntax](/docs/including-patterns/):
+
+```javascript
+"defaultPattern": "pages-welcome",
+```
+
+A special value of `all` can also be supplied to display all patterns on load.
+
+**default**: `all`
+
+### defaultShowPatternInfo
+
+Sets whether or not you want the styleguide to load with the pattern info open or closed.
+
+**default**: `false`
+
+### ishControlsHide
+
+Sets whether or not to hide navigation options within the styleguide.
+
+**default**:
+
+```javascript
+"ishControlsHide": {
+ "s": false,
+ "m": false,
+ "l": false,
+ "full": false,
+ "random": false,
+ "disco": false,
+ "hay": true,
+ "mqs": false,
+ "find": false,
+ "views-all": false,
+ "views-annotations": false,
+ "views-code": false,
+ "views-new": false,
+ "tools-all": false,
+ "tools-docs": false
+}
+```
+
+### ishViewportRange
+
+Sets the boundaries of each of the viewport toggles, 'S'mall, 'M'edium, and 'L'arge. Clicking on one of these buttons will randomly set the ish Viewport to a value within the given range. Setting the range to the same number can effectively set an exact value. The first entry in `ishViewportRange.s` is the `ishViewportMinimum`, which is now obsolete. The second entry in `ishViewportRange.l` is the `ishViewportMaximum`, which is now also obsolete.
+
+**default**:
+
+```javascript
+"ishViewportRange": {
+ "s": [240, 500],
+ "m": [500, 800],
+ "l": [800, 2600]
+},
+```
+
+### logLevel
+
+Sets the level of verbosity for Pattern Lab Node logging.
+
+- `error` will output a message as a thrown error
+- `warning` will output all warnings plus above
+- `info` will output all info messages, plus above (intended default)
+- `debug` will output all debug messages, plus above
+- `quiet` will output ZERO logs
+
+This replaces the now obsolete `debug` flag.
+
+**default**: `info`
+
+### outputFileSuffixes
+
+Sets the naming of output pattern files. Suffixes are defined for 'rendered', 'rawTemplate', and 'markupOnly' files. This configuration is needed for some PatternEngines that use the same input and output file extensions. Most users will not have to change this.
+
+```javascript
+"outputFileSuffixes": {
+ "rendered": ".rendered",
+ "rawTemplate": "",
+ "markupOnly": ".markup-only"
+},
+```
+
+### paths
+
+Sets the configurable source and public directories for files Pattern Lab Node operates within. Build, copy, output, and server operations rely upon these paths. Some paths are relative to the current UIKit. See UIKit configuration for more info. Note the `patternlabFiles` which help create the front end styleguide. Note also the intentional repetition of the nested structure, made this way for maximum flexibility. These are unlikely to change unless you customize your environment or write custom UIKits.
+
+**default** :
+
+```javascript
+ "paths": {
+ "source": {
+ "root": "./source/",
+ "patterns": "./source/_patterns/",
+ "data": "./source/_data/",
+ "meta": "./source/_meta/",
+ "annotations": "./source/_annotations/",
+ "styleguide": "dist/",
+ "patternlabFiles": {
+ "general-header": "views/partials/general-header.mustache",
+ "general-footer": "views/partials/general-footer.mustache",
+ "patternSection": "views/partials/patternSection.mustache",
+ "patternSectionSubtype": "views/partials/patternSectionSubtype.mustache",
+ "viewall": "views/viewall.mustache"
+ },
+ "js": "./source/js",
+ "images": "./source/images",
+ "fonts": "./source/fonts",
+ "css": "./source/css"
+ },
+ "public": {
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
+ }
+ },
+```
+
+### patternExtension
+
+Sets the panel name and language for the code tab on the styleguide. Since this only accepts one value, this is a place where mixed pattern trees (different PatternEngines in the same instance of Pattern Lab) does not quite work.
+
+**default**: `mustache`
+
+### patternStateCascade
+
+See the [Pattern State Documentation](/docs/using-pattern-states/)
+
+**default**:
+
+```javascript
+"patternStateCascade": ["inprogress", "inreview", "complete"],
+```
+
+### patternExportDirectory
+
+Sets the location that any export operations should output files to. This may be a relative or absolute path.
+
+**default**: `./pattern_exports/`
+
+### patternExportPatternPartials
+
+Sets an array of patterns (using the [short-hand pattern-include syntax](/docs/including-patterns/)) to be exported after a build.
+
+For example, to export the navigation, header, and footer, one might do:
+
+```javascript
+"patternExportPatternPartials": ["molecules-primary-nav", "organisms-footer", "organisms-header"],
+```
+
+**default**: `[]`
+
+### serverOptions
+
+Sets live-server options. See the [live-server documentation](https://github.com/pattern-lab/live-server#usage-from-node) for more details.
+
+**default**:
+
+```javascript
+"serverOptions": {
+ "wait": 1000
+},
+```
+
+### starterkitSubDir
+
+[Starterkits](/docs/starterkits/) by convention house their files within the `dist/` directory. Should someone ever wish to change this, this key is available.
+
+**default**:
+
+```javascript
+"starterkitSubDir": "dist",
+```
+
+### styleGuideExcludes
+
+Sets whole pattern types to be excluded from the "All" patterns page on the styleguide. This is useful to decrease initial load of the styleguide. For example, to exlude all patterns under `templates` and `pages`, add the following:
+
+```javascript
+"styleGuideExcludes": [
+ "templates",
+ "pages"
+]
+```
+
+These template and page patterns would still be accessible via navigation.
+
+**default**: `[]`
+
+### theme
+
+Sets the theme options for the styleguide. There are three options: 'color', 'density', and 'layout'.
+
+Available values are:
+
+```javascript
+"theme" : {
+ "color" : "dark" | "light",
+ "density" : "compact" | "cozy" | "comfortable",
+ "layout" : "horizontal" | "vertical"
+}
+```
+
+See the [initial release notes](https://github.com/pattern-lab/styleguidekit-assets-default/releases/tag/v4.0.0-alpha.2) for the theme feature for example output.
+
+**default**:
+
+```javascript
+"theme" : {
+ "color" : "dark",
+ "density" : "compact",
+ "layout" : "horizontal"
+}
+```
+
+### uikits
+
+Introduced in Pattern Lab Node v3, UIKits are a new term in the Pattern Lab [Ecosystem](/docs/overview-of-pattern-lab's-ecosystem/). They are an evolution of the original Styleguidekit pattern which separated front-end templates from front-end assets like stylesheets and code. The existing `styleguidekit-assets-default` and `styleguidekit-mustache-default` have merged into `uikit-workshop`.
+
+`uikits` accepts an array of UIKit objects, shipping with the one above.
+
+- `name`: the name of the UIKit
+- `outputDir` where to output this UIKit relative to the current root. By leaving this empty we retain the existing Pattern Lab 2.X behavior, outputting to `/public`. If you had multiple UIKits, however, you would provide different values, such as:
+
+```javascript
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "workshop",
+ ...
+ },
+ {
+ "name": "uikit-storefront",
+ "outputDir": "storefront",
+ ...
+ }
+ ]
+```
+
+- `enabled`: quickly turn on or off the building of this UIKit
+- `excludedPatternStates`: tell Pattern Lab not to include patterns with these states in this UIKit's output
+- `excludedPatternTags`: tell Pattern Lab not to include patterns with these tags in this UIKit's output
+ - [currently not supported](https://github.com/pattern-lab/patternlab-node/issues/844)
+
+Important details:
+
+- the [default `paths.source` object paths](https://github.com/pattern-lab/patternlab-node/pull/840/commits/a4961bd5d696a05fb516cdd951163b0f918d5e19) within `patternlab-config.json` are now relative to the current UIKit. See the [structure of uikit-workshop](https://github.com/pattern-lab/patternlab-node/tree/master/packages/uikit-workshop) for more info
+- the [default `paths.public` object paths](https://github.com/pattern-lab/patternlab-node/pull/840/commits/812bab3659f504043e8b61b1dc1cdac71f248449) within `patternlab-config.json` are now relative to the current UIKit's `outputDir`. Absolute paths will no longer work. Someone could test putting an absolute path in a UIKit `outputDir` property and see what happens I suppose.
+- `dependencyGraph.json` has moved to the project root rather than `public/` as we should only retain one
+
+**default**:
+
+```javascript
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ]
+```
diff --git a/packages/docs/src/docs/advanced-ecosystem-overview.md b/packages/docs/src/docs/advanced-ecosystem-overview.md
new file mode 100644
index 000000000..f61744581
--- /dev/null
+++ b/packages/docs/src/docs/advanced-ecosystem-overview.md
@@ -0,0 +1,58 @@
+---
+title: Overview of Pattern Lab's Ecosystem
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ key: advanced
+ title: Overview of Pattern Lab's Ecosystem
+ order: 300
+---
+
+Pattern Lab 2 introduces the beginnings of an ecosystem that will allow teams to mix, match and extend Pattern Lab to meet their specific needs. It will also make it easier for the Pattern Lab team to push out new features. Documentation that explains how best to take advantage of the ecosystem will be released in the coming weeks.
+
+## Editions
+
+Editions let teams and agencies bundle all the things that support their unique workflows with Pattern Lab. An Edition can become the starting point for all of your projects while teams share and update functionality. The Node version of Pattern Lab uses [npm](https://www.npmjs.com/) to pull in separate components.
+
+## Components of an Edition
+
+The following is good overview of what components might make up an edition:
+
+
+
+This is by no means exhaustive and can be added to as needed. Here is a description of each component:
+
+### Pattern Lab Core
+
+Core is the guts of Pattern Lab and enables all of the other features. Because Core is standalone a team can update and stay current with the latest Pattern Lab features without disrupting the rest of their project.
+
+### StarterKits
+
+Have a trusty set of boilerplate code that you start every project with? Perhaps a common set of basic patterns, Sass mix-ins, and JavaScript libraries that are your go-to tools? A StarterKit is perfect for bundling these assets together into a boilerplate that makes sure each project starts off on the right foot.
+
+[Several starterkits](https://github.com/pattern-lab?utf8=%E2%9C%93&q=starterkit&type=&language=) already exist to kick your project off, whether you’re looking for a blank start, begin with a demo that showcases Pattern Lab’s features, or start with a popular framework like Bootstrap, Foundation, or Material Design. And you can roll your own, which can be fully version-controlled so your team’s StarterKit can evolve along with your tools.
+
+Importing a starterkit is only a few keystrokes away after installation.
+
+[Learn more about Starterkits](/docs/starterkits/)
+
+### StyleguideKits
+
+StyleguideKits are the front-end of Pattern Lab. We call this “The Viewer.” StyleguideKits allow agencies and organizations to develop custom, branded Pattern Lab UIs to show off their patterns.
+
+### PatternEngines
+
+PatternEngines are the templating engines that are responsible for parsing patterns and turning them into HTML. PatternEngines give Pattern Lab Core the flexibility to render many different types of template languages. Current PatternEngines include Mustache and Twig, with others like Handlebars and Underscore in development. And there’s no stopping you from adding another templating engine to Pattern Lab.
+
+### Plugins
+
+Plugins allow developers to extend Pattern Lab Core and other parts of the ecosystem. Pattern Lab’s architecture allows developers to modify data at different stages, add their own commands or pattern rules, or change the front-end to modify and extend Pattern Lab’s capabilities.
+
+### Other Types of Components
+
+The flexibility of the Pattern Lab ecosystem means that teams can develop tools on top of Pattern Lab that meet _their_ needs. Want to standardize and push entire data sets to teams? Want to develop with granular collections of components instead of entire StarterKits? Only want to customize the CSS for the default StyleguideKit and distribute it as part of your projects? All of this and more is possible. We feel we're just scratching the surface on what it means to develop projects and design systems with a tool like Pattern Lab
+
+## Guidance and Help
+
+If you have ideas or would like guidance before we have all of the documentation done please learn how you can [engage with the Pattern Lab community](/support/).
diff --git a/packages/docs/src/docs/advanced-exporting-patterns.md b/packages/docs/src/docs/advanced-exporting-patterns.md
new file mode 100644
index 000000000..0f5d4ff66
--- /dev/null
+++ b/packages/docs/src/docs/advanced-exporting-patterns.md
@@ -0,0 +1,21 @@
+---
+title: Exporting Patterns
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Exporting Patterns
+ key: advanced
+ order: 300
+---
+
+While the Pattern Lab website is great for design, iteration, alignment, and discussion - you may find yourself wanting to export whole pattern markup snippets into a different environment.
+
+In Pattern Lab Node, `patternlab-config.json` has two properties that work together to export completed patterns for use elsewhere. To export, provide an array of patternPartials and an output directory. Pattern Lab Node doesn't ship with any patternPartials specified for export. The default directory,`'./pattern_exports/'`, is created inside the install directory. Here is an example with three patternPartials set.
+
+```javascript
+"patternExportPatternPartials": ["molecules-primary-nav", "organisms-header", "organisms-footer"],
+"patternExportDirectory": "./pattern_exports/"
+```
+
+Couple this technique with exported CSS via tools like [grunt-contrib-copy](https://github.com/gruntjs/grunt-contrib-copy) to really make patterns portable.
diff --git a/packages/docs/src/docs/advanced-generating-css.md b/packages/docs/src/docs/advanced-generating-css.md
new file mode 100644
index 000000000..74c2c539f
--- /dev/null
+++ b/packages/docs/src/docs/advanced-generating-css.md
@@ -0,0 +1,22 @@
+---
+title: Generating CSS
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Generating CSS
+ key: advanced
+ order: 300
+---
+
+**Note:** _The [CSS Rule Saver](https://github.com/dmolsen/css-rule-saver) library and CSS generation feature was added in v0.6.0 of the PHP version of Pattern Lab._
+
+When using this feature, Pattern Lab can display only those CSS rules that affect a given pattern on the pattern detail view. This might be useful if you have a large Sass-generated CSS file or framework but only need a sub-set of styles that may affect a small piece of mark-up or pattern.
+
+## How to Generate the CSS
+
+To generate your Pattern Lab site with CSS support on Mac OS X you can do the following:
+
+1. Open `core/scripts/`
+2. Double-click `generateSiteWithCSS.command`
+3. Refresh the Pattern Lab site
diff --git a/packages/docs/src/docs/advanced-integration-with-compass.md b/packages/docs/src/docs/advanced-integration-with-compass.md
new file mode 100644
index 000000000..359a67273
--- /dev/null
+++ b/packages/docs/src/docs/advanced-integration-with-compass.md
@@ -0,0 +1,34 @@
+---
+title: Integration with Compass
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Integration with Compass
+ key: advanced
+ order: 300
+---
+
+**Note:** _These directions incomplete. They are not meant to imply that Compass is officially supported with Pattern Lab. They should be modified to fit your instance of the PHP version of Pattern Lab._
+
+Setting up Compass to work with the PHP version of Pattern Lab should be really straightforward. To set-up a Compass config that uses SCSS and _doesn't_ install any starter stylesheets do the following:
+
+1. Open Terminal on a Mac
+2. `gem install compass` (if you don't have it)
+3. `cd /source`
+4. `compass create --bare --sass-dir "css" --css-dir "css" --javascripts-dir "js" --images-dir "images"`
+
+The directories provided in step #4 are based on the default install of the PHP version of Pattern Lab and should be updated to reflect your directory structure. Also, if you need Compass to watch other directories or implement features modify step #4 as appropriate.
+
+## Workflow with Pattern Lab
+
+Compass will only recompile your SCSS. To get Pattern Lab to rebuild your entire site as well as reload the browser when your SCSS files have been updated do the following:
+
+1. Open Terminal on a Mac
+2. `cd `
+3. `compass watch source`
+4. Open a new tab in Terminal
+5. `php core/builder.php -wr`
+6. Reload your browser
+
+As you make changes to the SCSS files Compass will recompile them and, seeing the changes to `styles.css`, the PHP version of Pattern Lab will rebuild the entire site. It should also reload the Pattern Lab website.
diff --git a/packages/docs/src/docs/advanced-integration-with-grunt.md b/packages/docs/src/docs/advanced-integration-with-grunt.md
new file mode 100644
index 000000000..4b4cc2418
--- /dev/null
+++ b/packages/docs/src/docs/advanced-integration-with-grunt.md
@@ -0,0 +1,41 @@
+---
+title: Integration with Grunt/Gulp
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Integration with Grunt/Gulp
+ key: advanced
+ order: 300
+---
+
+**Note:** _These directions may be incomplete. They also require **v0.7.9** of the PHP version of Pattern Lab._
+
+Setting up Grunt to work with the PHP version of Pattern Lab should be straightforward. To do so please do the following:
+
+1. Open a terminal window
+2. Type `npm install --save-dev grunt-shell` to install [grunt-shell](https://github.com/sindresorhus/grunt-shell)
+3. Add the following to your `grunt.initConfig`. The `-p` flag ensures that Pattern Lab only generates patterns.
+
+shell: {
+ patternlab: {
+ command: "php core/builder.php -gp"
+ }
+}
+
+4. Add `grunt.loadNpmTasks('grunt-shell');` to your list of plugins.
+5. Add `'shell:patternlab'` to your list of tasks in `grunt.registerTask`.
+
+You should also be using `grunt-contrib-watch` to monitor changes to Pattern Lab's patterns and data. The Pattern Lab section for your `watch` might look like:
+
+ html: {
+ files: ['source/_patterns/**/*.mustache', 'source/_patterns/**/*.json', 'source/_data/*.json'],
+ tasks: ['shell:patternlab'],
+ options: {
+ spawn: false
+ }
+ }
+
+You might be able to use `livereload` as well but that hasn't been tested by us yet.
+
+For more information, check out [this post about using Pattern Lab with Grunt](http://bradfrost.com/blog/post/using-grunt-with-pattern-lab/).
diff --git a/packages/docs/src/docs/advanced-keyboard-shortcuts.md b/packages/docs/src/docs/advanced-keyboard-shortcuts.md
new file mode 100644
index 000000000..f338df46c
--- /dev/null
+++ b/packages/docs/src/docs/advanced-keyboard-shortcuts.md
@@ -0,0 +1,36 @@
+---
+title: Keyboard Shortcuts
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Keyboard Shortcuts
+ key: advanced
+ order: 300
+---
+
+> **Note:** This feature is currently disabled. It will be back in a future release of `styleguidekit-assets-default`.
+
+Pattern Lab comes with support for a number of special keyboard shortcuts to make using Pattern Lab easier. These are broken up by where they work or are most useful.
+
+Modifying the viewport:
+
+- **ctrl+shift+0**: set the viewport to 320px
+- **ctrl+shift+s**: set the viewport to "small"
+- **ctrl+shift+m**: set the viewport to "medium"
+- **ctrl+shift+l**: set the viewport to "large"
+- **ctrl+shift+h**: toggle Hay mode
+- **ctrl+shift+d**: toggle disco mode
+
+Modifying the views:
+
+- **ctrl+shift+a**: open/close info panels
+- **ctrl+shift+c**: open/close info panels
+- **cmd+a/ctrl+a**: select the content of the current open tab in code view
+- **ctrl+shift+u**: make the Mustache tab active
+- **ctrl+shift+y**: make the HTML tab active
+- **esc**: close the open view
+
+Other:
+
+- **ctrl+shift+f**: open/close the pattern search
diff --git a/packages/docs/src/docs/advanced-page-follow.md b/packages/docs/src/docs/advanced-page-follow.md
new file mode 100644
index 000000000..f2015e2b1
--- /dev/null
+++ b/packages/docs/src/docs/advanced-page-follow.md
@@ -0,0 +1,44 @@
+---
+title: Multi browser & Multi device Testing with Page Follow
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Multi browser & Multi device Testing with Page Follow
+ key: advanced
+ order: 300
+---
+
+The Pattern Lab's Page Follow feature gives developers the ability to have one browser control other browsers that connect to the Pattern Lab website. Pattern Lab Node utilizes [BrowserSync](http://www.browsersync.io/) to synchronize all connected browsers and devices.
+
+## How to Start and Connect to Pattern Lab with BrowserSync
+
+Running `gulp patternlab:serve` or `grunt patternlab:serve` from the command line of your working directory will start up Pattern Lab with BrowserSync. By default, BrowserSync will output four URLs of note:
+
+1. Local: [http://localhost:3000](http://localhost:3000)
+2. External: http://your.ip.address:3000
+3. UI: [http://localhost:3001](http://localhost:3001)
+4. UI External: http://your.ip.address:3001
+
+Any browsers on your machine will be able access these URLs. Browsers on other machines or devices on the same network should use the external URLs. Connecting to the Pattern Lab website will inform users they are also connected to BrowserSync.
+
+## How to Stop the Page Follow
+
+To stop watching files on Mac OS X and Windows you can press`CTRL+C` in the command line window where the process is running.
+
+## BrowserSync Capabilities
+
+It's strongly recommended to visit [BrowserSync](http://www.browsersync.io/) documentation or the BrowserSync UI at [http://localhost:3001](http://localhost:3001). From this administration interface one can perform the following:
+
+- See all connected devices and browsers
+- Open new tabbed instances of the Pattern Lab website on devices
+- Sync all connected devices
+- Reload all connected devices
+- Scroll all connected devices to the top
+- Toggle mouse click synchronization
+- Toggle scroll synchronization
+- Toggle form submission synchronization
+- Toggle form input synchronization
+- View browsing history of the connect session
+- Toggle remote debugging tools
+- Artificially throttle the network
diff --git a/packages/docs/src/docs/advanced-pattern-lab-nav.md b/packages/docs/src/docs/advanced-pattern-lab-nav.md
new file mode 100644
index 000000000..8a69cb693
--- /dev/null
+++ b/packages/docs/src/docs/advanced-pattern-lab-nav.md
@@ -0,0 +1,33 @@
+---
+title: Modifying Pattern Lab's Navigation
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Modifying Pattern Lab's Navigation
+ key: advanced
+ order: 300
+---
+
+When sharing Pattern Lab with a client it may be beneficial to turn-off certain elements in the default navigation. To turn-off navigation elements, alter the flags inside the `ishControlsHide` object within `patternlab-config.json` and then re-generate the site. The following keys are supported and will hide their respective elements if toggled on:
+
+```javascript
+"ishControlsHide": {
+ "s": false,
+ "m": false,
+ "l": false,
+ "full": false,
+ "random": false,
+ "disco": false,
+ "hay": true,
+ "find": false,
+ "views-all": false,
+ "views-annotations": false,
+ "views-code": false,
+ "views-new": false,
+ "tools-all": false,
+ "tools-docs": false
+},
+```
+
+By default all navigation elements are visible except Hay Mode.
diff --git a/packages/docs/src/docs/advanced-starterkits.md b/packages/docs/src/docs/advanced-starterkits.md
new file mode 100644
index 000000000..48ead77e6
--- /dev/null
+++ b/packages/docs/src/docs/advanced-starterkits.md
@@ -0,0 +1,58 @@
+---
+title: Starterkits
+tags:
+ - docs
+category: advanced
+eleventyNavigation:
+ title: Starterkits
+ key: advanced
+ order: 300
+---
+
+Starterkits are a potent way create or augment a Pattern Lab instance with a baseline set of patterns and assets. They are an important part of the [Pattern Lab Ecosystem](/docs/overview-of-pattern-lab's-ecosystem/) An agency or team could use it for each new client or project. [Several starterkits](https://github.com/pattern-lab?utf8=%E2%9C%93&q=starterkit&type=&language=) already exist to kick your project off, whether you’re looking for a blank start, begin with a demo that showcases Pattern Lab’s features, or start with a popular framework like Bootstrap, Foundation, or Material Design.
+
+## Structure
+
+A Starterkit's structure mirrors that of the default file structure of Pattern Lab. Usually this is found under the `dist/` directory:
+
+```
+_annotations/
+_data/
+_meta/
+_patterns/
+css/
+fonts/
+images/
+js/
+favicon.ico
+```
+
+Teams constructing their own Starterkits should stick to this structure if they wish to publish it externally, else may alter the structure to their [configured `paths`](/docs/editing-the-configuration-options/).
+
+## Installing Starterkits
+
+Open your terminal and navigate to the root of your project. Type:
+
+```
+npm install [starterkit-name]
+gulp patternlab:loadstarterkit --kit=[starterkit-name]
+```
+
+where [starterkit-name] is the name of the Starterkit.
+
+so... a complete example:
+
+```
+npm install @pattern-lab/starterkit-mustache-demo
+gulp patternlab:loadstarterkit --kit=@pattern-lab/starterkit-mustache-demo
+```
+
+The [Pattern Lab Node CLI](https://github.com/pattern-lab/patternlab-node/tree/master/packages/cli) will also support installation of Starterkits should you not be using gulp.
+
+## PSA
+
+**LOADING A STARTERKIT WILL OVERWRITE ANY MATCHES INSIDE `./source`** Users can pass another flag `--clean=true` to attempt to delete the contents of `./source` prior to load.
+
+- Sometimes users will run into file permissions issues. It's recommended to run all command prompts as administrator if you can.
+
+`patternlab-config.json` also defines a `starterkitSubDir` key (with a default value of `dist`) which can be used to target a directory inside the starterkit module if need be.
diff --git a/packages/docs/src/docs/advanced-template-language-and-pattern-engines.md b/packages/docs/src/docs/advanced-template-language-and-pattern-engines.md
new file mode 100644
index 000000000..f59dff6b5
--- /dev/null
+++ b/packages/docs/src/docs/advanced-template-language-and-pattern-engines.md
@@ -0,0 +1,28 @@
+---
+title: Template Language and PatternEngines
+heading: Template Language and PatternEngines
+patternEnginesScript: true
+category: advanced
+eleventyNavigation:
+ title: Template Language and PatternEngines
+ key: advanced
+ order: 300
+---
+
+By default Pattern Lab uses the Mustache template language, extended with [pattern parameters](/docs/using-pattern-parameters/). PatternEngines let you add support for a template language of your personal choice. Each PatternEngine has it's own set of features and caveats.
+
+Right now the most mature PatternEngines are Handlebars, Mustache and Twig.
+
+## Official PatternEngines for Node
+
+
+
+## Install and Configure a PatternEngine
+
+1. Install a new PatternEngine that you wish to use. For example, to install the Handlebars engine, run `npm install --save @pattern-lab/engine-handlebars`.
+2. (Optional) Change the `"patternExtension"` property of your config. This sets the panel name and language for the code tab on the styleguide.
+
+You'll need to restart Pattern Lab for changes to take effect. Some PatternEngines may provide further configuration.
diff --git a/packages/docs/src/docs/changes-1-to-2.md b/packages/docs/src/docs/changes-1-to-2.md
new file mode 100644
index 000000000..b167ba607
--- /dev/null
+++ b/packages/docs/src/docs/changes-1-to-2.md
@@ -0,0 +1,10 @@
+---
+title: Pattern Lab 1 to Pattern Lab 2 Changes
+tags:
+ - docs
+eleventyNavigation:
+ title: Pattern Lab 1 to Pattern Lab 2 Changes
+ order: 300
+---
+
+The list of features is coming soon.
diff --git a/packages/docs/src/docs/data-json-mustache.md b/packages/docs/src/docs/data-json-mustache.md
new file mode 100644
index 000000000..cb8d37ec9
--- /dev/null
+++ b/packages/docs/src/docs/data-json-mustache.md
@@ -0,0 +1,108 @@
+---
+title: Introduction to JSON & Mustache Variables
+tags:
+ - docs
+category: data
+eleventyNavigation:
+ title: Introduction to JSON & Mustache Variables
+ key: data
+ order: 300
+---
+
+> This documentation is provided as a simple introduction to using one of the supported data types and one of the supported PatternEngines. The best reference for this topic is the [Mustache documentation](http://mustache.github.io/mustache.5.html) but this should provide a good beginner's primer.
+
+## Simple Variables
+
+At its core JSON is a simple key-value store. This means that any piece of data in JSON has a key and a value. The key is the name of an attribute and the value is what should be shown when that attribute is referenced. Here's a simple example:
+
+```javascript
+"src": "../../images/fpo-avatar.png"
+```
+
+In this case the key is `src` and the value is `../../images/fpo-avatar.png`. Let's look at how we might reference this data in a pattern template. Mustache variables are denoted by the double-curly braces (or mustaches).
+
+```html
+
+```
+
+The Mustache variable is `{% raw %}{{ src }}{% endraw %}`. Note that `src` matches the name of the key in our JSON example. When the Node version of Pattern Lab compile this template the end result will be:
+
+```html
+
+```
+
+Note that `{% raw %}{{ src }}{% endraw %}` was replaced by the value for `src` found in our JSON example.
+
+## Nested Variables
+
+We may want our JSON file to be a little more organized and our Mustache variable names to be a little more descriptive. For example, maybe we have multiple image sizes that we want to provide image sources for. We might organize our JSON key-values this way:
+
+```javascript
+"square": {
+ "src": "../../images/fpo-square.png",
+ "alt": "Square"
+},
+"avatar": {
+ "src": "../../images/fpo-avatar.png",
+ "alt": "Avatar"
+}
+```
+
+Note how their are attributes ( `src`, `alt` ) nested within a larger container ( `square` ). Also note how the attributes are separated by commas. If we wanted to use the attributes for the square image in our pattern we'd write:
+
+```html
+
+```
+
+This would compile to:
+
+```html
+
+```
+
+This nesting makes it easier to read how the attributes are organized in our patterns. The default `data.json` file has several examples of this type of nesting of attributes.
+
+## Rendering HTML in Variables
+
+You may want to include HTML in your variables. By default, Mustache will convert HTML mark-up to their HTML entity equivalents. For example, our JSON may look like:
+
+```javascript
+"lyrics": "Just good ol' boys , wouldn't change if they could, fightin' the system like a true modern day Robin Hood."
+```
+
+Based on our previous Mustache examples you would probably write out your template like so:
+
+```html
+TV Show Lyrics
+{% raw %}{{ lyrics }}{% endraw %}
+```
+
+Unfortunately, that would compile as:
+
+```html
+TV Show Lyrics
+
+ Just <em>good ol' boys</em>, wouldn't change if they could,
+ <strong>fightin'</strong> the system like a true modern day Robin Hood.
+
+```
+
+In order to make sure the mark-up doesn't get converted you must use _triple_ curly brackets like so:
+
+```html
+TV Show Lyrics
+{% raw %}{{{ lyrics }}}{% endraw %}
+```
+
+Now it would compile correctly:
+
+```html
+TV Show Lyrics
+
+ Just good ol' boys , wouldn't change if they could,
+ fightin' the system like a true modern day Robin Hood.
+
+```
diff --git a/packages/docs/src/docs/data-link-variable.md b/packages/docs/src/docs/data-link-variable.md
new file mode 100644
index 000000000..fa0fb18c3
--- /dev/null
+++ b/packages/docs/src/docs/data-link-variable.md
@@ -0,0 +1,42 @@
+---
+title: Linking to Patterns with Pattern Lab's Default `link` Variable
+category: data
+eleventyNavigation:
+ title: Linking to Patterns with Pattern Lab's Default `link` Variable
+ key: data
+ order: 100
+---
+
+You can build patterns that link to one another to help simulate using a real website. This is especially useful when working with the Pages and Templates pattern types. Rather than having to remember the actual path to a pattern you can use the same shorthand syntax you'd use to include one pattern within another. **Important:** Pattern links _do not_ support the same fuzzy matching of names as the shorthand partials syntax does. The basic format is:
+
+```html
+{% raw %}{{ link.pattern-name }}{% endraw %}
+```
+
+For example, if you wanted to add a link to the `article` page from your `blog` page you could write the following:
+
+```html
+Article Headline
+```
+
+This would compile to:
+
+```html
+Article Headline
+```
+
+Additionally, you can use pattern links within JSON to link to other pages, templates, or patterns within Pattern Lab. For instance, if you had a pattern containing the following:
+
+```html
+This is a link
+```
+
+You can set the URL to a pattern link via JSON like so:
+
+```javascript
+{
+ "url" : "link.pages-article"
+}
+```
+
+Using pattern links in JSON is especially helpful at keeping the pattern's structure and content entirely separate.
diff --git a/packages/docs/src/docs/data-overview.md b/packages/docs/src/docs/data-overview.md
new file mode 100644
index 000000000..0ce1caf10
--- /dev/null
+++ b/packages/docs/src/docs/data-overview.md
@@ -0,0 +1,38 @@
+---
+title: Overview of Data
+tags:
+ - docs
+category: data
+eleventyNavigation:
+ title: Overview of Data
+ key: data
+ order: 300
+---
+
+The primary default global source of data used when rendering Pattern Lab patterns can be found in `./source/_data/`.
+
+## Supported Data Formats
+
+The Node version of Pattern Lab only supports JSON.
+
+## Locations for Data
+
+There are three places to store data in Pattern Lab:
+
+- in `./source/_data`.
+- in [pattern-specific](/docs/creating-pattern-specific-values/) files in `./source/_patterns`.
+- in [pseudo-pattern](/docs/using-pseudo-patterns/) files in `./source/_patterns`.
+
+### A Special Note About Pattern Parameters
+
+[Pattern parameters](/docs/using-pattern-parameters/) are a simple find and replace of variables in the included pattern. As such they do not affect the context stack of Mustache and we don't consider them true data. They have no impact on overall data inheritance and they cannot be used any deeper than the included pattern. They are a hack.
+
+## Data Inheritance
+
+Data inheritance in Pattern Lab follows this flow:
+
+```
+Pattern-specific data for the pattern being rendered > Global data in _data
+```
+
+The only data that is loaded to render a pattern is its own data and global data. It will not include the data for any included patterns. For example, the pages template, `article`, might include the molecule, `block-hero`. `block-hero` may have its own pattern-specific data file, `block-hero.json`. The Node version of Pattern Lab **will not** use the `block-hero` data when rendering `article`. It will only use `article.json` (_if available_) and data found in `./source/_data`.
diff --git a/packages/docs/src/docs/data-pattern-specific.md b/packages/docs/src/docs/data-pattern-specific.md
new file mode 100644
index 000000000..495053a8f
--- /dev/null
+++ b/packages/docs/src/docs/data-pattern-specific.md
@@ -0,0 +1,50 @@
+---
+title: Creating Pattern-specific Values
+tags:
+ - docs
+category: data
+eleventyNavigation:
+ title: Creating Pattern-specific Values
+ key: data
+ order: 300
+---
+
+> **Note:** This article uses JSON because it is a standard between with the Node version of Pattern Lab.
+
+Storing data for your atoms, molecules, and organisms in `./source/_data` may work just fine. When fleshing out templates and pages, where data may need to be unique to each page even if they use the same molecules and organisms, data stored in `./source/_data` can become cumbersome. In order to work around this the Node version of Pattern Lab allows you to define pattern-specific data files that allow you to override the default values found in `./source/_data`.
+
+## Setting Up Pattern-specific Data
+
+In order to tell the Node version of Pattern Lab to use pattern-specific data to override the default global data create a JSON file with the same name as the pattern and put it in the same directory as the pattern. For example, if you wanted to provide pattern-specific data for the `article` pattern under the pattern type `pages` your `pages` directory would look like this:
+
+```
+pages/article.mustache
+pages/article.json
+```
+
+## Overriding the Default Variables
+
+To override the global data using pattern-specific data make sure the latter has the same variable names as the former. For example, the 4x3 landscape image source may look like this in `data.json`:
+
+```javascript
+"landscape-4x3": {
+ "src": "../../images/fpo-landscape-4x3.jpg",
+ "alt": "Landscape 4x3 Image"
+}
+```
+
+In our pattern-specific data file, `article.json`, we'd simply copy that structure and provide our own information:
+
+```javascript
+"landscape-4x3": {
+ "src": "../../images/a-team-hero.jpg"
+}
+```
+
+Now the article pattern will display an image of the A-Team when using `{% raw %}{{ landscape-4x3.src }}{% endraw %}`. All other patterns using `{% raw %}{{ landscape-4x3.src }}{% endraw %}` will display the default 4x3 image. Also, note that we **didn't** override the `landscape-4x3.alt` attribute. If we were to use that attribute in our pattern the default value, "Landscape 4x3 Image", would be displayed.
+
+**Important note:** You don't have to override every attribute. You can limit the data in your pattern-specific data file to just those variables you want. The Node version of Pattern Lab will fallback to using the default attributes from `data.json` if the attributes aren't defined in the pattern-specific data file.
+
+## Working With Includes
+
+The only data that is loaded to render a pattern is its own data and global data. It will not include the data for any included patterns. For example, the pages template, `article`, might include the molecule, `block-hero`. `block-hero` may have its own pattern-specific data file, `block-hero.json`. The Node version of Pattern Lab **will not** use the `block-hero` data when rendering `article`. It will only use `article.json` (_if available_) and data found in `./source/_data`.
diff --git a/packages/docs/src/docs/docs.json b/packages/docs/src/docs/docs.json
new file mode 100644
index 000000000..688f78f76
--- /dev/null
+++ b/packages/docs/src/docs/docs.json
@@ -0,0 +1,3 @@
+{
+ "layout": "layouts/docs.njk"
+}
diff --git a/packages/docs/src/docs/editing-source-files.md b/packages/docs/src/docs/editing-source-files.md
new file mode 100644
index 000000000..71af3301a
--- /dev/null
+++ b/packages/docs/src/docs/editing-source-files.md
@@ -0,0 +1,80 @@
+---
+title: Editing Pattern Lab Source Files
+tags:
+ - docs
+category: getting-started
+eleventyNavigation:
+ title: Editing Pattern Lab Source Files
+ key: getting-started
+ order: 20
+---
+
+When editing Pattern Lab you must put your files and edit them in the `./source/` directory. This includes your static assets like [JavaScript, CSS, and images](/docs/managing-pattern-assets/). Each time your site is generated your patterns will be compiled and your static assets will be moved to the `./public/` directory. Because of this you **should not edit** the files in the `./public/` directory.
+
+## Pattern Lab Directories
+
+For the most part you can organize `./source/` anyway you see fit. There are a few Pattern Lab-specific directories though. They are:
+
+- `_annotations/` - where your annotations reside. [learn more](/docs/adding-annotations/).
+- `_data/` - where the global data used to render your patterns resides. [learn more](/docs/overview-of-data/).
+- `_meta/` - where the header and footer that get applied to all of your patterns resides. [learn more](/docs/modifying-the-pattern-header-and-footer/).
+- `_patterns/` - where your patterns, pattern documentation, and pattern-specific data reside. [learn more](/docs/reorganizing-patterns/).
+
+## Configuring Pattern Lab Directories
+
+All Pattern Lab directories can be configured to suit your needs.
+
+```js
+// base directories
+exportDir: 'value'; // default is exports. where clean mark-up sans PL code is exported to.
+publicDir: 'value'; // default is public
+sourceDir: 'value'; // default is source
+
+// exportDir is the base directory for the following directories (e.g. ./exports/patterns)
+patternExportDir: 'value'; // default is patterns
+
+// publicDir is the base directory for the following directories (e.g. ./public/patterns)
+componentDir: 'value'; // default is patternlab-components. where plugin components are installed.
+patternPublicDir: 'value'; // default is patterns
+
+// sourceDir is the base directory for the following directories (e.g. ./source/_patterns)
+annotationsDir: 'value'; // default is _annotations
+dataDir: 'value'; // default is _data
+metaDir: 'value'; // default is _meta
+patternSourceDir: 'value'; // default is _patterns
+```
+
+In the Node version of Pattern Lab you can modify the following configuration options in `patternlab-config.json`:
+
+```javascript
+"paths" : {
+ "source" : {
+ "root": "./source/",
+ "patterns" : "./source/_patterns/",
+ "data" : "./source/_data/",
+ "meta": "./source/_meta/",
+ "annotations" : "./source/_annotations/",
+ "styleguide" : "./node_modules/styleguidekit-assets-default/dist/",
+ "patternlabFiles" : "./node_modules/styleguidekit-mustache-default/views/",
+ "js" : "./source/js",
+ "images" : "./source/images",
+ "fonts" : "./source/fonts",
+ "css" : "./source/css/"
+ },
+ "public" : {
+ "root" : "./public/",
+ "patterns" : "./public/patterns/",
+ "data" : "./public/styleguide/data/",
+ "annotations" : "./public/annotations/",
+ "styleguide" : "./public/styleguide/",
+ "js" : "./public/js",
+ "images" : "./public/images",
+ "fonts" : "./public/fonts",
+ "css" : "./public/css"
+ }
+}
+```
+
+## Watching for Source File Changes
+
+Manually generating the Pattern Lab website after each change can be cumbersome. The Node version of Pattern Lab comes with the ability to watch files in the `./source/` directory for changes and re-generate the site automatically. The Pattern Lab website can also be automatically reloaded..
diff --git a/packages/docs/src/docs/installation.md b/packages/docs/src/docs/installation.md
new file mode 100644
index 000000000..e205aa486
--- /dev/null
+++ b/packages/docs/src/docs/installation.md
@@ -0,0 +1,52 @@
+---
+title: Installing Pattern Lab
+tags:
+ - docs
+category: getting-started
+eleventyNavigation:
+ title: Installing Pattern Lab
+ key: getting-started
+ order: 0
+---
+
+## Step 1: Install requirements
+
+Make sure you have [Node.js](https://nodejs.org/en/download/) installed before setting up Pattern Lab.
+
+## Step 2: Run the create Pattern Lab command
+
+Open [the command line](https://tutorial.djangogirls.org/en/intro_to_command_line/) and run the following command:
+
+```
+npm create pattern-lab
+```
+
+This will bring up an installation menu that presents the following steps:
+
+## Step 3: Choose a directory
+
+**`Please specify a directory for your Pattern Lab project.`** Choose the directory where you want to install Pattern Lab. The default location is the current directory.
+
+## Step 4: Choose templating language
+
+**`What templating language do you want to use with Pattern Lab?`** This determines what templating engine you'll use to author components. The options are:
+
+- **`Handlebars`** - uses the [Handlebars](https://handlebarsjs.com/) templating engine
+- **`Twig (PHP)*`** - uses the [Twig](https://twig.symfony.com/) templating engine
+
+**\*A note on Twig:** while Pattern Lab is powered by Node, behind the scenes Twig files are compiled by Twig PHP, _not_ by twig.js (which isn't fully on par with Twig PHP).
+
+## Step 5: Choose initial patterns
+
+**`What initial patterns do you want included in your project?`** - Choose the Starterkit you want to begin your project with. The options are:
+
+- **`Handlebars base patterns`** `(some basic patterns to get started with)` - TODO: include demo link
+- **`Handlebars demo patterns`** `(full demo website and patterns)` - TODO: include demo link
+- **`Twig (PHP) demo patterns`** `(full demo website and patterns)` - TODO: include demo link
+- **`Custom starterkit`** - point to a custom Pattern Lab starterkit TODO: include instructions on including custom starterkits
+- **`Blank project (no patterns)`** - This won't include any initial patterns in your project so you can start completely from scratch
+
+## Step 6: Confirm your choices
+
+**`Are you happy with your choices? (Hit enter for YES)?`** - Confirm your choices, and when done the Pattern Lab installation will begin.
+
diff --git a/packages/docs/src/docs/pattern-add-new.md b/packages/docs/src/docs/pattern-add-new.md
new file mode 100644
index 000000000..4973b0547
--- /dev/null
+++ b/packages/docs/src/docs/pattern-add-new.md
@@ -0,0 +1,25 @@
+---
+title: Adding New Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Adding New Patterns
+ key: patterns
+ order: 70
+---
+
+To add new patterns to the Node version of Pattern Lab just add new Mustache templates under the appropriate pattern type or pattern subtype directories in `./source/_patterns`. For example, let's add a new pattern under the pattern type "molecules" and the pattern sub-type "blocks". The `./source/_patterns/molecules/blocks/` directory looks like:
+
+ block-hero.mustache
+ headline-byline.mustache
+ media-block.mustache
+
+If we want to add a new pattern we simply tack it onto the end:
+
+ block-hero.mustache
+ headline-byline.mustache
+ media-block.mustache
+ new-pattern.mustache
+
+If you want more control over their ordering please refer to "[Reorganizing Patterns](/docs/reorganizing-patterns/)."
diff --git a/packages/docs/src/docs/pattern-adding-annotations.md b/packages/docs/src/docs/pattern-adding-annotations.md
new file mode 100644
index 000000000..2c535188d
--- /dev/null
+++ b/packages/docs/src/docs/pattern-adding-annotations.md
@@ -0,0 +1,70 @@
+---
+title: Adding Annotations
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Adding Annotations
+ key: patterns
+ order: 180
+---
+
+Annotations provide an easy way to add notes to elements that may appear inside patterns. Annotations can be saved as a single JSON file at `./source/_annotations/annotations.js` or as multiple Markdown files in `./source/_annotations/`. They're _not_ tied to any specific patterns. When annotations are active they are compared against every pattern using a CSS selector syntax.
+
+## The Elements of an Annotation
+
+The elements of an annotation are:
+
+- **el** - the selector to be used to attach the annotation to a pattern
+- **title** - the title for a given annotation
+- **comment** - the description for a given annotation
+
+## JSON Example
+
+This is an example of an annotation saved as part of `annotations.js` that will be added to an element with the class `logo`:
+
+```javascript
+{
+ "el": ".logo",
+ "title" : "Logo",
+ "comment": "The logo image is an SVG file, which ensures that the logo displays crisply even on high resolution displays. A PNG fallback is provided for browsers that don't support SVG images.
Further reading: Optimizing Web Experiences for High Resolution Screens
"
+}
+```
+
+## Markdown Example
+
+This is an example of an annotation saved as part of `annotations.md` that will be added to an element with the class `logo`:
+
+```
+---
+el: .logo
+title: Logo
+---
+The logo image is an SVG file, which ensures that the logo displays crisply even on high resolution displays. A PNG fallback is provided for browsers that don't support SVG images.
+
+Further reading: [Optimizing Web Experiences for High Resolution Screens](http://bradfrostweb.com/blog/mobile/hi-res-optimization/)
+```
+
+To separate multiple annotations within one file use `~*~` between annotations.
+
+```
+---
+el: .logo
+title: Logo
+---
+The logo image is an SVG file, which ensures that the logo displays crisply even on high resolution displays. A PNG fallback is provided for browsers that don't support SVG images.
+
+Further reading: [Optimizing Web Experiences for High Resolution Screens](http://bradfrostweb.com/blog/mobile/hi-res-optimization/)
+~*~
+---
+el: .hamburger
+title: Sandwiches Considered Harmful
+---
+According to everyone, hamburger menus are not obvious, and obvious always wins.
+
+Further reading: [Hamburger Menus and Hidden Navigation Hurt UX Metrics](https://www.nngroup.com/articles/hamburger-menus/)
+```
+
+## Viewing Annotations
+
+In order to view annotations click "Show Pattern Info" in the Pattern Lab toolbar.
diff --git a/packages/docs/src/docs/pattern-converting.md b/packages/docs/src/docs/pattern-converting.md
new file mode 100644
index 000000000..795eda217
--- /dev/null
+++ b/packages/docs/src/docs/pattern-converting.md
@@ -0,0 +1,20 @@
+---
+title: Converting Old Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Converting Old Patterns
+ key: patterns
+ order: 190
+---
+
+You may have invested time in building patterns for Brad's original edition of Pattern Lab but now want to convert them so they can be used with the new PHP version of Pattern Lab. To convert them all you need to do is swap out the old `inc()` calls for the Mustache-based [shorthand partials syntax](/docs/including-patterns/). For example, let's say this was a call to a pattern using the original syntax:
+
+
+
+The new Mustache-based shorthand partials syntax would be:
+
+ {% raw %}{{> atoms-logo }}{% endraw %}
+
+The only real difference between the two is that the pattern type, e.g. `atoms`, has to be exact when using the Mustache partials syntax. Otherwise, it should be very easy to convert between the two formats.
diff --git a/packages/docs/src/docs/pattern-documenting.md b/packages/docs/src/docs/pattern-documenting.md
new file mode 100644
index 000000000..d26d6d75e
--- /dev/null
+++ b/packages/docs/src/docs/pattern-documenting.md
@@ -0,0 +1,50 @@
+---
+title: Documenting Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Documenting Patterns
+ key: patterns
+ order: 110
+---
+
+Pattern documentation gives developers and designers the ability to provide context for their patterns. The documentation file consists of Markdown with YAML front matter. It should follow this format:
+
+```
+---
+title: Title for my pattern
+---
+This is a *Markdown* description of my pattern.
+```
+
+The `title` attribute is used in Pattern Lab's navigation as well as in the styleguide views. The `description` is used in the styleguide views.
+
+Pattern documentation needs to have a `.md` file extension and match the name of the pattern it's documenting. For example, to document the following pattern:
+
+ 00-atoms/images/landscape-16x9.mustache
+
+We'd name our documentation file:
+
+ 00-atoms/images/landscape-16x9.md
+
+## Documenting Pseudo-Patterns
+
+To add documentation to [pseudo-patterns](/docs/using-pseudo-patterns/), replace the tilde sign (`~`) with a dash (`-`) when naming your documentation file.
+
+For example, to document the following pseudo-pattern:
+
+```
+00-atoms/button/button~red.mustache
+```
+
+We'd name our documentation file:
+
+```
+00-atoms/button/button-red.md
+```
+
+## Adding More Attributes to the Front Matter
+
+A future update of Pattern Lab will support more front matter attributes including: state, order, hidden, links and tags.
+It will also support adding custom attributes that could be utilized by plugins. For example, GitHub issues related to patterns.
diff --git a/packages/docs/src/docs/pattern-header-footer.md b/packages/docs/src/docs/pattern-header-footer.md
new file mode 100644
index 000000000..ae61da38d
--- /dev/null
+++ b/packages/docs/src/docs/pattern-header-footer.md
@@ -0,0 +1,26 @@
+---
+title: Modifying the Pattern Header & Footer
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Modifying the Pattern Header & Footer
+ key: patterns
+ order: 130
+---
+
+To add your own assets like JavaScript and CSS to your patterns' header and footer you need to modify two files:
+
+- `./source/_meta/_00-head.mustache`
+- `./source/_meta/_01-foot.mustache`
+
+These files are added to every rendered pattern, "view all" page and style guide. To see your changes simply re-generate your site.
+
+## Important: Don't Remove Two Things...
+
+**Do not remove the following two lines in these patterns:**
+
+- a tag referencing `patternLabHead` in `_00-head.mustache`
+- a tag referencing `patternLabFoot` in `_00-foot.mustache`
+
+Pattern Lab will not so mysteriously stop working if you do.
diff --git a/packages/docs/src/docs/pattern-hiding.md b/packages/docs/src/docs/pattern-hiding.md
new file mode 100644
index 000000000..52ba3acae
--- /dev/null
+++ b/packages/docs/src/docs/pattern-hiding.md
@@ -0,0 +1,22 @@
+---
+title: Hiding Patterns in the Navigation
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Hiding Patterns in the Navigation
+ key: patterns
+ order: 170
+---
+
+To remove a pattern from Pattern Lab's drop-down navigation and style guide add an underscore (`_`) to the beginning of the pattern name. For example, we may have a Google Map-based pattern that we don't need for a particular project. The path might look like:
+
+ molecules/media/map.mustache
+
+To "hide" the pattern we add the underscore and re-generate our site:
+
+ molecules/media/_map.mustache
+
+A hidden pattern can still be included in other patterns.
+
+Not all PatternEngines support hiding patterns.
diff --git a/packages/docs/src/docs/pattern-including.md b/packages/docs/src/docs/pattern-including.md
new file mode 100644
index 000000000..8ca8f03fa
--- /dev/null
+++ b/packages/docs/src/docs/pattern-including.md
@@ -0,0 +1,83 @@
+---
+title: Including Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Including Patterns
+ key: patterns
+ order: 90
+---
+
+To include one pattern within another, for example to create a molecule from several atoms, you can either use:
+
+- a shorthand include syntax or
+- the default include syntax for the template language you're using (e.g. Mustache, Twig, Handlebars).
+
+## The Shorthand Include Syntax
+
+The shorthand include syntax is less verbose than the default include syntax for many template languages. The shorthand syntax uses the following format:
+
+ [patternType]-[patternName]
+
+For example, to include the following pattern in a molecule:
+
+ 00-atoms/images/landscape-16x9.mustache
+
+The shorthand include syntax would be:
+
+ atoms-landscape-16x9
+
+The pattern type matches the top-level folder and is `atoms`. The pattern name matches the template file and is `landscape-16x9`. Any digits used for ordering are _dropped_ from both the pattern type and pattern name. Pattern subtypes are _never_ a part of the shorthand include syntax. This way patterns can be re-organized within a pattern type and/or by using digits without needing to change your pattern includes.
+
+The following are examples of using the shorthand include syntax with our supported PatternEngines:
+
+```
+{% raw %}{{> atoms-landscape-16x9 }} // Mustache{% endraw %}
+{% raw %}{% include "atoms-landscape-16x9" %} // Twig{% endraw %}
+```
+
+The shorthand syntax also allows for fuzzy matching on pattern names. This means that if you feel your pattern name is going to be unique within a given pattern type you can supply just the unique part of the pattern name and the partial will be included correctly. For example, using the shorthand syntax the pattern `atoms-landscape-16x9.mustache` could be written as:
+
+ atoms-16x9
+
+_Warning:_ Because subtypes are not included in the shorthand include syntax a given pattern name needs to be unique within its _pattern type_ and not just its pattern subtype. If you run into this problem you can do one of two things:
+
+- use the default include syntax for your template language or
+- give your pattern a unique name and use [the pattern's documentation](/docs/documenting-patterns/) to provide the pattern name
+
+## The Default Include Syntax
+
+If you need more specificity when including patterns the Node version of Pattern Lab also support the include syntax for the template language that you're using. For example, the syntax for Mustache is the path to the pattern minus the `.mustache` extension. Let's say we wanted to include the following pattern in a molecule:
+
+ 00-atoms/images/landscape-16x9.mustache
+
+The default Mustache include syntax would be:
+
+```handlebars
+{% raw %}{{> 00-atoms/images/landscape-16x9 }}{% endraw %}
+```
+
+**Important:** Unlike the shorthand include syntax the template language specific include syntax **must** include any digits used for ordering and subtype directories. Pattern paths need to be updated when either is changed for a given pattern.
+
+## Examples and Gotchas
+
+Here are some examples of how to include patterns as well as some gotchas.
+
+```handlebars
+{% raw %}// partials to match
+00-atoms/global/05-test.mustache
+00-atoms/global/06-test.mustache
+00-atoms/global/test.mustache
+00-atoms/global/test-with-picture.mustache
+
+// using the shorthand partials syntax
+{{> atoms-test }} // will match 00-atoms/global/05-test.mustache
+ // using the shorthand syntax you'll never be able to match 06-test nor test in this scenario
+{{> atoms-test-with-picture }} // will match 00-atoms/global/test-with-picture.mustache
+{{> atoms-test-wit }} // will match 00-atoms/global/test-with-picture.mustache
+
+// using the default mustache partials syntax
+{{> atoms/global/05-test }} // won't match anything because atoms is missing its digits
+{{> 00-atoms/global/06-test }} // will match 00-atoms/global/06-test.mustache{% endraw %}
+```
diff --git a/packages/docs/src/docs/pattern-linking.md b/packages/docs/src/docs/pattern-linking.md
new file mode 100644
index 000000000..fe340d4c4
--- /dev/null
+++ b/packages/docs/src/docs/pattern-linking.md
@@ -0,0 +1,113 @@
+---
+title: Pattern Lab's Special Query String Variables
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Pattern Lab's Special Query String Variables
+ key: patterns
+ order: 100
+---
+
+Pattern Lab comes with support for a number of special query string variables to help you share patterns with clients. These query string variables include ways to link to patterns, set the Pattern Lab viewport to a specific width, open various views as well as start Hay and disco modes on page load. There are lots of options:
+
+- [Linking to Specific Patterns](#link-pattern)
+- [Setting the Default Width for the Viewport](#default-width)
+- [Opening Annotations View on Page Load](#annotations-view)
+- [Opening Code View on Page Load](#code-view)
+- [Starting Hay Mode on Page Load](#hay-mode)
+- [Starting Disco Mode on Page Load](#disco-mode)
+
+## Linking to Specific Patterns
+
+You can link directly to any pattern listed on the Pattern Lab website. This might be useful when asking clients for feedback on a particular template or page pattern. If you want to [link from one pattern to another use the `link` variable](/docs/linking-to-patterns-with-pattern-lab's-default-link-variable/).
+
+### Copy & Paste
+
+The simplest method is to copy the address found in the address bar.
+
+### Manually Creating the Link
+
+It's also very easy to create a link manually. Simply append `?p=pattern-name` to the end of the address for your Pattern Lab website. For example, if we wanted to link to the `templates-article` pattern we'd add the following to the address for our Pattern Lab website:
+
+```
+?p=templates-article
+```
+
+The direct link feature supports the [shorthand partials syntax](/docs/including-patterns/) found in the Node version of Pattern Lab. Just provide part of a pattern name and Pattern Lab will attempt to resolve it.
+
+## Setting the Default Width for the Viewport
+
+You can load a specific viewport size by using the `w` query string variable.
+
+```
+http://patternlab.localhost/?w=320 (sets the viewport to 320px)
+http://patternlab.localhost/?w=400px (sets the viewport to 400px)
+http://patternlab.localhost/?w=40em (sets the viewport to 40em or 640px)
+```
+
+And it works with the `p` query string variable so you can also do:
+
+```
+http://patternlab.localhost/?p=atoms-landscape-4x3&w=400px
+```
+
+## Opening Annotations View on Page Load
+
+When sending a particular pattern to a client for review you may not want to include directions for how to open annotations. You can force the annotations view to open on page load by using the `view` query string variables with the values `annotations` or `a`:
+
+```
+http://patternlab.localhost/?p=templates-homepage&view=annotations
+http://patternlab.localhost/?p=templates-homepage&view=a
+```
+
+You can also force the annotations panel to scroll to a particular item by including the query string variable `number`. To scroll to the fifth element in the list of annotations you'd do the following:
+
+```
+http://patternlab.localhost/?p=templates-homepage&view=annotations&number=5
+```
+
+## Opening Code View on Page Load
+
+When sending a particular pattern to a client for review you may not want to include directions for how to open the code view. You can force the code view to open on page load by using the `view` query string variables with the values `code` or `c`:
+
+```
+http://patternlab.localhost/?p=templates-homepage&view=code
+http://patternlab.localhost/?p=templates-homepage&view=c
+```
+
+You can also force the HTML tab mark-up to be highlighted for copying by including the query string variable `copy`.
+
+```
+http://patternlab.localhost/?p=templates-homepage&view=code©=true
+```
+
+## Starting Hay Mode on Page Load
+
+You can start Hay mode automatically when the page is loaded by using the `h` or `hay` query string variables.
+
+```
+http://patternlab.localhost/?h=true
+http://patternlab.localhost/?hay=true
+```
+
+And it works with the `p` query string variable so you can also do:
+
+```
+http://patternlab.localhost/?p=atoms-landscape-4x3&h=true
+```
+
+## Starting Disco Mode on Page Load
+
+You can start disco mode automatically when the page is loaded by using the `d` or `disco` query string variables.
+
+```
+http://patternlab.localhost/?d=true
+http://patternlab.localhost/?disco=true
+```
+
+And it works with the `p` query string variable so you can also do:
+
+```
+http://patternlab.localhost/?p=atoms-landscape-4x3&d=true
+```
diff --git a/packages/docs/src/docs/pattern-managing-assets.md b/packages/docs/src/docs/pattern-managing-assets.md
new file mode 100644
index 000000000..2f99b5879
--- /dev/null
+++ b/packages/docs/src/docs/pattern-managing-assets.md
@@ -0,0 +1,55 @@
+---
+title: Managing Pattern Assets
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Managing Pattern Assets
+ key: patterns
+ order: 120
+---
+
+Assets for patterns - including JavaScript, CSS, and images - should be stored and edited in the `./source/` directory. Pattern Lab will move these assets to the `./public/` directory for you when you generate your site or when you watch the `./source/` directory for changes. _You can name and organize your assets however you like._ If you would like to use `./source/stylesheets/` to store your styles instead of `./source/css/` you can do that. The structure will be maintained when they're moved to the `./public/` directory.
+
+Pattern Lab ships with copy tasks in the `Gruntfile.js` or `Gulpfile.js` of [the Editions](https://github.com/pattern-lab/?utf8=%E2%9C%93&query=edition-node) that copy your assets for you.
+
+This structure is meant to be extended to suit your purposes. Change targets, move files, or ignore certain filetypes altogether. **Note**: If you make changes to `Gruntfile.js` or `Gulpfile.js`, such as to copy a new directory, and have auto re-generation and browser reload enable, you will need to stop and start your tasks to pick up the changes.
+
+## Configuring Asset Locations
+
+Pattern Lab has a configuration object which allows users to separate source patterns and assets from what is generated. The paths are managed within `patternlab-config.json`, found at the root of the edition project. The contents are sampled here:
+
+```javascript
+ "paths" : {
+ "source" : {
+ "root": "./source/",
+ "patterns" : "./source/_patterns/",
+ "data" : "./source/_data/",
+ "meta": "./source/_meta/",
+ "annotations" : "./source/_annotations/",
+ "styleguide" : "./node_modules/styleguidekit-assets-default/dist/",
+ "patternlabFiles" : "./node_modules/styleguidekit-mustache-default/views/",
+ "js" : "./source/js",
+ "images" : "./source/images",
+ "fonts" : "./source/fonts",
+ "css" : "./source/css/"
+ },
+ "public" : {
+ "root" : "./public/",
+ "patterns" : "./public/patterns/",
+ "data" : "./public/styleguide/data/",
+ "annotations" : "./public/annotations/",
+ "styleguide" : "./public/styleguide/",
+ "js" : "./public/js",
+ "images" : "./public/images",
+ "fonts" : "./public/fonts",
+ "css" : "./public/css"
+ }
+ }
+```
+
+Note how some sets of files even extend into the "vendor" `./node_modules/` directory. Relative paths are the default but absolute paths are supported also. You may also use these paths within the Grunt or Gulp taskfiles by referring to the `paths()` function.
+
+## Adding Assets to the Pattern Header & Footer
+
+Static assets like Javascript and CSS **are not** added automagically to your patterns. You need to add them manually to the [shared pattern header and footer](/docs/modifying-the-pattern-header-and-footer/).
diff --git a/packages/docs/src/docs/pattern-organization.md b/packages/docs/src/docs/pattern-organization.md
new file mode 100644
index 000000000..ff3cab5ad
--- /dev/null
+++ b/packages/docs/src/docs/pattern-organization.md
@@ -0,0 +1,52 @@
+---
+title: Overview of Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Overview of Patterns
+ key: patterns
+ order: 10
+---
+
+Patterns can be found in `./source/_patterns/`. Patterns must be written in the template languages supported by Pattern Lab's PatternEngines. For Node there are [several more PatternEngines to choose from](/docs/template-language-and-patternengines/).
+
+## How Patterns Are Organized
+
+Patterns are organized in a nested folder structure under `./source/_patterns/`. This allows the Node version of Pattern Lab to automatically find and build assets like the "view all" pages and the drop down navigation. Pattern Lab uses the following organizational structure:
+
+ [patternType]/[patternSubtype]/[patternName].[patternExtension]
+
+Here are the parts:
+
+- `patternType` denotes the overall pattern type. If using Atomic Design this will be something like "atoms" or "molecules" but it can be anything you want. For example, "components" or "elements."
+- `patternSubtype` denotes the sub-type of pattern and is _optional_. This helps to organize patterns under an overall pattern type in the drop downs in Pattern Lab. For example, a "blocks" pattern subtype under the "molecules" pattern type.
+- `patternName` is the name of the pattern. This is used when the pattern is displayed in the drop downs in Pattern Lab.
+- `patternExtension` is the file extension that tells the PatternEngine to render the pattern. For example, `.mustache`.
+
+Dashes (`-`) in your pattern types, pattern subtypes or pattern names will be replaced with spaces. For example, if you want a pattern to be displayed in the drop-down as "Hamburger Navigation" and you're using the Mustache PatternEngine you should name it `hamburger-navigation.mustache`.
+
+## Pattern Type Naming Conventions
+
+You do **not** have to use the Atomic Design naming convention when organizing your patterns. You can name your pattern types whatever you like and use as many or as few as you like. For example, you could use the pattern types Nachos, Tacos, and Burritos instead of Atoms, Molecules, and Organisms.
+
+## Ordering
+
+By default, pattern types, pattern subtypes and patterns are ordered alphabetically. If you want more control over their ordering please refer to "[Reorganizing Patterns](/docs/reorganizing-patterns/)."
+
+## Deeper Nesting
+
+Node versions support nesting of folders under `patternSubtype`. For example, you may want to organize your [pattern documentation](/docs/documenting-patterns/), pattern, Sass files and [pseudo-patterns](/docs/using-pseudo-patterns/) in one directory like so:
+
+ - molecules/
+ - blocks/
+ - media-block/
+ - media-block.md
+ - media-block.mustache
+ - media-block.scss
+ - media-block~variant1.json
+ - media-block~variant2.json
+
+In this example the `media-block/` directory is ignored for the purposes of generating breadcrumbs and navigation in the Pattern Lab front-end but the documentation, pattern and pseudo-patterns are still rendered.
+
+Folders can be nested under `media-block/` if desired but this is discouraged because of possible collisions when using the [shorthand partial syntax](/docs/including-patterns/).
diff --git a/packages/docs/src/docs/pattern-parameters.md b/packages/docs/src/docs/pattern-parameters.md
new file mode 100644
index 000000000..8aea3eca8
--- /dev/null
+++ b/packages/docs/src/docs/pattern-parameters.md
@@ -0,0 +1,105 @@
+---
+title: Using Pattern Parameters
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Using Pattern Parameters
+ key: patterns
+ order: 150
+---
+
+**Important:** Pattern parameters are supported by the Node Mustache PatternEngines. Other template languages provide better solutions to this problem.
+
+Pattern parameters are a **simple** mechanism for replacing Mustache variables in an included pattern. They are limited to replacing variables in the included pattern and **only** the included pattern. They are especially useful when including a single pattern multiple times in a molecule, template, or page and you want to supply unique data to that pattern each time it's included. Pattern parameters **do not** currently support the following:
+
+- sub-lists (_e.g. iteration of a section_),
+- long strings of text (_can be unwieldy_)
+- modifying/replacing variables in patterns included _within_ the targeted pattern
+
+Pattern parameters are Pattern Lab-specific, have no relationship to Mustache, and are implemented outside of Mustache. Learn more about pattern parameters:
+
+- [The Pattern Parameter Syntax](#pattern-parameter-syntax)
+- [Adding Pattern Parameters to Your Pattern Partial](#adding-pattern-parameters)
+- [Toggling Sections with Pattern Parameters](#toggling-sections)
+
+## The Pattern Parameter Syntax
+
+The attributes listed in the pattern parameters need to match Mustache variable names in your pattern. The values listed for each attribute will replace the Mustache variables. For example:
+
+ {% raw %}{{> patternType-pattern(attribute1: value, attribute2: "value string") }}{% endraw %}
+
+Again, pattern parameters are a simple find and replace of Mustache variables with the supplied values.
+
+## Adding Pattern Parameters to Your Pattern Partial
+
+Let's look at a simple example for how we might use pattern parameters. First we'll set-up a pattern that might be included multiple times. We'll make it a simple "message" pattern with a single Mustache variable of `message`.
+
+```html
+{% raw %}{{ message }}{% endraw %}
+```
+
+We'll organize it under Atoms > Global and call it "message" so it'll have the pattern partial of `atoms-message`.
+
+Now let's create a pattern that includes our message pattern partial multiple times. It might look like this.
+
+```html
+
+ {% raw %}{{> atoms-message }}{% endraw %}
+
+ A bunch of extra information
+
+ {% raw %}{{> atoms-message }}{% endraw %}
+
+```
+
+Using `data.json` or a pattern-specific JSON file we wouldn't be able to supply separate messages to each pattern partial. For example, if we defined `message` in our `data.json` as "this is an alert" then "this is an alert" would show up twice when our parent pattern was rendered.
+
+Instead we can use pattern parameters to supply unique messages for each instance. So let's show what that would look like:
+
+```html
+{% raw %}
+
+ {{> atoms-message(message: "this is an alert message") }}
+
+ A bunch of extra information
+
+ {{> atoms-message(message: "this is an informational message") }}
+
+{% endraw %}
+```
+
+Now each pattern would have its very own message.
+
+## Toggling Sections with Pattern Parameters
+
+While pattern parameters are not a one-to-one match for Mustache they do offer the ability to toggle sections of content. For example we might have the following in a generic header pattern called `organisms-header`:
+
+```html
+{% raw %}
+
+ {{# emergency }}
+
Emergency!!!
+ {{/ emergency }}
+
+
+{% endraw %}
+```
+
+We call the header pattern in a template like so:
+
+```
+{% raw %}{{> organisms-header }}{% endraw %}
+... stuff ...
+```
+
+By default, if we don't have an `emergency` attribute in our `data.json` or the pattern-specific JSON file for the template the emergency alert will never be rendered. Instead of modifying either of those two files we can use a boolean pattern param to show it instead like so:
+
+```
+{% raw %}{{> organisms-header(emergency: true) }}{% endraw %}
+... stuff ...
+```
+
+Again, because pattern parameters aren't leveraging Mustache this may not fit the normal Mustache workflow. We still wanted to offer a way to quickly turn on and off sections of an included pattern.
diff --git a/packages/docs/src/docs/pattern-pseudo-patterns.md b/packages/docs/src/docs/pattern-pseudo-patterns.md
new file mode 100644
index 000000000..6018113a8
--- /dev/null
+++ b/packages/docs/src/docs/pattern-pseudo-patterns.md
@@ -0,0 +1,73 @@
+---
+title: Using Pseudo-Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Using Pseudo-Patterns
+ key: patterns
+ order: 140
+---
+
+Pseudo-patterns give developers and designers the ability to quickly build multiple unique variants of an existing pattern. This feature is especially useful when developing template- and page-style patterns or showing the states of other patterns.
+
+## The Pseudo-Pattern File Naming Convention
+
+Pseudo-patterns are similar to [pattern-specific JSON files](/docs/creating-pattern-specific-values/) but are hinted in such a way that a developer can build a variant of an existing pattern. The basic syntax:
+
+ patternName~pseudo-pattern-name.json
+
+The tilde (`~`) and `.json` file extension are the hints that Pattern Lab uses to determine that this is a pseudo-pattern. The `patternName` tells Pattern Lab which existing pattern it should use when rendering the pseudo-pattern. The JSON file itself works exactly like the [pattern-specific JSON file](/docs/creating-pattern-specific-values/). It has the added benefit that the pseudo-pattern will also inherit any values from the existing pattern's pattern-specific JSON file.
+
+From a navigation and naming perspective `patternName` and `pseudoPatternName` will be combined.
+
+## Adding Pseudo-Patterns to Your Project
+
+Adding a pseudo-pattern is as simple as naming it correctly and following the [pattern-specific JSON file](/docs/creating-pattern-specific-values/) instructions for organizing its content. Let's look at a simple example where we want to show an emergency notification on our homepage Mustache template. Our `03-templates/` directory might look like this:
+
+ article.mustache
+ blog.mustache
+ homepage.mustache
+
+Our `homepage.mustache` template might look like this:
+
+```html
+{% raw %}
+
+ {{# emergency }}
+
Oh Noes! Emergency!
+ {{/ emergency }} { ...a bunch of other content... }
+
+{% endraw %}
+```
+
+If our `_data.json` file doesn't give a value for `emergency` that section will never show up when `homepage.mustache` is rendered. Obviously we'd need to show _both_ the regular and emergency states of the homepage but we don't want to duplicate the entire `homepage.mustache` template. That would be a maintenance nightmare. So let's add our pseudo-pattern:
+
+```
+article.mustache
+blog.mustache
+homepage.mustache
+homepage~emergency.json
+```
+
+In our pseudo-pattern, `00-homepage~emergency.json`, we add our `emergency` attribute:
+
+```javascript
+{% raw %}{
+ "emergency": true
+}{% endraw %}
+```
+
+Now when we generate our site we'll have our homepage template rendered twice. Once as the regular template and once as a pseudo-pattern showing the emergency section. Note that the pseudo-pattern will show up in our navigation as `Homepage Emergency`.
+
+## Using Pseudo-Patterns as Pattern Includes
+
+By default, pseudo-patterns **cannot** be used as pattern includes. The data included in the pseudo-pattern, the bit that actually controls the magic, cannot be accessed when rendering the pattern include.
+
+## Re-ordering Pseudo-Patterns
+
+To learn how to re-order pseudo-patterns, check the documentation for [Reorganizing Patterns](/docs/reorganizing-patterns/).
+
+## Documenting Pseudo-Patterns
+
+To learn how to document pseudo-patterns, check the documentation for [Documenting Patterns](/docs/documenting-patterns/) to learn more.
diff --git a/packages/docs/src/docs/pattern-reorganizing.md b/packages/docs/src/docs/pattern-reorganizing.md
new file mode 100644
index 000000000..05978c80d
--- /dev/null
+++ b/packages/docs/src/docs/pattern-reorganizing.md
@@ -0,0 +1,50 @@
+---
+title: Reorganizing Patterns
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Reorganizing Patterns
+ key: patterns
+ order: 80
+---
+
+By default, the Node version of Pattern Lab organizes pattern types, pattern subtypes, and patterns alphabetically when displaying them in the drop-down navigation, pattern subtype "view all" pages, and the "all" style guide. This may not meet your needs. You can re-order pattern types, pattern subtypes and patterns by prefixing them with two digit numbers.
+
+For example, we'll look at how we can re-organize patterns. Using alphabetical ordering the `lists` pattern subtype in `atoms` looks like:
+
+```
+definition.mustache
+ordered.mustache
+unordered.mustache
+```
+
+This is also the order they'll show up in the drop-down navigation. Because you rarely need to see the definition list pattern maybe you want to have it show up last in the navigation. To re-order the patterns just add numbers to the beginning:
+
+```
+01-ordered.mustache
+02-unordered.mustache
+03-definition.mustache
+```
+
+You may want to put some space between the numbers just in case you want to further re-order and not touch the other patterns. For example, a better default ordering might be:
+
+```
+01-ordered.mustache
+05-unordered.mustache
+10-definition.mustache
+```
+
+The numbers will not show up when Pattern Lab displays the name of the pattern in the drop-down navigation. They're simply a re-ordering mechanism.
+
+##Re-ordering Pseudo-Patterns
+
+The rules for re-ordering [pseudo-patterns](/docs/pattern-pseudo-patterns.html) are slightly different than normal patterns. The numbers go **after** the tilde sign (`~`) rather than at the beginning of the file name. For instance:
+
+```
+- pattern.mustache
+- pattern.yml
+- pattern~01-variation2.yml
+- pattern~02-variation3.yml
+- pattern~03-variation1.yml
+```
diff --git a/packages/docs/src/docs/pattern-states.md b/packages/docs/src/docs/pattern-states.md
new file mode 100644
index 000000000..ec0aee7f6
--- /dev/null
+++ b/packages/docs/src/docs/pattern-states.md
@@ -0,0 +1,53 @@
+---
+title: Using Pattern States
+tags:
+ - docs
+category: patterns
+eleventyNavigation:
+ title: Using Pattern States
+ key: patterns
+ order: 160
+---
+
+Pattern states provide your team and client a simple visual of the current state of patterns in Pattern Lab. Pattern states can track progress of a pattern from development, through client review, to completion or they can be used to give certain patterns specific classes. It's important to note that the state of a pattern can be influenced by its pattern partials.
+
+## The Default Pattern States
+
+Pattern Lab comes with the following default pattern states:
+
+- **inprogress**: pattern is in development or being worked upon. a red dot.
+- **inreview**: pattern is ready for a client to look at and comment upon. a yellow dot.
+- **complete**: pattern is ready to be moved to production. a green dot.
+
+Any pattern that includes a pattern partial that has a lower pattern state will inherit that state. For example, a pattern with the state of `inreview` that includes a pattern partial with the state of `inprogress` will have its state overridden and set to `inprogress`. It will not change to `inreview` until the pattern partial has a state of `inreview` or `complete`.
+
+## Giving Patterns a State
+
+Giving patterns a state is accomplished by setting the `state` frontmatter key on any pattern's companion `.md` file. Consider this media block pattern:
+
+```
+./source/_patterns/molecules/blocks/media-block.mustache
+```
+
+We would create or edit a file in the same location, calling it `media-block.md`:
+
+```
+---
+state: inreview
+---
+The media block consists of...
+```
+
+## Adding Customized States
+
+The three default states included with Pattern Lab might not be enough for everyone. To add customized states you should modify your own CSS files. **DO NOT** modify pattern states in `public/`. You cannot be assured these files won't be overwritten.
+
+You can use the following as your CSS template for new pattern states:
+
+```css
+{% raw %}.newpatternstate:before {
+ color: #B10DC9 !important;
+}{% endraw %}
+```
+
+Place this class inside `./source/css/pattern-scaffolding.css` to separate it from your css. Then add `newpatternstate` to your patterns' markdown `state` to have the new look show up. If you want to add it to the cascade of the default patterns you can modify `./patternlab-config.json`. Simply add your new pattern state to the `patternStateCascade` array.
diff --git a/packages/docs/src/docs/php-compile.md b/packages/docs/src/docs/php-compile.md
new file mode 100644
index 000000000..338e96ddb
--- /dev/null
+++ b/packages/docs/src/docs/php-compile.md
@@ -0,0 +1,14 @@
+---
+title: php-compile
+tags:
+ - demo-content
+ - code
+ - blog
+eleventyNavigation:
+ key: php-compile
+ order: 300
+---
+
+The PHP version of Pattern Lab is being deprecated in favor of a new unified Pattern Lab core. The PHP docs for this topic can be viewed here.
+
+The current version of PL's website includes full docs for PHP. The new version of PL runs exclusively through Node, but for PHP projects will compile PHP with a PHP renderer.
diff --git a/packages/docs/src/feed.njk b/packages/docs/src/feed.njk
new file mode 100644
index 000000000..11c50e48f
--- /dev/null
+++ b/packages/docs/src/feed.njk
@@ -0,0 +1,28 @@
+---
+permalink: '/feed.xml'
+---
+
+
+ {{ site.name }}
+
+
+
+ {{ collections.posts | rssLastUpdatedDate }}
+ {{ site.url }}
+
+ {{ site.authorName }}
+ {{ site.authorEmail }}
+
+ {% for post in collections.posts %}
+ {% set absolutePostUrl %}{{ site.url }}{{ post.url | url }}{% endset %}
+
+ {{ post.data.title }}
+
+ {{ post.date | rssDate }}
+ {{ absolutePostUrl }}
+
+
+ {% endfor %}
+
diff --git a/packages/docs/src/filters/date-filter.js b/packages/docs/src/filters/date-filter.js
new file mode 100644
index 000000000..5206da52f
--- /dev/null
+++ b/packages/docs/src/filters/date-filter.js
@@ -0,0 +1,15 @@
+// Stolen from https://stackoverflow.com/a/31615643
+const appendSuffix = n => {
+ var s = ['th', 'st', 'nd', 'rd'],
+ v = n % 100;
+ return n + (s[(v - 20) % 10] || s[v] || s[0]);
+};
+
+module.exports = function dateFilter(value) {
+ const dateObject = new Date(value);
+
+ const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+ const dayWithSuffix = appendSuffix(dateObject.getDate());
+
+ return `${dayWithSuffix} ${months[dateObject.getMonth()]} ${dateObject.getFullYear()}`;
+};
diff --git a/packages/docs/src/filters/markdown-filter.js b/packages/docs/src/filters/markdown-filter.js
new file mode 100644
index 000000000..530c2f571
--- /dev/null
+++ b/packages/docs/src/filters/markdown-filter.js
@@ -0,0 +1,9 @@
+const markdownIt = require('markdown-it')({
+ html: true,
+ breaks: true,
+ linkify: true
+});
+
+module.exports = function markdown(value) {
+ return markdownIt.render(value);
+};
diff --git a/packages/docs/src/filters/w3-date-filter.js b/packages/docs/src/filters/w3-date-filter.js
new file mode 100644
index 000000000..d31538da4
--- /dev/null
+++ b/packages/docs/src/filters/w3-date-filter.js
@@ -0,0 +1,5 @@
+module.exports = function w3cDate(value) {
+ const dateObject = new Date(value);
+
+ return dateObject.toISOString();
+};
diff --git a/packages/docs/src/images/1createpl.png b/packages/docs/src/images/1createpl.png
new file mode 100644
index 000000000..b92a451e0
Binary files /dev/null and b/packages/docs/src/images/1createpl.png differ
diff --git a/packages/docs/src/images/2choosedirectory.png b/packages/docs/src/images/2choosedirectory.png
new file mode 100644
index 000000000..11f331997
Binary files /dev/null and b/packages/docs/src/images/2choosedirectory.png differ
diff --git a/packages/docs/src/images/3chooseedition.png b/packages/docs/src/images/3chooseedition.png
new file mode 100644
index 000000000..7af97103a
Binary files /dev/null and b/packages/docs/src/images/3chooseedition.png differ
diff --git a/packages/docs/src/images/4choosestarterkit.png b/packages/docs/src/images/4choosestarterkit.png
new file mode 100644
index 000000000..4a7ef6a37
Binary files /dev/null and b/packages/docs/src/images/4choosestarterkit.png differ
diff --git a/packages/docs/src/images/5.png b/packages/docs/src/images/5.png
new file mode 100644
index 000000000..f7502ec4e
Binary files /dev/null and b/packages/docs/src/images/5.png differ
diff --git a/packages/docs/src/images/5areyouhappy.png b/packages/docs/src/images/5areyouhappy.png
new file mode 100644
index 000000000..43db88232
Binary files /dev/null and b/packages/docs/src/images/5areyouhappy.png differ
diff --git a/packages/docs/src/images/6.png b/packages/docs/src/images/6.png
new file mode 100644
index 000000000..f462b8db4
Binary files /dev/null and b/packages/docs/src/images/6.png differ
diff --git a/packages/docs/src/images/6settingup.png b/packages/docs/src/images/6settingup.png
new file mode 100644
index 000000000..6b4e3938e
Binary files /dev/null and b/packages/docs/src/images/6settingup.png differ
diff --git a/packages/docs/src/images/7.png b/packages/docs/src/images/7.png
new file mode 100644
index 000000000..4ee99b733
Binary files /dev/null and b/packages/docs/src/images/7.png differ
diff --git a/packages/docs/src/images/800x600.png b/packages/docs/src/images/800x600.png
new file mode 100644
index 000000000..d765b0574
Binary files /dev/null and b/packages/docs/src/images/800x600.png differ
diff --git a/packages/docs/src/images/createPL1.mp4 b/packages/docs/src/images/createPL1.mp4
new file mode 100644
index 000000000..d9686b649
Binary files /dev/null and b/packages/docs/src/images/createPL1.mp4 differ
diff --git a/packages/docs/src/images/favicon.ico b/packages/docs/src/images/favicon.ico
new file mode 100644
index 000000000..eee4aa78f
Binary files /dev/null and b/packages/docs/src/images/favicon.ico differ
diff --git a/packages/docs/src/images/icon-atom.svg b/packages/docs/src/images/icon-atom.svg
new file mode 100644
index 000000000..10bf0adf0
--- /dev/null
+++ b/packages/docs/src/images/icon-atom.svg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/images/icon-molecule.svg b/packages/docs/src/images/icon-molecule.svg
new file mode 100644
index 000000000..2dc151733
--- /dev/null
+++ b/packages/docs/src/images/icon-molecule.svg
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/images/icon-organism.svg b/packages/docs/src/images/icon-organism.svg
new file mode 100644
index 000000000..c12cc435b
--- /dev/null
+++ b/packages/docs/src/images/icon-organism.svg
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/images/icon-page.svg b/packages/docs/src/images/icon-page.svg
new file mode 100644
index 000000000..fe5751723
--- /dev/null
+++ b/packages/docs/src/images/icon-page.svg
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/images/icon-template.svg b/packages/docs/src/images/icon-template.svg
new file mode 100644
index 000000000..3aa6df78e
--- /dev/null
+++ b/packages/docs/src/images/icon-template.svg
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/docs/src/index.md b/packages/docs/src/index.md
new file mode 100644
index 000000000..aaa797e7d
--- /dev/null
+++ b/packages/docs/src/index.md
@@ -0,0 +1,4 @@
+---
+layout: home
+title: Create atomic design systems with Pattern Lab
+---
diff --git a/packages/docs/src/js/components/theme-toggle.js b/packages/docs/src/js/components/theme-toggle.js
new file mode 100644
index 000000000..7e93571a2
--- /dev/null
+++ b/packages/docs/src/js/components/theme-toggle.js
@@ -0,0 +1,98 @@
+// For syntax highlighting only
+const html = String.raw;
+
+class ThemeToggle extends HTMLElement {
+ constructor() {
+ super();
+
+ this.STORAGE_KEY = 'user-color-scheme';
+ this.COLOR_MODE_KEY = '--color-mode';
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ getCSSCustomProp(propKey) {
+ let response = getComputedStyle(document.documentElement).getPropertyValue(propKey);
+
+ // Tidy up the string if there’s something to work with
+ if (response.length) {
+ response = response.replace(/\'|"/g, '').trim();
+ }
+
+ // Return the string response by default
+ return response;
+ }
+
+ applySetting(passedSetting) {
+ let currentSetting = passedSetting || localStorage.getItem(this.STORAGE_KEY);
+
+ if (currentSetting) {
+ document.documentElement.setAttribute('data-user-color-scheme', currentSetting);
+ this.setButtonLabelAndStatus(currentSetting);
+ } else {
+ this.setButtonLabelAndStatus(this.getCSSCustomProp(this.COLOR_MODE_KEY));
+ }
+ }
+
+ toggleSetting() {
+ let currentSetting = localStorage.getItem(this.STORAGE_KEY);
+
+ switch (currentSetting) {
+ case null:
+ currentSetting =
+ this.getCSSCustomProp(this.COLOR_MODE_KEY) === 'dark' ? 'light' : 'dark';
+ break;
+ case 'light':
+ currentSetting = 'dark';
+ break;
+ case 'dark':
+ currentSetting = 'light';
+ break;
+ }
+
+ localStorage.setItem(this.STORAGE_KEY, currentSetting);
+
+ return currentSetting;
+ }
+
+ setButtonLabelAndStatus(currentSetting) {
+ this.modeToggleButton.innerText = `${
+ currentSetting === 'dark' ? 'Light' : 'Dark'
+ } theme`;
+ this.modeStatusElement.innerText = `Color mode is now "${currentSetting}"`;
+ }
+
+ render() {
+ this.innerHTML = html`
+
+ `;
+
+ this.afterRender();
+ }
+
+ afterRender() {
+ this.modeToggleButton = document.querySelector('.js-mode-toggle');
+ this.modeStatusElement = document.querySelector('.js-mode-status');
+
+ this.modeToggleButton.addEventListener('click', evt => {
+ evt.preventDefault();
+
+ this.applySetting(this.toggleSetting());
+ });
+
+ this.applySetting();
+ }
+}
+
+if ('customElements' in window) {
+ customElements.define('theme-toggle', ThemeToggle);
+}
+
+export default ThemeToggle;
diff --git a/packages/docs/src/js/primary-nav.js b/packages/docs/src/js/primary-nav.js
new file mode 100644
index 000000000..45b8a7d91
--- /dev/null
+++ b/packages/docs/src/js/primary-nav.js
@@ -0,0 +1,83 @@
+/*------------------------------------*\
+ #PRIMARY NAVIGATION
+\*------------------------------------*/
+/**
+ * Toggles active class on the primary nav item
+ * 1) Select all nav dropdown triggers and cycle through them
+ * 2) On click, find the nav dropdown trigger parent
+ * 3) If the nav dropdown trigger parent already has active class, remove it.
+ * 4) If the nav dropdown trigger parent does not have an active class, add it.
+ */
+(function() {
+ var navDropdownListItem = document.querySelector('.js-nav-dropdown');
+ var navLink = document.querySelectorAll('.js-nav-dropdown-trigger'); /* 1 */
+
+ for (i = 0; i < navLink.length; i++) {
+ /* 1 */
+
+ navLink[i].addEventListener('click', function(event) {
+ /* 2 */
+ event.preventDefault();
+ var navLinkParent = this.parentNode; /* 2 */
+
+ if (navLinkParent.classList.contains('is-active')) {
+ /* 3 */
+ navLinkParent.classList.remove('is-active');
+
+ this.setAttribute("aria-expanded", "false");
+ } else {
+ /* 4 */
+ navLinkParent.classList.add('is-active');
+
+ this.setAttribute("aria-expanded", "true");
+ }
+
+ });
+ }
+
+ /**
+ * Expose docs dropdown if on a docs page
+ */
+ if (window.location.href.indexOf('docs') > -1) {
+ navDropdownListItem.classList.add('is-active');
+ }
+
+ var pathName = location.pathname;
+
+ var navLinks = document.querySelectorAll('.c-tree-nav a');
+
+ for (i = 0; i < navLinks.length; i++) {
+ var subnavLink = navLinks[i].getAttribute('href');
+ if (subnavLink == pathName) {
+ navLinks[i].classList.add('is-active');
+ }
+ }
+
+ /**
+ * Toggles active class on the primary nav panel
+ * 1) Select all nav triggers and cycle through them
+ * 2) On click, find the nav panel within the header
+ * 3) If the navPanel already has active class, remove it on click.
+ * 4) If the navPanel does not have an active class, add it on click.
+ */
+ var navToggle = document.querySelectorAll('.js-nav-trigger'); /* 1 */
+
+ for (i = 0; i < navToggle.length; i++) {
+ /* 1 */
+
+ navToggle[i].addEventListener('click', function(event) {
+ /* 2 */
+ event.preventDefault();
+ var navToggleParent = this.parentNode; /* 2 */
+ var navPanel = navToggleParent.querySelector('.js-nav-panel'); /* 2 */
+
+ if (navPanel.classList.contains('is-active')) {
+ /* 3 */
+ navPanel.classList.remove('is-active');
+ } else {
+ /* 4 */
+ navPanel.classList.add('is-active');
+ }
+ });
+ }
+})();
diff --git a/packages/docs/src/pages/pages.json b/packages/docs/src/pages/pages.json
new file mode 100644
index 000000000..04d34aa3d
--- /dev/null
+++ b/packages/docs/src/pages/pages.json
@@ -0,0 +1,3 @@
+{
+ "layout": "layouts/page.njk"
+}
diff --git a/packages/docs/src/posts/pattern-lab-website-redesign.md b/packages/docs/src/posts/pattern-lab-website-redesign.md
new file mode 100644
index 000000000..0adfc23ac
--- /dev/null
+++ b/packages/docs/src/posts/pattern-lab-website-redesign.md
@@ -0,0 +1,14 @@
+---
+title: Pattern Lab website redesign
+description: The Pattern Lab website got a new facelift
+date: '2020-02-17'
+tags:
+ - blog
+url: '/posts/pattern-lab-website-redesign'
+---
+
+We're pleased to announce the Pattern Lab website is undergoing a much-needed facelift!
+
+There has been a lot of work on the Pattern Lab product that hasn't been reflected on the website. Over the coming months, we'll be updating the documentation to represent these improvements as well as bring home the new look and feel of the website.
+
+Stay tuned!
diff --git a/packages/docs/src/posts/posts.json b/packages/docs/src/posts/posts.json
new file mode 100644
index 000000000..d0428c43f
--- /dev/null
+++ b/packages/docs/src/posts/posts.json
@@ -0,0 +1,3 @@
+{
+ "layout": "layouts/post.njk"
+}
diff --git a/packages/docs/src/resources.md b/packages/docs/src/resources.md
new file mode 100644
index 000000000..15fca9770
--- /dev/null
+++ b/packages/docs/src/resources.md
@@ -0,0 +1,39 @@
+---
+layout: layouts/page-base.njk
+title: Resources
+---
+
+## Style guides and atomic design
+
+- [Styleguides.io](http://styleguides.io)
+- [Atomic Design by Brad Frost](http://atomicdesign.bradfrost.com)
+- [Atomic design article](http://bradfrost.com/blog/post/atomic-web-design/)
+- [A new link](http://google.com)
+
+## Pattern Lab Examples
+
+- [Pattern Lab Demo](http://demo.patternlab.io/)
+- [Frost Finery](http://patterns.frostfinery.com)
+- [Pittsburgh Food Bank](http://foodbank.bradfrostweb.com/patternlab/v10/)
+- [brianmuenzenmeyer.com](http://www.brianmuenzenmeyer.com/patternlab/public/)
+- [Altinn](http://altinn.github.io/DesignSystem/)
+
+## Articles
+
+- [Making And Maintaining Atomic Design Systems With Pattern Lab 2 by Brad Frost, Dave Olsen, Brian Muenzenmeyer](https://www.smashingmagazine.com/2016/07/building-maintaining-atomic-design-systems-pattern-lab/)
+- [Using Pattern Lab to Design Build and Maintain a (Jekyll) Website by Brian Muenzenmeyer](http://www.brianmuenzenmeyer.com/using-patternlab-to-design-build-and-maintain-a-website)
+- [Solving Problems with Pattern Lab - Small Team Workflow by Brian Muenzenmeyer](http://www.brianmuenzenmeyer.com/solving-problems-with-pattern-lab-small-team-workflow)
+- [Adding Common Gulp Tasks to Pattern Lab Node by Brian Muenzenmeyer](http://www.brianmuenzenmeyer.com/adding-common-gulp-tasks-to-pattern-lab-node)
+- [Why and How to Test Your Pattern Library: Testing Strategy by Jim Newbery](http://tinnedfruit.com/2016/09/12/why-and-how-to-test-your-pattern-library.html)
+- [Why and How to Test Your Pattern Library: Testing a Pattern Lab Project by Jim Newbery](http://tinnedfruit.com/2016/09/20/why-and-how-to-test-your-pattern-library-2.html)
+
+## Podcasts
+
+- [Dave Olsen talking Pattern Lab 2 on Non-Breaking Space Podcast](http://goodstuff.fm/nbsp/86)
+- [Brian Muenzenmeyer talking Pattern Lab 2 on the MS DEV SHOW Podcast](http://msdevshow.com/2015/12/pattern-lab-with-brian-muenzenmeyer/)
+
+## Presentations
+
+- [Screencast: A Quick Intro to Pattern Lab Node with Brian Muenzenmeyer](https://css-tricks.com/video-screencasts/149-quick-intro-pattern-lab-node-brian-muenzenmeyer/)
+- [Screencast: Migrating to Pattern Lab 3.0](https://www.youtube.com/watch?v=hIH-lI1QTns&t=1s)
+- [Code: Migrating to Pattern Lab 3.0](https://github.com/bmuenzenmeyer/pl-migrate-example)
diff --git a/packages/docs/src/scss/abstracts/_colors.scss b/packages/docs/src/scss/abstracts/_colors.scss
new file mode 100644
index 000000000..f1100a06d
--- /dev/null
+++ b/packages/docs/src/scss/abstracts/_colors.scss
@@ -0,0 +1,79 @@
+/*------------------------------------*\
+ #COLORS
+\*------------------------------------*/
+
+/**
+ * In this file, we take the literal colors from our palette (defined in variables.scss)
+ * and define them against variables that we can utilise anywhere throughout the project.
+ */
+
+
+
+
+
+/*------------------------------------*\
+ #GLOBAL TEXT COLOR
+\*------------------------------------*/
+
+/**
+ * Body text and background colors
+ */
+$color-text: $color-gray-93 !default;
+$color-text-bg: $color-white !default;
+
+/**
+ * Highlight colors
+ */
+$color-text-highlight: $color-gray-93;
+$color-text-highlight-bg: $color-gray-13;
+
+
+
+
+
+/*------------------------------------*\
+ #LINKS
+\*------------------------------------*/
+
+$color-links: $color-gray-73 !default;
+$color-links-hover: $color-gray-50!default;
+$color-links-active: $color-gray-93 !default;
+$color-links-visited: $color-gray-93 !default;
+
+
+
+
+
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+
+$color-btn-primary: $color-white !default;
+$color-btn-primary-bg: $color-gray-93 !default;
+$color-btn-primary-bg-hover: $color-gray-50 !default;
+$color-btn-primary-border: $color-gray-93 !default;
+
+$color-btn-secondary: $color-gray-93 !default;
+$color-btn-secondary-bg: $color-white !default;
+$color-btn-secondary-bg-hover: $color-gray-07 !default;
+$color-btn-secondary-border: $color-gray-93 !default;
+
+$color-btn-disabled: $color-gray-50 !default;
+$color-btn-disabled-bg: $color-gray-07 !default;
+
+
+
+
+
+/*------------------------------------*\
+ #FORMS
+\*------------------------------------*/
+
+$color-form: $color-gray-93 !default;
+$color-form-bg: $color-white !default;
+$color-form-border: $color-gray-73 !default;
+$color-form-border-focus: $color-gray-93 !default;
+$color-form-border-error: $color-utility-error !default;
+$color-form-label: $color-gray-93 !default;
+$color-form-info: $color-gray-73;
+$color-form-placeholder: $color-gray-50;
diff --git a/packages/docs/src/scss/abstracts/_mixins.scss b/packages/docs/src/scss/abstracts/_mixins.scss
new file mode 100644
index 000000000..a2425f6df
--- /dev/null
+++ b/packages/docs/src/scss/abstracts/_mixins.scss
@@ -0,0 +1,175 @@
+/*------------------------------------*\
+ #MIXINS
+\*------------------------------------*/
+
+/**
+ * Body Styles
+ * 1) Prevent Mobile Safari from scaling up text: https://blog.55minutes.com/2012/04/iphone-text-resizing/
+ */
+@mixin typographyBody() {
+ font-family: $font-primary;
+ font-size: $font-size-med-2;
+ font-weight: 500;
+ line-height: 1.6;
+ -webkit-text-size-adjust: 100%; /* 1 */
+}
+
+/**
+ * XL Type Styles
+ */
+@mixin typographyBodyLarge() {
+ font-size: $font-size-med-2;
+ line-height: $line-height-large;
+}
+
+/**
+ * XL Heading Styles
+ */
+@mixin typographyHeadingXl() {
+ font-weight: $font-weight-bold;
+ font-size: $font-size-large-2;
+ line-height: $line-height-med-2;
+
+ @media all and (min-width: $bp-med) {
+ font-size: $font-size-xl;
+ }
+}
+
+/**
+ * Large Heading Styles
+ */
+@mixin typographyHeadingLarge() {
+ font-size: $font-size-large;
+ font-weight: 700;
+ line-height: 1.6;
+}
+
+/**
+ * Medium 2 Heading Styles
+ */
+@mixin typographyHeadingMed2() {
+ font-size: $font-size-med-2;
+ font-weight: 700;
+ line-height: 1.2;
+}
+
+/**
+ * Medium Heading Styles
+ */
+@mixin typographyHeadingMed() {
+ font-size: $font-size-med;
+ font-weight: 700;
+ line-height: 1.2;
+}
+
+/*------------------------------------*\
+ #FOCUS
+\*------------------------------------*/
+
+@mixin focus() {
+ outline: 2px dotted $color-black;
+ outline-offset: 4px;
+}
+
+@mixin focusInverted() {
+ outline: 1px dotted $color-white;
+ outline-offset: 4px;
+}
+
+/*------------------------------------*\
+ #DECORATIVE
+\*------------------------------------*/
+
+@mixin textShadowEffect() {
+ position: relative;
+ z-index: 1;
+
+ &:after {
+ position: absolute;
+ left: 4px;
+ top: 4px;
+ z-index: 0;
+ content: attr(data-text);
+
+ background-image: radial-gradient(
+ $color-brand-purple 0%,
+ $color-brand-purple 60%,
+ transparent 60%
+ );
+ background-size: 4px 4px;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ z-index: -5;
+ display: block;
+ text-shadow: none;
+
+ @media all and (max-width: $bp-large) {
+ left: 2px;
+ top: 2px;
+ background-size: 2px 2px;
+ }
+ }
+}
+
+@mixin boxShadowEffect($color: 'green') {
+ @if $color == 'green' {
+ box-shadow: 6px 6px 0 $color-brand-green, 12px 12px 0 $color-brand-green-light;
+ } @else if $color == 'orange' {
+ box-shadow: 6px 6px 0 $color-brand-orange, 12px 12px 0 $color-brand-orange-light;
+ } @else {
+ box-shadow: 6px 6px 0 $color-brand-purple, 12px 12px 0 $color-brand-purple-light;
+ }
+}
+
+@mixin stripedBoxShadow($color: 'green') {
+ @if $color == 'green' {
+ background-image: repeating-linear-gradient(
+ 45deg,
+ $color-brand-green,
+ $color-brand-green 1px,
+ transparent 1px,
+ transparent 4px
+ );
+ } @else if $color == 'orange' {
+ background-image: repeating-linear-gradient(
+ 45deg,
+ $color-brand-orange,
+ $color-brand-orange 1px,
+ transparent 1px,
+ transparent 4px
+ );
+ } @else {
+ background-image: repeating-linear-gradient(
+ 45deg,
+ $color-brand-purple,
+ $color-brand-purple 1px,
+ transparent 1px,
+ transparent 4px
+ );
+ }
+}
+
+@mixin hideScrollbar() {
+ -webkit-overflow-scrolling: touch;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ scrollbar-width: none;
+ scrollbar-color: transparent;
+
+ &::-webkit-scrollbar {
+ height: var(--scrollbar-size);
+ width: var(--scrollbar-size);
+ }
+ &::-webkit-scrollbar-track {
+ background-color: var(--scrollbar-track-color);
+ }
+ &::-webkit-scrollbar-thumb {
+ background-color: var(--scrollbar-color);
+ /* Add :hover, :active as needed */
+ }
+ &::-webkit-scrollbar-thumb:vertical {
+ min-height: var(--scrollbar-minlength);
+ }
+ &::-webkit-scrollbar-thumb:horizontal {
+ min-width: var(--scrollbar-minlength);
+ }
+}
diff --git a/packages/docs/src/scss/abstracts/_typography.scss b/packages/docs/src/scss/abstracts/_typography.scss
new file mode 100644
index 000000000..fd42dfc3c
--- /dev/null
+++ b/packages/docs/src/scss/abstracts/_typography.scss
@@ -0,0 +1,10 @@
+/*------------------------------------*\
+ #BREAKPOINTS
+\*------------------------------------*/
+
+/**
+ * In this file, we take the literal colors from our palette and define them
+ * against variables that we can utilise anywhere throughout the project.
+ */
+
+ $body-font-size: $font-size-med;
\ No newline at end of file
diff --git a/packages/docs/src/scss/abstracts/_variables.scss b/packages/docs/src/scss/abstracts/_variables.scss
new file mode 100644
index 000000000..f722ef498
--- /dev/null
+++ b/packages/docs/src/scss/abstracts/_variables.scss
@@ -0,0 +1,192 @@
+/*------------------------------------*\
+ #VARIABLES
+\*------------------------------------*/
+
+/**
+ * CONTENTS
+ *
+ * COLORS
+ * Brand Colors...............Globally-available variables and config
+ * Neutral Colors.............Grayscale colors, including white and black
+ * Utility Colors.............Info, Warning, Error, Success
+ *
+ * TYPOGRAPHY
+ * Font Families..............The fonts used in the design system
+ * Sizing.....................Font sizing
+ *
+ * LAYOUT
+ * Max-widths.................Maximum layout container width
+ *
+
+ * SPACING
+ * Spacing defaults...........Spacing between elements
+ *
+ * BORDERS
+ * Border Width...............Border thicknesses
+ * Border Radius..............Border radius definitions
+ *
+ * ANIMATION
+ * Animation Speed............Transition/animation speed variables
+ * Animation easing...........Easing variables
+ *
+ * BREAKPOINTS
+ * Breakpoints................Global breakpoint definitions
+ */
+
+/*------------------------------------*\
+ #COLORS
+ \*------------------------------------*/
+
+/**
+ * Brand Colors
+ * 1) Brand=specific colors
+ */
+$color-brand-purple: #aa85ba;
+$color-brand-purple-dark: #22062e;
+$color-brand-purple-light: #f9f5fc;
+$color-brand-green: #7ec699;
+$color-brand-green-dark: #376548;
+$color-brand-green-light: #f4fdf6;
+$color-brand-orange: #eeb31b;
+$color-brand-orange-dark: #966d04;
+$color-brand-orange-light: #fef8ea;
+
+/**
+ * Neutral Colors
+ * 1) Neutral colors are grayscale values used throughout the UI
+ */
+$color-white: #fff;
+$color-gray-02: #f2f2f2;
+$color-gray-07: #eee;
+$color-gray-13: #ddd;
+$color-gray-27: #bbb;
+$color-gray-50: #808080;
+$color-gray-60: #666;
+$color-gray-73: #444;
+$color-gray-88: #1f1f1f;
+$color-gray-93: #131313;
+$color-black: #000;
+
+/**
+ * Utility Colors
+ * 1) Utility colors are colors used to provide feedback, such as alert messages,
+ * form validation, etc.
+ */
+$color-utility-info: #0192d0;
+$color-utility-info-light: #d3f2ff;
+$color-utility-error: #b12a0b;
+$color-utility-error-light: #fdded8;
+$color-utility-success: #03804d;
+$color-utility-success-light: #d4f3e6;
+$color-utility-warning: #a59b15;
+$color-utility-warning-light: #fffecf;
+
+/*------------------------------------*\
+ #TYPOGRAPHY
+\*------------------------------------*/
+
+/**
+ * Font Family
+ */
+$font-primary: neue-haas-grotesk-display, sans-serif;
+$font-secondary: monospace;
+
+/**
+ * Font Sizing
+ */
+$font-size-sm: 0.75rem;
+$font-size-sm-2: 0.85rem;
+$font-size-med: 1rem;
+$font-size-med-2: 1.2rem;
+$font-size-large: 2rem;
+$font-size-large-2: 2.6rem;
+$font-size-xl: 5rem;
+
+$font-weight-bold: 700;
+
+/**
+ * Line Height
+ */
+$line-height-sm: 0.8;
+$line-height-sm-2: 0.9;
+$line-height-med: 1;
+$line-height-med-2: 1.2;
+$line-height-large: 1.6;
+$line-height-xl: 1.8;
+
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+
+/**
+ * Max Width
+ */
+$l-max-width: 70rem !default;
+$l-linelength-width: 40rem !default;
+
+$l-sidebar-width: 18.75rem;
+
+/*------------------------------------*\
+ #SPACING
+\*------------------------------------*/
+
+/**
+ * Spacing and offsets
+ * 1) Used to space grids and body padding
+ */
+
+$spacing: 1rem;
+$spacing-small: round(0.5 * $spacing);
+$spacing-large: round(2 * $spacing);
+$spacing-xl: round(4 * $spacing);
+
+/*------------------------------------*\
+ #BORDERS
+\*------------------------------------*/
+
+/**
+ * Border
+ */
+$border-width: 1px;
+$border-width-thick: 0.5rem;
+
+/**
+ * Border radius
+ */
+$border-radius: 4px;
+
+/*------------------------------------*\
+ #ANIMATION
+\*------------------------------------*/
+
+/**
+ * Transition Speed
+ */
+$anim-fade-quick: 0.15s;
+$anim-fade-long: 0.4s;
+
+/**
+ * Transition Ease
+ */
+$anim-ease: ease-out;
+
+/*------------------------------------*\
+ #BREAKPOINTS
+\*------------------------------------*/
+
+/**
+ * Breakpoints used in media queries
+ * 1) These are not the only breakpoints used, but they provide a few defaults
+ */
+$bp-small: 28em;
+$bp-med: 47em;
+$bp-large: 60em;
+$bp-xl: 70em;
+
+:root {
+ --scrollbar-track-color: transparent;
+ --scrollbar-color: rgba(0, 0, 0, 0.2);
+
+ --scrollbar-size: 0.375rem;
+ --scrollbar-minlength: 1.5rem; /* Minimum length of scrollbar thumb (width of horizontal, height of vertical) */
+}
diff --git a/packages/docs/src/scss/base/_body.scss b/packages/docs/src/scss/base/_body.scss
new file mode 100644
index 000000000..897fa2846
--- /dev/null
+++ b/packages/docs/src/scss/base/_body.scss
@@ -0,0 +1,28 @@
+/*------------------------------------*\
+ #BODY
+\*------------------------------------*/
+
+/**
+ * HTML base styles
+ * 1) Set the html element's height to at least 100% of the viewport.
+ * This is used to achieve a sticky footer
+ */
+html {
+ min-height: 100vh; /* 1 */
+}
+
+/**
+ * Body base styles
+ * 1) Set the body element's height to at least 100% of the viewport.
+ * This is used to achieve a sticky footer
+ * 2) Prevent Mobile Safari from scaling up text: https://blog.55minutes.com/2012/04/iphone-text-resizing/
+ */
+body {
+ display: flex; /* 1 */
+ flex-direction: column; /* 1 */
+ min-height: 100vh; /* 1 */
+ @include typographyBody;
+ -webkit-text-size-adjust: 100%; /* 2 */
+ background-color: $color-white;
+ color: $color-gray-88;
+}
diff --git a/packages/docs/src/scss/base/_buttons.scss b/packages/docs/src/scss/base/_buttons.scss
new file mode 100644
index 000000000..31eca645a
--- /dev/null
+++ b/packages/docs/src/scss/base/_buttons.scss
@@ -0,0 +1,15 @@
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+
+/**
+ * Button and submit inputs reset
+ * 1) These should be styled using c-btn
+ */
+button {
+ cursor: pointer;
+
+ &:focus {
+ @include focus();
+ }
+}
diff --git a/packages/docs/src/scss/base/_forms.scss b/packages/docs/src/scss/base/_forms.scss
new file mode 100644
index 000000000..fca47c803
--- /dev/null
+++ b/packages/docs/src/scss/base/_forms.scss
@@ -0,0 +1,130 @@
+/*------------------------------------*\
+ #FORMS
+\*------------------------------------*/
+
+/**
+ * 1) Form element base styles
+ */
+
+/**
+ * Input placeholder text base styles
+ */
+::-webkit-input-placeholder {
+ color: $color-form-placeholder;
+}
+
+::-moz-placeholder {
+ color: $color-form-placeholder;
+}
+
+:-ms-input-placeholder {
+ color: $color-form-placeholder;
+}
+
+/**
+ * Fieldset base styles
+ */
+fieldset {
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+/**
+ * Legend base styles
+ */
+legend {
+ margin-bottom: 0.25rem;
+}
+
+/**
+ * Label base styles
+ */
+label {
+ display: block;
+ padding-bottom: 0.25rem;
+ color: $color-form-label;
+}
+
+/**
+ * Add font size 100% of form element and margin 0 to these elements
+ */
+button,
+input,
+select,
+textarea {
+ font-family: inherit;
+ font-size: $font-size-med;
+ margin: 0;
+}
+
+/**
+ * Text area base styles
+ */
+textarea {
+ resize: none;
+}
+
+/**
+ * Input and text area base styles
+ */
+input,
+textarea {
+ width: 100%;
+ padding: 0.5rem;
+ border: $border-width solid $color-form-border;
+ background: $color-form-bg;
+
+ &:focus {
+ border-color: $color-form-border-focus;
+ }
+}
+
+/**
+ * Remove webkit appearance styles from these elements
+ */
+input[type='text'],
+input[type='search'],
+input[type='search']::-webkit-search-cancel-button,
+input[type='search']::-webkit-search-decoration,
+input[type='url'],
+input[type='number'],
+textarea {
+ -webkit-appearance: none;
+}
+
+/**
+ * Checkbox and radio button base styles
+ */
+input[type='checkbox'],
+input[type='radio'] {
+ width: auto;
+ margin-right: 0.3rem;
+ border-color: $color-form-border;
+}
+
+/**
+ * Search input base styles
+ */
+input[type='search'] {
+ -webkit-appearance: none;
+ border-radius: 0;
+}
+
+/**
+ * Select
+ * 1) Remove default styling
+ */
+select {
+ display: block;
+ font-size: $font-size-med;
+ width: 100%;
+ border: $border-width solid $color-form-border;
+ padding: 0.5rem;
+ background: $color-form-bg;
+ color: $color-form;
+
+ &:focus {
+ border-color: $color-form-border-focus;
+ }
+}
diff --git a/packages/docs/src/scss/base/_headings.scss b/packages/docs/src/scss/base/_headings.scss
new file mode 100644
index 000000000..918271967
--- /dev/null
+++ b/packages/docs/src/scss/base/_headings.scss
@@ -0,0 +1,35 @@
+/*------------------------------------*\
+ #HEADINGS
+\*------------------------------------*/
+
+/**
+ * Heading 1 base styles
+ */
+h1 {
+ @include typographyHeadingXl();
+ position: relative;
+}
+
+/**
+ * Heading 2 base styles
+ */
+h2 {
+ @include typographyHeadingLarge();
+ position: relative;
+}
+
+/**
+ * Heading 3 base styles
+ */
+h3 {
+ @include typographyHeadingMed2();
+ position: relative;
+}
+
+/**
+ * Heading 4 base styles
+ */
+h4 {
+ @include typographyHeadingMed();
+ position: relative;
+}
diff --git a/packages/docs/src/scss/base/_links.scss b/packages/docs/src/scss/base/_links.scss
new file mode 100644
index 000000000..fca78f65b
--- /dev/null
+++ b/packages/docs/src/scss/base/_links.scss
@@ -0,0 +1,25 @@
+/*------------------------------------*\
+ #LINKS
+\*------------------------------------*/
+
+/**
+ * Link base styles
+ */
+a {
+ color: $color-links;
+ text-decoration: none;
+ transition: color $anim-fade-quick $anim-ease;
+
+ &:hover,
+ &:focus {
+ color: $color-links-hover;
+ }
+
+ &:focus {
+ @include focus();
+ }
+
+ &:active {
+ color: $color-links-active;
+ }
+}
diff --git a/packages/docs/src/scss/base/_lists.scss b/packages/docs/src/scss/base/_lists.scss
new file mode 100644
index 000000000..c7d5cab82
--- /dev/null
+++ b/packages/docs/src/scss/base/_lists.scss
@@ -0,0 +1,15 @@
+/*------------------------------------*\
+ #LISTS
+\*------------------------------------*/
+
+/**
+ * 1) List base styles
+ */
+
+ /**
+ * Remove list styles from unordered and ordered lists
+ */
+ol, ul {
+ list-style: none;
+
+}
diff --git a/packages/docs/src/scss/base/_main.scss b/packages/docs/src/scss/base/_main.scss
new file mode 100644
index 000000000..4d4049703
--- /dev/null
+++ b/packages/docs/src/scss/base/_main.scss
@@ -0,0 +1,23 @@
+/*------------------------------------*\
+ #MAIN ELEMENT
+\*------------------------------------*/
+
+/**
+ * Main element
+ */
+main {
+ display: block;
+ margin-top: 2rem;
+
+ @media all and (min-width: $bp-med) {
+ margin-top: 5rem;
+ }
+}
+
+.c-main--flush {
+ margin-top: 0;
+
+ @media all and (min-width: $bp-med) {
+ margin-top: 0;
+ }
+}
diff --git a/packages/docs/src/scss/base/_media.scss b/packages/docs/src/scss/base/_media.scss
new file mode 100644
index 000000000..1d73ebfc4
--- /dev/null
+++ b/packages/docs/src/scss/base/_media.scss
@@ -0,0 +1,13 @@
+/*------------------------------------*\
+ #MEDIA
+\*------------------------------------*/
+
+/**
+ * Responsive image styling
+ * 1) Allows for images to flex with varying screen size
+ */
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
diff --git a/packages/docs/src/scss/base/_reset.scss b/packages/docs/src/scss/base/_reset.scss
new file mode 100644
index 000000000..82c641215
--- /dev/null
+++ b/packages/docs/src/scss/base/_reset.scss
@@ -0,0 +1,25 @@
+/*------------------------------------*\
+ #RESET
+\*------------------------------------*/
+
+/**
+ * Border-Box http:/paulirish.com/2012/box-sizing-border-box-ftw/
+ */
+* {
+ box-sizing: border-box;
+}
+
+/**
+ * 1) Zero out margins and padding for elements
+ */
+html, body, div, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ol, ul, li, form, legend, label, table, header, footer, nav, section, figure {
+ margin: 0;
+ padding: 0;
+}
+
+/**
+ * 1) Set HTML5 elements to display: block
+ */
+header, footer, nav, section, article, figure {
+ display: block;
+}
diff --git a/packages/docs/src/scss/base/_table.scss b/packages/docs/src/scss/base/_table.scss
new file mode 100644
index 000000000..fa3215c54
--- /dev/null
+++ b/packages/docs/src/scss/base/_table.scss
@@ -0,0 +1,26 @@
+/*------------------------------------*\
+ #TABLES
+\*------------------------------------*/
+
+/**
+ * Table
+ */
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+}
+
+/**
+ * Table header cell
+ */
+th {
+ text-align: left;
+}
+
+/**
+ * Table row
+ */
+tr {
+ vertical-align: top;
+}
diff --git a/packages/docs/src/scss/base/_text.scss b/packages/docs/src/scss/base/_text.scss
new file mode 100644
index 000000000..bbea0b569
--- /dev/null
+++ b/packages/docs/src/scss/base/_text.scss
@@ -0,0 +1,84 @@
+/*------------------------------------*\
+ #TEXT
+\*------------------------------------*/
+
+/**
+ * Paragraph base styles
+ */
+p {
+ margin-bottom: $spacing;
+}
+
+/**
+ * Blockquote base styles
+ */
+blockquote {
+ font-style: italic;
+ border-left: 1px solid $color-gray-50;
+ color: $color-gray-50;
+ padding-left: 1rem;
+ margin-bottom: $spacing;
+}
+
+/**
+ * Horizontal rule base styles
+ */
+hr {
+ border: 0;
+ height: $border-width-thick;
+ background: $color-gray-13;
+ margin: 2rem 0;
+}
+
+/**
+ * Selection styles
+ */
+::-moz-selection {
+ color: $color-text-highlight;
+ background: $color-text-highlight-bg; /* Gecko Browsers */
+}
+
+::selection {
+ color: $color-text-highlight;
+ background: $color-text-highlight-bg; /* WebKit/Blink Browsers */
+}
+
+/**
+ * Code base styles
+ */
+code {
+ display: inline;
+ background: $color-brand-purple-light;
+ padding: 0.2rem;
+ line-height: 1.2;
+}
+
+/**
+ * Preformatted text base styles
+ */
+pre {
+ background: $color-gray-88;
+ padding: 2rem;
+ @include boxShadowEffect('green');
+ color: $color-white;
+ position: relative;
+ @include hideScrollbar();
+
+ /**
+ * Remove border from code within preformatted text block
+ */
+ code {
+ border: 0;
+ background: transparent;
+ color: inherit;
+ }
+}
+
+// /**
+// * Code with languages associated with them
+// * 1) Override Prism sysles for code blocks with language
+// */
+// code[class*='language-'],
+// pre[class*='language-'] {
+// font-family: monospace !important;
+// }
diff --git a/packages/docs/src/scss/components/_block-grid.scss b/packages/docs/src/scss/components/_block-grid.scss
new file mode 100644
index 000000000..6b48edacd
--- /dev/null
+++ b/packages/docs/src/scss/components/_block-grid.scss
@@ -0,0 +1,14 @@
+.c-block-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, 250px);
+ grid-gap: $spacing-large;
+ margin-bottom: $spacing-large;
+}
+
+.c-stacked-block {
+ // background: orange;
+}
+
+.c-stacked-block__description {
+ font-size: $font-size-med;
+}
diff --git a/packages/docs/src/scss/components/_buttons.scss b/packages/docs/src/scss/components/_buttons.scss
new file mode 100644
index 000000000..1f8d8cb9d
--- /dev/null
+++ b/packages/docs/src/scss/components/_buttons.scss
@@ -0,0 +1,47 @@
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+
+/**
+ *
+ * 1) Button or link that has functionality to it
+ */
+.c-btn {
+ font-family: $font-secondary;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border: $border-width solid $color-btn-primary-border;
+ background: $color-brand-green;
+ color: $color-black;
+ line-height: 1;
+ padding: 1rem 2rem;
+ border: 0;
+ text-align: center;
+ transition: all $anim-fade-quick $anim-ease;
+
+ &:hover,
+ &:focus {
+ background: $color-btn-primary-bg-hover;
+ }
+}
+
+.c-btn--inverted {
+ background: none;
+ border: 1px solid $color-gray-50;
+ color: $color-gray-27;
+}
+
+.c-btn--small {
+ padding: 1rem;
+}
+
+/*
+ * Button icon
+ */
+.c-btn__icon {
+ width: 1rem;
+ height: 1rem;
+ fill: $color-btn-primary;
+ transition: fill $anim-fade-quick $anim-ease;
+}
diff --git a/packages/docs/src/scss/components/_demo-list.scss b/packages/docs/src/scss/components/_demo-list.scss
new file mode 100644
index 000000000..e6b4eaf29
--- /dev/null
+++ b/packages/docs/src/scss/components/_demo-list.scss
@@ -0,0 +1,10 @@
+.c-demo-list {
+ display: grid;
+ grid-column-gap: 1rem;
+ grid-row-gap: 2rem;
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
+}
+
+.c-header-demo-page {
+ padding-bottom: 2rem;
+}
diff --git a/packages/docs/src/scss/components/_field.scss b/packages/docs/src/scss/components/_field.scss
new file mode 100644
index 000000000..eb2d65b76
--- /dev/null
+++ b/packages/docs/src/scss/components/_field.scss
@@ -0,0 +1,35 @@
+/*------------------------------------*\
+ #FIELDS
+\*------------------------------------*/
+
+/**
+ * 1) Consists of a label, form control, and an optional note about the field.
+ */
+ .c-field {
+ margin-bottom: $spacing-large;
+}
+
+/**
+ * Field label
+ */
+.c-field__label {
+ margin-bottom: 0.5rem;
+ font-size: $font-size-med;
+ font-weight: bold;
+}
+
+/**
+ * Field body
+ */
+.c-field__body {
+ position: relative;
+}
+
+/**
+ * Field note
+ */
+.c-field__note {
+ display: inline-block;
+ font-size: $font-size-sm;
+ color: $color-gray-50;
+}
\ No newline at end of file
diff --git a/packages/docs/src/scss/components/_footer-nav.scss b/packages/docs/src/scss/components/_footer-nav.scss
new file mode 100644
index 000000000..e851d4c10
--- /dev/null
+++ b/packages/docs/src/scss/components/_footer-nav.scss
@@ -0,0 +1,21 @@
+/*------------------------------------*\
+ #FOOTER NAV
+\*------------------------------------*/
+
+/**
+ * The nav inside the footer
+ */
+.c-footer-nav {
+ font-size: $font-size-sm-2;
+ margin-bottom: $spacing;
+
+ @media all and (min-width: $bp-med) {
+ display: flex;
+ }
+}
+
+.c-footer-nav__item {
+ @media all and (min-width: $bp-med) {
+ margin-right: $spacing-large;
+ }
+}
diff --git a/packages/docs/src/scss/components/_footer.scss b/packages/docs/src/scss/components/_footer.scss
new file mode 100644
index 000000000..e46bc7b03
--- /dev/null
+++ b/packages/docs/src/scss/components/_footer.scss
@@ -0,0 +1,22 @@
+/*------------------------------------*\
+ $FOOTER
+\*------------------------------------*/
+
+/**
+ * 1) Global block at the bottom of each page that contains a navigation and other information
+ */
+.c-footer {
+ padding: $spacing-large 0;
+}
+
+/**
+ * Footer note
+ * 1) Small paragraph of text in the footer
+ */
+ .c-footer__note {
+ font-size: $font-size-sm;
+
+ a {
+ text-decoration: underline;
+ }
+}
\ No newline at end of file
diff --git a/packages/docs/src/scss/components/_header.scss b/packages/docs/src/scss/components/_header.scss
new file mode 100644
index 000000000..bc5255b35
--- /dev/null
+++ b/packages/docs/src/scss/components/_header.scss
@@ -0,0 +1,87 @@
+/*------------------------------------*\
+ #HEADER
+\*------------------------------------*/
+
+/**
+ * Global block at the top of each page containing the navigation, logo, and other potential contents
+ */
+.c-header {
+ position: relative;
+ background: $color-gray-88;
+ color: $color-gray-27;
+ padding: $spacing;
+ @include hideScrollbar();
+
+ @media all and (min-width: $bp-large) {
+ padding: $spacing-large;
+ min-height: 100vh;
+ flex-direction: column;
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100vh;
+ overflow: auto;
+ width: $l-sidebar-width; //Because fixed position
+ }
+}
+
+/**
+ * Header inner
+ */
+.c-header__inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ @media all and (min-width: $bp-large) {
+ justify-content: flex-start;
+ align-items: flex-start;
+ flex-direction: column;
+ }
+}
+
+/**
+ * Header navigation button
+ * 1) Button used to toggle the navigation on/off on small screens
+ */
+.c-header__nav-btn {
+ margin-left: auto;
+
+ @media all and (min-width: $bp-large) {
+ display: none;
+ }
+}
+
+/**
+ * Header navigation conntainer
+ * 1) Contains the primary navigation and other possible patterns
+ */
+.c-header__nav-container {
+ display: none;
+
+ @media all and (min-width: $bp-large) {
+ display: block;
+ }
+}
+
+/**
+ * Active header nav container
+ */
+.c-header__nav-container.is-active {
+ display: block;
+ position: absolute;
+ background: $color-gray-88;
+ top: 100%;
+ left: 0;
+ width: 100%;
+ z-index: 5;
+ padding: $spacing;
+
+ @media all and (min-width: $bp-large) {
+ display: block;
+ position: static;
+ padding: 0;
+ margin-left: auto;
+ width: inherit;
+ }
+}
diff --git a/packages/docs/src/scss/components/_heading-permalink.scss b/packages/docs/src/scss/components/_heading-permalink.scss
new file mode 100644
index 000000000..d7ce2690d
--- /dev/null
+++ b/packages/docs/src/scss/components/_heading-permalink.scss
@@ -0,0 +1,38 @@
+/*------------------------------------*\
+ #HEADING PERMALINK
+\*------------------------------------*/
+
+/**
+ * Dynamically applied link icon
+ */
+
+.heading-permalink {
+ position: absolute;
+ top: -3px;
+ left: -20px;
+ display: block;
+ padding-right: 4px;
+
+ .c-text-passage & {
+ opacity: 0;
+ border-bottom: 0;
+ background: none;
+ transition: opacity 0.15s ease;
+
+ &:focus {
+ opacity: 1;
+ }
+ }
+
+ .c-text-passage h2:hover &,
+ .c-text-passage h2:focus &,
+ .c-text-passage h3:hover &,
+ .c-text-passage h3:focus & {
+ opacity: 1;
+ }
+}
+
+.heading-permalink__icon {
+ width: 16px;
+ height: 16px;
+}
diff --git a/packages/docs/src/scss/components/_hero.scss b/packages/docs/src/scss/components/_hero.scss
new file mode 100644
index 000000000..141aaa3a7
--- /dev/null
+++ b/packages/docs/src/scss/components/_hero.scss
@@ -0,0 +1,53 @@
+/*------------------------------------*\
+ #HERO
+\*------------------------------------*/
+
+.c-hero {
+ background-color: $color-brand-purple-light;
+ color: $color-black;
+ padding: 2rem 0;
+ margin-bottom: 2rem;
+}
+
+.c-hero__inner {
+ display: grid;
+ align-items: center;
+
+ @media all and (min-width: $bp-large) {
+ min-height: 60vh;
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+ }
+}
+
+.c-hero__body {
+ max-width: 47rem;
+}
+
+.c-hero__title {
+ color: $color-brand-purple-dark;
+ font-size: $font-size-large-2;
+ line-height: 1;
+ @include textShadowEffect();
+ margin-bottom: 1rem;
+
+ @media all and (min-width: $bp-large) {
+ font-size: 4.5rem;
+ }
+
+ @media all and (min-width: $bp-xl) {
+ font-size: 6rem;
+ }
+}
+
+.c-hero__description {
+ font-weight: bold;
+}
+
+.c-hero__instructions a {
+ text-decoration: underline;
+}
+
+.c-hero__code {
+ display: inline-block;
+}
diff --git a/packages/docs/src/scss/components/_icon.scss b/packages/docs/src/scss/components/_icon.scss
new file mode 100644
index 000000000..b94380c52
--- /dev/null
+++ b/packages/docs/src/scss/components/_icon.scss
@@ -0,0 +1,11 @@
+/*------------------------------------*\
+ #ICON
+\*------------------------------------*/
+
+/**
+ * 1) Small image that represents functionality
+ */
+.c-icon {
+ height: 16px;
+ width: 16px;
+}
diff --git a/packages/docs/src/scss/components/_logo.scss b/packages/docs/src/scss/components/_logo.scss
new file mode 100644
index 000000000..38381483f
--- /dev/null
+++ b/packages/docs/src/scss/components/_logo.scss
@@ -0,0 +1,70 @@
+/*------------------------------------*\
+ #LOGO
+\*------------------------------------*/
+
+/**
+ * Branding image or text of the site
+ */
+.c-logo {
+ @media all and (min-width: $bp-med) {
+ margin-bottom: $spacing-large;
+ }
+}
+
+/**
+ * Logo link
+ */
+.c-logo__link {
+ display: flex;
+ align-items: center;
+
+ &:focus {
+ @include focusInverted();
+ }
+}
+
+/**
+ * Logo image
+ */
+.c-logo__img {
+ display: block;
+ max-width: 2.4rem;
+ margin-right: 0.5rem;
+ animation: rotate 10s linear infinite;
+}
+
+/**
+ * Logo body
+ * 1) contains the logo text and meta info
+ */
+.c-logo__body {
+ position: relative;
+}
+
+/**
+ * Logo text
+ */
+.c-logo__text {
+ text-transform: lowercase;
+ font-weight: bold;
+ color: $color-white;
+}
+
+.c-logo__meta {
+ display: block;
+ padding-top: 0.2rem;
+ font-size: $font-size-sm;
+ color: $color-gray-27;
+ font-weight: 500;
+ position: absolute;
+ top: 100%;
+}
+
+@keyframes rotate {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/packages/docs/src/scss/components/_page-header.scss b/packages/docs/src/scss/components/_page-header.scss
new file mode 100644
index 000000000..822368f90
--- /dev/null
+++ b/packages/docs/src/scss/components/_page-header.scss
@@ -0,0 +1,30 @@
+/*------------------------------------*\
+ #PAGE HEADER
+\*------------------------------------*/
+/**
+ * 1) Container that consists of of a page header title and description
+ */
+.c-page-header {
+ margin-bottom: $spacing-large;
+}
+
+.c-page-header__kicker {
+ color: $color-gray-50;
+ margin-bottom: 0.5rem;
+}
+
+/**
+ * Page header title
+ */
+.c-page-header__title {
+ margin-bottom: $spacing;
+ @include textShadowEffect();
+}
+
+/**
+ * Page description
+ */
+.c-page-header__desc {
+ margin-top: 1rem;
+ margin-bottom: 2rem;
+}
diff --git a/packages/docs/src/scss/components/_primary-nav.scss b/packages/docs/src/scss/components/_primary-nav.scss
new file mode 100644
index 000000000..a7d4e43de
--- /dev/null
+++ b/packages/docs/src/scss/components/_primary-nav.scss
@@ -0,0 +1,42 @@
+/*------------------------------------*\
+ #PRIMARY NAVIGATION
+\*------------------------------------*/
+
+/**
+ * Primary navigation existing in the header and maybe the footer
+ */
+.c-primary-nav {
+ margin-left: auto;
+}
+
+/**
+ * Primary navigation list
+ */
+.c-primary-nav__list {
+ display: flex;
+}
+
+/**
+ * Primary navigation item
+ */
+.c-primary-nav__item {
+ margin-right: 1rem;
+}
+
+/**
+ * Primary navigation link
+ */
+.c-primary-nav__link {
+ display: block;
+ padding: 0.5rem 0;
+ transition: color 0.2s ease;
+
+ &:hover {
+ color: $color-white;
+ }
+
+ &:focus {
+ color: $color-white;
+ font-weight: bold;
+ }
+}
diff --git a/packages/docs/src/scss/components/_stacked-block-list.scss b/packages/docs/src/scss/components/_stacked-block-list.scss
new file mode 100644
index 000000000..885246efd
--- /dev/null
+++ b/packages/docs/src/scss/components/_stacked-block-list.scss
@@ -0,0 +1,12 @@
+/*------------------------------------*\
+ #STACKED BLOCK LIST
+\*------------------------------------*/
+
+/**
+ * Stacked block list item
+ */
+.c-stacked-block-list__item {
+ border-bottom: 1px solid $color-gray-27;
+ padding-bottom: 1rem;
+ margin-bottom: 2rem;
+}
diff --git a/packages/docs/src/scss/components/_stacked-block.scss b/packages/docs/src/scss/components/_stacked-block.scss
new file mode 100644
index 000000000..70d277eb4
--- /dev/null
+++ b/packages/docs/src/scss/components/_stacked-block.scss
@@ -0,0 +1,19 @@
+/*------------------------------------*\
+ #STACKED BLOCK
+\*------------------------------------*/
+
+/**
+ * Stacked block list item
+ */
+.c-stacked-block__title {
+ line-height: 1.2;
+ margin-bottom: 0.25rem;
+}
+
+/**
+ * Stacked block list item
+ */
+.c-stacked-block__kicker {
+ font-size: $font-size-sm-2;
+ color: $color-gray-50;
+}
diff --git a/packages/docs/src/scss/components/_table.scss b/packages/docs/src/scss/components/_table.scss
new file mode 100644
index 000000000..7e2b140d8
--- /dev/null
+++ b/packages/docs/src/scss/components/_table.scss
@@ -0,0 +1,53 @@
+/*------------------------------------*\
+ #TABLE
+\*------------------------------------*/
+
+/**
+ * 1) Data Table
+ */
+.c-table {
+ margin-bottom: 1rem;
+ min-width: 600px; /* 2 */
+}
+
+/**
+ * Table Header
+ */
+.c-table__header {
+ background: $color-gray-07;
+}
+
+/**
+ * Table Header Cell
+ */
+.c-table__header-cell {
+ padding: 0.8rem;
+}
+
+/**
+ * Table Row
+ */
+.c-table__row {
+ border-bottom: 1px solid $color-gray-07;
+}
+
+/**
+ * Table Cell
+ */
+.c-table__cell {
+ padding: 1.6rem 0.8rem;
+}
+
+/**
+ * Table Footer
+ */
+.c-table__footer {
+
+}
+
+/**
+ * Table Footer Cell
+ */
+.c-table__footer-cell {
+ padding: 0.8rem;
+}
diff --git a/packages/docs/src/scss/components/_text-passage.scss b/packages/docs/src/scss/components/_text-passage.scss
new file mode 100644
index 000000000..9f5fa2702
--- /dev/null
+++ b/packages/docs/src/scss/components/_text-passage.scss
@@ -0,0 +1,110 @@
+/*------------------------------------*\
+ #TEXT PASSAGE
+\*------------------------------------*/
+
+/**
+ * 1) A passage of text, including various components (i.e. article, blog post)
+ */
+.c-text-passage {
+ p {
+ margin-bottom: $spacing-large;
+ }
+
+ /**
+ * Link within the text passage
+ */
+ a {
+ border-bottom: 1px solid $color-black;
+ background: $color-brand-green-light;
+
+ &:hover,
+ &:focus {
+ color: $color-black;
+ border-bottom-color: $color-brand-green;
+ }
+ }
+
+ /**
+ * Blockquote within text passage
+ */
+ blockquote {
+ padding-left: 0.8rem;
+ border-left: 3px solid $color-gray-73;
+ color: $color-gray-50;
+ font-size: 1rem;
+ }
+
+ /**
+ * First-level heading within text passage
+ */
+ h1 {
+ margin-bottom: $spacing;
+ }
+
+ /**
+ * Second-level heading within text passage
+ */
+ h2 {
+ margin: 3rem 0 $spacing;
+ color: $color-gray-73;
+ }
+
+ /**
+ * Third-level heading within text passage
+ */
+ h3 {
+ margin: 3rem 0 $spacing;
+ }
+
+ /**
+ * Fourth-level heading within text passage
+ */
+ h4 {
+ margin: 3rem 0 $spacing;
+ }
+
+ /**
+ * Fifth-level heading within text passage
+ */
+ h5 {
+ margin: 3rem 0 $spacing;
+ }
+
+ /**
+ * Sixth-level heading within text passage
+ */
+ h6 {
+ margin: 3rem 0 $spacing;
+ }
+
+ /**
+ * Unordered list within text passage
+ */
+ ul {
+ list-style: disc;
+ margin-left: 1.25rem;
+ margin-bottom: $spacing-large;
+
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ /**
+ * Ordered list within text passage
+ */
+ ol {
+ list-style: decimal;
+ margin-left: $spacing;
+ margin-bottom: $spacing-large;
+
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ li {
+ margin-bottom: $spacing;
+ line-height: 1.6;
+ }
+}
diff --git a/packages/docs/src/scss/components/_tile-list.scss b/packages/docs/src/scss/components/_tile-list.scss
new file mode 100644
index 000000000..d5b90775d
--- /dev/null
+++ b/packages/docs/src/scss/components/_tile-list.scss
@@ -0,0 +1,31 @@
+/*------------------------------------*\
+ #TILE
+\*------------------------------------*/
+
+.c-tile-list {
+ display: grid;
+ grid-gap: $spacing-large;
+ margin-bottom: $spacing-xl;
+
+ @media all and (min-width: $bp-xl) {
+ grid-template-columns: 1fr 1fr;
+ }
+}
+
+.c-tile-list__item:nth-child(1) {
+ @media all and (min-width: $bp-xl) {
+ grid-row: span 2;
+ }
+}
+
+.c-tile-list__item:nth-child(2) {
+ @media all and (min-width: $bp-xl) {
+ grid-column: 2/3;
+ }
+}
+.c-tile-list__item:nth-child(3) {
+ @media all and (min-width: $bp-xl) {
+ grid-row: 2;
+ grid-column: 2/3;
+ }
+}
diff --git a/packages/docs/src/scss/components/_tile.scss b/packages/docs/src/scss/components/_tile.scss
new file mode 100644
index 000000000..67e0f01ac
--- /dev/null
+++ b/packages/docs/src/scss/components/_tile.scss
@@ -0,0 +1,76 @@
+/*------------------------------------*\
+ #TILE
+\*------------------------------------*/
+
+.c-tile {
+ position: relative;
+ z-index: 100;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.c-tile__body {
+ padding: 2rem;
+ position: relative;
+ z-index: 1;
+ flex: 1;
+
+ .c-tile--green & {
+ color: $color-brand-green-dark;
+ background: $color-brand-green-light;
+ }
+
+ .c-tile--orange & {
+ color: $color-brand-orange-dark;
+ background: $color-brand-orange-light;
+ }
+
+ .c-tile--purple & {
+ color: $color-brand-purple-dark;
+ background: $color-brand-purple-light;
+ }
+}
+
+.c-tile__shadow {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ right: -10px;
+ bottom: -10px;
+ z-index: 0;
+ @include stripedBoxShadow('green');
+
+ .c-tile--orange & {
+ @include stripedBoxShadow('orange');
+ }
+
+ .c-tile--purple & {
+ @include stripedBoxShadow('purple');
+ }
+}
+
+.c-tile__title {
+ color: inherit;
+}
+
+.c-tile__link {
+ color: inherit;
+
+ &:hover,
+ &:focus {
+ color: inherit;
+ text-decoration: underline;
+ }
+}
+
+.c-tile__description a {
+ color: inherit;
+ text-decoration: underline;
+
+ &:hover,
+ &:focus {
+ color: inherit;
+ text-decoration: none;
+ }
+}
diff --git a/packages/docs/src/scss/components/_tree-nav.scss b/packages/docs/src/scss/components/_tree-nav.scss
new file mode 100644
index 000000000..15aea9570
--- /dev/null
+++ b/packages/docs/src/scss/components/_tree-nav.scss
@@ -0,0 +1,95 @@
+/*------------------------------------*\
+ #TREE NAV
+\*------------------------------------*/
+
+/**
+ * 1) A tree nav is a nested accordion-style navigation, similar
+ * to operating system file manager navigations
+ */
+.c-tree-nav {
+}
+
+.c-tree-nav__link {
+ display: flex;
+ align-items: center;
+ margin-bottom: 1.2rem;
+ color: inherit;
+ font-weight: $font-weight-bold;
+ transition: color 0.2s ease;
+
+ &:hover,
+ &.is-active {
+ color: $color-white;
+ }
+
+ &:focus {
+ color: $color-white;
+ @include focusInverted();
+ }
+}
+
+.c-tree-nav__link--is-active {
+ color: $color-white;
+ font-weight: bold;
+}
+
+/**
+ * Subnav
+ */
+.c-tree-nav__subnav {
+ padding-left: 1rem;
+ border-left: 1px solid $color-gray-73;
+ margin-bottom: 1rem;
+ font-size: $font-size-med;
+ display: none;
+
+ .c-tree-nav__item.is-active & {
+ display: block;
+ }
+}
+
+.c-tree-nav__icon {
+ transition: transform $anim-fade-quick $anim-ease;
+
+ .c-tree-nav__item.is-active & {
+ transform: rotate(180deg);
+ }
+}
+
+.c-tree-nav__subnav-title {
+ font-weight: bold;
+ display: block;
+ margin-bottom: 1rem;
+}
+
+.c-tree-nav__subnav-link {
+ color: inherit;
+ display: block;
+ margin-bottom: 1rem;
+
+ &:hover,
+ &:focus,
+ &.is-active {
+ color: $color-white;
+ }
+
+ &:focus {
+ @include focusInverted();
+ }
+}
+
+.c-tree-nav__link--btn {
+ background: transparent;
+ border: 0;
+ padding: 0;
+ font-size: inherit;
+
+ svg {
+ fill: currentColor;
+ }
+}
+
+.c-tree-nav__subnav-link--heading {
+ font-weight: bold;
+ color: $color-white;
+}
diff --git a/packages/docs/src/scss/layout/_layout.scss b/packages/docs/src/scss/layout/_layout.scss
new file mode 100644
index 000000000..a6954f67a
--- /dev/null
+++ b/packages/docs/src/scss/layout/_layout.scss
@@ -0,0 +1,42 @@
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+
+/**
+ * Layout Container
+ * 1) Caps the width of the content to the maximum width
+ * and centers the container
+ */
+.l-container {
+ max-width: $l-max-width;
+ margin: 0 auto;
+ padding: 0 2rem;
+
+ @media all and (min-width: $bp-large) {
+ padding: 0 4rem;
+ }
+}
+
+/**
+ *
+ * 1) This narrow layout container is for lists, forms,
+ * and other singular objects that aren't dashboard-y
+ * kinds of displays
+ */
+.l-linelength-container {
+ max-width: $l-linelength-width;
+}
+
+/*------------------------------------*\
+ #GRID
+\*------------------------------------*/
+
+/**
+ * Grid Container
+ */
+.l-grid {
+ @media all and (min-width: $bp-large) {
+ display: grid;
+ grid-template-columns: $l-sidebar-width 1fr;
+ }
+}
diff --git a/packages/docs/src/scss/mixins/_dark-mode.scss b/packages/docs/src/scss/mixins/_dark-mode.scss
new file mode 100644
index 000000000..99e913d2d
--- /dev/null
+++ b/packages/docs/src/scss/mixins/_dark-mode.scss
@@ -0,0 +1,21 @@
+/**
+ * DARK MODE MIXIN
+ *
+ * A little wrapper that lets you define your dark mode custom
+ * properties in a way that supports the theme toggle web component
+ */
+@mixin dark-mode() {
+ @media (prefers-color-scheme: dark) {
+ :root {
+ --color-mode: 'dark';
+ }
+
+ :root:not([data-user-color-scheme]) {
+ @content;
+ }
+ }
+
+ [data-user-color-scheme='dark'] {
+ @content;
+ }
+}
diff --git a/packages/docs/src/scss/style.scss b/packages/docs/src/scss/style.scss
new file mode 100644
index 000000000..d6b95459d
--- /dev/null
+++ b/packages/docs/src/scss/style.scss
@@ -0,0 +1,71 @@
+/*------------------------------------*\
+ #TABLE OF CONTENTS
+\*------------------------------------*/
+/**
+ * ABSTRACTS..............................Declarations of Sass variables & mixins
+ * BASE...................................Default element styles
+ * LAYOUT.................................Layout-specific styles
+ * COMPONENTS.............................Component styles
+ * UTILITIES..............................Utility classes
+ */
+
+/*------------------------------------*\
+ #ABSTRACTS
+\*------------------------------------*/
+@import 'abstracts/variables';
+@import 'abstracts/mixins';
+@import 'abstracts/colors';
+@import 'abstracts/typography';
+
+/*------------------------------------*\
+ #BASE
+\*------------------------------------*/
+@import 'base/reset';
+@import 'base/body';
+@import 'base/links';
+@import 'base/lists';
+@import 'base/headings';
+@import 'base/forms';
+@import 'base/buttons';
+@import 'base/main';
+@import 'base/media';
+@import 'base/text';
+@import 'base/table';
+
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+@import 'layout/layout';
+
+/*------------------------------------*\
+ #COMPONENTS
+\*------------------------------------*/
+@import 'components/buttons';
+@import 'components/footer';
+@import 'components/footer-nav';
+@import 'components/header';
+@import 'components/heading-permalink';
+@import 'components/hero';
+@import 'components/logo';
+@import 'components/icon';
+@import 'components/page-header';
+@import 'components/primary-nav';
+@import 'components/tree-nav';
+@import 'components/text-passage';
+@import 'components/tile';
+@import 'components/tile-list';
+@import 'components/field';
+@import 'components/stacked-block';
+@import 'components/stacked-block-list';
+@import 'components/demo-list';
+@import 'components/block-grid';
+
+/*------------------------------------*\
+ #UTILITIES
+\*------------------------------------*/
+@import 'utilities/visibility';
+
+/*------------------------------------*\
+ #VENDOR
+\*------------------------------------*/
+@import 'vendor/prism';
diff --git a/packages/docs/src/scss/utilities/_visibility.scss b/packages/docs/src/scss/utilities/_visibility.scss
new file mode 100644
index 000000000..ab9998f07
--- /dev/null
+++ b/packages/docs/src/scss/utilities/_visibility.scss
@@ -0,0 +1,26 @@
+/*------------------------------------*\
+ #VISIBILITY CLASSES
+\*------------------------------------*/
+
+/**
+ * Is Hidden
+ * 1) Completely remove from the flow and screen readers.
+ */
+.u-is-hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+/**
+ * Is Visibly Hidden
+ * 1) Completely remove from the flow but leave available to screen readers.
+ */
+.u-is-vishidden {
+ position: absolute !important;
+ overflow: hidden;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+}
diff --git a/packages/docs/src/scss/vendor/_prism.scss b/packages/docs/src/scss/vendor/_prism.scss
new file mode 100644
index 000000000..1d63832a8
--- /dev/null
+++ b/packages/docs/src/scss/vendor/_prism.scss
@@ -0,0 +1,124 @@
+/* PrismJS 1.17.1
+https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+markup-templating+handlebars+php+json+scss+twig */
+/**
+ * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
+ * Based on https://github.com/chriskempson/tomorrow-theme
+ * @author Rose Pritchard
+ */
+
+code[class*='language-'],
+pre[class*='language-'] {
+ color: #ccc;
+ background: none;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: $font-size-med;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ // white-space: pre-wrap;
+ line-height: 1.5;
+
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+/* Code blocks */
+pre[class*='language-'] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+
+:not(pre) > code[class*='language-'],
+pre[class*='language-'] {
+ background: #2d2d2d;
+}
+
+/* Inline code */
+:not(pre) > code[class*='language-'] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+
+.token.comment,
+.token.block-comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: #999;
+}
+
+.token.punctuation {
+ color: #ccc;
+}
+
+.token.tag,
+.token.attr-name,
+.token.namespace,
+.token.deleted {
+ color: #e2777a;
+}
+
+.token.function-name {
+ color: #6196cc;
+}
+
+.token.boolean,
+.token.number,
+.token.function {
+ color: #f08d49;
+}
+
+.token.property,
+.token.class-name,
+.token.constant,
+.token.symbol {
+ color: #f8c555;
+}
+
+.token.selector,
+.token.important,
+.token.atrule,
+.token.keyword,
+.token.builtin {
+ color: #cc99cd;
+}
+
+.token.string,
+.token.char,
+.token.attr-value,
+.token.regex,
+.token.variable {
+ color: #7ec699;
+}
+
+.token.operator,
+.token.entity,
+.token.url {
+ color: #67cdcc;
+}
+
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+
+.token.entity {
+ cursor: help;
+}
+
+.token.inserted {
+ color: green;
+}
diff --git a/packages/docs/src/styleguide.njk b/packages/docs/src/styleguide.njk
new file mode 100644
index 000000000..66d64be12
--- /dev/null
+++ b/packages/docs/src/styleguide.njk
@@ -0,0 +1,112 @@
+---
+title: 'Styleguide'
+permalink: /styleguide/
+---
+
+{% extends 'layouts/base.njk' %}
+
+{# Intro content #}
+{% set introHeading = title %}
+
+{% block head %}
+
+{% endblock %}
+{% block content %}
+
+ {% include "partials/components/intro.njk" %}
+
+
+ Colours
+ Colour swatches with various values that you can copy.
+
+ {% for color in styleguide.colors() %}
+
+
+ {{ color.key }}
+
+ Value
+ {{ color.value }}
+ Sass function
+ get-color('{{ color.key }}')
+ Custom Property
+ var(--color-{{ color.key }})
+ Text util class
+ color-{{ color.key }}
+ Background util class
+ bg-{{ color.key }}
+
+
+ {% endfor %}
+
+ Fonts
+ Base — System stack
+
+ The quick brown fox jumps over the lazy fox
+ .font-base
+
+ Serif — Lora
+
+ The quick brown fox jumps over the lazy fox
+ .font-serif
+
+ Text sizes
+ Text sizes are available as standard classes or media query prefixed, such as lg:text-500.
+ {% for size in styleguide.sizes() %}
+ {{ size.value }} - text-{{ size.key }}
+ {% endfor %}
+ Spacing
+ There’s size ratio utilities that give you margin (gap-top, gap-bottom) and padding (pad-top, pad-left, pad-bottom).
+
Margin
+ Margin token classes that you can copy
+
+ {% for size in styleguide.sizes() %}
+
+ gap-top-{{ size.key }}
+
+ {% endfor %}
+
+ Padding
+ Padding token classes that you can copy
+ {% for size in styleguide.sizes() %}
+
+ pad-top-{{ size.key }}
+
+
+ pad-bottom-{{ size.key }}
+
+
+ pad-left-{{ size.key }}
+
+ {% endfor %}
+
+
+
+{% endblock %}
diff --git a/packages/docs/src/support.md b/packages/docs/src/support.md
new file mode 100644
index 000000000..914404ecb
--- /dev/null
+++ b/packages/docs/src/support.md
@@ -0,0 +1,12 @@
+---
+layout: layouts/post.njk
+title: Pattern Lab Support
+---
+
+## GitHub
+
+[GitHub](https://github.com/pattern-lab/) is the home base for the Pattern Lab project. You can explore the repository and submit/track [issues](https://github.com/pattern-lab/patternlab-node/issues) per the [contribution guidelines](https://github.com/pattern-lab/patternlab-node/blob/master/.github/CONTRIBUTING.md).
+
+## Gitter
+
+You can head over to [Pattern Lab's Gitter](https://gitter.im/pattern-lab/home) to chat with the Pattern Lab community. This is a great place to talk shop, ask quesitons, and get (and give!) help.
diff --git a/packages/docs/src/tags.njk b/packages/docs/src/tags.njk
new file mode 100644
index 000000000..a7cc28d69
--- /dev/null
+++ b/packages/docs/src/tags.njk
@@ -0,0 +1,36 @@
+---
+title: Tag Archive
+pagination:
+ data: collections
+ size: 1
+ alias: tag
+ filter:
+ - all
+ - nav
+ - post
+ - posts
+ - tagList
+ - postFeed
+ addAllPagesToCollections: true
+permalink: /tags/{{ tag }}/
+---
+
+{% extends 'layouts/base.njk' %}
+{% set pageType = 'Tag Archive' %}
+
+{# Intro content #}
+{% set introHeading %}Posts filed under “{{ tag }}”{% endset %}
+{% set introHeadingLevel = '2' %}
+
+{# Post list content #}
+{% set postListHeadingLevel = '2' %}
+{% set postListHeading = 'Posts' %}
+{% set postListItems = collections[tag] %}
+
+{% block content %}
+
+ {% include "partials/components/intro.njk" %}
+ {% include "partials/components/post-list.njk" %}
+ {% include "partials/components/pagination.njk" %}
+
+{% endblock %}
diff --git a/packages/docs/src/transforms/html-min-transform.js b/packages/docs/src/transforms/html-min-transform.js
new file mode 100644
index 000000000..7d0c8f99b
--- /dev/null
+++ b/packages/docs/src/transforms/html-min-transform.js
@@ -0,0 +1,14 @@
+const htmlmin = require('html-minifier');
+
+module.exports = function htmlMinTransform(value, outputPath) {
+ if (outputPath.indexOf('.html') > -1) {
+ let minified = htmlmin.minify(value, {
+ useShortDoctype: true,
+ removeComments: true,
+ collapseWhitespace: true,
+ minifyCSS: true
+ });
+ return minified;
+ }
+ return value;
+};
diff --git a/packages/docs/src/transforms/parse-transform.js b/packages/docs/src/transforms/parse-transform.js
new file mode 100644
index 000000000..541f04cf7
--- /dev/null
+++ b/packages/docs/src/transforms/parse-transform.js
@@ -0,0 +1,79 @@
+const jsdom = require('@tbranyen/jsdom');
+const {JSDOM} = jsdom;
+const minify = require('../utils/minify.js');
+const slugify = require('slugify');
+
+module.exports = function(value, outputPath) {
+ if (outputPath.endsWith('.html')) {
+ const DOM = new JSDOM(value, {
+ resources: 'usable'
+ });
+
+ const document = DOM.window.document;
+ const articleImages = [...document.querySelectorAll('main article img')];
+ const articleHeadings = [
+ ...document.querySelectorAll('main article h2, main article h3')
+ ];
+ const articleEmbeds = [...document.querySelectorAll('main article iframe')];
+
+ if (articleImages.length) {
+ articleImages.forEach(image => {
+ image.setAttribute('loading', 'lazy');
+
+ // If an image has a title it means that the user added a caption
+ // so replace the image with a figure containing that image and a caption
+ if (image.hasAttribute('title')) {
+ const figure = document.createElement('figure');
+ const figCaption = document.createElement('figcaption');
+
+ figCaption.innerHTML = image.getAttribute('title');
+
+ image.removeAttribute('title');
+
+ figure.appendChild(image.cloneNode(true));
+ figure.appendChild(figCaption);
+
+ image.replaceWith(figure);
+ }
+
+ });
+ }
+
+ if (articleHeadings.length) {
+ // Loop each heading and add a little anchor and an ID to each one
+ articleHeadings.forEach(heading => {
+ const headingSlug = slugify(heading.textContent.toLowerCase());
+ const anchor = document.createElement('a');
+
+ anchor.setAttribute('href', `#heading-${headingSlug}`);
+ anchor.classList.add('heading-permalink');
+ anchor.innerHTML = minify(`
+ permalink
+
+
+ `);
+
+ heading.setAttribute('id', `heading-${headingSlug}`);
+ heading.appendChild(anchor);
+ });
+ }
+
+ // Look for videos are wrap them in a container element
+ if (articleEmbeds.length) {
+ articleEmbeds.forEach(embed => {
+ if (embed.hasAttribute('allowfullscreen')) {
+ const player = document.createElement('div');
+
+ player.classList.add('video-player');
+
+ player.appendChild(embed.cloneNode(true));
+
+ embed.replaceWith(player);
+ }
+ });
+ }
+
+ return '\r\n' + document.documentElement.outerHTML;
+ }
+ return value;
+};
diff --git a/packages/docs/src/updates.md b/packages/docs/src/updates.md
new file mode 100644
index 000000000..09a9c2d73
--- /dev/null
+++ b/packages/docs/src/updates.md
@@ -0,0 +1,5 @@
+---
+layout: layouts/blog.njk
+title: Pattern Lab Updates
+description: The latest news about the Pattern Lab project
+---
diff --git a/packages/docs/src/utils/minify.js b/packages/docs/src/utils/minify.js
new file mode 100644
index 000000000..dd80e240c
--- /dev/null
+++ b/packages/docs/src/utils/minify.js
@@ -0,0 +1,3 @@
+module.exports = function minify(input) {
+ return input.replace(/\s{2,}/g, '').replace(/\'/g, '"');
+};
diff --git a/packages/edition-node-gulp/.gitignore b/packages/edition-node-gulp/.gitignore
index f5ffa0899..0679bd2b5 100644
--- a/packages/edition-node-gulp/.gitignore
+++ b/packages/edition-node-gulp/.gitignore
@@ -6,3 +6,4 @@ patternlab.json
Thumbs.db
.idea/
public
+dependencyGraph.json
diff --git a/packages/edition-node-gulp/.npmrc b/packages/edition-node-gulp/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/edition-node-gulp/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/edition-node-gulp/.nvmrc b/packages/edition-node-gulp/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/edition-node-gulp/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/edition-node-gulp/CHANGELOG.md b/packages/edition-node-gulp/CHANGELOG.md
index 2996991c6..5dd0a41e1 100644
--- a/packages/edition-node-gulp/CHANGELOG.md
+++ b/packages/edition-node-gulp/CHANGELOG.md
@@ -3,44 +3,344 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [2.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.6...@pattern-lab/edition-node-gulp@2.0.0-alpha.7) (2018-03-21)
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.9.2...v5.9.3) (2020-05-01)
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
-### Bug Fixes
-* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/9abb8ac))
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/337aa32))
+## [5.9.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.9.1...v5.9.2) (2020-04-24)
-
-# [2.0.0-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.5...@pattern-lab/edition-node-gulp@2.0.0-alpha.6) (2018-03-05)
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
-### Bug Fixes
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/1473cd5))
-### Features
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.9.0...v5.9.1) (2020-04-24)
-* **README:** Update for brevity and consistency ([65a2969](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/65a2969))
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
-
-# 2.0.0-alpha.5 (2018-03-02)
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.8.0...v5.9.0) (2020-04-24)
-### Bug Fixes
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
-* **package:** Regenerate package.lock and upgrade patternlab-node ([93ec49e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/93ec49e))
-* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/58beeb6))
-### Features
+
+## [5.7.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [5.4.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.4.1...v5.4.2) (2019-11-27)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [5.4.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.4.0...v5.4.1) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [5.3.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.3.2...v5.3.3) (2019-11-22)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+## [5.3.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.3.1...v5.3.2) (2019-11-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [5.3.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.3.0...v5.3.1) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **config:** add new default pattern export options ([a7487a0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/a7487a0681cb11e6f3c5c8eaefd62e5648ad5ea3))
+
+
+
+
+
+## [5.0.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.0.1...v5.0.2) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [5.0.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v5.0.0...v5.0.1) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+## [2.0.9](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.8...@pattern-lab/edition-node-gulp@2.0.9) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+## [2.0.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.7...@pattern-lab/edition-node-gulp@2.0.8) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+## [2.0.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.3...@pattern-lab/edition-node-gulp@2.0.4) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+## [2.0.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.2...@pattern-lab/edition-node-gulp@2.0.3) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+## [2.0.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.2-alpha.0...@pattern-lab/edition-node-gulp@2.0.2) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+# [2.0.0-beta.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-beta.0...@pattern-lab/edition-node-gulp@2.0.0-beta.2) (2019-02-09)
+
+
+### Bug Fixes
+
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/98dfadf))
+* version bump the PL gulp edition package that was also out of sync with the latest version published to NPM ([fb8b425](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/fb8b425))
+
+
+
+
+
+
+# [2.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.15...@pattern-lab/edition-node-gulp@2.0.0-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+
+
+
+
+# [2.0.0-alpha.15](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.14...@pattern-lab/edition-node-gulp@2.0.0-alpha.15) (2018-07-09)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+# [2.0.0-alpha.14](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.13...@pattern-lab/edition-node-gulp@2.0.0-alpha.14) (2018-07-06)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+# [2.0.0-alpha.13](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.12...@pattern-lab/edition-node-gulp@2.0.0-alpha.13) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/5ab3995))
+
+
+
+# [2.0.0-alpha.12](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.11...@pattern-lab/edition-node-gulp@2.0.0-alpha.12) (2018-07-05)
+
+### Bug Fixes
+
+* **gulp:** remove help command ([71575db](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/71575db))
+
+### Features
+
+* **serve:** change calling method ([f47217a](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/f47217a))
+
+
+
+# [2.0.0-alpha.11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.10...@pattern-lab/edition-node-gulp@2.0.0-alpha.11) (2018-05-19)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+# [2.0.0-alpha.10](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.9...@pattern-lab/edition-node-gulp@2.0.0-alpha.10) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+# [2.0.0-alpha.9](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.8...@pattern-lab/edition-node-gulp@2.0.0-alpha.9) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/edition-node-gulp
+
+
+
+# [2.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.7...@pattern-lab/edition-node-gulp@2.0.0-alpha.8) (2018-05-04)
+
+### Features
+
+* **API:** standardize v() and version() into a single call ([6309e69](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/6309e69))
+* **config:** add uikits config ([64c2e9f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/64c2e9f))
+* **config:** remove hard-coded base module path from pattern lab paths ([a4961bd](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/a4961bd))
+* **config:** simplify relative public paths ([812bab3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/812bab3))
+* **package:** add cli as a dependency ([a52b487](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/a52b487))
+* **uikits:** remove workshop for default config ([55570ff](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/55570ff))
+
+### BREAKING CHANGES
+
+* **API:** change `version()` to return a string representation of the version, removing `v()`
+
+
+
+# [2.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.6...@pattern-lab/edition-node-gulp@2.0.0-alpha.7) (2018-03-21)
+
+### Bug Fixes
+
+* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/9abb8ac))
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/337aa32))
+
+
+
+# [2.0.0-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/compare/@pattern-lab/edition-node-gulp@2.0.0-alpha.5...@pattern-lab/edition-node-gulp@2.0.0-alpha.6) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/1473cd5))
+
+### Features
+
+* **README:** Update for brevity and consistency ([65a2969](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/65a2969))
+
+
+
+# 2.0.0-alpha.5 (2018-03-02)
+
+### Bug Fixes
+
+* **package:** Regenerate package.lock and upgrade patternlab-node ([93ec49e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/93ec49e))
+* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/58beeb6))
+
+### Features
+
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node-gulp/commit/5eb2c11))
diff --git a/packages/edition-node-gulp/gulpfile.js b/packages/edition-node-gulp/gulpfile.js
index 8d8653659..62ddc007e 100644
--- a/packages/edition-node-gulp/gulpfile.js
+++ b/packages/edition-node-gulp/gulpfile.js
@@ -24,9 +24,10 @@ function build() {
}
function serve() {
- return patternlab
+ return patternlab.server
.serve({
cleanPublic: config.cleanPublic,
+ watch: true,
})
.then(() => {
// do something else when this promise resolves
@@ -34,11 +35,7 @@ function serve() {
}
gulp.task('patternlab:version', function() {
- patternlab.version();
-});
-
-gulp.task('patternlab:help', function() {
- patternlab.help();
+ console.log(patternlab.version());
});
gulp.task('patternlab:patternsonly', function() {
diff --git a/packages/edition-node-gulp/package-lock.json b/packages/edition-node-gulp/package-lock.json
deleted file mode 100644
index 65fbfdb09..000000000
--- a/packages/edition-node-gulp/package-lock.json
+++ /dev/null
@@ -1,2228 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "gulp": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
- "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
- "requires": {
- "archy": "1.0.0",
- "chalk": "1.1.3",
- "deprecated": "0.0.1",
- "gulp-util": "3.0.8",
- "interpret": "1.1.0",
- "liftoff": "2.5.0",
- "minimist": "1.2.0",
- "orchestrator": "0.3.8",
- "pretty-hrtime": "1.0.3",
- "semver": "4.3.6",
- "tildify": "1.2.0",
- "v8flags": "2.1.1",
- "vinyl-fs": "0.3.14"
- },
- "dependencies": {
- "ansi-gray": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "ansi-wrap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
- },
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
- },
- "array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
- },
- "array-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
- },
- "array-slice": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
- "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
- },
- "atob": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
- "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "requires": {
- "cache-base": "1.0.1",
- "class-utils": "0.3.6",
- "component-emitter": "1.2.1",
- "define-property": "1.0.0",
- "isobject": "3.0.1",
- "mixin-deep": "1.3.1",
- "pascalcase": "0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "1.0.2"
- }
- }
- }
- },
- "beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
- "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
- "requires": {
- "arr-flatten": "1.1.0",
- "array-unique": "0.3.2",
- "define-property": "1.0.0",
- "extend-shallow": "2.0.1",
- "fill-range": "4.0.0",
- "isobject": "3.0.1",
- "kind-of": "6.0.2",
- "repeat-element": "1.1.2",
- "snapdragon": "0.8.1",
- "snapdragon-node": "2.1.1",
- "split-string": "3.1.0",
- "to-regex": "3.0.2"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "1.0.2"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
- }
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "requires": {
- "collection-visit": "1.0.0",
- "component-emitter": "1.2.1",
- "get-value": "2.0.6",
- "has-value": "1.0.0",
- "isobject": "3.0.1",
- "set-value": "2.0.0",
- "to-object-path": "0.3.0",
- "union-value": "1.0.0",
- "unset-value": "1.0.0"
- }
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "requires": {
- "arr-union": "3.1.0",
- "define-property": "0.2.5",
- "isobject": "3.0.1",
- "static-extend": "0.1.2"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "clone": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
- "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8="
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "requires": {
- "map-visit": "1.0.0",
- "object-visit": "1.0.1"
- }
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
- },
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "requires": {
- "clone": "1.0.3"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "requires": {
- "is-descriptor": "1.0.2",
- "isobject": "3.0.1"
- }
- },
- "deprecated": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
- "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk="
- },
- "detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
- },
- "duplexer2": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
- "requires": {
- "readable-stream": "1.1.14"
- }
- },
- "end-of-stream": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
- "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
- "requires": {
- "once": "1.3.3"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "requires": {
- "debug": "2.6.9",
- "define-property": "0.2.5",
- "extend-shallow": "2.0.1",
- "posix-character-classes": "0.1.1",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.1",
- "to-regex": "3.0.2"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "requires": {
- "homedir-polyfill": "1.0.1"
- }
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "requires": {
- "assign-symbols": "1.0.0",
- "is-extendable": "1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "requires": {
- "is-plain-object": "2.0.4"
- }
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "requires": {
- "array-unique": "0.3.2",
- "define-property": "1.0.0",
- "expand-brackets": "2.1.4",
- "extend-shallow": "2.0.1",
- "fragment-cache": "0.2.1",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.1",
- "to-regex": "3.0.2"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "1.0.2"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
- }
- },
- "fancy-log": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
- "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
- "requires": {
- "ansi-gray": "0.1.1",
- "color-support": "1.1.3",
- "time-stamp": "1.1.0"
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "requires": {
- "extend-shallow": "2.0.1",
- "is-number": "3.0.0",
- "repeat-string": "1.6.1",
- "to-regex-range": "2.1.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
- }
- },
- "find-index": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
- "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ="
- },
- "findup-sync": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
- "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
- "requires": {
- "detect-file": "1.0.0",
- "is-glob": "3.1.0",
- "micromatch": "3.1.9",
- "resolve-dir": "1.0.1"
- }
- },
- "fined": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
- "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
- "requires": {
- "expand-tilde": "2.0.2",
- "is-plain-object": "2.0.4",
- "object.defaults": "1.1.0",
- "object.pick": "1.3.0",
- "parse-filepath": "1.0.2"
- }
- },
- "first-chunk-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
- "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04="
- },
- "flagged-respawn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
- "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c="
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
- },
- "for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "requires": {
- "map-cache": "0.2.2"
- }
- },
- "gaze": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
- "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
- "requires": {
- "globule": "0.1.0"
- }
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
- },
- "glob": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
- "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
- "requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "2.0.10",
- "once": "1.3.3"
- }
- },
- "glob-stream": {
- "version": "3.1.18",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
- "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
- "requires": {
- "glob": "4.5.3",
- "glob2base": "0.0.12",
- "minimatch": "2.0.10",
- "ordered-read-streams": "0.1.0",
- "through2": "0.6.5",
- "unique-stream": "1.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
- }
- }
- }
- },
- "glob-watcher": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
- "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
- "requires": {
- "gaze": "0.5.2"
- }
- },
- "glob2base": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
- "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
- "requires": {
- "find-index": "0.1.1"
- }
- },
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "requires": {
- "global-prefix": "1.0.2",
- "is-windows": "1.0.2",
- "resolve-dir": "1.0.1"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "requires": {
- "expand-tilde": "2.0.2",
- "homedir-polyfill": "1.0.1",
- "ini": "1.3.5",
- "is-windows": "1.0.2",
- "which": "1.3.0"
- }
- },
- "globule": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
- "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
- "requires": {
- "glob": "3.1.21",
- "lodash": "1.0.2",
- "minimatch": "0.2.14"
- },
- "dependencies": {
- "glob": {
- "version": "3.1.21",
- "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
- "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
- "requires": {
- "graceful-fs": "1.2.3",
- "inherits": "1.0.2",
- "minimatch": "0.2.14"
- }
- },
- "graceful-fs": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
- "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q="
- },
- "inherits": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
- "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js="
- },
- "minimatch": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
- "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
- "requires": {
- "lru-cache": "2.7.3",
- "sigmund": "1.0.1"
- }
- }
- }
- },
- "glogg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
- "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
- "requires": {
- "sparkles": "1.0.0"
- }
- },
- "graceful-fs": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
- "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
- "requires": {
- "natives": "1.1.1"
- }
- },
- "gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
- "requires": {
- "array-differ": "1.0.0",
- "array-uniq": "1.0.3",
- "beeper": "1.1.1",
- "chalk": "1.1.3",
- "dateformat": "2.2.0",
- "fancy-log": "1.3.2",
- "gulplog": "1.0.0",
- "has-gulplog": "0.1.0",
- "lodash._reescape": "3.0.0",
- "lodash._reevaluate": "3.0.0",
- "lodash._reinterpolate": "3.0.0",
- "lodash.template": "3.6.2",
- "minimist": "1.2.0",
- "multipipe": "0.1.2",
- "object-assign": "3.0.0",
- "replace-ext": "0.0.1",
- "through2": "2.0.3",
- "vinyl": "0.5.3"
- }
- },
- "gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
- "requires": {
- "glogg": "1.0.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "has-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "requires": {
- "sparkles": "1.0.0"
- }
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "requires": {
- "get-value": "2.0.6",
- "has-values": "1.0.0",
- "isobject": "3.0.1"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "homedir-polyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
- "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
- "requires": {
- "parse-passwd": "1.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.3.3",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "interpret": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
- "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
- },
- "is-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
- "requires": {
- "is-relative": "1.0.0",
- "is-windows": "1.0.2"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "6.0.2"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "6.0.2"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.2"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
- },
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "requires": {
- "is-extglob": "2.1.1"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-odd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
- "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
- "requires": {
- "is-number": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
- }
- }
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "requires": {
- "isobject": "3.0.1"
- }
- },
- "is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "requires": {
- "is-unc-path": "1.0.0"
- }
- },
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "requires": {
- "unc-path-regex": "0.1.2"
- }
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- },
- "lazy-cache": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
- "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
- "requires": {
- "set-getter": "0.1.0"
- }
- },
- "liftoff": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
- "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
- "requires": {
- "extend": "3.0.1",
- "findup-sync": "2.0.0",
- "fined": "1.1.0",
- "flagged-respawn": "1.0.0",
- "is-plain-object": "2.0.4",
- "object.map": "1.0.1",
- "rechoir": "0.6.2",
- "resolve": "1.5.0"
- }
- },
- "lodash": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
- "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE="
- },
- "lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY="
- },
- "lodash._basetostring": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
- "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U="
- },
- "lodash._basevalues": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
- "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc="
- },
- "lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
- },
- "lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw="
- },
- "lodash._reescape": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
- "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo="
- },
- "lodash._reevaluate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
- "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0="
- },
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
- },
- "lodash._root": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
- "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
- },
- "lodash.escape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
- "requires": {
- "lodash._root": "3.0.1"
- }
- },
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
- },
- "lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
- },
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
- "requires": {
- "lodash._getnative": "3.9.1",
- "lodash.isarguments": "3.1.0",
- "lodash.isarray": "3.0.4"
- }
- },
- "lodash.restparam": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
- "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU="
- },
- "lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
- "requires": {
- "lodash._basecopy": "3.0.1",
- "lodash._basetostring": "3.0.1",
- "lodash._basevalues": "3.0.0",
- "lodash._isiterateecall": "3.0.9",
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0",
- "lodash.keys": "3.1.2",
- "lodash.restparam": "3.6.1",
- "lodash.templatesettings": "3.1.1"
- }
- },
- "lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
- "requires": {
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0"
- }
- },
- "lru-cache": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
- "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI="
- },
- "make-iterator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz",
- "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "requires": {
- "object-visit": "1.0.1"
- }
- },
- "micromatch": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
- "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
- "requires": {
- "arr-diff": "4.0.0",
- "array-unique": "0.3.2",
- "braces": "2.3.1",
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "extglob": "2.0.4",
- "fragment-cache": "0.2.1",
- "kind-of": "6.0.2",
- "nanomatch": "1.2.9",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.1",
- "to-regex": "3.0.2"
- }
- },
- "minimatch": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
- "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "mixin-deep": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
- "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
- "requires": {
- "for-in": "1.0.2",
- "is-extendable": "1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "requires": {
- "is-plain-object": "2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "multipipe": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
- "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
- "requires": {
- "duplexer2": "0.0.2"
- }
- },
- "nanomatch": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
- "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
- "requires": {
- "arr-diff": "4.0.0",
- "array-unique": "0.3.2",
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "fragment-cache": "0.2.1",
- "is-odd": "2.0.0",
- "is-windows": "1.0.2",
- "kind-of": "6.0.2",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.1",
- "to-regex": "3.0.2"
- }
- },
- "natives": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
- "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA=="
- },
- "object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "requires": {
- "copy-descriptor": "0.1.1",
- "define-property": "0.2.5",
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "requires": {
- "isobject": "3.0.1"
- }
- },
- "object.defaults": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
- "requires": {
- "array-each": "1.0.1",
- "array-slice": "1.1.0",
- "for-own": "1.0.0",
- "isobject": "3.0.1"
- }
- },
- "object.map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
- "requires": {
- "for-own": "1.0.0",
- "make-iterator": "1.0.0"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "requires": {
- "isobject": "3.0.1"
- }
- },
- "once": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
- "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "orchestrator": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
- "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
- "requires": {
- "end-of-stream": "0.1.5",
- "sequencify": "0.0.7",
- "stream-consume": "0.1.1"
- }
- },
- "ordered-read-streams": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
- "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY="
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
- "requires": {
- "is-absolute": "1.0.0",
- "map-cache": "0.2.2",
- "path-root": "0.1.1"
- }
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
- },
- "path-parse": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
- "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
- },
- "path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
- "requires": {
- "path-root-regex": "0.1.2"
- }
- },
- "path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
- },
- "pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "requires": {
- "resolve": "1.5.0"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "requires": {
- "extend-shallow": "3.0.2",
- "safe-regex": "1.1.0"
- }
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
- },
- "resolve": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
- "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
- "requires": {
- "path-parse": "1.0.5"
- }
- },
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "requires": {
- "expand-tilde": "2.0.2",
- "global-modules": "1.0.0"
- }
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "requires": {
- "ret": "0.1.15"
- }
- },
- "semver": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
- "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto="
- },
- "sequencify": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
- "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw="
- },
- "set-getter": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
- "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
- "requires": {
- "to-object-path": "0.3.0"
- }
- },
- "set-value": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
- "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
- "requires": {
- "extend-shallow": "2.0.1",
- "is-extendable": "0.1.1",
- "is-plain-object": "2.0.4",
- "split-string": "3.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
- }
- },
- "sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
- },
- "snapdragon": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
- "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
- "requires": {
- "base": "0.11.2",
- "debug": "2.6.9",
- "define-property": "0.2.5",
- "extend-shallow": "2.0.1",
- "map-cache": "0.2.2",
- "source-map": "0.5.7",
- "source-map-resolve": "0.5.1",
- "use": "2.0.2"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "requires": {
- "define-property": "1.0.0",
- "isobject": "3.0.1",
- "snapdragon-util": "3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "1.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
- "source-map-resolve": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
- "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
- "requires": {
- "atob": "2.0.3",
- "decode-uri-component": "0.2.0",
- "resolve-url": "0.2.1",
- "source-map-url": "0.4.0",
- "urix": "0.1.0"
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
- },
- "sparkles": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
- "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM="
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "requires": {
- "extend-shallow": "3.0.2"
- }
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "requires": {
- "define-property": "0.2.5",
- "object-copy": "0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "stream-consume": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
- "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg=="
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
- "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
- "requires": {
- "first-chunk-stream": "1.0.0",
- "is-utf8": "0.2.1"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- },
- "through2": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
- "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
- "requires": {
- "readable-stream": "2.3.5",
- "xtend": "4.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- }
- }
- },
- "tildify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
- "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
- "requires": {
- "os-homedir": "1.0.2"
- }
- },
- "time-stamp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
- "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "requires": {
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "regex-not": "1.0.2",
- "safe-regex": "1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "requires": {
- "is-number": "3.0.0",
- "repeat-string": "1.6.1"
- }
- },
- "unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
- },
- "union-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
- "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
- "requires": {
- "arr-union": "3.1.0",
- "get-value": "2.0.6",
- "is-extendable": "0.1.1",
- "set-value": "0.4.3"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "0.1.1"
- }
- },
- "set-value": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
- "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
- "requires": {
- "extend-shallow": "2.0.1",
- "is-extendable": "0.1.1",
- "is-plain-object": "2.0.4",
- "to-object-path": "0.3.0"
- }
- }
- }
- },
- "unique-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
- "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs="
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "requires": {
- "has-value": "0.3.1",
- "isobject": "3.0.1"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "requires": {
- "get-value": "2.0.6",
- "has-values": "0.1.4",
- "isobject": "2.1.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- }
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
- },
- "use": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
- "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
- "requires": {
- "define-property": "0.2.5",
- "isobject": "3.0.1",
- "lazy-cache": "2.0.2"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "0.1.6",
- "is-data-descriptor": "0.1.4",
- "kind-of": "5.1.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "user-home": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA="
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "v8flags": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
- "requires": {
- "user-home": "1.1.1"
- }
- },
- "vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
- "requires": {
- "clone": "1.0.3",
- "clone-stats": "0.0.1",
- "replace-ext": "0.0.1"
- }
- },
- "vinyl-fs": {
- "version": "0.3.14",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
- "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
- "requires": {
- "defaults": "1.0.3",
- "glob-stream": "3.1.18",
- "glob-watcher": "0.0.6",
- "graceful-fs": "3.0.11",
- "mkdirp": "0.5.1",
- "strip-bom": "1.0.0",
- "through2": "0.6.5",
- "vinyl": "0.4.6"
- },
- "dependencies": {
- "clone": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
- "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "requires": {
- "readable-stream": "1.0.34",
- "xtend": "4.0.1"
- }
- },
- "vinyl": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
- "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
- "requires": {
- "clone": "0.2.0",
- "clone-stats": "0.0.1"
- }
- }
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- }
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- }
- }
-}
diff --git a/packages/edition-node-gulp/package.json b/packages/edition-node-gulp/package.json
index 136a485c8..86df154c9 100644
--- a/packages/edition-node-gulp/package.json
+++ b/packages/edition-node-gulp/package.json
@@ -1,14 +1,15 @@
{
"name": "@pattern-lab/edition-node-gulp",
"description": "The gulp wrapper around patternlab-node core, providing tasks to interact with the core library and move supporting frontend assets.",
- "version": "2.0.0-alpha.7",
+ "version": "5.9.3",
"main": "gulpfile.js",
"dependencies": {
- "@pattern-lab/core": "^3.0.0-alpha.11",
- "@pattern-lab/engine-mustache": "^2.0.0-alpha.5",
- "@pattern-lab/uikit-workshop": "^1.0.0-alpha.4",
- "gulp": "^3.9.1",
- "minimist": "^1.2.0"
+ "@pattern-lab/cli": "^5.9.3",
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/engine-mustache": "^5.0.0",
+ "@pattern-lab/uikit-workshop": "^5.9.3",
+ "gulp": "3.9.1",
+ "minimist": "1.2.0"
},
"keywords": [
"Pattern Lab",
@@ -21,11 +22,12 @@
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"author": "Brian Muenzenmeyer",
"scripts": {
- "gulp": "gulp -- "
+ "gulp": "gulp -- ",
+ "patternlab": "patternlab"
},
"license": "MIT",
"engines": {
- "node": ">=6.0"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/edition-node-gulp/patternlab-config.json b/packages/edition-node-gulp/patternlab-config.json
index a1d108136..20625a44f 100644
--- a/packages/edition-node-gulp/patternlab-config.json
+++ b/packages/edition-node-gulp/patternlab-config.json
@@ -38,18 +38,18 @@
"data": "./source/_data/",
"meta": "./source/_meta/",
"annotations": "./source/_annotations/",
- "styleguide": "./node_modules/@pattern-lab/uikit-workshop/dist/",
+ "styleguide": "dist/",
"patternlabFiles": {
"general-header":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-header.mustache",
+ "views/partials/general-header.mustache",
"general-footer":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-footer.mustache",
+ "views/partials/general-footer.mustache",
"patternSection":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSection.mustache",
+ "views/partials/patternSection.mustache",
"patternSectionSubtype":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSectionSubtype.mustache",
+ "views/partials/patternSectionSubtype.mustache",
"viewall":
- "./node_modules/@pattern-lab/uikit-workshop/views/viewall.mustache"
+ "views/viewall.mustache"
},
"js": "./source/js",
"images": "./source/images",
@@ -57,21 +57,24 @@
"css": "./source/css"
},
"public": {
- "root": "./public/",
- "patterns": "./public/patterns/",
- "data": "./public/styleguide/data/",
- "annotations": "./public/annotations/",
- "styleguide": "./public/styleguide/",
- "js": "./public/js",
- "images": "./public/images",
- "fonts": "./public/fonts",
- "css": "./public/css"
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
}
},
"patternExtension": "mustache",
"patternStateCascade": ["inprogress", "inreview", "complete"],
- "patternExportDirectory": "./pattern_exports/",
+ "patternExportAll": false,
+ "patternExportDirectory": "pattern_exports",
"patternExportPatternPartials": [],
+ "patternExportPreserveDirectoryStructure": true,
+ "patternExportRaw": false,
"serverOptions": {
"wait": 1000
},
@@ -81,5 +84,14 @@
"color": "dark",
"density": "compact",
"layout": "horizontal"
- }
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ]
}
diff --git a/packages/edition-node-gulp/source/_data/data.json b/packages/edition-node-gulp/source/_data/data.json
new file mode 100644
index 000000000..0670f0013
--- /dev/null
+++ b/packages/edition-node-gulp/source/_data/data.json
@@ -0,0 +1,3 @@
+{
+ "title": "Title"
+}
diff --git a/packages/edition-node-gulp/source/_meta/_00-head.mustache b/packages/edition-node-gulp/source/_meta/_00-head.mustache
index 069727248..0001e7628 100644
--- a/packages/edition-node-gulp/source/_meta/_00-head.mustache
+++ b/packages/edition-node-gulp/source/_meta/_00-head.mustache
@@ -4,14 +4,14 @@
{{ title }}
-
+
-
+
{{{ patternLabHead }}}
-
+
-
+
diff --git a/packages/edition-node/.gitignore b/packages/edition-node/.gitignore
index f5ffa0899..0679bd2b5 100644
--- a/packages/edition-node/.gitignore
+++ b/packages/edition-node/.gitignore
@@ -6,3 +6,4 @@ patternlab.json
Thumbs.db
.idea/
public
+dependencyGraph.json
diff --git a/packages/edition-node/.npmrc b/packages/edition-node/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/edition-node/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/edition-node/.nvmrc b/packages/edition-node/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/edition-node/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/edition-node/CHANGELOG.md b/packages/edition-node/CHANGELOG.md
index 2e0877571..161487259 100644
--- a/packages/edition-node/CHANGELOG.md
+++ b/packages/edition-node/CHANGELOG.md
@@ -3,45 +3,349 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [1.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.4...@pattern-lab/edition-node@1.0.0-alpha.5) (2018-03-21)
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.9.2...v5.9.3) (2020-05-01)
+**Note:** Version bump only for package @pattern-lab/edition-node
-### Bug Fixes
-* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/9abb8ac))
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/337aa32))
+## [5.9.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.9.1...v5.9.2) (2020-04-24)
-
-# [1.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.3...@pattern-lab/edition-node@1.0.0-alpha.4) (2018-03-05)
+**Note:** Version bump only for package @pattern-lab/edition-node
-### Bug Fixes
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/1473cd5))
-### Features
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.9.0...v5.9.1) (2020-04-24)
-* **README:** Update for brevity and consistency ([65a2969](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/65a2969))
-* **README:** Update for brevity and consistency ([a7f6866](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/a7f6866))
+**Note:** Version bump only for package @pattern-lab/edition-node
-
-# 1.0.0-alpha.3 (2018-03-02)
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.8.0...v5.9.0) (2020-04-24)
-### Bug Fixes
+**Note:** Version bump only for package @pattern-lab/edition-node
-* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/58beeb6))
-* **README:** Fix typos ([b3d1846](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/b3d1846))
-### Features
+
+## [5.7.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+## [5.4.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.4.1...v5.4.2) (2019-11-27)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+## [5.4.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.4.0...v5.4.1) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+## [5.3.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.3.2...v5.3.3) (2019-11-22)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+
+## [5.3.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.3.1...v5.3.2) (2019-11-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+## [5.3.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.3.0...v5.3.1) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **config:** add new default pattern export options ([a7487a0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/a7487a0681cb11e6f3c5c8eaefd62e5648ad5ea3))
+
+
+
+
+
+## [5.0.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.0.1...v5.0.2) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+## [5.0.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v5.0.0...v5.0.1) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Features
+
+* **edition-node:** switch to engine-handlebars ([b481e22](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/b481e22dc1f41ddd4da709621640a15190fba257))
+
+
+### BREAKING CHANGES
+
+* **edition-node:** use handlebars over mustache
+
+
+
+
+
+
+## [2.0.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@2.0.5...@pattern-lab/edition-node@2.0.6) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+
+## [2.0.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@2.0.4...@pattern-lab/edition-node@2.0.5) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+
+## [2.0.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@2.0.0...@pattern-lab/edition-node@2.0.1) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [2.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.2...@pattern-lab/edition-node@2.0.0) (2019-08-23)
+
+
+### Features
+
+* **edition-node:** switch to engine-handlebars ([b481e22](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/b481e22))
+
+
+### BREAKING CHANGES
+
+* **edition-node:** use handlebars over mustache
+
+
+
+
+
+
+## [1.0.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.2-alpha.0...@pattern-lab/edition-node@1.0.2) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+# [1.0.0-beta.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-beta.0...@pattern-lab/edition-node@1.0.0-beta.2) (2019-02-09)
+
+
+### Bug Fixes
+
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/98dfadf))
+
+
+
+
+
+
+# [1.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.13...@pattern-lab/edition-node@1.0.0-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+
+
+
+
+# [1.0.0-alpha.13](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.12...@pattern-lab/edition-node@1.0.0-alpha.13) (2018-07-09)
+
+### Features
+
+* **scripts:** namespace scripts ([3ecbb3e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/3ecbb3e))
+
+
+
+# [1.0.0-alpha.12](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.11...@pattern-lab/edition-node@1.0.0-alpha.12) (2018-07-06)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+# [1.0.0-alpha.11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.10...@pattern-lab/edition-node@1.0.0-alpha.11) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/5ab3995))
+
+
+
+# [1.0.0-alpha.10](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.9...@pattern-lab/edition-node@1.0.0-alpha.10) (2018-07-05)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+# [1.0.0-alpha.9](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.8...@pattern-lab/edition-node@1.0.0-alpha.9) (2018-05-19)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+# [1.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.7...@pattern-lab/edition-node@1.0.0-alpha.8) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+# [1.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.6...@pattern-lab/edition-node@1.0.0-alpha.7) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/edition-node
+
+
+
+# [1.0.0-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.5...@pattern-lab/edition-node@1.0.0-alpha.6) (2018-05-04)
+
+### Features
+
+* **package:** add [@pattern-lab](https://github.com/pattern-lab)/cli as a dependency ([760d0e0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/760d0e0))
+* **scripts:** refactor to use cli commands ([e8d5c21](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/e8d5c21))
+* **uikits:** uikits config ([027e56c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/027e56c))
+
+
+
+# [1.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.4...@pattern-lab/edition-node@1.0.0-alpha.5) (2018-03-21)
+
+### Bug Fixes
+
+* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/9abb8ac))
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/337aa32))
+
+
+
+# [1.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/compare/@pattern-lab/edition-node@1.0.0-alpha.3...@pattern-lab/edition-node@1.0.0-alpha.4) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/1473cd5))
+
+### Features
+
+* **README:** Update for brevity and consistency ([65a2969](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/65a2969))
+* **README:** Update for brevity and consistency ([a7f6866](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/a7f6866))
+
+
+
+# 1.0.0-alpha.3 (2018-03-02)
+
+### Bug Fixes
+
+* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/58beeb6))
+* **README:** Fix typos ([b3d1846](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/b3d1846))
+
+### Features
+
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/edition-node/commit/5eb2c11))
diff --git a/packages/edition-node/README.md b/packages/edition-node/README.md
index 329419890..bea6c5e16 100644
--- a/packages/edition-node/README.md
+++ b/packages/edition-node/README.md
@@ -14,7 +14,8 @@ The pure wrapper around [Pattern Lab Node Core](https://github.com/pattern-lab/p
This Edition comes with the following components:
* `@pattern-lab/core`: [GitHub](https://github.com/pattern-lab/patternlab-node/tree/master/packages/core) | [npm](https://www.npmjs.com/package/@pattern-lab/core)
-* `@pattern-lab/engine-mustache`: [GitHub](https://github.com/pattern-lab/tree/master/packages/engine-mustache) | [npm](https://www.npmjs.com/package/@pattern-lab/engine-mustache)
+* `@pattern-lab/cli`: [GitHub](https://github.com/pattern-lab/tree/master/packages/cli) | [npm](https://www.npmjs.com/package/@pattern-lab/cli)
+* `@pattern-lab/engine-handlebars`: [GitHub](https://github.com/pattern-lab/tree/master/packages/engine-handlebars) | [npm](https://www.npmjs.com/package/@pattern-lab/engine-handlebars)
* `@pattern-lab/uikit-workshop`: [GitHub](https://github.com/pattern-lab/tree/master/packages/uikit-workshop) | [npm](https://www.npmjs.com/package/@pattern-lab/uikit-workshop)
## Prerequisites
diff --git a/packages/edition-node/helpers/test.js b/packages/edition-node/helpers/test.js
new file mode 100644
index 000000000..8b32ed799
--- /dev/null
+++ b/packages/edition-node/helpers/test.js
@@ -0,0 +1,5 @@
+module.exports = function(Handlebars) {
+ Handlebars.registerHelper('test', function() {
+ return 'This is a test helper';
+ });
+};
diff --git a/packages/edition-node/package.json b/packages/edition-node/package.json
index dbac62d7b..25c2821d6 100644
--- a/packages/edition-node/package.json
+++ b/packages/edition-node/package.json
@@ -1,12 +1,13 @@
{
"name": "@pattern-lab/edition-node",
"description": "A pure wrapper around patternlab-node core, the default pattern engine, and supporting frontend assets.",
- "version": "1.0.0-alpha.5",
+ "version": "5.9.3",
"main": "patternlab-config.json",
"dependencies": {
- "@pattern-lab/core": "^3.0.0-alpha.11",
- "@pattern-lab/engine-mustache": "^2.0.0-alpha.5",
- "@pattern-lab/uikit-workshop": "^1.0.0-alpha.4"
+ "@pattern-lab/cli": "^5.9.3",
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/engine-handlebars": "^5.5.0",
+ "@pattern-lab/uikit-workshop": "^5.9.3"
},
"keywords": [
"Pattern Lab",
@@ -18,13 +19,15 @@
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"author": "Brian Muenzenmeyer",
"scripts": {
- "build": "node ./scripts/build.js",
- "help": "node ./scripts/help.js",
- "serve": "node ./scripts/serve.js"
+ "pl:build": "patternlab build --config ./patternlab-config.json",
+ "pl:help": "patternlab --help",
+ "pl:install": "patternlab install --config ./patternlab-config.json",
+ "pl:serve": "patternlab serve --config ./patternlab-config.json",
+ "pl:version": "patternlab --version"
},
"license": "MIT",
"engines": {
- "node": ">=6.0"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/edition-node/patternlab-config.json b/packages/edition-node/patternlab-config.json
index 667b927f7..e5cef6811 100644
--- a/packages/edition-node/patternlab-config.json
+++ b/packages/edition-node/patternlab-config.json
@@ -38,40 +38,43 @@
"data": "./source/_data/",
"meta": "./source/_meta/",
"annotations": "./source/_annotations/",
- "styleguide": "./node_modules/@pattern-lab/uikit-workshop/dist/",
+ "styleguide": "dist/",
"patternlabFiles": {
"general-header":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-header.mustache",
+ "views/partials/general-header.mustache",
"general-footer":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/general-footer.mustache",
+ "views/partials/general-footer.mustache",
"patternSection":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSection.mustache",
+ "views/partials/patternSection.mustache",
"patternSectionSubtype":
- "./node_modules/@pattern-lab/uikit-workshop/views/partials/patternSectionSubtype.mustache",
+ "views/partials/patternSectionSubtype.mustache",
"viewall":
- "./node_modules/@pattern-lab/uikit-workshop/views/viewall.mustache"
+ "views/viewall.mustache"
},
"js": "./source/js",
"images": "./source/images",
"fonts": "./source/fonts",
- "css": "./source/css/"
+ "css": "./source/css"
},
"public": {
- "root": "./public/",
- "patterns": "./public/patterns/",
- "data": "./public/styleguide/data/",
- "annotations": "./public/annotations/",
- "styleguide": "./public/styleguide/",
- "js": "./public/js",
- "images": "./public/images",
- "fonts": "./public/fonts",
- "css": "./public/css"
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
}
},
- "patternExtension": "mustache",
+ "patternExtension": "hbs",
"patternStateCascade": ["inprogress", "inreview", "complete"],
- "patternExportDirectory": "./pattern_exports/",
+ "patternExportAll": false,
+ "patternExportDirectory": "pattern_exports",
"patternExportPatternPartials": [],
+ "patternExportPreserveDirectoryStructure": true,
+ "patternExportRaw": false,
"serverOptions": {
"wait": 1000
},
@@ -81,5 +84,19 @@
"color": "light",
"density": "compact",
"layout": "vertical"
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ],
+ "engines": {
+ "handlebars": {
+ "extend": "helpers/*.js"
+ }
}
}
diff --git a/packages/edition-node/scripts/build.js b/packages/edition-node/scripts/build.js
deleted file mode 100644
index 78760033b..000000000
--- a/packages/edition-node/scripts/build.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- This is another simple example, which we wrapped with an `npm` script inside package.json
-*/
-const config = require('./../patternlab-config.json');
-const patternlab = require('@pattern-lab/core')(config);
-
-patternlab
- .build(
- () => {
- // use the callback
- },
- {
- cleanPublic: true,
- }
- )
- .then(() => {
- // or do something else when this promise resolves
- });
diff --git a/packages/edition-node/scripts/help.js b/packages/edition-node/scripts/help.js
deleted file mode 100644
index d6578d44e..000000000
--- a/packages/edition-node/scripts/help.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- This is another simple example, which we wrapped with an `npm` script inside package.json
-*/
-const config = require('./../patternlab-config.json');
-const patternlab = require('@pattern-lab/core')(config);
-
-patternlab.help();
diff --git a/packages/edition-node/scripts/serve.js b/packages/edition-node/scripts/serve.js
deleted file mode 100644
index fe6064fa2..000000000
--- a/packages/edition-node/scripts/serve.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- This is another simple example, which we wrapped with an `npm` script inside package.json
-*/
-const config = require('./../patternlab-config.json');
-const patternlab = require('@pattern-lab/core')(config);
-
-patternlab
- .serve(
- () => {
- // use the callback
- },
- {
- cleanPublic: true,
- }
- )
- .then(() => {
- // or do something else when this promise resolves
- });
diff --git a/packages/edition-node/source/_meta/_00-head.mustache b/packages/edition-node/source/_meta/_00-head.mustache
new file mode 100644
index 000000000..45ce3bb7d
--- /dev/null
+++ b/packages/edition-node/source/_meta/_00-head.mustache
@@ -0,0 +1,17 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
+
diff --git a/packages/edition-node/source/_meta/_01-foot.mustache b/packages/edition-node/source/_meta/_01-foot.mustache
new file mode 100644
index 000000000..797d9418d
--- /dev/null
+++ b/packages/edition-node/source/_meta/_01-foot.mustache
@@ -0,0 +1,6 @@
+
+
+{{{ patternLabFoot }}}
+
+
+
diff --git a/packages/edition-twig/.editorconfig b/packages/edition-twig/.editorconfig
new file mode 100644
index 000000000..8951c3929
--- /dev/null
+++ b/packages/edition-twig/.editorconfig
@@ -0,0 +1,11 @@
+# editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+tab_width = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/packages/edition-twig/.gitignore b/packages/edition-twig/.gitignore
new file mode 100644
index 000000000..0679bd2b5
--- /dev/null
+++ b/packages/edition-twig/.gitignore
@@ -0,0 +1,9 @@
+node_modules/
+.DS_Store
+patternlab.json
+.sass-cache/*
+/sass-cache
+Thumbs.db
+.idea/
+public
+dependencyGraph.json
diff --git a/packages/edition-twig/.patternlabrc.js b/packages/edition-twig/.patternlabrc.js
new file mode 100644
index 000000000..698dedca8
--- /dev/null
+++ b/packages/edition-twig/.patternlabrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ // target the UIKit installed / symlinked under node_modules
+ buildDir: __dirname + '/node_modules/@pattern-lab/uikit-workshop/dist',
+};
diff --git a/packages/edition-twig/CHANGELOG.md b/packages/edition-twig/CHANGELOG.md
new file mode 100644
index 000000000..f83cfd3c6
--- /dev/null
+++ b/packages/edition-twig/CHANGELOG.md
@@ -0,0 +1,228 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.9.2](https://github.com/pattern-lab/patternlab-node/compare/v5.9.1...v5.9.2) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.9.1](https://github.com/pattern-lab/patternlab-node/compare/v5.9.0...v5.9.1) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.7.2](https://github.com/pattern-lab/patternlab-node/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/patternlab-node/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/patternlab-node/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.4.2](https://github.com/pattern-lab/patternlab-node/compare/v5.4.1...v5.4.2) (2019-11-27)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.4.1](https://github.com/pattern-lab/patternlab-node/compare/v5.4.0...v5.4.1) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+
+### Features
+
+* test adding cross-env to Twig Edition test ([3f8bb01](https://github.com/pattern-lab/patternlab-node/commit/3f8bb01bc4e96a0aba61c213ea1619c02593defc))
+
+
+
+
+
+## [5.3.3](https://github.com/pattern-lab/patternlab-node/compare/v5.3.2...v5.3.3) (2019-11-22)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+
+## [5.3.2](https://github.com/pattern-lab/patternlab-node/compare/v5.3.1...v5.3.2) (2019-11-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.3.1](https://github.com/pattern-lab/patternlab-node/compare/v5.3.0...v5.3.1) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/patternlab-node/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+
+### Features
+
+* **config:** add new default pattern export options ([a7487a0](https://github.com/pattern-lab/patternlab-node/commit/a7487a0681cb11e6f3c5c8eaefd62e5648ad5ea3))
+
+
+
+
+
+## [5.0.2](https://github.com/pattern-lab/patternlab-node/compare/v5.0.1...v5.0.2) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [5.0.1](https://github.com/pattern-lab/patternlab-node/compare/v5.0.0...v5.0.1) (2019-10-28)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* add better pre-rendering support ([8ecd615](https://github.com/pattern-lab/patternlab-node/commit/8ecd6159a89232f42e0a9dc3c688b6e21de8fc30))
+* fix Twig Edition examples by adding missing Twig namespaces to config ([b4c20ef](https://github.com/pattern-lab/patternlab-node/commit/b4c20ef88ee0d3010760584c6f05ff7f92b711a6))
+
+
+
+
+
+
+## [3.1.8](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/edition-twig@3.1.7...@pattern-lab/edition-twig@3.1.8) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+
+## [3.1.7](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/edition-twig@3.1.6...@pattern-lab/edition-twig@3.1.7) (2019-10-14)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+
+## [3.1.3](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/edition-twig@3.1.2...@pattern-lab/edition-twig@3.1.3) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
+
+
+
+
+
+## [3.1.2](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/edition-twig@3.1.1...@pattern-lab/edition-twig@3.1.2) (2019-08-23)
+
+
+### Bug Fixes
+
+* add better pre-rendering support ([8ecd615](https://github.com/pattern-lab/patternlab-node/commit/8ecd615))
+
+
+
+
+
+
+## [3.1.1](https://github.com/sghoweri/patternlab-node/compare/@pattern-lab/edition-twig@3.1.0...@pattern-lab/edition-twig@3.1.1) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/edition-twig
diff --git a/packages/edition-twig/README.md b/packages/edition-twig/README.md
new file mode 100644
index 000000000..2d8d9f3d0
--- /dev/null
+++ b/packages/edition-twig/README.md
@@ -0,0 +1,11 @@
+## Working on Pattern Lab's UI Locally
+
+### Step 1: Install Dependencies
+Run the following in the root of the Pattern Lab repo:
+
+```
+yarn run setup
+```
+
+### Step 2
+Finally, go back into this folder, `cd packages/edition-twig`, and start up the local dev server which watches UIKit and the local Pattern Lab instance for changes, live reloads, etc by running `yarn dev`
diff --git a/packages/edition-twig/alter-twig.php b/packages/edition-twig/alter-twig.php
new file mode 100644
index 000000000..0c7c2918c
--- /dev/null
+++ b/packages/edition-twig/alter-twig.php
@@ -0,0 +1,34 @@
+Hello {{ customTwigFunctionThatSaysWorld() }}!` => `Hello Custom World `
+ */
+// $env->addFunction(new \Twig_SimpleFunction('customTwigFunctionThatSaysWorld', function () {
+// return 'Custom World';
+// }));
+
+ /*
+ * Reverse a string
+ * @param string $theString
+ * @example `{{ reverse('abc') }}
` => `cba
`
+ */
+// $env->addFunction(new \Twig_SimpleFunction('reverse', function ($theString) {
+// return strrev($theString);
+// }));
+
+
+// $env->addExtension(new \My\CustomExtension());
+
+// `{{ foo }}` => `bar`
+// $env->addGlobal('foo', 'bar');
+
+ // example of enabling the Twig debug mode extension (ex. {{ dump(my_variable) }} to check out the template's available data) -- comment out to disable
+ // $env->addExtension(new \Twig_Extension_Debug());
+
+}
diff --git a/packages/edition-twig/package-lock.json b/packages/edition-twig/package-lock.json
new file mode 100644
index 000000000..e68ff4f21
--- /dev/null
+++ b/packages/edition-twig/package-lock.json
@@ -0,0 +1,59 @@
+{
+ "name": "@pattern-lab/edition-twig",
+ "version": "3.1.5",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "cross-env": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz",
+ "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==",
+ "requires": {
+ "cross-spawn": "7.0.1"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+ "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+ "requires": {
+ "path-key": "3.1.0",
+ "shebang-command": "2.0.0",
+ "which": "2.0.1"
+ }
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "path-key": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
+ "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "which": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
+ "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/packages/edition-twig/package.json b/packages/edition-twig/package.json
new file mode 100644
index 000000000..f3d13f65f
--- /dev/null
+++ b/packages/edition-twig/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@pattern-lab/edition-twig",
+ "version": "5.9.3",
+ "description": "Pattern Lab node with Twig PHP Engine",
+ "author": {
+ "name": "Evan Lovely",
+ "url": "http://evanlovely.com"
+ },
+ "maintainers": [
+ {
+ "name": "Salem Ghoweri"
+ }
+ ],
+ "main": "patternlab-config.json",
+ "scripts": {
+ "build:uikit": "cross-env-shell PL_CONFIG_PATH='${INIT_CWD}/.patternlabrc.js' npm run build --prefix node_modules/@pattern-lab/uikit-workshop -- --patternlabrc '$PL_CONFIG_PATH'",
+ "build": "patternlab build --config ./patternlab-config.json",
+ "help": "patternlab --help",
+ "install": "patternlab install --config ./patternlab-config.json",
+ "serve": "patternlab serve --config ./patternlab-config.json",
+ "start": "npm run serve",
+ "version": "patternlab --version",
+ "dev": "node ./node_modules/@pattern-lab/uikit-workshop/build-tools.js"
+ },
+ "dependencies": {
+ "@pattern-lab/cli": "^5.9.3",
+ "@pattern-lab/core": "^5.9.3",
+ "@pattern-lab/engine-twig-php": "^5.9.3",
+ "@pattern-lab/uikit-workshop": "^5.9.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "keywords": [
+ "Pattern",
+ "Lab",
+ "Atomic",
+ "Web",
+ "Design",
+ "Twig"
+ ],
+ "license": "MIT"
+}
diff --git a/packages/edition-twig/patternlab-config.json b/packages/edition-twig/patternlab-config.json
new file mode 100644
index 000000000..e9652bde5
--- /dev/null
+++ b/packages/edition-twig/patternlab-config.json
@@ -0,0 +1,162 @@
+{
+ "engines": {
+ "twig": {
+ "namespaces": [
+ {
+ "id": "uikit",
+ "recursive": true,
+ "paths": [
+ "./node_modules/@pattern-lab/uikit-workshop/views-twig"
+ ]
+ },
+ {
+ "id": "atoms",
+ "recursive": true,
+ "paths": [
+ "./source/_patterns/00-atoms"
+ ]
+ },
+ {
+ "id": "molecules",
+ "recursive": true,
+ "paths": [
+ "./source/_patterns/01-molecules"
+ ]
+ },
+ {
+ "id": "organisms",
+ "recursive": true,
+ "paths": [
+ "./source/_patterns/02-organisms"
+ ]
+ },
+ {
+ "id": "templates",
+ "recursive": true,
+ "paths": [
+ "./source/_patterns/03-templates"
+ ]
+ },
+ {
+ "id": "pages",
+ "recursive": true,
+ "paths": [
+ "./source/_patterns/04-pages"
+ ]
+ }
+ ],
+ "alterTwigEnv": [
+ {
+ "file": "alter-twig.php",
+ "functions": [
+ "addCustomExtension"
+ ]
+ }
+ ]
+ }
+ },
+ "cacheBust": true,
+ "cleanPublic": true,
+ "defaultPattern": "all",
+ "defaultShowPatternInfo": false,
+ "ishControlsHide": {
+ "s": false,
+ "m": false,
+ "l": false,
+ "full": false,
+ "random": false,
+ "disco": false,
+ "hay": true,
+ "mqs": false,
+ "find": false,
+ "views-all": false,
+ "views-annotations": false,
+ "views-code": false,
+ "views-new": false,
+ "tools-all": false,
+ "tools-docs": false
+ },
+ "ishViewportRange": {
+ "s": [
+ 240,
+ 500
+ ],
+ "m": [
+ 500,
+ 800
+ ],
+ "l": [
+ 800,
+ 2600
+ ]
+ },
+ "logLevel": "info",
+ "outputFileSuffixes": {
+ "rendered": ".rendered",
+ "rawTemplate": "",
+ "markupOnly": ".markup-only"
+ },
+ "paths": {
+ "source": {
+ "root": "./source/",
+ "patterns": "./source/_patterns/",
+ "data": "./source/_data/",
+ "meta": "./source/_meta/",
+ "annotations": "./source/_annotations/",
+ "styleguide": "dist/",
+ "patternlabFiles": {
+ "general-header": "views/partials/general-header.mustache",
+ "general-footer": "views/partials/general-footer.mustache",
+ "patternSection": "views/partials/patternSection.mustache",
+ "patternSectionSubtype": "views/partials/patternSectionSubtype.mustache",
+ "viewall": "views/viewall.mustache"
+ },
+ "js": "./source/js",
+ "images": "./source/images",
+ "fonts": "./source/fonts",
+ "css": "./source/css"
+ },
+ "public": {
+ "root": "public/",
+ "patterns": "public/patterns/",
+ "data": "public/styleguide/data/",
+ "annotations": "public/annotations/",
+ "styleguide": "public/styleguide/",
+ "js": "public/js",
+ "images": "public/images",
+ "fonts": "public/fonts",
+ "css": "public/css"
+ }
+ },
+ "patternExtension": "twig",
+ "patternStateCascade": [
+ "inprogress",
+ "inreview",
+ "complete"
+ ],
+ "patternExportAll": false,
+ "patternExportDirectory": "pattern_exports",
+ "patternExportPatternPartials": [],
+ "patternExportPreserveDirectoryStructure": true,
+ "patternExportRaw": false,
+ "serverOptions": {
+ "wait": 1000
+ },
+ "starterkitSubDir": "dist",
+ "styleGuideExcludes": [],
+ "theme": {
+ "color": "light",
+ "density": "compact",
+ "layout": "horizontal",
+ "noViewAll": false
+ },
+ "uikits": [
+ {
+ "name": "uikit-workshop",
+ "outputDir": "",
+ "enabled": true,
+ "excludedPatternStates": [],
+ "excludedTags": []
+ }
+ ]
+}
diff --git a/packages/edition-twig/source/_annotations/annotations.js b/packages/edition-twig/source/_annotations/annotations.js
new file mode 100755
index 000000000..6ae3d7dc3
--- /dev/null
+++ b/packages/edition-twig/source/_annotations/annotations.js
@@ -0,0 +1,9 @@
+{
+ "comments" : [
+ {
+ "el": "header[role=banner]",
+ "title" : "Masthead",
+ "comment": "The main header of the site doesn't take up too much screen real estate in order to keep the focus on the core content. It's using a linear CSS gradient instead of a background image to give greater design flexibility and reduce HTTP requests."
+ }
+ ]
+}
diff --git a/packages/edition-twig/source/_data/data.json b/packages/edition-twig/source/_data/data.json
new file mode 100755
index 000000000..2440c9d40
--- /dev/null
+++ b/packages/edition-twig/source/_data/data.json
@@ -0,0 +1,3 @@
+{
+ "title" : "Pattern Lab"
+}
diff --git a/packages/edition-twig/source/_data/listitems.json b/packages/edition-twig/source/_data/listitems.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/packages/edition-twig/source/_data/listitems.json
@@ -0,0 +1 @@
+{}
diff --git a/packages/edition-twig/source/_layouts/.gitkeep b/packages/edition-twig/source/_layouts/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_layouts/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_macros/.gitkeep b/packages/edition-twig/source/_macros/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_macros/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_meta/_00-head.mustache b/packages/edition-twig/source/_meta/_00-head.mustache
new file mode 100644
index 000000000..45ce3bb7d
--- /dev/null
+++ b/packages/edition-twig/source/_meta/_00-head.mustache
@@ -0,0 +1,17 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
+
diff --git a/packages/edition-twig/source/_meta/_00-head.twig b/packages/edition-twig/source/_meta/_00-head.twig
new file mode 100755
index 000000000..3891e1793
--- /dev/null
+++ b/packages/edition-twig/source/_meta/_00-head.twig
@@ -0,0 +1,17 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{ patternLabHead | raw }}
+
+
+
+
+
diff --git a/packages/edition-twig/source/_meta/_01-foot.mustache b/packages/edition-twig/source/_meta/_01-foot.mustache
new file mode 100644
index 000000000..797d9418d
--- /dev/null
+++ b/packages/edition-twig/source/_meta/_01-foot.mustache
@@ -0,0 +1,6 @@
+
+
+{{{ patternLabFoot }}}
+
+
+
diff --git a/packages/edition-twig/source/_meta/_01-foot.twig b/packages/edition-twig/source/_meta/_01-foot.twig
new file mode 100755
index 000000000..4d65e2a55
--- /dev/null
+++ b/packages/edition-twig/source/_meta/_01-foot.twig
@@ -0,0 +1,6 @@
+
+
+ {{ patternLabFoot | raw }}
+
+
+
diff --git a/packages/edition-twig/source/_patterns/00-atoms/00-text/00-headings.twig b/packages/edition-twig/source/_patterns/00-atoms/00-text/00-headings.twig
new file mode 100755
index 000000000..2ecbbf0c5
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/00-atoms/00-text/00-headings.twig
@@ -0,0 +1,6 @@
+Heading Level 1
+Heading Level 2
+Heading Level 3
+Heading Level 4
+Heading Level 5
+Heading Level 6
diff --git a/packages/edition-twig/source/_patterns/00-atoms/05-buttons/_button.twig b/packages/edition-twig/source/_patterns/00-atoms/05-buttons/_button.twig
new file mode 100644
index 000000000..1d124b4ed
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/00-atoms/05-buttons/_button.twig
@@ -0,0 +1 @@
+{{ text }}
diff --git a/packages/edition-twig/source/_patterns/00-atoms/05-buttons/button-dark-demo.twig b/packages/edition-twig/source/_patterns/00-atoms/05-buttons/button-dark-demo.twig
new file mode 100644
index 000000000..7899b77f8
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/00-atoms/05-buttons/button-dark-demo.twig
@@ -0,0 +1,4 @@
+{% include '@atoms/05-buttons/_button.twig' with {
+ text: 'Click Me',
+ dark: true,
+} only %}
diff --git a/packages/edition-twig/source/_patterns/00-atoms/05-buttons/button-simple-demo.twig b/packages/edition-twig/source/_patterns/00-atoms/05-buttons/button-simple-demo.twig
new file mode 100644
index 000000000..b8afb5833
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/00-atoms/05-buttons/button-simple-demo.twig
@@ -0,0 +1,3 @@
+{% include '@atoms/05-buttons/_button.twig' with {
+ text: 'Click Me',
+} only %}
diff --git a/packages/edition-twig/source/_patterns/01-molecules/.gitkeep b/packages/edition-twig/source/_patterns/01-molecules/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/01-molecules/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_patterns/01-molecules/05-card/card.twig b/packages/edition-twig/source/_patterns/01-molecules/05-card/card.twig
new file mode 100644
index 000000000..0d8840f90
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/01-molecules/05-card/card.twig
@@ -0,0 +1,6 @@
+
+
Card Title here
+ {% include '@atoms/05-buttons/_button.twig' with {
+ text: 'some text from card'
+ } only %}
+
diff --git a/packages/edition-twig/source/_patterns/02-organisms/.gitkeep b/packages/edition-twig/source/_patterns/02-organisms/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/02-organisms/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_patterns/03-templates/.gitkeep b/packages/edition-twig/source/_patterns/03-templates/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/03-templates/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_patterns/04-pages/.gitkeep b/packages/edition-twig/source/_patterns/04-pages/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_patterns/04-pages/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_twig-components/filters/.gitkeep b/packages/edition-twig/source/_twig-components/filters/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_twig-components/filters/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_twig-components/functions/.gitkeep b/packages/edition-twig/source/_twig-components/functions/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_twig-components/functions/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_twig-components/tags/.gitkeep b/packages/edition-twig/source/_twig-components/tags/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_twig-components/tags/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/_twig-components/tests/.gitkeep b/packages/edition-twig/source/_twig-components/tests/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/_twig-components/tests/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/css/.gitkeep b/packages/edition-twig/source/css/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/css/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/favicon.ico b/packages/edition-twig/source/favicon.ico
new file mode 100644
index 000000000..eee4aa78f
Binary files /dev/null and b/packages/edition-twig/source/favicon.ico differ
diff --git a/packages/edition-twig/source/fonts/.gitkeep b/packages/edition-twig/source/fonts/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/fonts/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/images/.gitkeep b/packages/edition-twig/source/images/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/images/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/edition-twig/source/js/.gitkeep b/packages/edition-twig/source/js/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/edition-twig/source/js/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/engine-handlebars/.npmrc b/packages/engine-handlebars/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-handlebars/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-handlebars/.nvmrc b/packages/engine-handlebars/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-handlebars/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-handlebars/CHANGELOG.md b/packages/engine-handlebars/CHANGELOG.md
index 71157a4d8..4e702faa0 100644
--- a/packages/engine-handlebars/CHANGELOG.md
+++ b/packages/engine-handlebars/CHANGELOG.md
@@ -3,9 +3,98 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+**Note:** Version bump only for package @pattern-lab/engine-handlebars
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* **lint:** Use const instead of var ([ad1e782](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/ad1e782ef71295eb610f56d019eaa35499fb3f85))
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/74e5af28c4e714fdfc1db535b94c52f3dc14a3a4))
+
+
+### Features
+
+* **engine-handlebars:** Default location for helpers, like engine-nunjucks ([11c4180](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/11c41805e0c3dbebb7109719c4f3c780d32feab5))
+* **engine-handlebars:** Document the Helpers feature ([a01e040](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/a01e040429a7f77dfeb28d67c690e835b97881de))
+* **engine-handlebars:** Load Handlebars helpers specified in the config ([a12df36](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/a12df36d2a644dfac8ded1dfd94b987e99c29d79))
+
+
+
+
+
+
+# [2.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-beta.1...@pattern-lab/engine-handlebars@2.0.0) (2019-08-23)
+
+
+### Bug Fixes
+
+* **lint:** Use const instead of var ([ad1e782](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/ad1e782))
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/74e5af2))
+
+
+### Features
+
+* **engine-handlebars:** Default location for helpers, like engine-nunjucks ([11c4180](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/11c4180))
+* **engine-handlebars:** Document the Helpers feature ([a01e040](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/a01e040))
+* **engine-handlebars:** Load Handlebars helpers specified in the config ([a12df36](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/a12df36))
+
+
+
+
+
+
+# [2.0.0-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-beta.0...@pattern-lab/engine-handlebars@2.0.0-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/engine-handlebars
+
+
+
+
+
+
+# [2.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.8...@pattern-lab/engine-handlebars@2.0.0-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-handlebars
+
+
+
+
+
+
+
+# [2.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.7...@pattern-lab/engine-handlebars@2.0.0-alpha.8) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/5ab3995))
+
+
+
+# [2.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.6...@pattern-lab/engine-handlebars@2.0.0-alpha.7) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/38a01b1))
+
+
+
+# [2.0.0-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.5...@pattern-lab/engine-handlebars@2.0.0-alpha.6) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-handlebars
+
-# [2.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.4...@pattern-lab/engine-handlebars@2.0.0-alpha.5) (2018-03-21)
+# [2.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.4...@pattern-lab/engine-handlebars@2.0.0-alpha.5) (2018-03-21)
### Bug Fixes
@@ -14,29 +103,22 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/337aa32))
* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/issues/815)
-
-
-
-# [2.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.3...@pattern-lab/engine-handlebars@2.0.0-alpha.4) (2018-03-05)
+# [2.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/compare/@pattern-lab/engine-handlebars@2.0.0-alpha.3...@pattern-lab/engine-handlebars@2.0.0-alpha.4) (2018-03-05)
### Bug Fixes
* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/1473cd5))
-
-
-
-# 2.0.0-alpha.3 (2018-03-02)
+# 2.0.0-alpha.3 (2018-03-02)
### Bug Fixes
* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/58beeb6))
-
### Features
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-handlebars/commit/5eb2c11))
diff --git a/packages/engine-handlebars/README.md b/packages/engine-handlebars/README.md
index d85db9ea5..2dc828d60 100644
--- a/packages/engine-handlebars/README.md
+++ b/packages/engine-handlebars/README.md
@@ -1,6 +1,6 @@
# The Handlebars PatternEngine for Pattern Lab / Node
-To install the Handlebars PatternEngine in your edition, `npm install @pattern-lab/engine-handlebars` should do the trick.
+To install the Handlebars PatternEngine in your edition, `npm install --save @pattern-lab/engine-handlebars` should do the trick.
## Supported features
@@ -11,3 +11,34 @@ To install the Handlebars PatternEngine in your edition, `npm install @pattern-l
* [x] [Pattern States](http://patternlab.io/docs/pattern-states.html)
* [ ] [Pattern Parameters](http://patternlab.io/docs/pattern-parameters.html) (Accomplished instead using [native Handlebars partial arguments](http://handlebarsjs.com/partials.html))
* [ ] [Style Modifiers](http://patternlab.io/docs/pattern-stylemodifier.html) (Accomplished instead using [native Handlebars partial arguments](http://handlebarsjs.com/partials.html))
+
+## Helpers
+
+To add custom [helpers](http://handlebarsjs.com/#helpers) or otherwise interact with Handlebars directly, create a file named `patternlab-handlebars-config.js` in the root of your Pattern Lab project, or override the default location by specifying one or several glob patterns in the Pattern Lab config:
+
+```json
+ {
+ ...
+ "engines": {
+ "handlebars": {
+ "extend": [
+ "handlebars-helpers.js",
+ "helpers/**/*.js"
+ ]
+ }
+ }
+ }
+```
+
+Each file should export a function which takes Handlebars as an argument.
+
+```js
+module.exports = function(Handlebars) {
+ // Put helpers here
+
+ Handlebars.registerHelper('fullName', function(person) {
+ // Example: person = {firstName: "Alan", lastName: "Johnson"}
+ return person.firstName + " " + person.lastName;
+ });
+};
+```
diff --git a/packages/engine-handlebars/lib/engine_handlebars.js b/packages/engine-handlebars/lib/engine_handlebars.js
index dbeb88312..80e0b90da 100644
--- a/packages/engine-handlebars/lib/engine_handlebars.js
+++ b/packages/engine-handlebars/lib/engine_handlebars.js
@@ -25,6 +25,7 @@
const fs = require('fs-extra');
const path = require('path');
const Handlebars = require('handlebars');
+const glob = require('glob');
// regexes, stored here so they're only compiled once
const findPartialsRE = /{{#?>\s*([\w-\/.]+)(?:.|\s+)*?}}/g;
@@ -32,14 +33,22 @@ const findListItemsRE = /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|s
const findAtPartialBlockRE = /{{#?>\s*@partial-block\s*}}/g;
function escapeAtPartialBlock(partialString) {
- var partial = partialString.replace(
+ const partial = partialString.replace(
findAtPartialBlockRE,
'{{> @partial-block }}'
);
return partial;
}
-var engine_handlebars = {
+function loadHelpers(helpers) {
+ helpers.forEach(globPattern => {
+ glob.sync(globPattern).forEach(filePath => {
+ require(path.join(process.cwd(), filePath))(Handlebars);
+ });
+ });
+}
+
+const engine_handlebars = {
engine: Handlebars,
engineName: 'handlebars',
engineFileExtension: ['.hbs', '.handlebars'],
@@ -54,7 +63,7 @@ var engine_handlebars = {
Handlebars.registerPartial(partials);
}
- var compiled = Handlebars.compile(escapeAtPartialBlock(pattern.template));
+ const compiled = Handlebars.compile(escapeAtPartialBlock(pattern.template));
return Promise.resolve(compiled(data));
},
@@ -68,7 +77,7 @@ var engine_handlebars = {
// find and return any {{> template-name }} within pattern
findPartials: function findPartials(pattern) {
- var matches = pattern.template.match(findPartialsRE);
+ const matches = pattern.template.match(findPartialsRE);
return matches;
},
findPartialsWithStyleModifiers: function() {
@@ -85,14 +94,14 @@ var engine_handlebars = {
return [];
},
findListItems: function(pattern) {
- var matches = pattern.template.match(findListItemsRE);
+ const matches = pattern.template.match(findListItemsRE);
return matches;
},
// given a pattern, and a partial string, tease out the "pattern key" and
// return it.
findPartial: function(partialString) {
- var partial = partialString.replace(findPartialsRE, '$1');
+ const partial = partialString.replace(findPartialsRE, '$1');
return partial;
},
@@ -122,6 +131,36 @@ var engine_handlebars = {
this.spawnFile(config, '_00-head.hbs');
this.spawnFile(config, '_01-foot.hbs');
},
+
+ /**
+ * Accept a Pattern Lab config object from the core and use the settings to
+ * load helpers.
+ *
+ * @param {object} config - the global config object from core
+ */
+ usePatternLabConfig: function(config) {
+ let helpers;
+
+ try {
+ // Look for helpers in the config
+ helpers = config.engines.handlebars.extend;
+
+ if (typeof helpers === 'string') {
+ helpers = [helpers];
+ }
+ } catch (error) {
+ // Look for helpers in default location
+ const configPath = 'patternlab-handlebars-config.js';
+ if (fs.existsSync(path.join(process.cwd(), configPath))) {
+ helpers = [configPath];
+ }
+ }
+
+ // Load helpers if they were found
+ if (helpers) {
+ loadHelpers(helpers);
+ }
+ },
};
module.exports = engine_handlebars;
diff --git a/packages/engine-handlebars/package-lock.json b/packages/engine-handlebars/package-lock.json
deleted file mode 100644
index 474743a03..000000000
--- a/packages/engine-handlebars/package-lock.json
+++ /dev/null
@@ -1,308 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.2"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- },
- "handlebars": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
- "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
- "requires": {
- "async": "1.5.2",
- "optimist": "0.6.1",
- "source-map": "0.4.4",
- "uglify-js": "2.8.29"
- },
- "dependencies": {
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "requires": {
- "kind-of": "3.2.2",
- "longest": "1.0.1",
- "repeat-string": "1.6.1"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
- },
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "optional": true
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "optional": true,
- "requires": {
- "align-text": "0.1.4",
- "lazy-cache": "1.0.4"
- }
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "optional": true,
- "requires": {
- "center-align": "0.1.3",
- "right-align": "0.1.3",
- "wordwrap": "0.0.2"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "optional": true
- }
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "optional": true
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "optional": true
- },
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
- },
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "requires": {
- "minimist": "0.0.10",
- "wordwrap": "0.0.3"
- }
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "optional": true,
- "requires": {
- "align-text": "0.1.4"
- }
- },
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "requires": {
- "amdefine": "1.0.1"
- }
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "optional": true,
- "requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "optional": true
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "optional": true
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "optional": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
- },
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "optional": true,
- "requires": {
- "camelcase": "1.2.1",
- "cliui": "2.1.0",
- "decamelize": "1.2.0",
- "window-size": "0.1.0"
- }
- }
- }
- }
- }
-}
diff --git a/packages/engine-handlebars/package.json b/packages/engine-handlebars/package.json
index 8c0934c4d..5ab060d43 100644
--- a/packages/engine-handlebars/package.json
+++ b/packages/engine-handlebars/package.json
@@ -1,11 +1,12 @@
{
"name": "@pattern-lab/engine-handlebars",
"description": "The Handlebars engine for Pattern Lab / Node",
- "version": "2.0.0-alpha.5",
+ "version": "5.5.0",
"main": "lib/engine_handlebars.js",
"dependencies": {
- "fs-extra": "^0.30.0",
- "handlebars": "^4.0.5"
+ "fs-extra": "^8.1.0",
+ "glob": "^7.1.6",
+ "handlebars": "^4.5.3"
},
"keywords": [
"Pattern Lab",
@@ -20,11 +21,9 @@
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"author": "Brian Muenzenmeyer & Geoffrey Pursell",
"license": "MIT",
- "scripts": {
- "test": "grunt travis --verbose"
- },
+ "scripts": {},
"engines": {
- "node": ">=4.0"
+ "node": ">=12.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/engine-liquid/.npmrc b/packages/engine-liquid/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-liquid/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-liquid/.nvmrc b/packages/engine-liquid/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-liquid/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-liquid/CHANGELOG.md b/packages/engine-liquid/CHANGELOG.md
index 77cdc9f33..ac7f4559b 100644
--- a/packages/engine-liquid/CHANGELOG.md
+++ b/packages/engine-liquid/CHANGELOG.md
@@ -3,9 +3,51 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/engine-liquid
+
+
+
+
+
+
+# [1.0.0-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-beta.0...@pattern-lab/engine-liquid@1.0.0-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/engine-liquid
+
+
+
+
+
+
+# [1.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.10...@pattern-lab/engine-liquid@1.0.0-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-liquid
+
+
+
+
+
+
+
+# [1.0.0-alpha.10](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.9...@pattern-lab/engine-liquid@1.0.0-alpha.10) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/5ab3995))
+
+
+
+# [1.0.0-alpha.9](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.8...@pattern-lab/engine-liquid@1.0.0-alpha.9) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-liquid
+
-# [1.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.7...@pattern-lab/engine-liquid@1.0.0-alpha.8) (2018-03-21)
+# [1.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.7...@pattern-lab/engine-liquid@1.0.0-alpha.8) (2018-03-21)
### Bug Fixes
@@ -14,29 +56,22 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/337aa32))
* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/issues/815)
-
-
-
-# [1.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.6...@pattern-lab/engine-liquid@1.0.0-alpha.7) (2018-03-05)
+# [1.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/compare/@pattern-lab/engine-liquid@1.0.0-alpha.6...@pattern-lab/engine-liquid@1.0.0-alpha.7) (2018-03-05)
### Bug Fixes
* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/1473cd5))
-
-
-
-# 1.0.0-alpha.6 (2018-03-02)
+# 1.0.0-alpha.6 (2018-03-02)
### Bug Fixes
* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/58beeb6))
-
### Features
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-liquid/commit/5eb2c11))
diff --git a/packages/engine-liquid/package-lock.json b/packages/engine-liquid/package-lock.json
deleted file mode 100644
index 2fefc4c2d..000000000
--- a/packages/engine-liquid/package-lock.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "4.0.0",
- "universalify": "0.1.1"
- },
- "dependencies": {
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "universalify": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
- "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
- }
- }
- },
- "liquidjs": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-2.2.0.tgz",
- "integrity": "sha512-y3/w8nxb+SQpKAd6FvJP8WjicVDeOMFJFpFDm4nYuYBspHax8ZhUTNtGuyDPs+XxTfWtP0d82wdl65tYQrNvDg==",
- "requires": {
- "any-promise": "1.3.0"
- },
- "dependencies": {
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- }
- }
- }
- }
-}
diff --git a/packages/engine-liquid/package.json b/packages/engine-liquid/package.json
index 0a1bbda4f..dfb15fed3 100644
--- a/packages/engine-liquid/package.json
+++ b/packages/engine-liquid/package.json
@@ -1,10 +1,10 @@
{
"name": "@pattern-lab/engine-liquid",
"description": "The Liquid engine for Pattern Lab / Node",
- "version": "1.0.0-alpha.8",
+ "version": "5.0.0",
"main": "lib/engine_liquid.js",
"dependencies": {
- "fs-extra": "^5.0.0",
+ "fs-extra": "5.0.0",
"liquidjs": "2.2.0"
},
"keywords": [
@@ -22,7 +22,7 @@
"license": "MIT",
"scripts": {},
"engines": {
- "node": ">=0.1"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/engine-mustache/.npmrc b/packages/engine-mustache/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-mustache/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-mustache/.nvmrc b/packages/engine-mustache/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-mustache/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-mustache/CHANGELOG.md b/packages/engine-mustache/CHANGELOG.md
index 9afc10924..76309e04f 100644
--- a/packages/engine-mustache/CHANGELOG.md
+++ b/packages/engine-mustache/CHANGELOG.md
@@ -3,44 +3,89 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [2.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.4...@pattern-lab/engine-mustache@2.0.0-alpha.5) (2018-03-21)
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/engine-mustache
+
+
+
+
+
+
+# [2.0.0-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-beta.0...@pattern-lab/engine-mustache@2.0.0-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/engine-mustache
+
+
+
+
+
+
+# [2.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.8...@pattern-lab/engine-mustache@2.0.0-beta.0) (2018-09-07)
### Bug Fixes
-* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/9abb8ac))
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/337aa32))
-* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/issues/815)
+* **package:** update mustache dependency ([27bd4cd](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/27bd4cd))
+
+
+
+
+
+# [2.0.0-alpha.8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.7...@pattern-lab/engine-mustache@2.0.0-alpha.8) (2018-07-06)
+
### Features
-* **package:** add engine-nunjucks to monorepo ([bf527ed](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/bf527ed)), closes [#814](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/issues/814)
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/5ab3995))
+
+# [2.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.6...@pattern-lab/engine-mustache@2.0.0-alpha.7) (2018-07-05)
+### Features
-
-# [2.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.3...@pattern-lab/engine-mustache@2.0.0-alpha.4) (2018-03-05)
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/38a01b1))
+
+
+
+# [2.0.0-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.5...@pattern-lab/engine-mustache@2.0.0-alpha.6) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-mustache
+
+
+# [2.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.4...@pattern-lab/engine-mustache@2.0.0-alpha.5) (2018-03-21)
### Bug Fixes
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/1473cd5))
+* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/9abb8ac))
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/337aa32))
+* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/issues/815)
+### Features
+
+* **package:** add engine-nunjucks to monorepo ([bf527ed](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/bf527ed)), closes [#814](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/issues/814)
+
+
+
+# [2.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/compare/@pattern-lab/engine-mustache@2.0.0-alpha.3...@pattern-lab/engine-mustache@2.0.0-alpha.4) (2018-03-05)
+### Bug Fixes
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/1473cd5))
-# 2.0.0-alpha.3 (2018-03-02)
+# 2.0.0-alpha.3 (2018-03-02)
### Bug Fixes
* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/58beeb6))
-
### Features
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-mustache/commit/5eb2c11))
diff --git a/packages/engine-mustache/README.md b/packages/engine-mustache/README.md
index 6e451ca0f..cb2c8838e 100644
--- a/packages/engine-mustache/README.md
+++ b/packages/engine-mustache/README.md
@@ -1,5 +1,5 @@
## The Mustache PatternEngine for Pattern Lab / Node
-This one should be included by default with [Pattern Lab Node Core](https://github.com/pattern-lab/patternlab-node/packages/core) and consumed by [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node).
+This one should be included by default with [Pattern Lab Node Core](https://github.com/pattern-lab/patternlab-node/tree/dev/packages/core) and consumed by [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node).
If it's missing from your project for any reason, `npm install @pattern-lab/engine-mustache` should do the trick.
diff --git a/packages/engine-mustache/package-lock.json b/packages/engine-mustache/package-lock.json
deleted file mode 100644
index 998efa2c8..000000000
--- a/packages/engine-mustache/package-lock.json
+++ /dev/null
@@ -1,131 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.2"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- },
- "mustache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz",
- "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA="
- }
- }
-}
diff --git a/packages/engine-mustache/package.json b/packages/engine-mustache/package.json
index c3c87aed9..6142804b3 100644
--- a/packages/engine-mustache/package.json
+++ b/packages/engine-mustache/package.json
@@ -1,11 +1,11 @@
{
"name": "@pattern-lab/engine-mustache",
"description": "The Mustache engine for Pattern Lab / Node",
- "version": "2.0.0-alpha.5",
+ "version": "5.0.0",
"main": "lib/engine_mustache.js",
"dependencies": {
- "fs-extra": "^0.30.0",
- "mustache": "^2.2.0"
+ "fs-extra": "0.30.0",
+ "mustache": "3.1.0"
},
"keywords": [
"Pattern Lab",
@@ -20,11 +20,9 @@
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"author": "Brian Muenzenmeyer & Geoffrey Pursell",
"license": "MIT",
- "scripts": {
- "test": "grunt travis --verbose"
- },
+ "scripts": {},
"engines": {
- "node": ">=0.1"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/engine-nunjucks/.npmrc b/packages/engine-nunjucks/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-nunjucks/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-nunjucks/.nvmrc b/packages/engine-nunjucks/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-nunjucks/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-nunjucks/CHANGELOG.md b/packages/engine-nunjucks/CHANGELOG.md
index 82cb7b7d7..8a7b13cc9 100644
--- a/packages/engine-nunjucks/CHANGELOG.md
+++ b/packages/engine-nunjucks/CHANGELOG.md
@@ -3,15 +3,95 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/74e5af28c4e714fdfc1db535b94c52f3dc14a3a4))
+
+
+### Features
+
+* **engine-nunjucks:** Configurable extension locations; Use usePatternlabConfig() ([e54e3b3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/e54e3b3d48f934d3a4d44b9f4ff262f742a4aaf9))
+* update Node to v12 ([fcbb970](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/fcbb970648cdd775c9a88078f14c1f24c5b62d73))
+
+
+
+
+
+
+# [0.2.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/@pattern-lab/engine-nunjucks@0.1.5-alpha.0...@pattern-lab/engine-nunjucks@0.2.0) (2019-08-23)
+
+
+### Bug Fixes
+
+* Rename Handlebars and Nunjucks extension setting to "extend" ([74e5af2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/74e5af2))
+
+
+### Features
+
+* **engine-nunjucks:** Configurable extension locations; Use usePatternlabConfig() ([e54e3b3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/e54e3b3))
+
+
+
+
+
+
+## [0.1.4-beta.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/@pattern-lab/engine-nunjucks@0.1.4-beta.0...@pattern-lab/engine-nunjucks@0.1.4-beta.2) (2019-02-09)
+
+
+### Bug Fixes
+
+* manually bump package.json versions of packages published in September but with mismatched package.json versions ([98dfadf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/98dfadf))
+
+
+
+
+
+
+## [0.1.4-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/@pattern-lab/engine-nunjucks@0.1.4-alpha.4...@pattern-lab/engine-nunjucks@0.1.4-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-nunjucks
+
+
+
+
+
+
+
+## [0.1.4-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/@pattern-lab/engine-nunjucks@0.1.4-alpha.3...@pattern-lab/engine-nunjucks@0.1.4-alpha.4) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/5ab3995))
+
+
+
+## [0.1.4-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/@pattern-lab/engine-nunjucks@0.1.4-alpha.2...@pattern-lab/engine-nunjucks@0.1.4-alpha.3) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/38a01b1))
+
+
+
+## [0.1.4-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/compare/@pattern-lab/engine-nunjucks@0.1.4-alpha.1...@pattern-lab/engine-nunjucks@0.1.4-alpha.2) (2018-05-04)
+
+### Features
+
+* **package:** add [@pattern-lab](https://github.com/pattern-lab)/cli as a dependency ([760d0e0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/760d0e0))
+
-## 0.1.4-alpha.1 (2018-03-21)
+## 0.1.4-alpha.1 (2018-03-21)
### Bug Fixes
* **lint:** run code through prettier ([ca52fde](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/ca52fde)), closes [#825](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/issues/825)
-
### Features
* **package:** add engine-nunjucks to monorepo ([bf527ed](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/commit/bf527ed)), closes [#814](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-nunjucks/issues/814)
diff --git a/packages/engine-nunjucks/README.md b/packages/engine-nunjucks/README.md
index 7a88645df..9d6ab1c99 100644
--- a/packages/engine-nunjucks/README.md
+++ b/packages/engine-nunjucks/README.md
@@ -17,20 +17,38 @@ Level of Support is more or less full. Partial calls and lineage hunting are sup
## Extending the Nunjucks instance
-To add custom filters or make customizations to the nunjucks instance, create a file named `patternlab-nunjucks-config.js` in the root of your Pattern Lab project. `patternlab-nunjucks-config.js` should export a function that takes two parameters. The first parameter is the nunjucks instance; the second is the nunjucks instance's environment.
+To add custom filters or make customizations to the nunjucks instance, add the following to `patternlab-config.json`:
+```json
+ {
+ ...
+ "engines": {
+ "nunjucks": {
+ "extend": [
+ "nunjucks-extensions/*.js"
+ ]
+ }
+ }
+ }
```
-module.exports = function (nunjucks, env) {
+
+...or use the default file name: `patternlab-nunjucks-config.js` (in the root of your Pattern Lab project).
+
+Each file providing extensions should export a function with the Nunjucks environment as parameter.
+
+```js
+module.exports = function (env) {
[YOUR CUSTOM CODE HERE]
};
```
Example: `patternlab-nunjucks-config.js` file that uses lodash and adds three custom filters.
-```
+
+```js
var _shuffle = require('lodash/shuffle'),
_take = require('lodash/take');
-exports = module.exports = function (nunjucks, env) {
+exports = module.exports = function (env) {
env.addFilter('shorten', function (str, count) {
return str.slice(0, count || 5);
});
diff --git a/packages/engine-nunjucks/lib/engine_nunjucks.js b/packages/engine-nunjucks/lib/engine_nunjucks.js
index 5c149d3f9..176f977aa 100644
--- a/packages/engine-nunjucks/lib/engine_nunjucks.js
+++ b/packages/engine-nunjucks/lib/engine_nunjucks.js
@@ -20,48 +20,15 @@
'use strict';
-var fs = require('fs-extra'),
- path = require('path'),
- plPath = process.cwd(),
- plConfig = require(path.join(plPath, 'patternlab-config.json')),
- nunjucks = require('nunjucks'),
- env = nunjucks.configure(plConfig.paths.source.patterns),
- partialRegistry = [];
-
-////////////////////////////
-// LOAD ANY USER NUNJUCKS CONFIGURATIONS
-////////////////////////////
-try {
- var nunjucksConfig = require(path.join(
- plPath,
- 'patternlab-nunjucks-config.js'
- ));
- if (typeof nunjucksConfig == 'function') {
- nunjucksConfig(nunjucks, env);
- }
-} catch (err) {}
-
-////////////////////////////
-// HELPER FUNCTIONS
-// https://stackoverflow.com/questions/2116558/fastest-method-to-replace-all-instances-of-a-character-in-a-string
-// Might do some research on the solution.
-////////////////////////////
-if (!String.prototype.replaceAll) {
- String.prototype.replaceAll = function(str1, str2, ignore) {
- return this.replace(
- new RegExp(
- str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, '\\$&'),
- ignore ? 'gi' : 'g'
- ),
- typeof str2 == 'string' ? str2.replace(/\$/g, '$$$$') : str2
- );
- };
-}
-
-////////////////////////////
-// NUNJUCKS ENGINE
-////////////////////////////
-var engine_nunjucks = {
+const fs = require('fs-extra');
+const path = require('path');
+const nunjucks = require('nunjucks');
+const partialRegistry = [];
+
+let env;
+
+// Nunjucks Engine
+const engine_nunjucks = {
engine: nunjucks,
engineName: 'nunjucks',
engineFileExtension: '.njk',
@@ -77,25 +44,24 @@ var engine_nunjucks = {
// render it
renderPattern: function renderPattern(pattern, data) {
try {
- // replace pattern names with their full path so Nunjucks can find them.
- pattern.extendedTemplate = this.replacePartials(pattern);
- var result = nunjucks.renderString(pattern.extendedTemplate, data);
+ const result = env.renderString(pattern.extendedTemplate, data);
return Promise.resolve(result);
} catch (err) {
console.error('Failed to render pattern: ' + pattern.name);
+ console.error(err);
}
},
// find and return any Nunjucks style includes/imports/extends within pattern
findPartials: function findPartials(pattern) {
- var matches = pattern.template.match(this.findPartialsRE);
+ const matches = pattern.template.match(this.findPartialsRE);
return matches;
},
// given a pattern, and a partial string, tease out the "pattern key" and return it.
findPartial: function(partialString) {
try {
- var partial = partialString.match(this.findPartialKeyRE)[1];
+ let partial = partialString.match(this.findPartialKeyRE)[1];
partial = partial.replace(/["']/g, '');
return partial;
} catch (err) {
@@ -116,38 +82,9 @@ var engine_nunjucks = {
}
},
- replacePartials: function(pattern) {
- try {
- var partials = this.findPartials(pattern);
- if (partials !== null) {
- for (var i = 0; i < partials.length; i++) {
- // e.g. {% include "atoms-parent" %}
- var partialName = this.findPartial(partials[i]); // e.g. atoms-parent
- var partialFullPath = partialRegistry[partialName]; // e.g. 00-atoms/01-parent.njk
- var newPartial = partials[i].replaceAll(
- partialName,
- partialFullPath,
- true
- ); // e.g. {% include "00-atoms/01-parent.njk" %}
- pattern.extendedTemplate = pattern.extendedTemplate.replaceAll(
- partials[i],
- newPartial,
- true
- );
- }
- }
- return pattern.extendedTemplate;
- } catch (err) {
- console.error(
- 'Error occurred in replacing partial names with paths for patern: ' +
- pattern.name
- );
- }
- },
-
// still requires the mustache syntax because of the way PL handles lists
findListItems: function(pattern) {
- var matches = pattern.template.match(this.findListItemsRE);
+ const matches = pattern.template.match(this.findListItemsRE);
return matches;
},
@@ -168,7 +105,6 @@ var engine_nunjucks = {
fs.statSync(metaFilePath);
} catch (err) {
//not a file, so spawn it from the included file
- const localMetaFilePath = path.resolve(__dirname, '_meta/', fileName);
const metaFileContent = fs.readFileSync(
path.resolve(__dirname, '..', '_meta/', fileName),
'utf8'
@@ -188,6 +124,72 @@ var engine_nunjucks = {
this.spawnFile(config, '_00-head.njk');
this.spawnFile(config, '_01-foot.njk');
},
+
+ /**
+ * Accept a Pattern Lab config object from the core and use the settings to
+ * load helpers.
+ *
+ * @param {object} config - the global config object from core
+ */
+ usePatternLabConfig: function(config) {
+ // Create Pattern Loader
+ // Since Pattern Lab includes are not path based we need a custom loader for Nunjucks.
+ function PatternLoader() {}
+
+ PatternLoader.prototype.getSource = function(name) {
+ const fullPath = path.resolve(
+ config.paths.source.patterns,
+ partialRegistry[name]
+ );
+ return {
+ src: fs.readFileSync(fullPath, 'utf-8'),
+ path: fullPath,
+ noCache: true,
+ };
+ };
+
+ env = new nunjucks.Environment(new PatternLoader());
+
+ let extensions;
+
+ try {
+ // Look for helpers in the config
+ extensions = config.engines.nunjucks.extend;
+
+ if (typeof extensions === 'string') {
+ extensions = [extensions];
+ }
+ } catch (error) {
+ // No defined path(s) found, look in default location
+
+ const configPath = 'patternlab-nunjucks-config.js';
+ if (fs.existsSync(path.join(process.cwd(), configPath))) {
+ extensions = [configPath];
+ }
+ }
+
+ if (extensions) {
+ extensions.forEach(extensionPath => {
+ // Load any user Defined configurations
+ const nunjucksConfigPath = path.join(process.cwd(), extensionPath);
+
+ try {
+ const nunjucksConfig = require(nunjucksConfigPath);
+ if (typeof nunjucksConfig === 'function') {
+ nunjucksConfig(env);
+ } else {
+ console.error(
+ `Failed to load Nunjucks extension: Expected ${extensionPath} to export a function.`
+ );
+ }
+ } catch (err) {
+ console.error(
+ `Failed to load Nunjucks extension ${nunjucksConfigPath}.`
+ );
+ }
+ });
+ }
+ },
};
module.exports = engine_nunjucks;
diff --git a/packages/engine-nunjucks/package-lock.json b/packages/engine-nunjucks/package-lock.json
deleted file mode 100644
index 26e77fc0d..000000000
--- a/packages/engine-nunjucks/package-lock.json
+++ /dev/null
@@ -1,1438 +0,0 @@
-{
- "name": "patternengine-node-nunjucks",
- "version": "0.1.3",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "a-sync-waterfall": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.0.tgz",
- "integrity": "sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw="
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "optional": true,
- "requires": {
- "micromatch": "2.3.11",
- "normalize-path": "2.1.1"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "optional": true,
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "optional": true
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "optional": true
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "async-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
- "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
- "optional": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "optional": true
- },
- "binary-extensions": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz",
- "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
- "optional": true
- },
- "brace-expansion": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
- "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
- "optional": true,
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "optional": true,
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
- }
- },
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
- },
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "optional": true,
- "requires": {
- "anymatch": "1.3.2",
- "async-each": "1.0.1",
- "fsevents": "1.1.3",
- "glob-parent": "2.0.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0"
- }
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "optional": true
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "optional": true,
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "optional": true,
- "requires": {
- "fill-range": "2.2.3"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "optional": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "optional": true
- },
- "fill-range": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "optional": true,
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "optional": true
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "optional": true,
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "4.0.0",
- "universalify": "0.1.1"
- }
- },
- "fsevents": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
- "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
- "optional": true,
- "requires": {
- "nan": "2.8.0",
- "node-pre-gyp": "0.6.39"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "ajv": {
- "version": "4.11.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true
- },
- "aproba": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.2.9"
- }
- },
- "asn1": {
- "version": "0.2.3",
- "bundled": true,
- "optional": true
- },
- "assert-plus": {
- "version": "0.2.0",
- "bundled": true,
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "bundled": true,
- "optional": true
- },
- "aws-sign2": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true
- },
- "aws4": {
- "version": "1.6.0",
- "bundled": true,
- "optional": true
- },
- "balanced-match": {
- "version": "0.4.2",
- "bundled": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "block-stream": {
- "version": "0.0.9",
- "bundled": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "boom": {
- "version": "2.10.1",
- "bundled": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "brace-expansion": {
- "version": "1.1.7",
- "bundled": true,
- "requires": {
- "balanced-match": "0.4.2",
- "concat-map": "0.0.1"
- }
- },
- "buffer-shims": {
- "version": "1.0.0",
- "bundled": true
- },
- "caseless": {
- "version": "0.12.0",
- "bundled": true,
- "optional": true
- },
- "co": {
- "version": "4.6.0",
- "bundled": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true
- },
- "combined-stream": {
- "version": "1.0.5",
- "bundled": true,
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true
- },
- "cryptiles": {
- "version": "2.0.5",
- "bundled": true,
- "requires": {
- "boom": "2.10.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "debug": {
- "version": "2.6.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-extend": {
- "version": "0.4.2",
- "bundled": true,
- "optional": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "bundled": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "extend": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true
- },
- "extsprintf": {
- "version": "1.0.2",
- "bundled": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "bundled": true,
- "optional": true
- },
- "form-data": {
- "version": "2.1.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.15"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true
- },
- "fstream": {
- "version": "1.0.11",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.1"
- }
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "fstream": "1.0.11",
- "inherits": "2.0.3",
- "minimatch": "3.0.4"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "aproba": "1.1.1",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "bundled": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "bundled": true
- },
- "har-schema": {
- "version": "1.0.5",
- "bundled": true,
- "optional": true
- },
- "har-validator": {
- "version": "4.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ajv": "4.11.8",
- "har-schema": "1.0.5"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "hawk": {
- "version": "3.1.3",
- "bundled": true,
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "bundled": true
- },
- "http-signature": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.0",
- "sshpk": "1.13.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "ini": {
- "version": "1.3.4",
- "bundled": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true
- },
- "isstream": {
- "version": "0.1.2",
- "bundled": true,
- "optional": true
- },
- "jodid25519": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "bundled": true,
- "optional": true
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "bundled": true,
- "optional": true
- },
- "jsonify": {
- "version": "0.0.0",
- "bundled": true,
- "optional": true
- },
- "jsprim": {
- "version": "1.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.0.2",
- "json-schema": "0.2.3",
- "verror": "1.3.6"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "mime-db": {
- "version": "1.27.0",
- "bundled": true
- },
- "mime-types": {
- "version": "2.1.15",
- "bundled": true,
- "requires": {
- "mime-db": "1.27.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "requires": {
- "brace-expansion": "1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "node-pre-gyp": {
- "version": "0.6.39",
- "bundled": true,
- "optional": true,
- "requires": {
- "detect-libc": "1.0.2",
- "hawk": "3.1.3",
- "mkdirp": "0.5.1",
- "nopt": "4.0.1",
- "npmlog": "4.1.0",
- "rc": "1.2.1",
- "request": "2.81.0",
- "rimraf": "2.6.1",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "tar-pack": "3.4.0"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "abbrev": "1.1.0",
- "osenv": "0.1.4"
- }
- },
- "npmlog": {
- "version": "4.1.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true
- },
- "oauth-sign": {
- "version": "0.8.2",
- "bundled": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true
- },
- "performance-now": {
- "version": "0.2.0",
- "bundled": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "bundled": true
- },
- "punycode": {
- "version": "1.4.1",
- "bundled": true,
- "optional": true
- },
- "qs": {
- "version": "6.4.0",
- "bundled": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.2.9",
- "bundled": true,
- "requires": {
- "buffer-shims": "1.0.0",
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "1.0.1",
- "util-deprecate": "1.0.2"
- }
- },
- "request": {
- "version": "2.81.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "4.2.1",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.15",
- "oauth-sign": "0.8.2",
- "performance-now": "0.2.0",
- "qs": "6.4.0",
- "safe-buffer": "5.0.1",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.6.0",
- "uuid": "3.0.1"
- }
- },
- "rimraf": {
- "version": "2.6.1",
- "bundled": true,
- "requires": {
- "glob": "7.1.2"
- }
- },
- "safe-buffer": {
- "version": "5.0.1",
- "bundled": true
- },
- "semver": {
- "version": "5.3.0",
- "bundled": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "optional": true
- },
- "sntp": {
- "version": "1.0.9",
- "bundled": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "sshpk": {
- "version": "1.13.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jodid25519": "1.0.2",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.1",
- "bundled": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "bundled": true,
- "optional": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "tar": {
- "version": "2.2.1",
- "bundled": true,
- "requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
- }
- },
- "tar-pack": {
- "version": "3.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "debug": "2.6.8",
- "fstream": "1.0.11",
- "fstream-ignore": "1.0.5",
- "once": "1.4.0",
- "readable-stream": "2.2.9",
- "rimraf": "2.6.1",
- "tar": "2.2.1",
- "uid-number": "0.0.6"
- }
- },
- "tough-cookie": {
- "version": "2.3.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "punycode": "1.4.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "bundled": true,
- "optional": true
- },
- "uid-number": {
- "version": "0.0.6",
- "bundled": true,
- "optional": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true
- },
- "uuid": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true
- },
- "verror": {
- "version": "1.3.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "extsprintf": "1.0.2"
- }
- },
- "wide-align": {
- "version": "1.1.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "string-width": "1.0.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "optional": true,
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "optional": true,
- "requires": {
- "binary-extensions": "1.10.0"
- }
- },
- "is-buffer": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
- "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
- "optional": true
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "optional": true,
- "requires": {
- "is-primitive": "2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "optional": true
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "optional": true,
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "optional": true
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "optional": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "optional": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.5"
- }
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "requires": {
- "invert-kv": "1.0.0"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "optional": true,
- "requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "optional": true,
- "requires": {
- "brace-expansion": "1.1.8"
- }
- },
- "nan": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
- "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
- "optional": true
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "nunjucks": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.0.1.tgz",
- "integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=",
- "requires": {
- "a-sync-waterfall": "1.0.0",
- "asap": "2.0.6",
- "chokidar": "1.7.0",
- "yargs": "3.32.0"
- }
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "optional": true,
- "requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- }
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "requires": {
- "lcid": "1.0.0"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "optional": true,
- "requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "optional": true
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "optional": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "optional": true
- },
- "randomatic": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
- "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
- "optional": true,
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "optional": true,
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "optional": true,
- "requires": {
- "is-buffer": "1.1.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "optional": true,
- "requires": {
- "is-buffer": "1.1.5"
- }
- }
- }
- },
- "readable-stream": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
- "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
- "optional": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "readdirp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
- "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
- "optional": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "readable-stream": "2.3.3",
- "set-immediate-shim": "1.0.1"
- }
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "optional": true,
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "optional": true
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "optional": true,
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "universalify": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
- "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "optional": true
- },
- "window-size": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
- "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1"
- }
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
- },
- "yargs": {
- "version": "3.32.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
- "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
- "requires": {
- "camelcase": "2.1.1",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "os-locale": "1.4.0",
- "string-width": "1.0.2",
- "window-size": "0.1.4",
- "y18n": "3.2.1"
- }
- }
- }
-}
diff --git a/packages/engine-nunjucks/package.json b/packages/engine-nunjucks/package.json
index 3be1990bd..575c4af28 100644
--- a/packages/engine-nunjucks/package.json
+++ b/packages/engine-nunjucks/package.json
@@ -7,11 +7,11 @@
"deprecated": false,
"description": "The nunjucks PatternEngine for Pattern Lab / Node",
"dependencies": {
- "fs-extra": "^5.0.0",
- "nunjucks": "^3.0.1"
+ "fs-extra": "7.0.0",
+ "nunjucks": "^3.2.0"
},
"engines": {
- "node": ">=4.0"
+ "node": ">=10.0"
},
"keywords": [
"Pattern Lab",
@@ -25,10 +25,8 @@
"license": "MIT",
"main": "lib/engine_nunjucks.js",
"name": "@pattern-lab/engine-nunjucks",
- "scripts": {
- "test": "grunt travis --verbose"
- },
- "version": "0.1.4-alpha.1",
+ "scripts": {},
+ "version": "5.0.0",
"publishConfig": {
"access": "public"
}
diff --git a/packages/engine-react/.npmrc b/packages/engine-react/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-react/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-react/.nvmrc b/packages/engine-react/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-react/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-react/CHANGELOG.md b/packages/engine-react/CHANGELOG.md
index bff76ec2a..467717ff5 100644
--- a/packages/engine-react/CHANGELOG.md
+++ b/packages/engine-react/CHANGELOG.md
@@ -3,9 +3,62 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Features
+
+* **engine-react:** set package to private ([3aea881](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/3aea8815f19df5b527cdda0b75cf99a9a8c3bc1e))
+
+
+
+
+
+
+## [0.2.1-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-beta.0...@pattern-lab/engine-react@0.2.1-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/engine-react
+
+
+
+
+
+
+## [0.2.1-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.5...@pattern-lab/engine-react@0.2.1-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-react
+
+
+
+
+
+
+
+## [0.2.1-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.4...@pattern-lab/engine-react@0.2.1-alpha.5) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/5ab3995))
+
+
+
+## [0.2.1-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.3...@pattern-lab/engine-react@0.2.1-alpha.4) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/38a01b1))
+
+
+
+## [0.2.1-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.2...@pattern-lab/engine-react@0.2.1-alpha.3) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-react
+
-## [0.2.1-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.1...@pattern-lab/engine-react@0.2.1-alpha.2) (2018-03-21)
+## [0.2.1-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.1...@pattern-lab/engine-react@0.2.1-alpha.2) (2018-03-21)
### Bug Fixes
@@ -13,29 +66,22 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/337aa32))
* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/issues/815)
-
-
-
-## [0.2.1-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.0...@pattern-lab/engine-react@0.2.1-alpha.1) (2018-03-05)
+## [0.2.1-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/compare/@pattern-lab/engine-react@0.2.1-alpha.0...@pattern-lab/engine-react@0.2.1-alpha.1) (2018-03-05)
### Bug Fixes
* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/1473cd5))
-
-
-
-## 0.2.1-alpha.0 (2018-03-02)
+## 0.2.1-alpha.0 (2018-03-02)
### Bug Fixes
* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/58beeb6))
-
### Features
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-react/commit/5eb2c11))
diff --git a/packages/engine-react/lib/engine_react.js b/packages/engine-react/lib/engine_react.js
index 7b62a9e54..b0f01cdd2 100644
--- a/packages/engine-react/lib/engine_react.js
+++ b/packages/engine-react/lib/engine_react.js
@@ -14,7 +14,7 @@ const path = require('path');
const React = require('react');
const ReactDOMServer = require('react-dom/server');
const Babel = require('babel-core');
-const Hogan = require('hogan.js');
+const Hogan = require('hogan');
const beautify = require('js-beautify');
const cheerio = require('cheerio');
const _require = require;
diff --git a/packages/engine-react/package-lock.json b/packages/engine-react/package-lock.json
deleted file mode 100644
index c0c305875..000000000
--- a/packages/engine-react/package-lock.json
+++ /dev/null
@@ -1,1350 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "babel-core": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
- "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
- "requires": {
- "babel-code-frame": "6.26.0",
- "babel-generator": "6.26.1",
- "babel-helpers": "6.24.1",
- "babel-messages": "6.23.0",
- "babel-register": "6.26.0",
- "babel-runtime": "6.26.0",
- "babel-template": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "convert-source-map": "1.5.1",
- "debug": "2.6.9",
- "json5": "0.5.1",
- "lodash": "4.17.5",
- "minimatch": "3.0.4",
- "path-is-absolute": "1.0.1",
- "private": "0.1.8",
- "slash": "1.0.0",
- "source-map": "0.5.7"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- }
- },
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
- "requires": {
- "babel-messages": "6.23.0",
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0",
- "detect-indent": "4.0.0",
- "jsesc": "1.3.0",
- "lodash": "4.17.5",
- "source-map": "0.5.7",
- "trim-right": "1.0.1"
- }
- },
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-template": "6.26.0"
- }
- },
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "requires": {
- "babel-runtime": "6.26.0"
- }
- },
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
- "requires": {
- "babel-core": "6.26.0",
- "babel-runtime": "6.26.0",
- "core-js": "2.5.3",
- "home-or-tmp": "2.0.0",
- "lodash": "4.17.5",
- "mkdirp": "0.5.1",
- "source-map-support": "0.4.18"
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "requires": {
- "core-js": "2.5.3",
- "regenerator-runtime": "0.11.1"
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "lodash": "4.17.5"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "requires": {
- "babel-code-frame": "6.26.0",
- "babel-messages": "6.23.0",
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "debug": "2.6.9",
- "globals": "9.18.0",
- "invariant": "2.2.3",
- "lodash": "4.17.5"
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "requires": {
- "babel-runtime": "6.26.0",
- "esutils": "2.0.2",
- "lodash": "4.17.5",
- "to-fast-properties": "1.0.3"
- }
- },
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "convert-source-map": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
- "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
- },
- "core-js": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
- "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "requires": {
- "repeating": "2.0.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
- }
- },
- "invariant": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
- "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
- "requires": {
- "loose-envify": "1.3.1"
- }
- },
- "is-finite": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "loose-envify": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
- "requires": {
- "js-tokens": "3.0.2"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "requires": {
- "is-finite": "1.0.2"
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "requires": {
- "source-map": "0.5.7"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- },
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
- },
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
- }
- }
- },
- "babel-plugin-transform-es2015-modules-commonjs": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
- "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
- "requires": {
- "babel-plugin-transform-strict-mode": "6.24.1",
- "babel-runtime": "6.26.0",
- "babel-template": "6.26.0",
- "babel-types": "6.26.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- }
- },
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "requires": {
- "babel-runtime": "6.26.0"
- }
- },
- "babel-plugin-transform-strict-mode": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
- "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0"
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "requires": {
- "core-js": "2.5.3",
- "regenerator-runtime": "0.11.1"
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "lodash": "4.17.5"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "requires": {
- "babel-code-frame": "6.26.0",
- "babel-messages": "6.23.0",
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "debug": "2.6.9",
- "globals": "9.18.0",
- "invariant": "2.2.3",
- "lodash": "4.17.5"
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "requires": {
- "babel-runtime": "6.26.0",
- "esutils": "2.0.2",
- "lodash": "4.17.5",
- "to-fast-properties": "1.0.3"
- }
- },
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "core-js": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
- "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "invariant": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz",
- "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==",
- "requires": {
- "loose-envify": "1.3.1"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "loose-envify": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
- "requires": {
- "js-tokens": "3.0.2"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- },
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
- }
- }
- },
- "babel-preset-react": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
- "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
- "requires": {
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-plugin-transform-react-display-name": "6.25.0",
- "babel-plugin-transform-react-jsx": "6.24.1",
- "babel-plugin-transform-react-jsx-self": "6.22.0",
- "babel-plugin-transform-react-jsx-source": "6.22.0",
- "babel-preset-flow": "6.23.0"
- },
- "dependencies": {
- "babel-helper-builder-react-jsx": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
- "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-types": "6.26.0",
- "esutils": "2.0.2"
- }
- },
- "babel-plugin-syntax-flow": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
- "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0="
- },
- "babel-plugin-syntax-jsx": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
- "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
- },
- "babel-plugin-transform-flow-strip-types": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
- "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
- "requires": {
- "babel-plugin-syntax-flow": "6.18.0",
- "babel-runtime": "6.26.0"
- }
- },
- "babel-plugin-transform-react-display-name": {
- "version": "6.25.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
- "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
- "requires": {
- "babel-runtime": "6.26.0"
- }
- },
- "babel-plugin-transform-react-jsx": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
- "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
- "requires": {
- "babel-helper-builder-react-jsx": "6.26.0",
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-runtime": "6.26.0"
- }
- },
- "babel-plugin-transform-react-jsx-self": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
- "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
- "requires": {
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-runtime": "6.26.0"
- }
- },
- "babel-plugin-transform-react-jsx-source": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
- "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
- "requires": {
- "babel-plugin-syntax-jsx": "6.18.0",
- "babel-runtime": "6.26.0"
- }
- },
- "babel-preset-flow": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
- "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
- "requires": {
- "babel-plugin-transform-flow-strip-types": "6.22.0"
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "requires": {
- "core-js": "2.5.3",
- "regenerator-runtime": "0.11.1"
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "requires": {
- "babel-runtime": "6.26.0",
- "esutils": "2.0.2",
- "lodash": "4.17.5",
- "to-fast-properties": "1.0.3"
- }
- },
- "core-js": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
- "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
- },
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
- }
- }
- },
- "cheerio": {
- "version": "0.22.0",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz",
- "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
- "requires": {
- "css-select": "1.2.0",
- "dom-serializer": "0.1.0",
- "entities": "1.1.1",
- "htmlparser2": "3.9.2",
- "lodash.assignin": "4.2.0",
- "lodash.bind": "4.2.1",
- "lodash.defaults": "4.2.0",
- "lodash.filter": "4.6.0",
- "lodash.flatten": "4.4.0",
- "lodash.foreach": "4.5.0",
- "lodash.map": "4.6.0",
- "lodash.merge": "4.6.1",
- "lodash.pick": "4.4.0",
- "lodash.reduce": "4.6.0",
- "lodash.reject": "4.6.0",
- "lodash.some": "4.6.0"
- },
- "dependencies": {
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
- "requires": {
- "boolbase": "1.0.0",
- "css-what": "2.1.0",
- "domutils": "1.5.1",
- "nth-check": "1.0.1"
- }
- },
- "css-what": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
- "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0="
- },
- "dom-serializer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
- "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
- "requires": {
- "domelementtype": "1.1.3",
- "entities": "1.1.1"
- },
- "dependencies": {
- "domelementtype": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
- "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
- }
- }
- },
- "domelementtype": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
- "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
- },
- "domhandler": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
- "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
- "requires": {
- "domelementtype": "1.3.0"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0.1.0",
- "domelementtype": "1.3.0"
- }
- },
- "entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
- },
- "htmlparser2": {
- "version": "3.9.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
- "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
- "requires": {
- "domelementtype": "1.3.0",
- "domhandler": "2.4.1",
- "domutils": "1.5.1",
- "entities": "1.1.1",
- "inherits": "2.0.3",
- "readable-stream": "2.3.5"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "lodash.assignin": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
- "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI="
- },
- "lodash.bind": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz",
- "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU="
- },
- "lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
- },
- "lodash.filter": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz",
- "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4="
- },
- "lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
- },
- "lodash.foreach": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
- "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM="
- },
- "lodash.map": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
- "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
- },
- "lodash.merge": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
- "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ=="
- },
- "lodash.pick": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
- "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
- },
- "lodash.reduce": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
- "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
- },
- "lodash.reject": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz",
- "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU="
- },
- "lodash.some": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
- "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0="
- },
- "nth-check": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
- "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
- "requires": {
- "boolbase": "1.0.0"
- }
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- }
- }
- },
- "hogan": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hogan/-/hogan-1.0.2.tgz",
- "integrity": "sha1-2NXlf64Od4ez4B4UJW+dWIoj0fA=",
- "requires": {
- "hogan.js": "3.0.2"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "hogan.js": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz",
- "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=",
- "requires": {
- "mkdirp": "0.3.0",
- "nopt": "1.0.10"
- }
- },
- "mkdirp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz",
- "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4="
- },
- "nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
- "requires": {
- "abbrev": "1.1.1"
- }
- }
- }
- },
- "js-beautify": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.5.tgz",
- "integrity": "sha512-9OhfAqGOrD7hoQBLJMTA+BKuKmoEtTJXzZ7WDF/9gvjtey1koVLuZqIY6c51aPDjbNdNtIXAkiWKVhziawE9Og==",
- "requires": {
- "config-chain": "1.1.11",
- "editorconfig": "0.13.3",
- "mkdirp": "0.5.1",
- "nopt": "3.0.6"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "bluebird": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
- },
- "commander": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
- "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
- },
- "config-chain": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
- "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=",
- "requires": {
- "ini": "1.3.5",
- "proto-list": "1.2.4"
- }
- },
- "editorconfig": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz",
- "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==",
- "requires": {
- "bluebird": "3.5.1",
- "commander": "2.14.1",
- "lru-cache": "3.2.0",
- "semver": "5.5.0",
- "sigmund": "1.0.1"
- }
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "lru-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
- "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
- "requires": {
- "pseudomap": "1.0.2"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "requires": {
- "abbrev": "1.1.1"
- }
- },
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
- }
- }
- },
- "react": {
- "version": "15.6.2",
- "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz",
- "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=",
- "requires": {
- "create-react-class": "15.6.3",
- "fbjs": "0.8.16",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "prop-types": "15.6.1"
- },
- "dependencies": {
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- },
- "create-react-class": {
- "version": "15.6.3",
- "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz",
- "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==",
- "requires": {
- "fbjs": "0.8.16",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1"
- }
- },
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "0.4.19"
- }
- },
- "fbjs": {
- "version": "0.8.16",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz",
- "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=",
- "requires": {
- "core-js": "1.2.7",
- "isomorphic-fetch": "2.2.1",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "promise": "7.3.1",
- "setimmediate": "1.0.5",
- "ua-parser-js": "0.7.17"
- }
- },
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "isomorphic-fetch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
- "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
- "requires": {
- "node-fetch": "1.7.3",
- "whatwg-fetch": "2.0.3"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "loose-envify": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
- "requires": {
- "js-tokens": "3.0.2"
- }
- },
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
- "requires": {
- "encoding": "0.1.12",
- "is-stream": "1.1.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "2.0.6"
- }
- },
- "prop-types": {
- "version": "15.6.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz",
- "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==",
- "requires": {
- "fbjs": "0.8.16",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1"
- }
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
- "ua-parser-js": {
- "version": "0.7.17",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
- "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g=="
- },
- "whatwg-fetch": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
- "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
- }
- }
- },
- "react-dom": {
- "version": "15.6.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz",
- "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=",
- "requires": {
- "fbjs": "0.8.16",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "prop-types": "15.6.1"
- },
- "dependencies": {
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- },
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "0.4.19"
- }
- },
- "fbjs": {
- "version": "0.8.16",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz",
- "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=",
- "requires": {
- "core-js": "1.2.7",
- "isomorphic-fetch": "2.2.1",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1",
- "promise": "7.3.1",
- "setimmediate": "1.0.5",
- "ua-parser-js": "0.7.17"
- }
- },
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "isomorphic-fetch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
- "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
- "requires": {
- "node-fetch": "1.7.3",
- "whatwg-fetch": "2.0.3"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "loose-envify": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
- "requires": {
- "js-tokens": "3.0.2"
- }
- },
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
- "requires": {
- "encoding": "0.1.12",
- "is-stream": "1.1.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "2.0.6"
- }
- },
- "prop-types": {
- "version": "15.6.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz",
- "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==",
- "requires": {
- "fbjs": "0.8.16",
- "loose-envify": "1.3.1",
- "object-assign": "4.1.1"
- }
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
- "ua-parser-js": {
- "version": "0.7.17",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
- "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g=="
- },
- "whatwg-fetch": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
- "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
- }
- }
- }
- }
-}
diff --git a/packages/engine-react/package.json b/packages/engine-react/package.json
index 5e190580d..bbde28cac 100644
--- a/packages/engine-react/package.json
+++ b/packages/engine-react/package.json
@@ -1,17 +1,18 @@
{
"name": "@pattern-lab/engine-react",
"description": "The React engine for Pattern Lab / Node",
- "version": "0.2.1-alpha.2",
+ "version": "5.0.0",
+ "private": true,
"main": "lib/engine_react.js",
"dependencies": {
- "babel-core": "^6.17.0",
- "babel-plugin-transform-es2015-modules-commonjs": "^6.16.0",
- "babel-preset-react": "^6.16.0",
- "cheerio": "^0.22.0",
- "hogan": "^1.0.2",
- "js-beautify": "^1.6.4",
- "react": "^15.3.2",
- "react-dom": "^15.3.2"
+ "babel-core": "6.17.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.16.0",
+ "babel-preset-react": "6.16.0",
+ "cheerio": "0.22.0",
+ "hogan": "1.0.2",
+ "js-beautify": "1.6.4",
+ "react": "15.3.2",
+ "react-dom": "15.3.2"
},
"peerDependencies": {
"@pattern-lab/core": ">2"
@@ -28,11 +29,9 @@
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"author": "Brian Muenzenmeyer & Geoffrey Pursell",
"license": "MIT",
- "scripts": {
- "test": "grunt travis --verbose"
- },
+ "scripts": {},
"engines": {
- "node": ">=6"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/engine-twig-php/.gitignore b/packages/engine-twig-php/.gitignore
new file mode 100644
index 000000000..74ab03195
--- /dev/null
+++ b/packages/engine-twig-php/.gitignore
@@ -0,0 +1,10 @@
+node_modules/
+.DS_Store
+latest-change.txt
+patternlab.json
+.sass-cache/*
+/sass-cache
+Thumbs.db
+source/css/style.css.map
+.idea/
+public
diff --git a/packages/engine-twig-php/.npmrc b/packages/engine-twig-php/.npmrc
new file mode 100644
index 000000000..0ca8d2a0b
--- /dev/null
+++ b/packages/engine-twig-php/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-twig-php/CHANGELOG.md b/packages/engine-twig-php/CHANGELOG.md
new file mode 100644
index 000000000..6c58d83e0
--- /dev/null
+++ b/packages/engine-twig-php/CHANGELOG.md
@@ -0,0 +1,149 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+# [5.9.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.8.0...v5.9.0) (2020-04-24)
+
+
+### Bug Fixes
+
+* actually exit build when Twig render fails ([5d28a24](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/5d28a24a53011396289c1e29e0a715cd82470185))
+* Update packages/engine-twig-php/lib/engine_twig_php.js ([c67d50e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/c67d50ebb5d69816b7514e85f129f8ecde984ad3))
+
+
+
+
+
+## [5.7.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.7.0...v5.7.1) (2020-02-24)
+
+
+### Bug Fixes
+
+* update twig-renderer ([46f53b7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/46f53b79f8bb0bb64a9c55fd32f29459cea6e28c))
+
+
+
+
+
+# [5.7.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.6.0...v5.7.0) (2020-02-17)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+# [5.6.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.5.0...v5.6.0) (2020-01-18)
+
+
+### Features
+
+* pass additional configuration into twig-php engine ([dff5a78](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/dff5a7830918fa46e2692d9f9daed4121f803461))
+
+
+
+
+
+
+# [5.5.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.4.2...v5.5.0) (2019-12-19)
+
+
+### Features
+
+* upgrade Twig to use new filter, map, reduce ([4218a5a](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/4218a5a04b06027548afd9f417486297dd25fef8))
+
+
+
+
+
+# [5.4.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.3.3...v5.4.0) (2019-11-26)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+# [5.2.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.1.0...v5.2.0) (2019-11-12)
+
+
+### Bug Fixes
+
+* **engine_twig_php:** Allow additional flexibility with twig namespaces. ([07bfaa3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/07bfaa35a00ff62fd2016cc9f34e09cf5af36559))
+
+
+
+
+
+
+# [5.1.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v5.0.2...v5.1.0) (2019-10-29)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* **engine_twig_php:** Pseudo patterns Twig PHP ([226aa8b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/226aa8bbaaf5e418530ccf54a28f6c5657ee6dea)), closes [#1045](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/issues/1045)
+* **engine_twig_php:** Twig incremental rebuilds ([5d33f24](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/5d33f24f156ebe50900701513a855de7de608dcf)), closes [#1015](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/issues/1015)
+* **engine_twig_php:** Twig incremental rebuilds ([1ade945](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/1ade9451840b2645706a0b01129e2b697dc22d4b)), closes [#1015](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/issues/1015)
+
+
+
+
+
+
+## [3.0.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/@pattern-lab/engine-twig-php@3.0.4...@pattern-lab/engine-twig-php@3.0.5) (2019-10-14)
+
+
+### Bug Fixes
+
+* **engine_twig_php:** Pseudo patterns Twig PHP ([226aa8b](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/226aa8bbaaf5e418530ccf54a28f6c5657ee6dea)), closes [#1045](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/issues/1045)
+* **engine_twig_php:** Twig incremental rebuilds ([5d33f24](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/5d33f24f156ebe50900701513a855de7de608dcf)), closes [#1015](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/issues/1015)
+* **engine_twig_php:** Twig incremental rebuilds ([1ade945](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/commit/1ade9451840b2645706a0b01129e2b697dc22d4b)), closes [#1015](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/issues/1015)
+
+
+
+
+
+
+## [3.0.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/@pattern-lab/engine-twig-php@3.0.1...@pattern-lab/engine-twig-php@3.0.2) (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+
+## [3.0.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php/compare/@pattern-lab/engine-twig-php@3.0.0...@pattern-lab/engine-twig-php@3.0.1) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig-php
+
+
+
+
+
+# Change Log
diff --git a/packages/engine-twig-php/LICENSE b/packages/engine-twig-php/LICENSE
new file mode 100644
index 000000000..8d83dd7de
--- /dev/null
+++ b/packages/engine-twig-php/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Evan Lovely, http://evanlovely.com & Brad Frost, http://bradfrostweb.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/engine-twig-php/README.md b/packages/engine-twig-php/README.md
new file mode 100644
index 000000000..f6764d129
--- /dev/null
+++ b/packages/engine-twig-php/README.md
@@ -0,0 +1,3 @@
+## The Twig PHP PatternEngine for Pattern Lab / Node
+
+To install the Twig engine in your edition, `npm install --save @pattern-lab/engine-twig-php` should do the trick.
diff --git a/packages/engine-twig-php/_meta/_00-head.twig b/packages/engine-twig-php/_meta/_00-head.twig
new file mode 100644
index 000000000..4b49c63b7
--- /dev/null
+++ b/packages/engine-twig-php/_meta/_00-head.twig
@@ -0,0 +1,16 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{ patternLabHead | raw }}
+
+
+
+
diff --git a/packages/engine-twig-php/_meta/_01-foot.twig b/packages/engine-twig-php/_meta/_01-foot.twig
new file mode 100644
index 000000000..159dae3eb
--- /dev/null
+++ b/packages/engine-twig-php/_meta/_01-foot.twig
@@ -0,0 +1,6 @@
+
+
+{{ patternLabFoot | raw }}
+
+
+
diff --git a/packages/engine-twig-php/lib/engine_twig_php.js b/packages/engine-twig-php/lib/engine_twig_php.js
new file mode 100644
index 000000000..f675e94d1
--- /dev/null
+++ b/packages/engine-twig-php/lib/engine_twig_php.js
@@ -0,0 +1,268 @@
+'use strict';
+
+/*
+ * Twig PHP pattern engine for patternlab-node
+ *
+ * Evan Lovely
+ * Licensed under the MIT license.
+ *
+ * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice.
+ *
+ */
+
+/*
+ * ENGINE SUPPORT LEVEL: Experimental
+ */
+
+const TwigRenderer = require('@basalt/twig-renderer');
+const fs = require('fs-extra');
+const path = require('path');
+const chalk = require('chalk');
+
+let twigRenderer;
+let patternLabConfig = {};
+
+const engine_twig_php = {
+ engine: TwigRenderer,
+ engineName: 'twig-php',
+ engineFileExtension: '.twig',
+ expandPartials: false,
+ findPartialsRE: /{%\s*(?:extends|include|embed)\s+('[^']+'|"[^"]+").*?(with|%}|\s*%})/g,
+ findPartialKeyRE: /"((?:\\.|[^"\\])*)"|'((?:\\.|[^"\\])*)'/,
+ namespaces: [],
+
+ /**
+ * Accept a Pattern Lab config object from the core and put it in
+ * this module's closure scope so we can configure engine behavior.
+ *
+ * @param {object} config - the global config object from core
+ */
+ usePatternLabConfig: function(config) {
+ patternLabConfig = config;
+
+ if (!config.engines.twig) {
+ console.error('Missing "twig" in Pattern Lab config file; exiting...');
+ process.exit(1);
+ }
+
+ const { namespaces, alterTwigEnv, relativeFrom, ...rest } = config.engines.twig;
+
+ // Schema on config object being passed in:
+ // https://github.com/basaltinc/twig-renderer/blob/master/config.schema.json
+ twigRenderer = new TwigRenderer({
+ src: {
+ roots: [config.paths.source.root, config.paths.source.patterns],
+ namespaces,
+ },
+ relativeFrom,
+ alterTwigEnv,
+ ...rest,
+ });
+
+ // Preserve the namespaces (after recursively adding nested folders) from the config so we can use them later to evaluate partials.
+ this.namespaces = twigRenderer.config.src.namespaces;
+ },
+
+ renderPattern(pattern, data) {
+ return new Promise((resolve, reject) => {
+ // If this is a pseudo pattern the relPath will be incorrect.
+ // i.e. /path/to/pattern.json
+ // Twig can't render that file so we need to use the base patterns
+ // relPath instead.
+ const relPath = pattern.isPseudoPattern
+ ? pattern.basePattern.relPath
+ : pattern.relPath;
+
+ const patternPath = path.isAbsolute(relPath)
+ ? path.relative(patternLabConfig.paths.source.root, relPath)
+ : relPath;
+ let details = '';
+ if (patternLabConfig.logLevel === 'debug') {
+ details = `${JSON.stringify(
+ { pattern, data },
+ null,
+ ' '
+ )} `;
+ }
+
+ twigRenderer
+ .render(patternPath, data)
+ .then(results => {
+ if (results.ok) {
+ resolve(results.html + details);
+ } else {
+ // make Twig rendering errors more noticeable + exit when not in dev mode (or running the `patternlab serve` command)
+ if (
+ process.argv.slice(1).includes('serve') ||
+ process.env.NODE_ENV === 'development'
+ ) {
+ reject(chalk.red(results.message));
+ } else {
+ console.log(chalk.red(results.message));
+ process.exit(1);
+ }
+ }
+ })
+ .catch(error => {
+ reject(error);
+ });
+ });
+ },
+
+ /**
+ * Checks to see if the _meta directory has engine-specific head and foot files,
+ * spawning them if not found.
+ *
+ * @param {object} config - the global config object from core, since we won't
+ * assume it's already present
+ */
+ spawnMeta(config) {
+ const { paths } = config;
+ ['_00-head.twig', '_01-foot.twig'].forEach(fileName => {
+ const metaFilePath = path.resolve(paths.source.meta, fileName);
+ try {
+ fs.statSync(metaFilePath);
+ } catch (err) {
+ //not a file, so spawn it from the included file
+ const metaFileContent = fs.readFileSync(
+ path.resolve(__dirname, '..', '_meta/', fileName),
+ 'utf8'
+ );
+ fs.outputFileSync(metaFilePath, metaFileContent);
+ }
+ });
+ },
+
+ // Below exists several functions that core uses to build lineage through RegEx
+ // @todo Add all functions that get called even if disabled to ease implementing engine further
+ // Currently all of them return `null` as I'm not totally sure there absence will be ok. Additionally, future improvements may be implemented in this functions.
+
+ // Find and return any {% extends|include|embed 'template-name' %} within pattern.
+ // The regex should match the following examples:
+ // {%
+ // include '@molecules/teaser-card/teaser-card.twig' with {
+ // teaser_card: card
+ // } only
+ // %}
+ // OR
+ // {% include '@molecules/teaser-card/teaser-card.twig' %}
+ // OR
+ // {%
+ // include '@molecules/teaser-card/teaser-card.twig'
+ // %}
+ findPartials: function(pattern) {
+ const matches = pattern.template.match(this.findPartialsRE);
+ const filteredMatches =
+ matches &&
+ matches.filter(match => {
+ // Filter out programmatically created includes.
+ // i.e. {% include '@namespace/icons/assets/' ~ name ~ '.svg' %}
+ return match.indexOf('~') === -1;
+ });
+ return filteredMatches;
+ },
+
+ findPartialsWithStyleModifiers(pattern) {
+ return null;
+ },
+
+ findPartialsWithPatternParameters(pattern) {
+ return null;
+ },
+
+ findListItems(pattern) {
+ return null;
+ },
+
+ findPartial_new(partialString) {
+ return null;
+ },
+
+ // Given a pattern, and a partial string, tease out the "pattern key" and
+ // return it.
+ findPartial: function(partialString) {
+ try {
+ let partial = partialString.match(this.findPartialKeyRE)[0];
+ partial = partial.replace(/"/g, '');
+ partial = partial.replace(/'/g, '');
+
+ // Check if namespaces is not empty.
+ const selectedNamespace = this.namespaces.filter(namespace => {
+ // Check to see if this partial contains within the namespace id.
+ return partial.indexOf(`@${namespace.id}`) !== -1;
+ });
+
+ let namespaceResolvedPartial = '';
+
+ if (selectedNamespace.length > 0) {
+ // Loop through all namespaces and try to resolve the namespace to a file path.
+ for (
+ let index = 0;
+ index < selectedNamespace[0].paths.length;
+ index++
+ ) {
+ const patternPath = path.isAbsolute(selectedNamespace[0].paths[index])
+ ? path.relative(
+ patternLabConfig.paths.source.root,
+ selectedNamespace[0].paths[index]
+ )
+ : selectedNamespace[0].paths[index];
+
+ // Replace the name space with the actual path.
+ // i.e. @atoms -> source/_patterns/00-atoms
+ const tempPartial = path.join(
+ process.cwd(),
+ partial.replace(`@${selectedNamespace[0].id}`, patternPath)
+ );
+
+ try {
+ // Check to see if the file actually exists.
+ if (fs.existsSync(tempPartial)) {
+ // get the path to the top-level folder of this pattern
+ // ex. /Users/bradfrost/sites/pattern-lab/packages/edition-twig/source/_patterns/00-atoms
+ const fullFolderPath = `${
+ tempPartial.split(selectedNamespace[0].paths[index])[0]
+ }${selectedNamespace[0].paths[index]}`;
+
+ // then tease out the folder name itself (including the # prefix)
+ // ex. 00-atoms
+ const folderName = fullFolderPath.substring(
+ fullFolderPath.lastIndexOf('/') + 1,
+ fullFolderPath.length
+ );
+
+ // finally, return the Twig path we created from the full file path
+ // ex. 00-atoms/05-buttons/button.twig
+ const fullIncludePath = tempPartial.replace(
+ tempPartial.split(
+ `${folderName}${tempPartial.split(folderName)[1]}`
+ )[0],
+ ''
+ );
+
+ namespaceResolvedPartial = fullIncludePath;
+
+ // After it matches one time, set the resolved partial and exit the loop.
+ break;
+ }
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ }
+ // Return the path with the namespace resolved OR the regex'd partial.
+ return namespaceResolvedPartial || partial;
+ } catch (err) {
+ console.error(
+ 'Error occured when trying to find partial name in: ' + partialString
+ );
+ return null;
+ }
+ },
+
+ patternMatcher(pattern, regex) {
+ return null;
+ },
+};
+
+module.exports = engine_twig_php;
diff --git a/packages/engine-twig-php/package.json b/packages/engine-twig-php/package.json
new file mode 100644
index 000000000..d1a3bd703
--- /dev/null
+++ b/packages/engine-twig-php/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@pattern-lab/engine-twig-php",
+ "description": "The Twig PHP engine for Pattern Lab Node",
+ "version": "5.9.3",
+ "main": "lib/engine_twig_php.js",
+ "dependencies": {
+ "@basalt/twig-renderer": "0.13.1",
+ "@pattern-lab/core": "^5.9.3",
+ "chalk": "^4.0.0",
+ "fs-extra": "0.30.0"
+ },
+ "keywords": [
+ "Pattern Lab",
+ "Atomic Web Design",
+ "Twig"
+ ],
+ "repository": "https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig-php",
+ "bugs": "https://github.com/pattern-lab/patternlab-node/issues",
+ "author": {
+ "name": "Evan Lovely",
+ "url": "http://evanlovely.com"
+ },
+ "maintainers": [
+ {
+ "name": "Salem Ghoweri"
+ }
+ ],
+ "license": "MIT",
+ "scripts": {},
+ "engines": {
+ "node": ">=8.9"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/engine-twig/.npmrc b/packages/engine-twig/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-twig/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-twig/.nvmrc b/packages/engine-twig/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-twig/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-twig/CHANGELOG.md b/packages/engine-twig/CHANGELOG.md
index 0ec0a551d..133363e5b 100644
--- a/packages/engine-twig/CHANGELOG.md
+++ b/packages/engine-twig/CHANGELOG.md
@@ -3,40 +3,111 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [0.2.1-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.1...@pattern-lab/engine-twig@0.2.1-alpha.2) (2018-03-21)
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/v5.9.2...v5.9.3) (2020-05-01)
### Bug Fixes
-* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/9abb8ac))
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/337aa32))
-* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/issues/815)
+* Update dependency on twing JS engine ([cfe88c6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/cfe88c6cdbf2219b9955eaa0ffcfc0e4a7683511))
-
-## [0.2.1-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.0...@pattern-lab/engine-twig@0.2.1-alpha.1) (2018-03-05)
-
-### Bug Fixes
-
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/1473cd5))
-
-
-
-
-
-## 0.2.1-alpha.0 (2018-03-02)
+# [5.8.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/v5.7.2...v5.8.0) (2020-04-03)
### Bug Fixes
-* **engine-twig:** Fix package name ([58f7ec1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/58f7ec1))
-* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/58beeb6))
+* Updated the README to reflect which issues are resolved. ([d90c3c4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/d90c3c4605f9a5bcd1153996e3f4d1a17d58bd92))
### Features
+* switch engine-twig to use twing rather than node-twig ([daca95c](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/daca95c4ffa48916fb6c67c5184bde9b624acd76))
+
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig
+
+
+
+
+
+
+## [0.2.1-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-beta.0...@pattern-lab/engine-twig@0.2.1-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig
+
+
+
+
+
+
+## [0.2.1-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.5...@pattern-lab/engine-twig@0.2.1-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig
+
+
+
+
+
+
+
+## [0.2.1-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.4...@pattern-lab/engine-twig@0.2.1-alpha.5) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/5ab3995))
+
+
+
+## [0.2.1-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.3...@pattern-lab/engine-twig@0.2.1-alpha.4) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/38a01b1))
+
+
+
+## [0.2.1-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.2...@pattern-lab/engine-twig@0.2.1-alpha.3) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-twig
+
+
+
+## [0.2.1-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.1...@pattern-lab/engine-twig@0.2.1-alpha.2) (2018-03-21)
+
+### Bug Fixes
+
+* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/9abb8ac))
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/337aa32))
+* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/issues/815)
+
+
+
+## [0.2.1-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/compare/@pattern-lab/engine-twig@0.2.1-alpha.0...@pattern-lab/engine-twig@0.2.1-alpha.1) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/1473cd5))
+
+
+
+## 0.2.1-alpha.0 (2018-03-02)
+
+### Bug Fixes
+
+* **engine-twig:** Fix package name ([58f7ec1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/58f7ec1))
+* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/58beeb6))
+
+### Features
+
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-twig/commit/5eb2c11))
diff --git a/packages/engine-twig/README.md b/packages/engine-twig/README.md
index 194f92e49..9d45fca95 100644
--- a/packages/engine-twig/README.md
+++ b/packages/engine-twig/README.md
@@ -1,12 +1,16 @@
## The Twig PatternEngine for Pattern Lab / Node
-To install the Twig engine in your edition, `npm install @pattern-lab/engine-twig` should do the trick.
+To install the Twig engine in your edition, `npm install @pattern-lab/engine-twig` should do the trick. This pattern engine uses the [`twing`](https://www.npmjs.com/package/twing) library.
## Supported features
-Level of support is more or less full. Partial calls and lineage hunting are supported. Twig does not support the mustache-specific syntax extensions, style modifiers and pattern parameters, because their use cases are addressed by the core Twig feature set.
+Level of support for Twig constructs is on the level that the `twing` library supports. The following partial resolution schemes (`includes`, `extends`, `import`) are supported:
-We are looking for help with the following issues:
+* relative file paths: standard by `twing` libary
+* namespaces: standard by `twing` library, `engine-twig` only passes the configuration from `patternlab-config.json`
+* Patternlab pattern names: integration between Patternlab and `twing` implemented by a custom [`loader`](https://nightlycommit.github.io/twing/api.html#create-your-own-loader)
+
+Now that this engine uses a better Twig Javascript library, the following issues are resolved:
* [Pattern Lab does not support twig extends](https://github.com/pattern-lab/patternlab-node/issues/554)
* [Verify maturity of Twig engine](https://github.com/pattern-lab/patternlab-node/issues/285)
diff --git a/packages/engine-twig/lib/engine_twig.js b/packages/engine-twig/lib/engine_twig.js
index 898a21450..0bfc99363 100644
--- a/packages/engine-twig/lib/engine_twig.js
+++ b/packages/engine-twig/lib/engine_twig.js
@@ -22,44 +22,126 @@
const fs = require('fs-extra');
const path = require('path');
-const process = require('process');
-const Twig = require('node-twig');
-const twig = Twig.renderFile;
+const {
+ TwingEnvironment,
+ TwingLoaderFilesystem,
+ TwingLoaderChain,
+ TwingSource,
+} = require('twing');
+
+class TwingLoaderPatternLab {
+ patterns = new Map();
+
+ constuctor() {}
+
+ registerPartial(pattern) {
+ if (pattern.patternPartial) {
+ this.patterns.set(pattern.patternPartial, pattern);
+ }
+ }
+
+ /**
+ * Returns the source context for a given template logical name.
+ *
+ * @param {string} name The template logical name
+ * @param {TwingSource} from The source that initiated the template loading
+ *
+ * @returns {Promise}
+ *
+ * @throws TwingErrorLoader When name is not found
+ */
+ getSourceContext(name, from) {
+ var pattern = this.patterns.get(name);
+ return Promise.resolve(
+ new TwingSource(pattern.extendedTemplate, name, pattern.relPath)
+ );
+ }
+
+ /**
+ * Gets the cache key to use for the cache for a given template name.
+ *
+ * @param {string} name The name of the template to load
+ * @param {TwingSource} from The source that initiated the template loading
+ *
+ * @returns {Promise} The cache key
+ *
+ * @throws TwingErrorLoader When name is not found
+ */
+ getCacheKey(name, from) {
+ return Promise.resolve(name);
+ }
+
+ /**
+ * Returns true if the template is still fresh.
+ *l
+ * @param {string} name The template name
+ * @param {number} time Timestamp of the last modification time of the cached template
+ * @param {TwingSource} from The source that initiated the template loading
+ *
+ * @returns {Promise} true if the template is fresh, false otherwise
+ *
+ * @throws TwingErrorLoader When name is not found
+ */
+ isFresh(name, time, from) {
+ return Promise.resolve(this.patterns.has(name) ? true : false);
+ }
+
+ /**
+ * Check if we have the source code of a template, given its name.
+ *
+ * @param {string} name The name of the template to check if we can load
+ * @param {TwingSource} from The source that initiated the template loading
+ *
+ * @returns {Promise} If the template source code is handled by this loader or not
+ */
+ exists(name, from) {
+ return Promise.resolve(this.patterns.has(name) ? true : false);
+ }
+
+ /**
+ * Resolve the path of a template, given its name, whatever it means in the context of the loader.
+ *
+ * @param {string} name The name of the template to resolve
+ * @param {TwingSource} from The source that initiated the template loading
+ *
+ * @returns {Promise} The resolved path of the template
+ */
+ resolve(name, from) {
+ pattern = this.patterns.get(name);
+ return null;
+ }
+}
+
+const fileSystemLoader = new TwingLoaderFilesystem();
+const patternLabLoader = new TwingLoaderPatternLab();
+const chainLoader = new TwingLoaderChain([fileSystemLoader, patternLabLoader]);
+const twing = new TwingEnvironment(chainLoader);
+var metaPath;
var engine_twig = {
- engine: Twig,
+ engine: twing,
engineName: 'twig',
engineFileExtension: '.twig',
- //Important! Needed for Twig compilation. Can't resolve paths otherwise.
- expandPartials: true,
-
// regexes, stored here so they're only compiled once
findPartialsRE: /{%\s*(?:extends|include|embed)\s+('[^']+'|"[^"]+").*?%}/g,
findPartialKeyRE: /"((?:\\.|[^"\\])*)"/,
findListItemsRE: /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g, // TODO
// render it
- renderPattern: function renderPattern(pattern, data) {
- return Promise.resolve(
- twig(
- pattern.relPath,
- {
- root: path.relative(
- __dirname,
- path.resolve(process.cwd(), 'source', '_patterns')
- ),
- context: data,
- },
- (error, template) => {
- if (error) {
- console.log(error);
- }
- console.log(template);
- return template;
- }
- )
+ renderPattern: function renderPattern(pattern, data, partials) {
+ var patternPath = pattern.relPath;
+ if (patternPath.lastIndexOf(metaPath) === 0) {
+ patternPath = patternPath.substring(metaPath.length + 1);
+ }
+ return Promise.resolve(twing.render(patternPath, data));
+ },
+
+ registerPartial: function registerPartial(pattern) {
+ console.log(
+ `registerPartial(${pattern.name} - ${pattern.patternPartial} - ${pattern.patternPath} - ${pattern.relPath})`
);
+ patternLabLoader.registerPartial(pattern);
},
// find and return any {% include 'template-name' %} within pattern
@@ -88,7 +170,6 @@ var engine_twig = {
// given a pattern, and a partial string, tease out the "pattern key" and
// return it.
findPartial: function(partialString) {
- //var partialKey = partialString.replace(this.findPartialsRE, '$1');
var partial = partialString.match(this.findPartialKeyRE)[0];
partial = partial.replace(/"/g, '');
@@ -121,6 +202,30 @@ var engine_twig = {
this.spawnFile(config, '_00-head.twig');
this.spawnFile(config, '_01-foot.twig');
},
+
+ /**
+ * Accept a Pattern Lab config object from the core and use the settings to
+ * load helpers.
+ *
+ * @param {object} config - the global config object from core
+ */
+ usePatternLabConfig: function(config) {
+ metaPath = path.resolve(config.paths.source.meta);
+ // Global paths
+ fileSystemLoader.addPath(config.paths.source.meta);
+ fileSystemLoader.addPath(config.paths.source.patterns);
+ // Namespaced paths
+ if (
+ config['engines'] &&
+ config['engines']['twig'] &&
+ config['engines']['twig']['namespaces']
+ ) {
+ var namespaces = config['engines']['twig']['namespaces'];
+ Object.keys(namespaces).forEach(function(key, index) {
+ fileSystemLoader.addPath(namespaces[key], key);
+ });
+ }
+ },
};
module.exports = engine_twig;
diff --git a/packages/engine-twig/package-lock.json b/packages/engine-twig/package-lock.json
deleted file mode 100644
index d7bfc68b4..000000000
--- a/packages/engine-twig/package-lock.json
+++ /dev/null
@@ -1,161 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.2"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- },
- "node-twig": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/node-twig/-/node-twig-1.1.0.tgz",
- "integrity": "sha1-3ZISSMr0moyGdoyx/6/G9DMG1YA=",
- "requires": {
- "colors": "1.1.2",
- "exec-php": "0.0.3",
- "trim": "0.0.1"
- },
- "dependencies": {
- "colors": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
- },
- "exec-php": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/exec-php/-/exec-php-0.0.3.tgz",
- "integrity": "sha1-oKvQ7d90ATr2jwdVX9UfoOUicj4=",
- "requires": {
- "tmp": "0.0.24"
- }
- },
- "tmp": {
- "version": "0.0.24",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
- "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI="
- },
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
- }
- }
- }
- }
-}
diff --git a/packages/engine-twig/package.json b/packages/engine-twig/package.json
index e1b9018d5..2b3723c0a 100644
--- a/packages/engine-twig/package.json
+++ b/packages/engine-twig/package.json
@@ -1,11 +1,11 @@
{
"name": "@pattern-lab/engine-twig",
"description": "The Twig engine for Pattern Lab / Node",
- "version": "0.2.1-alpha.2",
+ "version": "5.9.3",
"main": "lib/engine_twig.js",
"dependencies": {
- "fs-extra": "^0.30.0",
- "node-twig": "^1.1.0"
+ "fs-extra": "0.30.0",
+ "twing": "4.0.6"
},
"keywords": [
"Pattern Lab",
@@ -20,11 +20,9 @@
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"author": "Brian Muenzenmeyer & Geoffrey Pursell",
"license": "MIT",
- "scripts": {
- "test": "grunt travis --verbose"
- },
+ "scripts": {},
"engines": {
- "node": ">=4.0"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/engine-underscore/.npmrc b/packages/engine-underscore/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/engine-underscore/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/engine-underscore/.nvmrc b/packages/engine-underscore/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/engine-underscore/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/engine-underscore/CHANGELOG.md b/packages/engine-underscore/CHANGELOG.md
index bfc77ad73..24bcead4c 100644
--- a/packages/engine-underscore/CHANGELOG.md
+++ b/packages/engine-underscore/CHANGELOG.md
@@ -3,9 +3,59 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/engine-underscore
+
+
+
+
+
+
+# [2.0.0-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-beta.0...@pattern-lab/engine-underscore@2.0.0-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/engine-underscore
+
+
+
+
+
+
+# [2.0.0-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.7...@pattern-lab/engine-underscore@2.0.0-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/engine-underscore
+
+
+
+
+
+
+
+# [2.0.0-alpha.7](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.6...@pattern-lab/engine-underscore@2.0.0-alpha.7) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/5ab3995))
+
+
+
+# [2.0.0-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.5...@pattern-lab/engine-underscore@2.0.0-alpha.6) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/38a01b1))
+
+
+
+# [2.0.0-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.4...@pattern-lab/engine-underscore@2.0.0-alpha.5) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/engine-underscore
+
-# [2.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.3...@pattern-lab/engine-underscore@2.0.0-alpha.4) (2018-03-21)
+# [2.0.0-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.3...@pattern-lab/engine-underscore@2.0.0-alpha.4) (2018-03-21)
### Bug Fixes
@@ -13,29 +63,22 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/337aa32))
* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/issues/815)
-
-
-
-# [2.0.0-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.2...@pattern-lab/engine-underscore@2.0.0-alpha.3) (2018-03-05)
+# [2.0.0-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/compare/@pattern-lab/engine-underscore@2.0.0-alpha.2...@pattern-lab/engine-underscore@2.0.0-alpha.3) (2018-03-05)
### Bug Fixes
* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/1473cd5))
-
-
-
-# 2.0.0-alpha.2 (2018-03-02)
+# 2.0.0-alpha.2 (2018-03-02)
### Bug Fixes
* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/58beeb6))
-
### Features
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/engine-underscore/commit/5eb2c11))
diff --git a/packages/engine-underscore/package-lock.json b/packages/engine-underscore/package-lock.json
deleted file mode 100644
index 07f47fab5..000000000
--- a/packages/engine-underscore/package-lock.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "underscore": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
- "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
- }
- }
-}
diff --git a/packages/engine-underscore/package.json b/packages/engine-underscore/package.json
index 25bf39288..b103cbbcb 100644
--- a/packages/engine-underscore/package.json
+++ b/packages/engine-underscore/package.json
@@ -1,10 +1,10 @@
{
"name": "@pattern-lab/engine-underscore",
"description": "The Underscore engine for Pattern Lab / Node",
- "version": "2.0.0-alpha.4",
+ "version": "5.0.0",
"main": "lib/engine_underscore.js",
"dependencies": {
- "underscore": "^1.8.3"
+ "underscore": "1.8.3"
},
"keywords": [
"Pattern Lab",
@@ -20,11 +20,10 @@
"author": "Brian Muenzenmeyer & Geoffrey Pursell",
"license": "MIT",
"scripts": {
- "test": "grunt travis --verbose",
"lint": "eslint **/*.js"
},
"engines": {
- "node": ">=4.0"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/live-server/.npmrc b/packages/live-server/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/live-server/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/live-server/.nvmrc b/packages/live-server/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/live-server/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/live-server/CHANGELOG.md b/packages/live-server/CHANGELOG.md
index ab56385bb..8028bae59 100644
--- a/packages/live-server/CHANGELOG.md
+++ b/packages/live-server/CHANGELOG.md
@@ -3,46 +3,113 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [1.3.3-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.1...@pattern-lab/live-server@1.3.3-alpha.2) (2018-03-21)
-
-
-### Bug Fixes
-
-* **lint:** run code through prettier ([ca52fde](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/ca52fde)), closes [#825](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/issues/825)
-* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/9abb8ac))
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/337aa32))
-* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/issues/815)
-
-
-### Features
-
-* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/7f4ce6f))
-
-
-
-
-
-## [1.3.3-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.0...@pattern-lab/live-server@1.3.3-alpha.1) (2018-03-05)
-
-
-### Bug Fixes
-
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/1473cd5))
-
-
-
-
-
-## 1.3.3-alpha.0 (2018-03-02)
-
-
-### Bug Fixes
-
-* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/58beeb6))
-* **prettier:** Attempt to ignore package files ([e6c08bf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/e6c08bf))
-
-
-### Features
-
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/v5.9.2...v5.9.3) (2020-05-01)
+
+**Note:** Version bump only for package @pattern-lab/live-server
+
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/live-server
+
+
+
+
+
+
+## [1.3.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-beta.1...@pattern-lab/live-server@1.3.3) (2019-05-16)
+
+**Note:** Version bump only for package @pattern-lab/live-server
+
+
+
+
+
+## [1.3.3-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-beta.0...@pattern-lab/live-server@1.3.3-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/live-server
+
+
+
+
+
+
+## [1.3.3-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.6...@pattern-lab/live-server@1.3.3-beta.0) (2018-09-07)
+
+**Note:** Version bump only for package @pattern-lab/live-server
+
+
+
+
+
+
+
+## [1.3.3-alpha.6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.5...@pattern-lab/live-server@1.3.3-alpha.6) (2018-07-06)
+
+### Bug Fixes
+
+* **dependencies:** pin all packages marked as latest ([87347d5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/87347d5))
+
+
+
+## [1.3.3-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.4...@pattern-lab/live-server@1.3.3-alpha.5) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/5ab3995))
+
+
+
+## [1.3.3-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.3...@pattern-lab/live-server@1.3.3-alpha.4) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/38a01b1))
+
+
+
+## [1.3.3-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.2...@pattern-lab/live-server@1.3.3-alpha.3) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/live-server
+
+
+
+## [1.3.3-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.1...@pattern-lab/live-server@1.3.3-alpha.2) (2018-03-21)
+
+### Bug Fixes
+
+* **lint:** run code through prettier ([ca52fde](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/ca52fde)), closes [#825](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/issues/825)
+* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/9abb8ac))
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/337aa32))
+* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/issues/815)
+
+### Features
+
+* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/7f4ce6f))
+
+
+
+## [1.3.3-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/compare/@pattern-lab/live-server@1.3.3-alpha.0...@pattern-lab/live-server@1.3.3-alpha.1) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/1473cd5))
+
+
+
+## 1.3.3-alpha.0 (2018-03-02)
+
+### Bug Fixes
+
+* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/58beeb6))
+* **prettier:** Attempt to ignore package files ([e6c08bf](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/e6c08bf))
+
+### Features
+
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server/commit/5eb2c11))
diff --git a/packages/live-server/index.js b/packages/live-server/index.js
index 4da8f2db4..e372fac33 100644
--- a/packages/live-server/index.js
+++ b/packages/live-server/index.js
@@ -1,25 +1,26 @@
#!/usr/bin/env node
-var fs = require('fs'),
- connect = require('connect'),
- serveIndex = require('serve-index'),
- logger = require('morgan'),
- WebSocket = require('faye-websocket'),
- path = require('path'),
- url = require('url'),
- http = require('http'),
- send = require('send'),
- open = require('opn'),
- es = require('event-stream'),
- os = require('os'),
- chokidar = require('chokidar');
+const fs = require('fs');
+const connect = require('connect');
+const serveIndex = require('serve-index');
+const logger = require('morgan');
+const WebSocket = require('faye-websocket');
+const path = require('path');
+const url = require('url');
+const http = require('http');
+const send = require('send');
+const open = require('opn');
+const es = require('event-stream');
+const os = require('os');
+const chokidar = require('chokidar');
+
require('colors');
-var INJECTED_CODE = fs.readFileSync(
+const INJECTED_CODE = fs.readFileSync(
path.join(__dirname, 'injected.html'),
'utf8'
);
-var LiveServer = {
+const LiveServer = {
server: null,
watcher: null,
logLevel: 2,
@@ -35,7 +36,7 @@ function escape(html) {
// Based on connect.static(), but streamlined and with added code injecter
function staticServer(root) {
- var isFile = false;
+ let isFile = false;
try {
// For supporting mounting files instead of just directories
isFile = fs.statSync(root).isFile();
@@ -44,36 +45,49 @@ function staticServer(root) {
}
return function(req, res, next) {
if (req.method !== 'GET' && req.method !== 'HEAD') return next();
- var reqpath = isFile ? '' : url.parse(req.url).pathname;
- var hasNoOrigin = !req.headers.origin;
- var injectCandidates = [
+
+ const reqpath = isFile ? '' : url.parse(req.url).pathname;
+ const hasNoOrigin = !req.headers.origin;
+ const injectCandidates = [
new RegExp('', 'i'),
- new RegExp(''),
+ new RegExp('', 'g'),
new RegExp('', 'i'),
];
- var injectTag = null;
+
+ let injectTag = null;
+ let injectCount = 0;
function directory() {
- var pathname = url.parse(req.originalUrl).pathname;
+ const pathname = url.parse(req.originalUrl).pathname;
res.statusCode = 301;
res.setHeader('Location', pathname + '/');
res.end('Redirecting to ' + escape(pathname) + '/');
}
function file(filepath /*, stat*/) {
- var x = path.extname(filepath).toLocaleLowerCase(),
- match,
- possibleExtensions = ['', '.html', '.htm', '.xhtml', '.php', '.svg'];
+ const x = path.extname(filepath).toLocaleLowerCase();
+ const possibleExtensions = [
+ '',
+ '.html',
+ '.htm',
+ '.xhtml',
+ '.php',
+ '.svg',
+ ];
+
+ let matches;
if (hasNoOrigin && possibleExtensions.indexOf(x) > -1) {
// TODO: Sync file read here is not nice, but we need to determine if the html should be injected or not
- var contents = fs.readFileSync(filepath, 'utf8');
- for (var i = 0; i < injectCandidates.length; ++i) {
- match = injectCandidates[i].exec(contents);
- if (match) {
- injectTag = match[0];
+ const contents = fs.readFileSync(filepath, 'utf8');
+ for (let i = 0; i < injectCandidates.length; ++i) {
+ matches = contents.match(injectCandidates[i]);
+ injectCount = (matches && matches.length) || 0;
+ if (injectCount) {
+ injectTag = matches[0];
break;
}
}
+
if (injectTag === null && LiveServer.logLevel >= 3) {
console.warn(
'Failed to inject refresh script!'.yellow,
@@ -88,15 +102,17 @@ function staticServer(root) {
function error(err) {
if (err.status === 404) return next();
- next(err);
+ return next(err);
}
function inject(stream) {
if (injectTag) {
// We need to modify the length given to browser
- var len = INJECTED_CODE.length + res.getHeader('Content-Length');
+ const len =
+ INJECTED_CODE.length * injectCount + res.getHeader('Content-Length');
res.setHeader('Content-Length', len);
- var originalPipe = stream.pipe;
+
+ const originalPipe = stream.pipe;
stream.pipe = function(resp) {
originalPipe
.call(
@@ -108,7 +124,7 @@ function staticServer(root) {
}
}
- send(req, reqpath, { root: root })
+ return send(req, reqpath, { root: root })
.on('error', error)
.on('directory', directory)
.on('file', file)
@@ -150,41 +166,44 @@ function entryPoint(staticHandler, file) {
* @param wait {number} Server will wait for all changes, before reloading
* @param htpasswd {string} Path to htpasswd file to enable HTTP Basic authentication
* @param middleware {array} Append middleware to stack, e.g. [function(req, res, next) { next(); }].
+ * @param assets {String[]} path of asset directories to watch
*/
LiveServer.start = function(options) {
- options = options || {};
- var host = options.host || '0.0.0.0';
- var port = options.port !== undefined ? options.port : 8080; // 0 means random
- var root = options.root || process.cwd();
- var mount = options.mount || [];
- var watchPaths = options.watch || [root];
+ const host = options.host || '0.0.0.0';
+ const port = options.port !== undefined ? options.port : 8080; // 0 means random
+ const root = options.root || process.cwd();
+ const mount = options.mount || [];
+ const watchPaths = options.watch || [root, ...options.assets];
LiveServer.logLevel = options.logLevel === undefined ? 2 : options.logLevel;
- var openPath =
+
+ let openPath =
options.open === undefined || options.open === true
? ''
- : options.open === null || options.open === false ? null : options.open;
+ : options.open === null || options.open === false
+ ? null
+ : options.open;
if (options.noBrowser) openPath = null; // Backwards compatibility with 0.7.0
- var file = options.file;
- var staticServerHandler = staticServer(root);
- var wait = options.wait === undefined ? 100 : options.wait;
- var browser = options.browser || null;
- var htpasswd = options.htpasswd || null;
- var cors = options.cors || false;
- var https = options.https || null;
- var proxy = options.proxy || [];
- var middleware = options.middleware || [];
- var noCssInject = options.noCssInject;
- var httpsModule = options.httpsModule;
+
+ const file = options.file;
+ const staticServerHandler = staticServer(root);
+ const wait = options.wait === undefined ? 100 : options.wait;
+ const browser = options.browser || null;
+ const htpasswd = options.htpasswd || null;
+ const cors = options.cors || false;
+ const https = options.https || null;
+ const proxy = options.proxy || [];
+ const middleware = options.middleware || [];
+ const noCssInject = options.noCssInject;
+ let httpsModule = options.httpsModule;
if (httpsModule) {
try {
require.resolve(httpsModule);
} catch (e) {
console.error(
- ('HTTPS module "' + httpsModule + '" you\'ve provided was not found.')
- .red
+ `HTTPS module "${httpsModule}" you've provided was not found.`.red
);
- console.error('Did you do', '"npm install ' + httpsModule + '"?');
+ console.error('Did you do', `"npm install ${httpsModule}"?`);
return;
}
} else {
@@ -192,7 +211,7 @@ LiveServer.start = function(options) {
}
// Setup a web server
- var app = connect();
+ const app = connect();
// Add logger. Level 2 logs only errors
if (LiveServer.logLevel === 2) {
@@ -207,31 +226,34 @@ LiveServer.start = function(options) {
} else if (LiveServer.logLevel > 2) {
app.use(logger('dev'));
}
+
if (options.spa) {
middleware.push('spa');
}
+
// Add middleware
- middleware.map(function(mw) {
+ middleware.map(mw => {
+ let mwm = mw;
if (typeof mw === 'string') {
- var ext = path.extname(mw).toLocaleLowerCase();
- if (ext !== '.js') {
- mw = require(path.join(__dirname, 'middleware', mw + '.js'));
+ if (path.extname(mw).toLocaleLowerCase() !== '.js') {
+ mwm = require(path.join(__dirname, 'middleware', mw + '.js'));
} else {
- mw = require(mw);
+ mwm = require(mw);
}
}
- app.use(mw);
+ app.use(mwm);
});
// Use http-auth if configured
if (htpasswd !== null) {
- var auth = require('http-auth');
- var basic = auth.basic({
+ const auth = require('http-auth');
+ const basic = auth.basic({
realm: 'Please authorize',
file: htpasswd,
});
app.use(auth.connect(basic));
}
+
if (cors) {
app.use(
require('cors')({
@@ -240,34 +262,43 @@ LiveServer.start = function(options) {
})
);
}
- mount.forEach(function(mountRule) {
- var mountPath = path.resolve(process.cwd(), mountRule[1]);
- if (!options.watch)
+
+ mount.forEach(mountRule => {
+ const mountPath = path.resolve(process.cwd(), mountRule[1]);
+ if (!options.watch) {
// Auto add mount paths to wathing but only if exclusive path option is not given
watchPaths.push(mountPath);
+ }
+
app.use(mountRule[0], staticServer(mountPath));
- if (LiveServer.logLevel >= 1)
+ if (LiveServer.logLevel >= 1) {
console.log('Mapping %s to "%s"', mountRule[0], mountPath);
+ }
});
- proxy.forEach(function(proxyRule) {
- var proxyOpts = url.parse(proxyRule[1]);
+
+ proxy.forEach(proxyRule => {
+ const proxyOpts = url.parse(proxyRule[1]);
proxyOpts.via = true;
proxyOpts.preserveHost = true;
app.use(proxyRule[0], require('proxy-middleware')(proxyOpts));
- if (LiveServer.logLevel >= 1)
+
+ if (LiveServer.logLevel >= 1) {
console.log('Mapping %s to "%s"', proxyRule[0], proxyRule[1]);
+ }
});
+
app
.use(staticServerHandler) // Custom static server
.use(entryPoint(staticServerHandler, file))
.use(serveIndex(root, { icons: true }));
- var server, protocol;
+ let server, protocol;
if (https !== null) {
- var httpsConfig = https;
+ let httpsConfig = https;
if (typeof https === 'string') {
httpsConfig = require(path.resolve(process.cwd(), https));
}
+
server = require(httpsModule).createServer(httpsConfig, app);
protocol = 'https';
} else {
@@ -278,10 +309,9 @@ LiveServer.start = function(options) {
// Handle server startup errors
server.addListener('error', function(e) {
if (e.code === 'EADDRINUSE') {
- var serveURL = protocol + '://' + host + ':' + port;
console.log(
'%s is already in use. Trying another port.'.yellow,
- serveURL
+ `${protocol}://${host}:${port}`
);
setTimeout(function() {
server.listen(0, host);
@@ -296,35 +326,27 @@ LiveServer.start = function(options) {
server.addListener('listening', function(/*e*/) {
LiveServer.server = server;
- var address = server.address();
- var serveHost =
+ const address = server.address();
+ const serveHost =
address.address === '0.0.0.0' ? '127.0.0.1' : address.address;
- var openHost = host === '0.0.0.0' ? '127.0.0.1' : host;
+ const openHost = host === '0.0.0.0' ? '127.0.0.1' : host;
- var serveURL = protocol + '://' + serveHost + ':' + address.port;
- var openURL = protocol + '://' + openHost + ':' + address.port;
+ const serveURL = `${protocol}://${serveHost}:${address.port}`;
+ const openURL = `${protocol}://${openHost}:${address.port}`;
- var serveURLs = [serveURL];
+ let serveURLs = [serveURL];
if (LiveServer.logLevel > 2 && address.address === '0.0.0.0') {
- var ifaces = os.networkInterfaces();
+ const ifaces = os.networkInterfaces();
serveURLs = Object.keys(ifaces)
- .map(function(iface) {
- return ifaces[iface];
- })
+ .map(iface => ifaces[iface])
// flatten address data, use only IPv4
- .reduce(function(data, addresses) {
+ .reduce((data, addresses) => {
addresses
- .filter(function(addr) {
- return addr.family === 'IPv4';
- })
- .forEach(function(addr) {
- data.push(addr);
- });
+ .filter(addr => addr.family === 'IPv4')
+ .forEach(addr => data.push(addr));
return data;
}, [])
- .map(function(addr) {
- return protocol + '://' + addr.address + ':' + address.port;
- });
+ .map(addr => `${protocol}://${addr.address}:${address.port}`);
}
// Output
@@ -346,9 +368,7 @@ LiveServer.start = function(options) {
// Launch browser
if (openPath !== null)
if (typeof openPath === 'object') {
- openPath.forEach(function(p) {
- open(openURL + p, { app: browser });
- });
+ openPath.forEach(p => open(openURL + p, { app: browser }));
} else {
open(openURL + openPath, { app: browser });
}
@@ -358,19 +378,19 @@ LiveServer.start = function(options) {
server.listen(port, host);
// WebSocket
- var clients = [];
+ let clients = [];
server.addListener('upgrade', function(request, socket, head) {
- var ws = new WebSocket(request, socket, head);
+ const ws = new WebSocket(request, socket, head);
ws.onopen = function() {
ws.send('connected');
};
if (wait > 0) {
(function() {
- var wssend = ws.send;
- var waitTimeout;
+ const wssend = ws.send;
+ let waitTimeout;
ws.send = function() {
- var args = arguments;
+ const args = arguments;
if (waitTimeout) clearTimeout(waitTimeout);
waitTimeout = setTimeout(function() {
wssend.apply(ws, args);
@@ -380,15 +400,13 @@ LiveServer.start = function(options) {
}
ws.onclose = function() {
- clients = clients.filter(function(x) {
- return x !== ws;
- });
+ clients = clients.filter(x => x !== ws);
};
clients.push(ws);
});
- var ignored = [
+ let ignored = [
function(testPath) {
// Always ignore dotfiles (important e.g. because editor hidden temp files)
return (
@@ -396,27 +414,39 @@ LiveServer.start = function(options) {
);
},
];
+
if (options.ignore) {
ignored = ignored.concat(options.ignore);
}
+
if (options.ignorePattern) {
ignored.push(options.ignorePattern);
}
+
// Setup file watcher
- LiveServer.watcher = chokidar.watch(watchPaths, {
- ignored: ignored,
- ignoreInitial: true,
- });
+ LiveServer.watcher = chokidar.watch(
+ // Replace backslashes with slashes, because chokidar pattern
+ // like path/**/*.xyz only acceps linux file path
+ watchPaths.map(p => p.replace(/\\/g, '/')),
+ {
+ ignored: ignored,
+ ignoreInitial: true,
+ awaitWriteFinish: true,
+ }
+ );
+
function handleChange(changePath) {
- var cssChange = path.extname(changePath) === '.css' && !noCssInject;
+ const cssChange = path.extname(changePath) === '.css' && !noCssInject;
if (LiveServer.logLevel >= 1) {
if (cssChange) console.log('CSS change detected'.magenta, changePath);
else console.log('Change detected'.cyan, changePath);
}
- clients.forEach(function(ws) {
+
+ clients.forEach(ws => {
if (ws) ws.send(cssChange ? 'refreshcss' : 'reload');
});
}
+
LiveServer.watcher
.on('change', handleChange)
.on('add', handleChange)
@@ -432,34 +462,28 @@ LiveServer.start = function(options) {
LiveServer.refreshCSS = function() {
if (clients.length) {
- clients.forEach(function(ws) {
- if (ws) {
- ws.send('refreshcss');
- }
+ clients.forEach(ws => {
+ if (ws) ws.send('refreshcss');
});
}
};
LiveServer.reload = function() {
if (clients.length) {
- clients.forEach(function(ws) {
- if (ws) {
- ws.send('reload');
- }
+ clients.forEach(ws => {
+ if (ws) ws.send('reload');
});
}
};
-
- return server;
};
LiveServer.shutdown = function() {
- var watcher = LiveServer.watcher;
- if (watcher) {
- watcher.close();
+ if (LiveServer.watcher) {
+ LiveServer.watcher.close();
+ }
+ if (LiveServer.server) {
+ LiveServer.server.close();
}
- var server = LiveServer.server;
- if (server) server.close();
};
module.exports = LiveServer;
diff --git a/packages/live-server/package-lock.json b/packages/live-server/package-lock.json
deleted file mode 100644
index cadd5af19..000000000
--- a/packages/live-server/package-lock.json
+++ /dev/null
@@ -1,2334 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "requires": {
- "anymatch": "1.3.2",
- "async-each": "1.0.1",
- "fsevents": "1.1.3",
- "glob-parent": "2.0.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0"
- },
- "dependencies": {
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "requires": {
- "micromatch": "2.3.11",
- "normalize-path": "2.1.1"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
- },
- "async-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
- "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "binary-extensions": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
- "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "requires": {
- "fill-range": "2.2.3"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
- },
- "fill-range": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "fsevents": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
- "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
- "optional": true,
- "requires": {
- "nan": "2.9.2",
- "node-pre-gyp": "0.6.39"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "ajv": {
- "version": "4.11.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true
- },
- "aproba": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.2.9"
- }
- },
- "asn1": {
- "version": "0.2.3",
- "bundled": true,
- "optional": true
- },
- "assert-plus": {
- "version": "0.2.0",
- "bundled": true,
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "bundled": true,
- "optional": true
- },
- "aws-sign2": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true
- },
- "aws4": {
- "version": "1.6.0",
- "bundled": true,
- "optional": true
- },
- "balanced-match": {
- "version": "0.4.2",
- "bundled": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "block-stream": {
- "version": "0.0.9",
- "bundled": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "boom": {
- "version": "2.10.1",
- "bundled": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "brace-expansion": {
- "version": "1.1.7",
- "bundled": true,
- "requires": {
- "balanced-match": "0.4.2",
- "concat-map": "0.0.1"
- }
- },
- "buffer-shims": {
- "version": "1.0.0",
- "bundled": true
- },
- "caseless": {
- "version": "0.12.0",
- "bundled": true,
- "optional": true
- },
- "co": {
- "version": "4.6.0",
- "bundled": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true
- },
- "combined-stream": {
- "version": "1.0.5",
- "bundled": true,
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true
- },
- "cryptiles": {
- "version": "2.0.5",
- "bundled": true,
- "requires": {
- "boom": "2.10.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "debug": {
- "version": "2.6.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-extend": {
- "version": "0.4.2",
- "bundled": true,
- "optional": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "bundled": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "extend": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true
- },
- "extsprintf": {
- "version": "1.0.2",
- "bundled": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "bundled": true,
- "optional": true
- },
- "form-data": {
- "version": "2.1.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.15"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true
- },
- "fstream": {
- "version": "1.0.11",
- "bundled": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.1"
- }
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "fstream": "1.0.11",
- "inherits": "2.0.3",
- "minimatch": "3.0.4"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "aproba": "1.1.1",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "bundled": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "bundled": true
- },
- "har-schema": {
- "version": "1.0.5",
- "bundled": true,
- "optional": true
- },
- "har-validator": {
- "version": "4.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ajv": "4.11.8",
- "har-schema": "1.0.5"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "hawk": {
- "version": "3.1.3",
- "bundled": true,
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "bundled": true
- },
- "http-signature": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.0",
- "sshpk": "1.13.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true
- },
- "ini": {
- "version": "1.3.4",
- "bundled": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true
- },
- "isstream": {
- "version": "0.1.2",
- "bundled": true,
- "optional": true
- },
- "jodid25519": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "bundled": true,
- "optional": true
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "bundled": true,
- "optional": true
- },
- "jsonify": {
- "version": "0.0.0",
- "bundled": true,
- "optional": true
- },
- "jsprim": {
- "version": "1.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.0.2",
- "json-schema": "0.2.3",
- "verror": "1.3.6"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "mime-db": {
- "version": "1.27.0",
- "bundled": true
- },
- "mime-types": {
- "version": "2.1.15",
- "bundled": true,
- "requires": {
- "mime-db": "1.27.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "requires": {
- "brace-expansion": "1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "node-pre-gyp": {
- "version": "0.6.39",
- "bundled": true,
- "optional": true,
- "requires": {
- "detect-libc": "1.0.2",
- "hawk": "3.1.3",
- "mkdirp": "0.5.1",
- "nopt": "4.0.1",
- "npmlog": "4.1.0",
- "rc": "1.2.1",
- "request": "2.81.0",
- "rimraf": "2.6.1",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "tar-pack": "3.4.0"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "abbrev": "1.1.0",
- "osenv": "0.1.4"
- }
- },
- "npmlog": {
- "version": "4.1.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true
- },
- "oauth-sign": {
- "version": "0.8.2",
- "bundled": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true
- },
- "performance-now": {
- "version": "0.2.0",
- "bundled": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "bundled": true
- },
- "punycode": {
- "version": "1.4.1",
- "bundled": true,
- "optional": true
- },
- "qs": {
- "version": "6.4.0",
- "bundled": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.2.9",
- "bundled": true,
- "requires": {
- "buffer-shims": "1.0.0",
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "1.0.1",
- "util-deprecate": "1.0.2"
- }
- },
- "request": {
- "version": "2.81.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "4.2.1",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.15",
- "oauth-sign": "0.8.2",
- "performance-now": "0.2.0",
- "qs": "6.4.0",
- "safe-buffer": "5.0.1",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.6.0",
- "uuid": "3.0.1"
- }
- },
- "rimraf": {
- "version": "2.6.1",
- "bundled": true,
- "requires": {
- "glob": "7.1.2"
- }
- },
- "safe-buffer": {
- "version": "5.0.1",
- "bundled": true
- },
- "semver": {
- "version": "5.3.0",
- "bundled": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "optional": true
- },
- "sntp": {
- "version": "1.0.9",
- "bundled": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "sshpk": {
- "version": "1.13.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jodid25519": "1.0.2",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.1",
- "bundled": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "bundled": true,
- "optional": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "tar": {
- "version": "2.2.1",
- "bundled": true,
- "requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
- }
- },
- "tar-pack": {
- "version": "3.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "debug": "2.6.8",
- "fstream": "1.0.11",
- "fstream-ignore": "1.0.5",
- "once": "1.4.0",
- "readable-stream": "2.2.9",
- "rimraf": "2.6.1",
- "tar": "2.2.1",
- "uid-number": "0.0.6"
- }
- },
- "tough-cookie": {
- "version": "2.3.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "punycode": "1.4.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "bundled": true,
- "optional": true
- },
- "uid-number": {
- "version": "0.0.6",
- "bundled": true,
- "optional": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true
- },
- "uuid": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true
- },
- "verror": {
- "version": "1.3.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "extsprintf": "1.0.2"
- }
- },
- "wide-align": {
- "version": "1.1.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "string-width": "1.0.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true
- }
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "requires": {
- "binary-extensions": "1.11.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "requires": {
- "is-primitive": "2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "nan": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz",
- "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==",
- "optional": true
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "randomatic": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
- "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "readdirp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
- "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
- "requires": {
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "readable-stream": "2.3.5",
- "set-immediate-shim": "1.0.1"
- }
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- }
- }
- },
- "colors": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
- },
- "connect": {
- "version": "3.6.6",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
- "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
- "requires": {
- "debug": "2.6.9",
- "finalhandler": "1.1.0",
- "parseurl": "1.3.2",
- "utils-merge": "1.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "finalhandler": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
- "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "1.0.2",
- "escape-html": "1.0.3",
- "on-finished": "2.3.0",
- "parseurl": "1.3.2",
- "statuses": "1.3.1",
- "unpipe": "1.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "parseurl": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
- "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
- },
- "statuses": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
- "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- }
- }
- },
- "cors": {
- "version": "2.8.4",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz",
- "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=",
- "requires": {
- "object-assign": "4.1.1",
- "vary": "1.1.2"
- },
- "dependencies": {
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- }
- }
- },
- "event-stream": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
- "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
- "requires": {
- "duplexer": "0.1.1",
- "from": "0.1.7",
- "map-stream": "0.1.0",
- "pause-stream": "0.0.11",
- "split": "0.3.3",
- "stream-combiner": "0.0.4",
- "through": "2.3.8"
- },
- "dependencies": {
- "duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
- },
- "from": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
- "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4="
- },
- "map-stream": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
- "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ="
- },
- "pause-stream": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
- "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
- "requires": {
- "through": "2.3.8"
- }
- },
- "split": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
- "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
- "requires": {
- "through": "2.3.8"
- }
- },
- "stream-combiner": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
- "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
- "requires": {
- "duplexer": "0.1.1"
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- }
- }
- },
- "faye-websocket": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
- "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
- "requires": {
- "websocket-driver": "0.7.0"
- },
- "dependencies": {
- "http-parser-js": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
- "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
- },
- "websocket-driver": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
- "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
- "requires": {
- "http-parser-js": "0.4.10",
- "websocket-extensions": "0.1.3"
- }
- },
- "websocket-extensions": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
- "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
- }
- }
- },
- "http-auth": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.2.3.tgz",
- "integrity": "sha1-Y2hCtx1uHyyY26Ca9UQXof74thw=",
- "requires": {
- "apache-crypt": "1.2.1",
- "apache-md5": "1.1.2",
- "bcryptjs": "2.4.3",
- "uuid": "3.2.1"
- },
- "dependencies": {
- "apache-crypt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz",
- "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=",
- "requires": {
- "unix-crypt-td-js": "1.0.0"
- }
- },
- "apache-md5": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz",
- "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI="
- },
- "bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
- },
- "unix-crypt-td-js": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz",
- "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs="
- },
- "uuid": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
- "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
- }
- }
- },
- "jshint": {
- "version": "2.9.5",
- "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz",
- "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=",
- "requires": {
- "cli": "1.0.1",
- "console-browserify": "1.1.0",
- "exit": "0.1.2",
- "htmlparser2": "3.8.3",
- "lodash": "3.7.0",
- "minimatch": "3.0.4",
- "shelljs": "0.3.0",
- "strip-json-comments": "1.0.4"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "cli": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
- "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
- "requires": {
- "exit": "0.1.2",
- "glob": "7.1.2"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "console-browserify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
- "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
- "requires": {
- "date-now": "0.1.4"
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "date-now": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
- },
- "dom-serializer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
- "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
- "requires": {
- "domelementtype": "1.1.3",
- "entities": "1.1.1"
- },
- "dependencies": {
- "domelementtype": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
- "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
- },
- "entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
- }
- }
- },
- "domelementtype": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
- "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
- },
- "domhandler": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
- "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
- "requires": {
- "domelementtype": "1.3.0"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0.1.0",
- "domelementtype": "1.3.0"
- }
- },
- "entities": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
- "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "htmlparser2": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
- "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
- "requires": {
- "domelementtype": "1.3.0",
- "domhandler": "2.3.0",
- "domutils": "1.5.1",
- "entities": "1.0.0",
- "readable-stream": "1.1.14"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "lodash": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz",
- "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "shelljs": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
- "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E="
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
- "strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- },
- "mocha": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
- "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
- "requires": {
- "browser-stdout": "1.3.0",
- "commander": "2.11.0",
- "debug": "3.1.0",
- "diff": "3.3.1",
- "escape-string-regexp": "1.0.5",
- "glob": "7.1.2",
- "growl": "1.10.3",
- "he": "1.1.1",
- "mkdirp": "0.5.1",
- "supports-color": "4.4.0"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "browser-stdout": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
- "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8="
- },
- "commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ=="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "diff": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
- "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww=="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "growl": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
- "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q=="
- },
- "has-flag": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
- "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
- },
- "he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "supports-color": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
- "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
- "requires": {
- "has-flag": "2.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- },
- "morgan": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz",
- "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=",
- "requires": {
- "basic-auth": "2.0.0",
- "debug": "2.6.9",
- "depd": "1.1.2",
- "on-finished": "2.3.0",
- "on-headers": "1.0.1"
- },
- "dependencies": {
- "basic-auth": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
- "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
- "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- }
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "opn": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz",
- "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==",
- "requires": {
- "is-wsl": "1.1.0"
- },
- "dependencies": {
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- }
- }
- },
- "proxy-middleware": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz",
- "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY="
- },
- "send": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
- "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
- "requires": {
- "debug": "2.6.9",
- "depd": "1.1.2",
- "destroy": "1.0.4",
- "encodeurl": "1.0.2",
- "escape-html": "1.0.3",
- "etag": "1.8.1",
- "fresh": "0.5.2",
- "http-errors": "1.6.2",
- "mime": "1.4.1",
- "ms": "2.0.0",
- "on-finished": "2.3.0",
- "range-parser": "1.2.0",
- "statuses": "1.4.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "http-errors": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
- "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
- "requires": {
- "depd": "1.1.1",
- "inherits": "2.0.3",
- "setprototypeof": "1.0.3",
- "statuses": "1.4.0"
- },
- "dependencies": {
- "depd": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
- "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
- }
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "mime": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
- "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "range-parser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
- "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
- },
- "setprototypeof": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
- "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
- },
- "statuses": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
- "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
- }
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "requires": {
- "accepts": "1.3.5",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "1.0.3",
- "http-errors": "1.6.2",
- "mime-types": "2.1.18",
- "parseurl": "1.3.2"
- },
- "dependencies": {
- "accepts": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
- "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
- "requires": {
- "mime-types": "2.1.18",
- "negotiator": "0.6.1"
- }
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
- "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "http-errors": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
- "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
- "requires": {
- "depd": "1.1.1",
- "inherits": "2.0.3",
- "setprototypeof": "1.0.3",
- "statuses": "1.4.0"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "mime-db": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
- "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
- },
- "mime-types": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
- "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
- "requires": {
- "mime-db": "1.33.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "negotiator": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
- "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
- },
- "parseurl": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
- "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
- },
- "setprototypeof": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
- "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
- },
- "statuses": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
- "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
- }
- }
- },
- "supertest": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz",
- "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=",
- "requires": {
- "methods": "1.1.2",
- "superagent": "3.8.2"
- },
- "dependencies": {
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "combined-stream": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
- "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "cookiejar": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz",
- "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
- },
- "form-data": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
- "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.6",
- "mime-types": "2.1.18"
- }
- },
- "formidable": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz",
- "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
- "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
- },
- "mime-types": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
- "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
- "requires": {
- "mime-db": "1.33.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "superagent": {
- "version": "3.8.2",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz",
- "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==",
- "requires": {
- "component-emitter": "1.2.1",
- "cookiejar": "2.1.1",
- "debug": "3.1.0",
- "extend": "3.0.1",
- "form-data": "2.3.2",
- "formidable": "1.1.1",
- "methods": "1.1.2",
- "mime": "1.6.0",
- "qs": "6.5.1",
- "readable-stream": "2.3.5"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- }
- }
- }
- }
-}
diff --git a/packages/live-server/package.json b/packages/live-server/package.json
index 86924d11e..9d5e5d0a1 100644
--- a/packages/live-server/package.json
+++ b/packages/live-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@pattern-lab/live-server",
- "version": "1.3.3-alpha.2",
+ "version": "5.9.3",
"description": "simple development http server with live reload capability",
"keywords": [
"front-end",
@@ -12,30 +12,30 @@
],
"author": "Tapio Vierros",
"dependencies": {
- "chokidar": "^1.6.0",
- "colors": "latest",
- "connect": "^3.6.5",
- "cors": "latest",
- "event-stream": "latest",
+ "chokidar": "3.1.0",
+ "colors": "1.3.0",
+ "connect": "3.6.5",
+ "cors": "2.8.4",
+ "event-stream": "3.3.4",
"faye-websocket": "0.11.x",
"http-auth": "3.2.x",
- "morgan": "^1.6.1",
- "object-assign": "latest",
- "opn": "latest",
- "proxy-middleware": "latest",
- "send": "latest",
- "serve-index": "^1.7.2"
+ "morgan": "1.9.1",
+ "object-assign": "4.1.1",
+ "opn": "5.3.0",
+ "proxy-middleware": "0.15.0",
+ "send": "0.16.2",
+ "serve-index": "1.9.1"
},
"devDependencies": {
"eslint": "4.18.2",
- "jshint": "^2.9.2",
- "mocha": "^4.0.1",
- "supertest": "^3.0.0"
+ "jshint": "2.10.2",
+ "mocha": "4.0.1",
+ "supertest": "3.0.0"
},
"scripts": {
"lint": "eslint live-server.js index.js",
"hint": "jshint live-server.js index.js",
- "test": "mocha test && npm run lint"
+ "test:separate": "mocha test && npm run lint"
},
"bin": {
"live-server": "./live-server.js"
@@ -43,7 +43,7 @@
"repository": "https://github.com/pattern-lab/patternlab-node/tree/master/packages/live-server",
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/plugin-tab/.npmrc b/packages/plugin-tab/.npmrc
new file mode 100644
index 000000000..ce73f58bf
--- /dev/null
+++ b/packages/plugin-tab/.npmrc
@@ -0,0 +1,2 @@
+package-lock=false
+save-exact=true
diff --git a/packages/plugin-tab/.nvmrc b/packages/plugin-tab/.nvmrc
new file mode 100644
index 000000000..95c4e8d27
--- /dev/null
+++ b/packages/plugin-tab/.nvmrc
@@ -0,0 +1 @@
+10.0.0
\ No newline at end of file
diff --git a/packages/plugin-tab/CHANGELOG.md b/packages/plugin-tab/CHANGELOG.md
index af387ae36..8105bc650 100644
--- a/packages/plugin-tab/CHANGELOG.md
+++ b/packages/plugin-tab/CHANGELOG.md
@@ -3,44 +3,135 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [2.0.3-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.1...@pattern-lab/plugin-tab@2.0.3-alpha.2) (2018-03-21)
+## [5.9.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/v5.9.2...v5.9.3) (2020-05-01)
### Bug Fixes
-* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/9abb8ac))
-* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/337aa32))
-* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/issues/815)
-
-
-### Features
-
-* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/7f4ce6f))
-
-
-
-
-
-## [2.0.3-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.0...@pattern-lab/plugin-tab@2.0.3-alpha.1) (2018-03-05)
-
-
-### Bug Fixes
-
-* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/1473cd5))
-
-
-
-
-
-## 2.0.3-alpha.0 (2018-03-02)
-
-
-### Bug Fixes
-
-* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/58beeb6))
-
-
-### Features
-
+* **plugintabs:** enabling multiple file formats [#1163](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/issues/1163) ([bb5e817](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/bb5e8179e6b8553a6e1af0bede26db412b6c0b68))
+
+
+
+
+
+
+# [5.3.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/v5.2.0...v5.3.0) (2019-11-13)
+
+
+### Bug Fixes
+
+* add PluginTab workaround for Safari ([2fa9367](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/2fa936769be65484af52f242dca2536a3382462c))
+* **plugin-tab:** defensively call addPanels ([b82bd12](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/b82bd129fdbe48de95b62d75fb7fe95cea896b7e))
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* **plugin:** correct spelling error and function locations ([d4abd88](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/d4abd88cb017550002407241b5045a2ad1adb1dc))
+* **plugin-tab:** bump lodash from 4.17.5 to 4.17.15 in /packages/plugin-tab ([#1081](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/issues/1081)) ([3f89dda](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/3f89dda1685874e251f9777f969c0943e0080881))
+* **plugin-tab:** handle params correctly ([d248993](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/d2489939bb0db1a1d67b0e7f47dfb1838b88b0a0))
+
+
+### Features
+
+* **plugin-tab:** pivot to using hook functions ([d4b2598](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/d4b25984fc2a2646cc1876a5c635f57593c35f09))
+* **plugin-tab, core:** initial plugin hook exploration ([2f3d39a](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/2f3d39ac6b125ad4c6b872e27ee224ce2ea33a12))
+
+
+### BREAKING CHANGES
+
+* **plugin-tab:** event based listeners replaced with functions
+
+
+
+
+
+
+## [2.0.3-beta.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-beta.0...@pattern-lab/plugin-tab@2.0.3-beta.1) (2019-02-09)
+
+**Note:** Version bump only for package @pattern-lab/plugin-tab
+
+
+
+
+
+
+## [2.0.3-beta.0](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.5...@pattern-lab/plugin-tab@2.0.3-beta.0) (2018-09-07)
+
+
+### Bug Fixes
+
+* **package:** fix pathing and naming issues ([45583f8](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/45583f8))
+* **postinstall:** fix typo in name ([a1a9779](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/a1a9779))
+
+
+### Features
+
+* **package:** revamp plugin-tab ([2aa0f8f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/2aa0f8f))
+
+
+
+
+
+
+
+## [2.0.3-alpha.5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.4...@pattern-lab/plugin-tab@2.0.3-alpha.5) (2018-07-06)
+
+### Features
+
+* **package:** add npmrc file ([55f5bc2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/55f5bc2))
+* **package:** pin all dependencies ([415698e](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/415698e))
+* **package:** remove package-lock.json files ([5ab3995](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/5ab3995))
+
+
+
+## [2.0.3-alpha.4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.3...@pattern-lab/plugin-tab@2.0.3-alpha.4) (2018-07-05)
+
+### Features
+
+* **tests:** use lerna run test at the monorepo level ([38a01b1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/38a01b1))
+
+
+
+## [2.0.3-alpha.3](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.2...@pattern-lab/plugin-tab@2.0.3-alpha.3) (2018-05-04)
+
+**Note:** Version bump only for package @pattern-lab/plugin-tab
+
+
+
+## [2.0.3-alpha.2](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.1...@pattern-lab/plugin-tab@2.0.3-alpha.2) (2018-03-21)
+
+### Bug Fixes
+
+* **package:** remove files obsoleted by monorepo ([9abb8ac](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/9abb8ac))
+* **package:** update LICENSE ([337aa32](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/337aa32))
+* **README:** update content for consistency ([4edf0d4](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/4edf0d4)), closes [#815](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/issues/815)
+
+### Features
+
+* **package:** standardize and hoist common devDependencies ([7f4ce6f](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/7f4ce6f))
+
+
+
+## [2.0.3-alpha.1](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/compare/@pattern-lab/plugin-tab@2.0.3-alpha.0...@pattern-lab/plugin-tab@2.0.3-alpha.1) (2018-03-05)
+
+### Bug Fixes
+
+* **config:** Add npm registry to lerna config ([1473cd5](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/1473cd5))
+
+
+
+## 2.0.3-alpha.0 (2018-03-02)
+
+### Bug Fixes
+
+* **packages:** Allow scoped publishing ([58beeb6](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/58beeb6))
+
+### Features
+
* **packages:** Update all package.json repo and bug links ([5eb2c11](https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab/commit/5eb2c11))
diff --git a/packages/plugin-tab/README.md b/packages/plugin-tab/README.md
index 50e24a477..c7cea632f 100644
--- a/packages/plugin-tab/README.md
+++ b/packages/plugin-tab/README.md
@@ -1,4 +1,4 @@
-
+
[](https://www.npmjs.com/package/@pattern-lab/plugin-tab)
[](https://gitter.im/pattern-lab/node)
@@ -28,7 +28,7 @@ Example:
```
"plugins": {
- "plugin-node-tab": {
+ "@pattern-lab/plugin-tab": {
"enabled": true,
"initialized": false,
"options": {
@@ -38,7 +38,7 @@ Example:
}
```
-Add file extensions to this array as strings. Example: `"tabsToAdd": ['scss', 'js']`. You are all set now.
+Add file extensions to this array as strings. Example: `"tabsToAdd": ["scss", "js"]`. You are all set now.
## Expected Structure
@@ -56,4 +56,4 @@ For example, if we added an `scss` tab:
## Enabling / Disabling the Plugin
-After install, you may manually enable or disable the plugin by finding the `plugin-node-tab` key within your main Pattern Lab project's `patternlab-config.json` file and setting the `enabled` flag. In the future this will be possible via CLI.
+After install, you may manually enable or disable the plugin by finding the `@pattern-lab/plugin-tab` key within your main Pattern Lab project's `patternlab-config.json` file and setting the `enabled` flag. In the future this will be possible via CLI.
diff --git a/packages/plugin-tab/dist/js/@pattern-lab-plugin-tab.js b/packages/plugin-tab/dist/js/@pattern-lab-plugin-tab.js
new file mode 100644
index 000000000..f1fcd7be3
--- /dev/null
+++ b/packages/plugin-tab/dist/js/@pattern-lab-plugin-tab.js
@@ -0,0 +1,20 @@
+// workaround to `PluginTab undefined` error in Safari
+window.PluginTab = {
+ /**
+ * The function defined as the onready callback within the plugin configuration.
+ */
+ init: function() {
+ //placeholder that will be replaced during configuation
+ //most plugins could probably just implement logic here instead.
+ function addPanels() {
+ /*SNIPPETS*/
+ }
+
+ // workaround to try recovering from load order race conditions
+ if (window.patternlab && window.patternlab.panels) {
+ addPanels();
+ } else {
+ document.addEventListener('patternLab.pageLoad', addPanels);
+ }
+ },
+};
diff --git a/packages/plugin-tab/dist/js/plugin-node-tab.js b/packages/plugin-tab/dist/js/plugin-node-tab.js
deleted file mode 100644
index d0e999422..000000000
--- a/packages/plugin-tab/dist/js/plugin-node-tab.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var PluginTab = {
- /**
- * The function defined as the onready callback within the plugin configuration.
- */
- init: function() {
- //placeholder that will be replaced during configuation
- //most plugins could probably just implement logic here instead.
- /*SNIPPETS*/
- },
-};
diff --git a/packages/plugin-tab/index.js b/packages/plugin-tab/index.js
index 3790ea383..71d96281f 100644
--- a/packages/plugin-tab/index.js
+++ b/packages/plugin-tab/index.js
@@ -1,24 +1,33 @@
'use strict';
-const pluginName = 'plugin-node-tab';
+const path = require('path');
+const EOL = require('os').EOL;
+const _ = require('lodash');
const fs = require('fs-extra');
const glob = require('glob');
-const path = require('path');
-const EOL = require('os').EOL;
+
const tab_loader = require('./src/tab-loader');
+const pluginName = '@pattern-lab/plugin-tab';
+//remove the forward-slash, which can accidentally result in directories being written in the output
+const safePluginName = '@pattern-lab-plugin-tab';
+
function writeConfigToOutput(patternlab, pluginConfig) {
- var pluginConfigPathName = path.resolve(
- patternlab.config.paths.public.root,
- 'patternlab-components',
- 'packages'
- );
try {
- fs.outputFileSync(
- pluginConfigPathName + '/' + pluginName + '.json',
- JSON.stringify(pluginConfig, null, 2)
- );
+ _.each(patternlab.uikits, uikit => {
+ fs.outputFileSync(
+ path.join(
+ process.cwd(),
+ uikit.outputDir,
+ patternlab.config.paths.public.root,
+ 'patternlab-components',
+ 'packages',
+ `/${safePluginName}.json`
+ ),
+ JSON.stringify(pluginConfig, null, 2)
+ );
+ });
} catch (ex) {
console.trace(
pluginName + ': Error occurred while writing pluginFile configuration'
@@ -27,18 +36,19 @@ function writeConfigToOutput(patternlab, pluginConfig) {
}
}
-function onPatternIterate(patternlab, pattern) {
- tab_loader(patternlab, pattern);
+async function onPatternIterate(params) {
+ const [patternlab, pattern] = params;
+ await tab_loader(patternlab, pattern);
}
/**
- * Define what events you wish to listen to here
- * For a full list of events - check out https://github.com/pattern-lab/patternlab-node/wiki/Creating-Plugins#events
- * @param patternlab - global data store which has the handle to the event emitter
+ * Define what hooks you wish to invoke to here
+ * //todo change link
+ * For a full list of hooks - check out https://github.com/pattern-lab/patternlab-node/wiki/Creating-Plugins#events
+ * @param patternlab - global data store which has the handle to hooks
*/
-function registerEvents(patternlab) {
- //register our handler at the appropriate time of execution
- patternlab.events.on('patternlab-pattern-write-end', onPatternIterate);
+function registerHooks(patternlab) {
+ patternlab.hooks['patternlab-pattern-write-end'].push(onPatternIterate);
}
/**
@@ -48,15 +58,11 @@ function registerEvents(patternlab) {
*/
function getPluginFrontendConfig() {
return {
- name: 'pattern-lab/' + pluginName,
+ name: pluginName,
templates: [],
stylesheets: [],
javascripts: [
- 'patternlab-components/pattern-lab/' +
- pluginName +
- '/js/' +
- pluginName +
- '.js',
+ `patternlab-components/pattern-lab/${safePluginName}/js/${safePluginName}.js`,
],
onready: 'PluginTab.init()',
callback: '',
@@ -69,33 +75,16 @@ function getPluginFrontendConfig() {
*/
function pluginInit(patternlab) {
if (!patternlab) {
- console.error('patternlab object not provided to plugin-init');
+ console.error('patternlab object not provided to pluginInit');
process.exit(1);
}
//write the plugin json to public/patternlab-components
- var pluginConfig = getPluginFrontendConfig();
+ const pluginConfig = getPluginFrontendConfig();
pluginConfig.tabsToAdd =
patternlab.config.plugins[pluginName].options.tabsToAdd;
writeConfigToOutput(patternlab, pluginConfig);
- var pluginConfigPathName = path.resolve(
- patternlab.config.paths.public.root,
- 'patternlab-components',
- 'packages'
- );
- try {
- fs.outputFileSync(
- pluginConfigPathName + '/' + pluginName + '.json',
- JSON.stringify(pluginConfig, null, 2)
- );
- } catch (ex) {
- console.trace(
- 'plugin-node-tab: Error occurred while writing pluginFile configuration'
- );
- console.log(ex);
- }
-
//add the plugin config to the patternlab-object
if (!patternlab.plugins) {
patternlab.plugins = [];
@@ -103,26 +92,26 @@ function pluginInit(patternlab) {
patternlab.plugins.push(pluginConfig);
//write the plugin dist folder to public/pattern-lab
- var pluginFiles = glob.sync(__dirname + '/dist/**/*');
+ const pluginFiles = glob.sync(__dirname + '/dist/**/*');
if (pluginFiles && pluginFiles.length > 0) {
- let tab_frontend_snippet = fs.readFileSync(
+ const tab_frontend_snippet = fs.readFileSync(
path.resolve(__dirname + '/src/snippet.js'),
'utf8'
);
for (let i = 0; i < pluginFiles.length; i++) {
try {
- var fileStat = fs.statSync(pluginFiles[i]);
+ const fileStat = fs.statSync(pluginFiles[i]);
if (fileStat.isFile()) {
- var relativePath = path
+ const relativePath = path
.relative(__dirname, pluginFiles[i])
.replace('dist', ''); //dist is dropped
- var writePath = path.join(
+ const writePath = path.join(
patternlab.config.paths.public.root,
'patternlab-components',
'pattern-lab',
- pluginName,
+ safePluginName,
relativePath
);
@@ -134,10 +123,10 @@ function pluginInit(patternlab) {
//in this case, we need to alter the dist file to loop through our tabs to load as defined in the package.json
//we are also being a bit lazy here, since we only expect one file
let tabJSFileContents = fs.readFileSync(pluginFiles[i], 'utf8');
- var snippetString = '';
+ let snippetString = '';
if (pluginConfig.tabsToAdd && pluginConfig.tabsToAdd.length > 0) {
for (let j = 0; j < pluginConfig.tabsToAdd.length; j++) {
- let tabSnippetLocal = tab_frontend_snippet
+ const tabSnippetLocal = tab_frontend_snippet
.replace(/<>/g, pluginConfig.tabsToAdd[j])
.replace(
/<>/g,
@@ -149,12 +138,17 @@ function pluginInit(patternlab) {
'/*SNIPPETS*/',
snippetString
);
- fs.outputFileSync(writePath, tabJSFileContents);
+ _.each(patternlab.uikits, uikit => {
+ fs.outputFileSync(
+ path.join(process.cwd(), uikit.outputDir, writePath),
+ tabJSFileContents
+ );
+ });
}
}
} catch (ex) {
console.trace(
- 'plugin-node-tab: Error occurred while copying pluginFile',
+ 'plugin-tab: Error occurred while copying pluginFile',
pluginFiles[i]
);
console.log(ex);
@@ -167,14 +161,14 @@ function pluginInit(patternlab) {
patternlab.config.plugins = {};
}
- //attempt to only register events once
+ //attempt to only register hooks once
if (
patternlab.config.plugins[pluginName] !== undefined &&
patternlab.config.plugins[pluginName].enabled &&
!patternlab.config.plugins[pluginName].initialized
) {
- //register events
- registerEvents(patternlab);
+ //register hooks
+ registerHooks(patternlab);
//set the plugin initialized flag to true to indicate it is installed and ready
patternlab.config.plugins[pluginName].initialized = true;
diff --git a/packages/plugin-tab/package-lock.json b/packages/plugin-tab/package-lock.json
deleted file mode 100644
index d657026af..000000000
--- a/packages/plugin-tab/package-lock.json
+++ /dev/null
@@ -1,1100 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "eslint": {
- "version": "3.19.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz",
- "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=",
- "requires": {
- "babel-code-frame": "6.26.0",
- "chalk": "1.1.3",
- "concat-stream": "1.6.1",
- "debug": "2.6.9",
- "doctrine": "2.1.0",
- "escope": "3.6.0",
- "espree": "3.5.4",
- "esquery": "1.0.0",
- "estraverse": "4.2.0",
- "esutils": "2.0.2",
- "file-entry-cache": "2.0.0",
- "glob": "7.1.2",
- "globals": "9.18.0",
- "ignore": "3.3.7",
- "imurmurhash": "0.1.4",
- "inquirer": "0.12.0",
- "is-my-json-valid": "2.17.2",
- "is-resolvable": "1.1.0",
- "js-yaml": "3.11.0",
- "json-stable-stringify": "1.0.1",
- "levn": "0.3.0",
- "lodash": "4.17.5",
- "mkdirp": "0.5.1",
- "natural-compare": "1.4.0",
- "optionator": "0.8.2",
- "path-is-inside": "1.0.2",
- "pluralize": "1.2.1",
- "progress": "1.1.8",
- "require-uncached": "1.0.3",
- "shelljs": "0.7.8",
- "strip-bom": "3.0.0",
- "strip-json-comments": "2.0.1",
- "table": "3.8.3",
- "text-table": "0.2.0",
- "user-home": "2.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.0.tgz",
- "integrity": "sha512-arn53F07VXmls4o4pUhSzBa4fvaagPRe7AVZ8l7NHxFWUie2DsuFSBMMNAkgzRlOhEhzAnxeKyaWVzOH4xqp/g=="
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "requires": {
- "acorn": "3.3.0"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
- }
- }
- },
- "ajv": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
- "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
- "requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
- }
- },
- "ajv-keywords": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
- "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw="
- },
- "ansi-escapes": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
- "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "1.0.3"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.2",
- "js-tokens": "3.0.2"
- }
- },
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
- "requires": {
- "callsites": "0.2.0"
- }
- },
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
- },
- "cli-cursor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
- "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
- "requires": {
- "restore-cursor": "1.0.1"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
- "requires": {
- "inherits": "2.0.3",
- "readable-stream": "2.3.5",
- "typedarray": "0.0.6"
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "d": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
- "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
- "requires": {
- "es5-ext": "0.10.39"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "requires": {
- "globby": "5.0.0",
- "is-path-cwd": "1.0.0",
- "is-path-in-cwd": "1.0.0",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "rimraf": "2.6.2"
- }
- },
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "requires": {
- "esutils": "2.0.2"
- }
- },
- "es5-ext": {
- "version": "0.10.39",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz",
- "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==",
- "requires": {
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-symbol": "3.1.1"
- }
- },
- "es6-map": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
- "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-iterator": "2.0.3",
- "es6-set": "0.1.5",
- "es6-symbol": "3.1.1",
- "event-emitter": "0.3.5"
- }
- },
- "es6-set": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
- "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1",
- "event-emitter": "0.3.5"
- }
- },
- "es6-symbol": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
- "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39"
- }
- },
- "es6-weak-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
- "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39",
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "escope": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
- "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
- "requires": {
- "es6-map": "0.1.5",
- "es6-weak-map": "2.0.2",
- "esrecurse": "4.2.1",
- "estraverse": "4.2.0"
- }
- },
- "espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
- "requires": {
- "acorn": "5.5.0",
- "acorn-jsx": "3.0.1"
- }
- },
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
- },
- "esquery": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
- "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "requires": {
- "estraverse": "4.2.0"
- }
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
- "requires": {
- "d": "1.0.0",
- "es5-ext": "0.10.39"
- }
- },
- "exit-hook": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
- "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "requires": {
- "escape-string-regexp": "1.0.5",
- "object-assign": "4.1.1"
- }
- },
- "file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
- "requires": {
- "flat-cache": "1.3.0",
- "object-assign": "4.1.1"
- }
- },
- "flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
- "requires": {
- "circular-json": "0.3.3",
- "del": "2.2.2",
- "graceful-fs": "4.1.11",
- "write": "0.2.1"
- }
- },
- "generate-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
- "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ="
- },
- "generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
- "requires": {
- "is-property": "1.0.2"
- }
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "requires": {
- "array-union": "1.0.2",
- "arrify": "1.0.1",
- "glob": "7.1.2",
- "object-assign": "4.1.1",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "ignore": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA=="
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "inquirer": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
- "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
- "requires": {
- "ansi-escapes": "1.4.0",
- "ansi-regex": "2.1.1",
- "chalk": "1.1.3",
- "cli-cursor": "1.0.2",
- "cli-width": "2.2.0",
- "figures": "1.7.0",
- "lodash": "4.17.5",
- "readline2": "1.0.1",
- "run-async": "0.1.0",
- "rx-lite": "3.1.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "through": "2.3.8"
- }
- },
- "interpret": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
- "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-my-ip-valid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
- "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
- },
- "is-my-json-valid": {
- "version": "2.17.2",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
- "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
- "requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "is-my-ip-valid": "1.0.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
- }
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
- "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
- "requires": {
- "is-path-inside": "1.0.1"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "1.0.2"
- }
- },
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "js-yaml": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
- "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
- "requires": {
- "argparse": "1.0.10",
- "esprima": "4.0.0"
- }
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
- },
- "jsonpointer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2"
- }
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mute-stream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
- "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "onetime": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "requires": {
- "deep-is": "0.1.3",
- "fast-levenshtein": "2.0.6",
- "levn": "0.3.0",
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2",
- "wordwrap": "1.0.0"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "path-parse": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
- "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "pluralize": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
- "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU="
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "progress": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
- "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74="
- },
- "readable-stream": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.0",
- "safe-buffer": "5.1.1",
- "string_decoder": "1.0.3",
- "util-deprecate": "1.0.2"
- }
- },
- "readline2": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
- "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "mute-stream": "0.0.5"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "requires": {
- "resolve": "1.5.0"
- }
- },
- "require-uncached": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
- "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
- "requires": {
- "caller-path": "0.1.0",
- "resolve-from": "1.0.1"
- }
- },
- "resolve": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
- "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
- "requires": {
- "path-parse": "1.0.5"
- }
- },
- "resolve-from": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
- "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
- },
- "restore-cursor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
- "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
- "requires": {
- "exit-hook": "1.1.1",
- "onetime": "1.1.0"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- },
- "run-async": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
- "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
- "requires": {
- "once": "1.4.0"
- }
- },
- "rx-lite": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
- "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI="
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "shelljs": {
- "version": "0.7.8",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
- "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
- "requires": {
- "glob": "7.1.2",
- "interpret": "1.1.0",
- "rechoir": "0.6.2"
- }
- },
- "slice-ansi": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
- "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU="
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- },
- "table": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
- "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
- "requires": {
- "ajv": "4.11.8",
- "ajv-keywords": "1.5.1",
- "chalk": "1.1.3",
- "lodash": "4.17.5",
- "slice-ansi": "0.0.4",
- "string-width": "2.1.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "2.0.0",
- "strip-ansi": "4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "3.0.0"
- }
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "1.1.2"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "user-home": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
- "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
- "requires": {
- "os-homedir": "1.0.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
- "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
- "requires": {
- "mkdirp": "0.5.1"
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- }
- }
- },
- "fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
- "requires": {
- "graceful-fs": "4.1.11",
- "jsonfile": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.2"
- },
- "dependencies": {
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "4.1.11"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "7.1.2"
- }
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- }
- }
- }
- }
-}
diff --git a/packages/plugin-tab/package.json b/packages/plugin-tab/package.json
index da80caa44..387057575 100644
--- a/packages/plugin-tab/package.json
+++ b/packages/plugin-tab/package.json
@@ -1,21 +1,25 @@
{
"name": "@pattern-lab/plugin-tab",
- "version": "2.0.3-alpha.2",
+ "version": "5.9.3",
"description": "",
"main": "index.js",
"dependencies": {
- "fs-extra": "^0.30.0",
- "glob": "^7.0.0"
+ "fs-extra": "0.30.0",
+ "glob": "7.0.0",
+ "lodash": "4.17.15"
+ },
+ "engines": {
+ "node": ">=10.0"
},
"repository": "https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab",
"bugs": "https://github.com/pattern-lab/patternlab-node/issues",
"scripts": {
- "test": "eslint src/** index.js postinstall.js",
+ "lint": "eslint src/** index.js postinstall.js",
"postinstall": "node ./postinstall.js"
},
"author": "Brian Muenzenmeyer",
"license": "MIT",
- "homepage": "https://github.com/pattern-lab/plugin-node-tab#readme",
+ "homepage": "https://github.com/pattern-lab/patternlab-node/tree/master/packages/plugin-tab",
"devDependencies": {
"eslint": "4.18.2"
},
diff --git a/packages/plugin-tab/postinstall.js b/packages/plugin-tab/postinstall.js
index 56620abe5..25c8c2039 100644
--- a/packages/plugin-tab/postinstall.js
+++ b/packages/plugin-tab/postinstall.js
@@ -1,10 +1,5 @@
-console.log('Pattern Lab Node Plugin - "plugin-node-tab" installed. ');
-console.log(
- 'You may have to run `npm run postinstall` from your console as well.'
-);
-console.log(
- 'Configure or disable this plugin inside your patternlab-config.json file.'
-);
-console.log(
- 'Add tabs to the Pattern Lab UI by adding file extensions to the "tabsToAdd" array on the plugins.plugin-node-tab.options object.'
-);
+console.log(`Pattern Lab Node Plugin - "plugin-tab" installed.
+Use the CLI to install this: patternlab install --plugins @pattern-lab/plugin-tab
+Configure or disable this plugin inside your patternlab-config.json file.
+Add tabs to the Pattern Lab UI by adding file extensions to the "tabsToAdd" array on the plugins['@pattern-lab/plugin-tab'].options object.
+`);
diff --git a/packages/plugin-tab/src/snippet.js b/packages/plugin-tab/src/snippet.js
index b7e08bb36..337f00fec 100644
--- a/packages/plugin-tab/src/snippet.js
+++ b/packages/plugin-tab/src/snippet.js
@@ -1,14 +1,13 @@
-/* global Panels */
-
-Panels.add({
+window.patternlab.panels.add({
id: 'sg-panel-<>',
name: '<>',
- default: false,
+ default: window.config.defaultPatternInfoPanelCode && window.config.defaultPatternInfoPanelCode === "<>",
templateID: 'pl-panel-template-code',
httpRequest: true,
httpRequestReplace: '.<>',
httpRequestCompleted: false,
prismHighlight: true,
- language: 'markup',
- keyCombo: 'ctrl+shift+z',
+ language: '<>'//,
+ /* TODO: We would need to find a way to enable keyCombo for multiple panels
+ keyCombo: 'ctrl+shift+z',*/
});
diff --git a/packages/plugin-tab/src/tab-loader.js b/packages/plugin-tab/src/tab-loader.js
index 4793128a9..ff0981b45 100644
--- a/packages/plugin-tab/src/tab-loader.js
+++ b/packages/plugin-tab/src/tab-loader.js
@@ -1,32 +1,34 @@
'use strict';
-const fs = require('fs-extra');
const path = require('path');
+const _ = require('lodash');
+const fs = require('fs-extra');
+
/**
* The backend method that is called during the patternlab-pattern-write-end event.
* Responsible for looking for a companion filetype file alongside a pattern file and outputting it if found.
* @param patternlab - the global data store
* @param pattern - the pattern object being iterated over
*/
-function findTab(patternlab, pattern) {
+async function findTab(patternlab, pattern) {
//read the filetypes from the configuration
const fileTypes =
- patternlab.config.plugins['plugin-node-tab'].options.tabsToAdd;
+ patternlab.config.plugins['@pattern-lab/plugin-tab'].options.tabsToAdd;
//exit if either of these two parameters are missing
if (!patternlab) {
- console.error('plugin-node-tab: patternlab object not provided to findTab');
+ console.error('plugin-tab: patternlab object not provided to findTab');
process.exit(1);
}
if (!pattern) {
- console.error('plugin-node-tab: pattern object not provided to findTab');
+ console.error('plugin-tab: pattern object not provided to findTab');
process.exit(1);
}
//derive the custom filetype paths from the pattern relPath
- var customFileTypePath = path.join(
+ let customFileTypePath = path.join(
patternlab.config.paths.source.patterns,
pattern.relPath
);
@@ -39,35 +41,47 @@ function findTab(patternlab, pattern) {
customFileTypePath.substr(0, customFileTypePath.lastIndexOf('.')) +
'.' +
fileType;
- var customFileTypeOutputPath =
+ const customFileTypeOutputPath =
patternlab.config.paths.public.patterns +
pattern.getPatternLink(patternlab, 'custom', '.' + fileType);
//look for a custom filetype for this template
+ let tabFileName;
+ let tabFileNameStats;
try {
- var tabFileName = path.resolve(customFileTypePath);
+ tabFileName = path.resolve(customFileTypePath);
try {
- var tabFileNameStats = fs.statSync(tabFileName);
+ tabFileNameStats = fs.statSync(tabFileName);
} catch (err) {
//not a file - move on quietly
}
if (tabFileNameStats && tabFileNameStats.isFile()) {
if (patternlab.config.debug) {
console.log(
- 'plugin-node-tab: copied pattern-specific custom file for ' +
+ 'plugin-tab: copied pattern-specific custom file for ' +
pattern.patternPartial
);
}
//copy the file to our output target if found
- fs.copySync(tabFileName, customFileTypeOutputPath);
+ _.each(patternlab.uikits, uikit => {
+ fs.copySync(
+ tabFileName,
+ path.join(process.cwd(), uikit.outputDir, customFileTypeOutputPath)
+ );
+ });
} else {
//otherwise write nothing to the same location - this prevents GET errors on the tab.
- fs.outputFileSync(customFileTypeOutputPath, '');
+ _.each(patternlab.uikits, uikit => {
+ fs.outputFileSync(
+ path.join(process.cwd(), uikit.outputDir, customFileTypeOutputPath),
+ ''
+ );
+ });
}
} catch (err) {
console.log(
- 'plugin-node-tab:There was an error parsing sibling JSON for ' +
+ 'plugin-tab: There was an error parsing sibling JSON for ' +
pattern.relPath
);
console.log(err);
diff --git a/packages/starterkit-handlebars-demo/CHANGELOG.md b/packages/starterkit-handlebars-demo/CHANGELOG.md
new file mode 100644
index 000000000..cc7b9ed6b
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/CHANGELOG.md
@@ -0,0 +1,54 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [5.7.2](https://github.com/pattern-lab/patternlab-node/compare/v5.7.1...v5.7.2) (2020-03-24)
+
+**Note:** Version bump only for package @pattern-lab/starterkit-handlebars-demo
+
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/patternlab-node/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+
+### Bug Fixes
+
+* **starterkit:** add css output and build command ([ccb2d35](https://github.com/pattern-lab/patternlab-node/commit/ccb2d3569b741220324a3fa738ab3d4d2eb97ffe))
+* **starterkit:** remove config file ([f90e38a](https://github.com/pattern-lab/patternlab-node/commit/f90e38aa873dcff0dd08fe4dabc3b71bf95080b6))
+* **starterkit:** use handlebars meta files ([d8f5e12](https://github.com/pattern-lab/patternlab-node/commit/d8f5e12471bd783bd3755626701ecc17669fc761))
+
+
+
+
+
+
+## [1.0.3](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/starterkit-handlebars-demo@1.0.2...@pattern-lab/starterkit-handlebars-demo@1.0.3) (2019-08-24)
+
+
+### Bug Fixes
+
+* **starterkit:** add css output and build command ([ccb2d35](https://github.com/pattern-lab/patternlab-node/commit/ccb2d35))
+
+
+
+
+
+## [1.0.2](https://github.com/pattern-lab/patternlab-node/compare/@pattern-lab/starterkit-handlebars-demo@1.0.1...@pattern-lab/starterkit-handlebars-demo@1.0.2) (2019-08-23)
+
+
+### Bug Fixes
+
+* **starterkit:** remove config file ([f90e38a](https://github.com/pattern-lab/patternlab-node/commit/f90e38a))
+* **starterkit:** use handlebars meta files ([d8f5e12](https://github.com/pattern-lab/patternlab-node/commit/d8f5e12))
+
+
+
+
+
+## 1.0.1 (2019-08-23)
+
+**Note:** Version bump only for package @pattern-lab/starterkit-handlebars-demo
diff --git a/packages/starterkit-handlebars-demo/LICENSE b/packages/starterkit-handlebars-demo/LICENSE
new file mode 100644
index 000000000..1190640f9
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Brad Frost, http://bradfrostweb.com & Dave Olsen, http://dmolsen.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/starterkit-handlebars-demo/README.md b/packages/starterkit-handlebars-demo/README.md
new file mode 100644
index 000000000..1ce6378d5
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/README.md
@@ -0,0 +1,17 @@
+# Demo StarterKit for Handlebars
+
+The Demo StarterKit for Handlebars is meant to be used as a demonstration of a Handlebars-based project in Pattern Lab.
+
+## Requirements
+
+The Base StarterKit for Handlebars requires the following PatternEngine:
+
+- `@pattern-lab/patternengine-node-handlebars`: [npm](https://www.npmjs.com/package/@pattern-lab/patternengine-node-handlebars), [Github](https://github.com/pattern-lab/patternengine-node-handlebars)
+
+## Install
+
+[Installation Instructions](http://patternlab.io/docs/advanced-starterkits.html)
+
+## Edit Files
+
+After installation the files for this StarterKit can be found in `source/`.
diff --git a/packages/starterkit-handlebars-demo/dist/_data/blocks.json b/packages/starterkit-handlebars-demo/dist/_data/blocks.json
new file mode 100644
index 000000000..585ec80fd
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/blocks.json
@@ -0,0 +1,10 @@
+{
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400"
+ },
+ "stripeField": true,
+ "cartPrice": {
+ "label": "Label",
+ "meta": "meta"
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/buttons.json b/packages/starterkit-handlebars-demo/dist/_data/buttons.json
new file mode 100644
index 000000000..81560eb82
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/buttons.json
@@ -0,0 +1,15 @@
+{
+ "buttonTag" : true,
+ "buttonText" : "Button",
+ "buttonGroup" : [
+ {
+ "buttonTag": true,
+ "buttonText": "Button"
+ },
+ {
+ "styleModifier": "c-btn--bare",
+ "buttonTag": true,
+ "buttonText": "Button"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/colors.json b/packages/starterkit-handlebars-demo/dist/_data/colors.json
new file mode 100644
index 000000000..9d1f67b12
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/colors.json
@@ -0,0 +1,103 @@
+{
+ "brandColors" : [
+ {
+ "colorHex" : "#0000ff",
+ "colorName" : "Brand Blue",
+ "variable" : "$color-brand-blue"
+ }
+ ],
+ "neutralColors" : [
+ {
+ "colorHex" : "#ffffff",
+ "colorName" : "White",
+ "variable" : "$color-white"
+ },
+ {
+ "colorHex" : "#f9f9f9",
+ "colorName" : "02% Gray",
+ "variable" : "$color-gray-02"
+ },
+ {
+ "colorHex" : "#eeeeee",
+ "colorName" : "07% Gray",
+ "variable" : "$color-gray-07"
+ },
+ {
+ "colorHex" : "#dddddd",
+ "colorName" : "13% Gray",
+ "variable" : "$color-gray-13"
+ },
+ {
+ "colorHex" : "#bbbbbb",
+ "colorName" : "27% Gray",
+ "variable" : "$color-gray-27"
+ },
+ {
+ "colorHex" : "#808080",
+ "colorName" : "50% Gray",
+ "variable" : "$color-gray-50"
+ },
+ {
+ "colorHex" : "#666666",
+ "colorName" : "60% Gray",
+ "variable" : "$color-gray-60"
+ },
+ {
+ "colorHex" : "#444444",
+ "colorName" : "73% Gray",
+ "variable" : "$color-gray-73"
+ },
+ {
+ "colorHex" : "#131313",
+ "colorName" : "93% Gray",
+ "variable" : "$color-gray-93"
+ },
+ {
+ "colorHex" : "#000000",
+ "colorName" : "Black",
+ "variable" : "$color-black"
+ }
+ ],
+ "utilityColors" : [
+ {
+ "colorHex" : "#0192d0",
+ "colorName" : "Info",
+ "variable" : "$color-utility-info"
+ },
+ {
+ "colorHex" : "#d3f2ff",
+ "colorName" : "Info Light",
+ "variable" : "$color-utility-info-light"
+ },
+ {
+ "colorHex" : "#b12a0b",
+ "colorName" : "Error",
+ "variable" : "$color-utility-error"
+ },
+ {
+ "colorHex" : "#fdded8",
+ "colorName" : "Error Light",
+ "variable" : "$color-utility-error-light"
+ },
+ {
+ "colorHex" : "#a59b15",
+ "colorName" : "Warning",
+ "variable" : "$color-utility-warning"
+ },
+ {
+ "colorHex" : "#fffecf",
+ "colorName" : "Warning Light",
+ "variable" : "$color-utility-warning-light"
+ },
+ {
+ "colorHex" : "#03804d",
+ "colorName" : "Success",
+ "variable" : "$color-utility-success"
+ },
+ {
+ "colorHex" : "#d4f3e6",
+ "colorName" : "Success Light",
+ "variable" : "$color-utility-success-light"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/data.json b/packages/starterkit-handlebars-demo/dist/_data/data.json
new file mode 100755
index 000000000..3639de279
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/data.json
@@ -0,0 +1,24 @@
+{
+ "title": "Soul Soles",
+ "company": {
+ "name": "Soul Soles",
+ "url": "http://soulsoles.com"
+ },
+ "user": {
+ "name": "Thisisauser Withaverylongname",
+ "username": "thisisalongusernamenamename"
+ },
+ "page": {
+ "title": "This is the page title",
+ "description": "This is the page description"
+ },
+ "heading": "Heading ipsum dol (33 characters)",
+ "headline": "Heading ipsum dol (33 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "url": "#",
+ "htmlText": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam necessitatibus reprehenderit ipsum repellat quasi ratione sit possimus 🙂 eveniet, ea, ut mollitia repudiandae eligendi unde aperiam molestiae voluptatibus error. Dolorem, iure.
Lorem ipsum dolor sit amet , consectetur adipiscing elit. Integer fringilla sem a urna porttitor fringilla. Nulla eget justo felis. eget volutpat justo mattis nec. Sed a orci turpis. Aliquam aliquet placerat dui.
This is a second-level heading Aliquam erat volutpat. Mauris vulputate scelerisque feugiat. Cras a erat a diam venenatis aliquam . Sed tempus, purus ac pretium varius, risus orci sagittis purus, quis auctor libero magna nec magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas eros dolor.
Ordered list item Another ordered list item Yet another ordered list item This is a third-level heading Aliquam ultrices cursus mauris, eget volutpat justo mattis nec. Sed a orci turpis. Aliquam aliquet placerat dui, consectetur tincidunt leo tristique et. Vivamus enim nisi, blandit a venenatis quis, convallis et arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris libero sapien, placerat in sodales eu, tempor quis dui. Vivamus egestas faucibus pulvinar. Maecenas eget diam nunc. Phasellus at sem eros, ac suscipit neque. Phasellus sollicitudin libero a odio dignissim scelerisque. Aliquam purus nulla, tempor eget ullamcorper quis, rhoncus non dui.
Bulleted list item Another bulleted list item Yet bulleted list item And here's yet another bulleted list item This is a blockquote. Eget volutpat justo mattis nec. Sed a orci turpis. Aliquam aliquet placerat dui, consectetur tincidunt leo eget est blandit dignissim a eu ante. Morbi augue nulla Cite Source This is a fourth-level heading Cras at fringilla ipsum. Donec nec libero eget est blandit dignissim a eu ante. Morbi augue nulla, luctus eu sagittis vel, malesuada ut felis. Aliquam erat volutpat. Morbi malesuada augue ac massa hendrerit fermentum. Integer scelerisque lacus a dolor convallis lobortis. Curabitur mollis ante in massa ultricies dignissim.
This is a fifth-level heading Cras at fringilla ipsum. Donec nec libero eget est blandit dignissim a eu ante. Morbi augue nulla, luctus eu sagittis vel.
This is a sixth-level heading Lorem ipsum dolor sit amet.
",
+ "cta": "Call to Action",
+ "sectionTitle": "Section Title",
+ "hero": true,
+ "promoBlock": true
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/forms.json b/packages/starterkit-handlebars-demo/dist/_data/forms.json
new file mode 100644
index 000000000..eb5780265
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/forms.json
@@ -0,0 +1,127 @@
+{
+ "legend" : "Legend",
+ "label" : "Label",
+ "value" : "",
+ "placeholder" : "Placeholder",
+ "fieldNote" : "This is a note about the field",
+ "id" : "",
+ "selectOptions" : [
+ {
+ "value" : "option-1",
+ "option" : "Option 1"
+ },
+ {
+ "value" : "option-2",
+ "option" : "Option 2"
+ }
+ ],
+ "checkboxes" : [
+ {
+ "label" : "Option 1",
+ "id" : "check-1",
+ "name" : "checkname",
+ "checked" : true
+ },
+ {
+ "label" : "Option 2",
+ "id" : "check-2",
+ "name" : "checkname"
+ }
+ ],
+ "radios" : [
+ {
+ "label" : "Option 1",
+ "id" : "radio-1",
+ "name" : "radioname",
+ "checked" : true
+ },
+ {
+ "label" : "Option 2",
+ "id" : "radio-2",
+ "name" : "radioname"
+ }
+ ],
+ "searchForm": true,
+ "searchFormButton": {
+ "buttonTag": true,
+ "styleModifier": "u-is-vishidden",
+ "buttonText": "Search"
+ },
+ "fields": [
+ {}
+ ],
+ "selectField": [
+ {}
+ ],
+ "formFields": {
+ "items": [
+ {
+ "textField": {
+ "label" : "Name"
+ }
+ },
+ {
+ "selectField": {
+ "label": "Select",
+ "selectOptions" : [
+ {
+ "value" : "option-1",
+ "option" : "Option 1"
+ },
+ {
+ "value" : "option-2",
+ "option" : "Option 2"
+ }
+ ]
+ }
+ },
+ {
+ "checkboxField": {
+ "label": "Checkbox Field",
+ "checkboxes" : [
+ {
+ "label" : "Option 1",
+ "id" : "check-1",
+ "name" : "checkname",
+ "checked" : true
+ },
+ {
+ "label" : "Option 2",
+ "id" : "check-2",
+ "name" : "checkname"
+ }
+ ]
+ }
+ },
+ {
+ "textAreaField": {
+ "label" : "Textarea Field"
+ }
+ },
+ {
+ "radioField": {
+ "label": "Radios",
+ "radios" : [
+ {
+ "label" : "Option 1",
+ "id" : "radio-1",
+ "name" : "radioname",
+ "checked" : true
+ },
+ {
+ "label" : "Option 2",
+ "id" : "radio-2",
+ "name" : "radioname"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "formButtons": [
+ {},
+ {
+ "styleModifier": "c-btn--bare"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/global.json b/packages/starterkit-handlebars-demo/dist/_data/global.json
new file mode 100644
index 000000000..0a432082e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/global.json
@@ -0,0 +1,5 @@
+{
+ "footerLogo": {
+ "styleModifier": "c-logo--light"
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/icons.json b/packages/starterkit-handlebars-demo/dist/_data/icons.json
new file mode 100644
index 000000000..b6e5ea0cb
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/icons.json
@@ -0,0 +1,13 @@
+{
+ "iconPath" : "../../icons.svg",
+ "icon" : "search",
+ "icons" : [
+ { "icon" : "minus" },
+ { "icon" : "plus" },
+ { "icon" : "search" },
+ { "icon" : "triangle-down" },
+ { "icon" : "triangle-up" },
+ { "icon" : "triangle-right" },
+ { "icon" : "triangle-left" }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/images.json b/packages/starterkit-handlebars-demo/dist/_data/images.json
new file mode 100644
index 000000000..fba053261
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/images.json
@@ -0,0 +1,5 @@
+{
+ "src" : "http://via.placeholder.com/1200x800",
+ "alt": "landscape image",
+ "logoImg" : "../../images/logo.png"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/listitems.json b/packages/starterkit-handlebars-demo/dist/_data/listitems.json
new file mode 100644
index 000000000..49d1a202f
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/listitems.json
@@ -0,0 +1,3 @@
+{
+
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/lists.json b/packages/starterkit-handlebars-demo/dist/_data/lists.json
new file mode 100644
index 000000000..5100a1310
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/lists.json
@@ -0,0 +1,154 @@
+{
+ "stackedBlockList": [
+ {
+ "styleModifier": "",
+ "url": "#",
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400",
+ "alt": "placeholder image"
+ },
+ "headline": "Heading ipsum dolor sit (39 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "label": "Label"
+ },
+ {
+ "styleModifier": "",
+ "url": "#",
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400",
+ "alt": "placeholder image"
+ },
+ "headline": "Heading ipsum dolor sit (39 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "label": "Label"
+ },
+ {
+ "styleModifier": "",
+ "url": "#",
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400",
+ "alt": "placeholder image"
+ },
+ "headline": "Heading ipsum dolor sit (39 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "label": "Label"
+ },
+ {
+ "styleModifier": "",
+ "url": "#",
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400",
+ "alt": "placeholder image"
+ },
+ "headline": "Heading ipsum dolor sit (39 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "label": "Label"
+ },
+ {
+ "styleModifier": "",
+ "url": "#",
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400",
+ "alt": "placeholder image"
+ },
+ "headline": "Heading ipsum dolor sit (39 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "label": "Label"
+ },
+ {
+ "styleModifier": "",
+ "url": "#",
+ "stackedBlockMedia": {
+ "src": "http://via.placeholder.com/600x400",
+ "alt": "placeholder image"
+ },
+ "headline": "Heading ipsum dolor sit (39 characters)",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "label": "Label"
+ }
+ ],
+ "stripeList": [
+ {
+ "url": "#",
+ "src": "http://via.placeholder.com/495x330",
+ "alt": "placeholder image",
+ "headline": "product item",
+ "cartPrice": {
+ "label": "label",
+ "meta": "meta"
+ }
+ },
+ {
+ "url": "#",
+ "src": "http://via.placeholder.com/495x330",
+ "alt": "placeholder image",
+ "headline": "product item",
+ "cartPrice": {
+ "label": "label",
+ "meta": "meta"
+ }
+ }
+ ],
+ "definitionList": {
+ "items": [
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ }
+ ]
+ },
+ "definitionItems": [
+ {
+ "definitionList": {
+ "items": [
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ }
+ ]
+ }
+ },
+ {
+ "definitionList": {
+ "items": [
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ },
+ {
+ "term": "Definition List Term",
+ "description": "Definition list description"
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/navigation.json b/packages/starterkit-handlebars-demo/dist/_data/navigation.json
new file mode 100644
index 000000000..093eff61a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/navigation.json
@@ -0,0 +1,85 @@
+{
+ "navToggle" : {
+ "styleModifier" : "c-btn--small c-header__nav-btn js-nav-trigger",
+ "buttonText" : "Menu"
+ },
+ "paginationList" : [
+ {
+ "number" : "Prev"
+ },
+ {
+ "number" : "1"
+ },
+ {
+ "number" : "2"
+ },
+ {
+ "number" : "Next"
+ }
+ ],
+ "navItems" : [
+ {
+ "label" : "Women",
+ "url" : "link.pages-category"
+ },
+ {
+ "label" : "Men",
+ "url" : "link.pages-category-men"
+ },
+ {
+ "label" : "Kids",
+ "url" : "link.pages-category-kids"
+ },
+ {
+ "label" : "On Sale",
+ "url" : "link.pages-category-on-sale"
+ },
+ {
+ "label": false,
+ "navIcon": {
+ "iconPath": "../../icons.svg",
+ "navIcon": "shopping-cart"
+ },
+ "url" : "link.pages-cart"
+ }
+ ],
+ "footerNav" : [
+ {
+ "label" : "Women",
+ "url" : "link.pages-category"
+ },
+ {
+ "label" : "Men",
+ "url" : "link.pages-category-men"
+ },
+ {
+ "label" : "Kids",
+ "url" : "link.pages-category-kids"
+ },
+ {
+ "label" : "On Sale",
+ "url" : "link.pages-category-on-sale"
+ }
+ ],
+ "progressTracker" : {
+ "items": [
+ {
+ "styleModifier": "is-current",
+ "number": "1",
+ "label": "Shipping Information"
+ },
+ {
+ "number": "2",
+ "label": "Billing Information"
+ },
+ {
+ "number": "3",
+ "label": "Review Order"
+ },
+ {
+ "number": "4",
+ "label": "Confirmation"
+ }
+ ]
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/sections.json b/packages/starterkit-handlebars-demo/dist/_data/sections.json
new file mode 100644
index 000000000..0178ced86
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/sections.json
@@ -0,0 +1,3 @@
+{
+ "stackedBlockSection": true
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_data/tables.json b/packages/starterkit-handlebars-demo/dist/_data/tables.json
new file mode 100644
index 000000000..f4105b7b9
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_data/tables.json
@@ -0,0 +1,33 @@
+{
+ "tableHeaderCells" : [
+ {
+ "th" : "Table Heading 1"
+ },
+ {
+ "th" : "Table Heading 2"
+ }
+ ],
+ "tableRows" : [
+ {
+ "tableCells" : [
+ {
+ "td" : "Value"
+ },
+ {
+ "td" : "Value"
+ }
+ ]
+ },
+ {
+ "tableCells" : [
+ {
+ "td" : "Value"
+ },
+ {
+ "td" : "Value"
+ }
+ ]
+ }
+ ],
+ "tableFooterCells" : false
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_meta/_00-head.hbs b/packages/starterkit-handlebars-demo/dist/_meta/_00-head.hbs
new file mode 100644
index 000000000..cf2ddff33
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_meta/_00-head.hbs
@@ -0,0 +1,19 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+ {{{ patternLabHead }}}
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_meta/_01-foot.hbs b/packages/starterkit-handlebars-demo/dist/_meta/_01-foot.hbs
new file mode 100644
index 000000000..98d360860
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_meta/_01-foot.hbs
@@ -0,0 +1,9 @@
+
+
+
+
+ {{{ patternLabFoot }}}
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/.gitkeep b/packages/starterkit-handlebars-demo/dist/_patterns/.gitkeep
new file mode 100644
index 000000000..c7c2a5f52
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/.gitkeep
@@ -0,0 +1 @@
+keeping this dir around
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-brand-colors.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-brand-colors.hbs
new file mode 100755
index 000000000..a19359a3e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-brand-colors.hbs
@@ -0,0 +1 @@
+{{> atoms-colors }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-brand-colors.json b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-brand-colors.json
new file mode 100644
index 000000000..fc10a79bc
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-brand-colors.json
@@ -0,0 +1,22 @@
+{
+ "items": [
+ {
+ "name": "$color-brand-blue",
+ "value": "#114689",
+ "comment": ""
+ },
+ {
+ "name": "$color-brand-blue-dark",
+ "value": "#041544",
+ "comment": ""
+ },
+ {
+ "name": "$color-brand-orange",
+ "value": "#ba6333",
+ "comment": ""
+ }
+ ],
+ "meta": {
+ "description": "To add to these items, use Sass variables that start with $color-brand- in ./source/css/scss/abstracts/_variables.scss"
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-neutral-colors.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-neutral-colors.hbs
new file mode 100644
index 000000000..a19359a3e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-neutral-colors.hbs
@@ -0,0 +1 @@
+{{> atoms-colors }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-neutral-colors.json b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-neutral-colors.json
new file mode 100644
index 000000000..2ffefc02a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-neutral-colors.json
@@ -0,0 +1,57 @@
+{
+ "items": [
+ {
+ "name": "$color-neutral-white",
+ "value": "#fff",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-02",
+ "value": "#f9f9f9",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-07",
+ "value": "#eee",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-13",
+ "value": "#ddd",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-27",
+ "value": "#bbb",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-50",
+ "value": "#808080",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-60",
+ "value": "#666",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-73",
+ "value": "#444",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-gray-93",
+ "value": "#131313",
+ "comment": ""
+ },
+ {
+ "name": "$color-neutral-black",
+ "value": "#000",
+ "comment": ""
+ }
+ ],
+ "meta": {
+ "description": "To add to these items, use Sass variables that start with $color-neutral- in ./source/css/scss/abstracts/_variables.scss"
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-utility-colors.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-utility-colors.hbs
new file mode 100644
index 000000000..a19359a3e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-utility-colors.hbs
@@ -0,0 +1 @@
+{{> atoms-colors }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-utility-colors.json b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-utility-colors.json
new file mode 100644
index 000000000..48fe29629
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/00-utility-colors.json
@@ -0,0 +1,47 @@
+{
+ "items": [
+ {
+ "name": "$color-utility-info",
+ "value": "#0192d0",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-info-light",
+ "value": "#d3f2ff",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-error",
+ "value": "#b12a0b",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-error-light",
+ "value": "#fdded8",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-success",
+ "value": "#03804d",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-success-light",
+ "value": "#d4f3e6",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-warning",
+ "value": "#a59b15",
+ "comment": ""
+ },
+ {
+ "name": "$color-utility-warning-light",
+ "value": "#fffecf",
+ "comment": ""
+ }
+ ],
+ "meta": {
+ "description": "To add to these items, use Sass variables that start with $color-utility- in ./source/css/scss/abstracts/_variables.scss"
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-families.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-families.hbs
new file mode 100755
index 000000000..ee83f885c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-families.hbs
@@ -0,0 +1,6 @@
+
+ {{# items }}
+ {{ name }}: {{ value }}
+ {{/ items }}
+
+{{{ meta.description }}}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-families.json b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-families.json
new file mode 100644
index 000000000..1631188fe
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-families.json
@@ -0,0 +1,17 @@
+{
+ "items": [
+ {
+ "name": "$font-family-primary",
+ "value": "'Raleway', \"HelveticaNeue\", \"Helvetica\", \"Arial\", sans-serif",
+ "comment": ""
+ },
+ {
+ "name": "$font-family-secondary",
+ "value": "'Abel', serif",
+ "comment": ""
+ }
+ ],
+ "meta": {
+ "description": "To add to these items, use Sass variables that start with $font-family- in ./source/css/scss/abstracts/_variables.scss"
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-sizes.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-sizes.hbs
new file mode 100755
index 000000000..57ac7fe61
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-sizes.hbs
@@ -0,0 +1,6 @@
+
+ {{# items }}
+ {{ name }}: {{ value }}
+ {{/ items }}
+
+{{{ meta.description }}}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-sizes.json b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-sizes.json
new file mode 100644
index 000000000..95c0e11c0
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/02-font-sizes.json
@@ -0,0 +1,42 @@
+{
+ "items": [
+ {
+ "name": "$font-size-sm",
+ "value": "0.75rem",
+ "comment": ""
+ },
+ {
+ "name": "$font-size-sm-2",
+ "value": "0.85rem",
+ "comment": ""
+ },
+ {
+ "name": "$font-size-med",
+ "value": "1rem",
+ "comment": ""
+ },
+ {
+ "name": "$font-size-med-2",
+ "value": "1.2rem",
+ "comment": ""
+ },
+ {
+ "name": "$font-size-large",
+ "value": "2rem",
+ "comment": ""
+ },
+ {
+ "name": "$font-size-xl",
+ "value": "3rem",
+ "comment": ""
+ },
+ {
+ "name": "$font-size-xxl",
+ "value": "4rem",
+ "comment": ""
+ }
+ ],
+ "meta": {
+ "description": "To add to these items, use Sass variables that start with $font-size- in ./source/css/scss/abstracts/_variables.scss"
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/_colors.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/_colors.hbs
new file mode 100644
index 000000000..58a0f0199
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/01-global/_colors.hbs
@@ -0,0 +1,17 @@
+
+
+ {{# items }}
+
+
+
+ {{ name }}
+ {{ value }}
+ {{ comment }}
+
+
+ {{/ items }}
+
+
+
+
+{{{ meta.description }}}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/00-headings.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/00-headings.hbs
new file mode 100755
index 000000000..43f648c7f
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/00-headings.hbs
@@ -0,0 +1,6 @@
+Heading Level 1
+Heading Level 2
+Heading Level 3
+Heading Level 4
+Heading Level 5
+Heading Level 6
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/01-paragraph.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/01-paragraph.hbs
new file mode 100755
index 000000000..4ed3f6c01
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/01-paragraph.hbs
@@ -0,0 +1 @@
+A paragraph (from the Greek paragraphos, "to write beside" or "written beside") is a self-contained unit of a discourse in writing dealing with a particular point or idea. A paragraph consists of one or more sentences. Though not required by the syntax of any language, paragraphs are usually an expected part of formal writing, used to organize longer prose.
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/02-blockquote.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/02-blockquote.hbs
new file mode 100755
index 000000000..2f11319b3
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/02-blockquote.hbs
@@ -0,0 +1,3 @@
+
+ A block quotation (also known as a long quotation or extract) is a quotation in a written document, that is set off from the main text as a paragraph, or block of text, and typically distinguished visually using indentation and a different typeface or smaller size quotation.
+
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/03-inline-elements.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/03-inline-elements.hbs
new file mode 100755
index 000000000..e13300096
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/03-inline-elements.hbs
@@ -0,0 +1,43 @@
+
+
+
This is a text link
+
+
Strong is used to indicate strong importance
+
+
This text has added emphasis
+
+
The b element is stylistically different text from normal text, without any special importance
+
+
The i element is text that is set off from the normal text
+
+
The u element is text with an unarticulated, though explicitly rendered, non-textual annotation
+
+
This text is deleted and This text is inserted
+
+
This text has a strikethrough
+
+
Superscript®
+
+
Subscript for things like H2 O
+
+
This small text is small for for fine print, etc.
+
+
Abbreviation: HTML
+
+
Keybord input: Cmd
+
+
This text is a short inline quotation
+
+
This is a citation
+
+
The dfn element indicates a definition.
+
+
The mark element indicates a highlight
+
+
This is what inline code looks like.
+
+
This is sample output from a computer program
+
+
The variable element , such as x = y
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/06-hr.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/06-hr.hbs
new file mode 100755
index 000000000..1d6667d2e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/02-text/06-hr.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/00-text-input.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/00-text-input.hbs
new file mode 100755
index 000000000..a18328c25
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/00-text-input.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/00-textarea.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/00-textarea.hbs
new file mode 100644
index 000000000..0207b015f
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/00-textarea.hbs
@@ -0,0 +1 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/01-select.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/01-select.hbs
new file mode 100755
index 000000000..abe66fa04
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/01-select.hbs
@@ -0,0 +1,16 @@
+
+ {{# selectOptions }}
+ {{ option }}
+ {{/ selectOptions }}
+
+ {{# optionGroups }}
+
+
+ {{# selectOptions }}
+ {{ option }}
+ {{/ selectOptions }}
+
+
+ {{/ optionGroups }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/02-checkbox.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/02-checkbox.hbs
new file mode 100755
index 000000000..9730829f1
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/02-checkbox.hbs
@@ -0,0 +1 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/03-radio-button.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/03-radio-button.hbs
new file mode 100755
index 000000000..df41f8452
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/forms/03-radio-button.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/icon.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/icon.hbs
new file mode 100644
index 000000000..e4e0b3418
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/icon.hbs
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/icons.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/icons.hbs
new file mode 100644
index 000000000..14a13d525
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/icons.hbs
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+ Icon kit preview | gulp-svg-sprites
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ shopping-cart
+
+
+
+ triangle-down
+
+
+
+ triangle-left
+
+
+
+ triangle-right
+
+
+
+ triangle-up
+
+
+
+
+
+ Gulp SVG Sprites (8 icons in <symbol> mode)
+ Files Generated:
+
+ icons.svg
+
+ Usage:
+
+
+ Include the contents of the SVG file just after the opening <body> tag.
+
+
+ Paste one of the snippets anywhere into your website.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ minus
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon minus"><use xlink:href="#minus"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
+
+ plus
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon plus"><use xlink:href="#plus"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
+
+ search
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon search"><use xlink:href="#search"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
+
+ shopping-cart
+ Show Snippet
+
+ Invert Background
+
+
+
+
+
+
+
+
+
+
+ triangle-down
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon triangle-down"><use xlink:href="#triangle-down"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
+
+ triangle-left
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon triangle-left"><use xlink:href="#triangle-left"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
+
+ triangle-right
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon triangle-right"><use xlink:href="#triangle-right"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
+
+ triangle-up
+ Show Snippet
+
+ Invert Background
+
+
<svg class="icon triangle-up"><use xlink:href="#triangle-up"></use></svg>
+
Close
+
+
+
+
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/landscape.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/landscape.hbs
new file mode 100644
index 000000000..301a3d138
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/landscape.hbs
@@ -0,0 +1 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/stacked-block-image.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/stacked-block-image.hbs
new file mode 100644
index 000000000..68e37b93c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/stacked-block-image.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/stacked-block-image.json b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/stacked-block-image.json
new file mode 100644
index 000000000..311ab542f
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/00-atoms/images/stacked-block-image.json
@@ -0,0 +1,3 @@
+{
+ "src": "http://via.placeholder.com/600x400"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/00-global/00-logo.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/00-global/00-logo.hbs
new file mode 100644
index 000000000..402dc066e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/00-global/00-logo.hbs
@@ -0,0 +1,8 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/hero.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/hero.hbs
new file mode 100644
index 000000000..49b5c3243
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/hero.hbs
@@ -0,0 +1,8 @@
+
+
+
+
+
{{ heading }}
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/promo-block.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/promo-block.hbs
new file mode 100644
index 000000000..da2ba6801
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/promo-block.hbs
@@ -0,0 +1,23 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block.hbs
new file mode 100644
index 000000000..efa5db7c5
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block.hbs
@@ -0,0 +1,25 @@
+
+
+
+
+
+
{{ headline }}
+ {{#if excerpt}}
{{ excerpt }}
{{/ if }}
+
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block.json b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block.json
new file mode 100644
index 000000000..2c63c0851
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block~sale.json b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block~sale.json
new file mode 100644
index 000000000..e7a514937
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stacked-block~sale.json
@@ -0,0 +1,6 @@
+{
+ "onSale": {
+ "badge": "Sale",
+ "price": "$90"
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stripe.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stripe.hbs
new file mode 100644
index 000000000..91b6cc046
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stripe.hbs
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ {{# stripeField }}
+ {{> molecules-text-field }}
+ {{/ stripeField }}
+ {{#with cartPrice }}
+
+ {{ label }}
+ {{ meta }}
+
+ {{/ with }}
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stripe.json b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stripe.json
new file mode 100644
index 000000000..9f2913432
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/blocks/stripe.json
@@ -0,0 +1,3 @@
+{
+ "src": "http://via.placeholder.com/495x330"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button.hbs
new file mode 100755
index 000000000..fc8f42ada
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button.hbs
@@ -0,0 +1,17 @@
+<{{#if buttonTag }}button{{/ if }}{{#if linkTag }}a href="{{ url }}"{{/ if }} class="c-btn {{ styleModifier }}" {{# buttonTitle}}title="{{ buttonTitle }}"{{/ buttonTitle}}{{# buttonIsToggle }} data-btn-icon-swap="{{ iconPath }}{{ buttonIconSwap }}"{{/ buttonIsToggle }}>
+
+
+
+ {{#if buttonIcon }}
+
+
+
+ {{/ if }}
+
+ {{#if buttonText }}
+ {{ buttonText }}
+ {{/ if }}
+
+
+
+{{#if buttonTag }}button{{/ if }}{{#if linkTag }}a{{/ if }}>
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button.json b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button.json
new file mode 100644
index 000000000..2c63c0851
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button~bare.json b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button~bare.json
new file mode 100644
index 000000000..f65351498
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/buttons/button~bare.json
@@ -0,0 +1,3 @@
+{
+ "styleModifier": "c-btn--bare"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/checkbox-field.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/checkbox-field.hbs
new file mode 100644
index 000000000..b4c6f9157
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/checkbox-field.hbs
@@ -0,0 +1,28 @@
+
+
+
{{ label }}
+
+
+
+ {{#if fieldNote }}
+
{{{ fieldNote }}}
+ {{/ if }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/inline-checkbox.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/inline-checkbox.hbs
new file mode 100644
index 000000000..0b02c92f7
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/inline-checkbox.hbs
@@ -0,0 +1,6 @@
+
+
+
+ {{ label }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/radio-field.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/radio-field.hbs
new file mode 100644
index 000000000..ba7140e9f
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/radio-field.hbs
@@ -0,0 +1,28 @@
+
+
+
{{ label }}
+
+
+
+ {{#if fieldNote }}
+
{{{ fieldNote }}}
+ {{/ if }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/select-field.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/select-field.hbs
new file mode 100644
index 000000000..18c142f87
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/select-field.hbs
@@ -0,0 +1,15 @@
+
+
+
{{ label }}
+
+
+
+ {{> atoms-select }}
+
+
+
+ {{#if fieldNote }}
+
{{{ fieldNote }}}
+ {{/ if }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/text-field.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/text-field.hbs
new file mode 100644
index 000000000..1fed094e5
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/text-field.hbs
@@ -0,0 +1,15 @@
+
+
+
{{ label }}
+
+
+
+
+
+
+
+ {{#if fieldNote }}
+
{{{ fieldNote }}}
+ {{/ if }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/textarea-field.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/textarea-field.hbs
new file mode 100644
index 000000000..9bfed5061
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/forms/textarea-field.hbs
@@ -0,0 +1,15 @@
+
+
+
{{ label }}
+
+
+
+
+
+
+
+ {{#if fieldNote }}
+
{{{ fieldNote }}}
+ {{/ if }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/lists/definition-list.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/lists/definition-list.hbs
new file mode 100644
index 000000000..300bdd2ce
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/lists/definition-list.hbs
@@ -0,0 +1,21 @@
+{{# definitionList }}
+
+
+ {{#each items }}
+
+
+
+ {{ term }}
+
+
+ {{#if description }}
+
+ {{{ description }}}
+
+ {{/ if }}
+
+
+ {{/ each }}
+
+
+{{/ definitionList }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/footer-nav.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/footer-nav.hbs
new file mode 100644
index 000000000..7a4fbf4d1
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/footer-nav.hbs
@@ -0,0 +1,9 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/pagination.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/pagination.hbs
new file mode 100644
index 000000000..83aa17b0a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/pagination.hbs
@@ -0,0 +1,5 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/primary-nav.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/primary-nav.hbs
new file mode 100755
index 000000000..47125be15
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/primary-nav.hbs
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/progress-tracker.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/progress-tracker.hbs
new file mode 100644
index 000000000..f9c366ca3
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/navigation/progress-tracker.hbs
@@ -0,0 +1,17 @@
+{{#if progressTracker }}
+{{#with progressTracker }}
+
+ {{#each items }}
+
+
+ {{ number }}
+
+
+ {{ label }}
+
+
+ {{/ each }}
+
+
+ {{/ with }}
+{{/ if }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/text/page-header.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/text/page-header.hbs
new file mode 100644
index 000000000..778984faf
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/01-molecules/text/page-header.hbs
@@ -0,0 +1,9 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/00-global/00-header.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/00-global/00-header.hbs
new file mode 100755
index 000000000..1fca2a553
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/00-global/00-header.hbs
@@ -0,0 +1,11 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/00-global/01-footer.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/00-global/01-footer.hbs
new file mode 100755
index 000000000..1d9ee7924
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/00-global/01-footer.hbs
@@ -0,0 +1,17 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/buttons/button-group.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/buttons/button-group.hbs
new file mode 100644
index 000000000..44452d756
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/buttons/button-group.hbs
@@ -0,0 +1,7 @@
+
+
+ {{#each buttonGroup }}
+ {{> molecules-button }}
+ {{/ each }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/forms/form.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/forms/form.hbs
new file mode 100644
index 000000000..213cd65b4
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/forms/form.hbs
@@ -0,0 +1,48 @@
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list.hbs
new file mode 100644
index 000000000..80d0737a2
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list.hbs
@@ -0,0 +1,5 @@
+
+ {{#each definitionItems }}
+ {{> molecules-definition-list }}
+ {{/ each }}
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list.json b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list.json
new file mode 100644
index 000000000..36a37131a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list.json
@@ -0,0 +1,3 @@
+{
+
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list~lined.json b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list~lined.json
new file mode 100644
index 000000000..fe1ec5059
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/definition-list-list~lined.json
@@ -0,0 +1,3 @@
+{
+ "styleModifier": "c-definition-list-list--lined"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/stacked-block-list.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/stacked-block-list.hbs
new file mode 100644
index 000000000..e071f061b
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/stacked-block-list.hbs
@@ -0,0 +1,5 @@
+
+ {{# stackedBlockList }}
+ {{> molecules-stacked-block }}
+ {{/ stackedBlockList }}
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/stripe-list.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/stripe-list.hbs
new file mode 100644
index 000000000..1105b59c0
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/lists/stripe-list.hbs
@@ -0,0 +1,7 @@
+
+ {{# stripeList }}
+
+ {{> molecules-stripe }}
+
+ {{/ stripeList }}
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/sections/stacked-block-section.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/sections/stacked-block-section.hbs
new file mode 100644
index 000000000..a622e6e21
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/sections/stacked-block-section.hbs
@@ -0,0 +1,10 @@
+
+ {{#if sectionTitle}}
+
+ {{/ if }}
+
+ {{> organisms-stacked-block-list }}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/tables/table.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/tables/table.hbs
new file mode 100644
index 000000000..227d32458
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/tables/table.hbs
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+ {{# tableRows }}
+
+
+ {{# tableCells }}
+
+ {{{ td }}}
+
+ {{/ tableCells }}
+
+
+ {{/ tableRows }}
+
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/text/text-passage.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/text/text-passage.hbs
new file mode 100644
index 000000000..6bb2fe17d
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/02-organisms/text/text-passage.hbs
@@ -0,0 +1,5 @@
+
+
+ {{{ htmlText }}}
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/cart.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/cart.hbs
new file mode 100644
index 000000000..5613bdd1e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/cart.hbs
@@ -0,0 +1,25 @@
+{{> organisms-header }}
+
+
+
+ {{> molecules-page-header }}
+ {{> organisms-stripe-list }}
+
+ {{# totalPrice }}
+
+ {{ label }}
+ {{ number }}
+
+ {{/ totalPrice }}
+
+ {{# checkoutButton }}
+
+ {{> molecules-button }}
+
+ {{/ checkoutButton }}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/category.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/category.hbs
new file mode 100644
index 000000000..2bfe73fe8
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/category.hbs
@@ -0,0 +1,25 @@
+{{> organisms-header }}
+
+
+
+ {{#if page.title }}
+ {{> molecules-page-header }}
+ {{/if}}
+
+ {{#if hero }}
+ {{#with hero }}
+ {{> molecules-hero }}
+ {{/with }}
+ {{/if}}
+
+ {{# stackedBlockSection }}
+ {{> organisms-stacked-block-list }}
+ {{/ stackedBlockSection }}
+
+ {{> molecules-pagination}}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/checkout.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/checkout.hbs
new file mode 100644
index 000000000..41046e131
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/checkout.hbs
@@ -0,0 +1,29 @@
+{{> organisms-header }}
+
+
+
+ {{> molecules-progress-tracker }}
+ {{> molecules-page-header }}
+
+
+
+
+ {{#with definitionListSection }}
+ {{> organisms-definition-list-list }}
+ {{/ with }}
+ {{# totalPrice }}
+
+ {{ label }}
+ {{ number }}
+
+ {{/ totalPrice }}
+
+
+
+ {{> organisms-form }}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/confirmation.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/confirmation.hbs
new file mode 100644
index 000000000..67c83694c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/confirmation.hbs
@@ -0,0 +1,14 @@
+{{> organisms-header }}
+
+
+
+ {{> molecules-progress-tracker }}
+ {{> molecules-page-header }}
+
+ {{> organisms-text-passage }}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/detail.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/detail.hbs
new file mode 100644
index 000000000..4b35ddde0
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/detail.hbs
@@ -0,0 +1,32 @@
+{{> organisms-header }}
+
+
+ {{> molecules-page-header }}
+
+
+
+
+
+
+ {{# featureImage }}
+
+ {{/ featureImage }}
+
+
+
+
+ {{> organisms-text-passage }}
+
+ {{# checkoutForm }}
+ {{> organisms-form }}
+ {{/ checkoutForm }}
+
+
+
+ {{#with stackedBlockSection }}
+ {{> organisms-stacked-block-section }}
+ {{/ with }}
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/homepage.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/homepage.hbs
new file mode 100644
index 000000000..16de05be2
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/homepage.hbs
@@ -0,0 +1,22 @@
+{{> organisms-header }}
+
+
+
+ {{# hero }}
+ {{> molecules-hero }}
+ {{/ hero }}
+
+ {{# promoBlock }}
+ {{> molecules-promo-block }}
+ {{/ promoBlock }}
+
+
+ {{#with saleSection}}
+ {{> organisms-stacked-block-section }}
+ {{/with}}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/page.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/page.hbs
new file mode 100644
index 000000000..ae4791473
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/page.hbs
@@ -0,0 +1,15 @@
+{{> organisms-header }}
+
+
+
+
+
+ {{> molecules-page-header }}
+
+ {{> organisms-text-passage }}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/review.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/review.hbs
new file mode 100644
index 000000000..ef60c06a8
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/03-templates/review.hbs
@@ -0,0 +1,32 @@
+{{> organisms-header }}
+
+
+
+ {{> molecules-progress-tracker }}
+ {{> molecules-page-header }}
+
+
+
+
+ {{#with definitionListSection }}
+ {{> organisms-definition-list-list }}
+ {{/ with }}
+ {{# totalPrice }}
+
+ {{ label }}
+ {{ number }}
+
+ {{/ totalPrice }}
+
+
+
+
+ {{> organisms-text-passage }}
+
+ {{> organisms-button-group }}
+
+
+
+
+
+{{> organisms-footer }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/00-homepage.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/00-homepage.hbs
new file mode 100644
index 000000000..d9894d4a7
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/00-homepage.hbs
@@ -0,0 +1 @@
+{{> templates-homepage }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/00-homepage.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/00-homepage.json
new file mode 100644
index 000000000..b6b30dd08
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/00-homepage.json
@@ -0,0 +1,126 @@
+{
+ "hero" : {
+ "url": "link.pages-detail",
+ "src": "../../images/group-shoes.jpg",
+ "alt": "Group of shoes",
+ "heading" : "Shoes For The Soul"
+ },
+ "promoBlock": [
+ {
+ "promoBlockLink": {
+ "url": "#"
+ },
+ "src": "../../images/women-boots.jpg",
+ "alt": "Women's boots",
+ "heading": "Go Out In Style",
+ "description": "Dive into the Fall season with these stylish casual boots that are great for a jump in the leaves or a night out on the town."
+ },
+ {
+ "promoBlockLink": {
+ "url": "#"
+ },
+ "styleModifier": "c-promo-block--right",
+ "src": "../../images/men-casual-shoes.jpg",
+ "alt": "striped sneakers",
+ "heading": "Casual But Classy",
+ "description": "Feel comfortable in your own shoes no matter what the situation."
+ },
+ {
+ "promoBlockLink": {
+ "url": "#"
+ },
+ "src": "../../images/women-hiking-boots.jpg",
+ "alt": "hiking boots in woods",
+ "heading": "Immerse Yourself In Nature",
+ "description": "Explore the outdoors and clear your head with a hike in one of our sleek boot styles."
+ },
+ {
+ "promoBlockLink": {
+ "url": "#"
+ },
+ "styleModifier": "c-promo-block--right u-margin-bottom-large",
+ "src": "../../images/kids-velcro.jpg",
+ "alt": "kid's velcro shoes",
+ "heading": "Discover the Unknown",
+ "description": "Take the path least traveled and write your own story with our shoes."
+ }
+ ],
+ "toutSection" : {
+ "styleModifier" : "l-grid--4up",
+ "toutList" : [
+ {
+ "url": "link.pages-category",
+ "headline": "Women's fashion",
+ "imgLandscapeSrc" : "../../images/woman-outside-brownstone.jpg",
+ "imgLandscapeAlt" : "Woman in sweater"
+ },
+ {
+ "url": "link.pages-category",
+ "headline": "Men's fashion",
+ "imgLandscapeSrc" : "../../images/smiling-man-in-formalwear.jpg",
+ "imgLandscapeAlt" : "Man in formalwear"
+ },
+ {
+ "url": "link.pages-category",
+ "headline": "Kid's Fashion",
+ "imgLandscapeSrc" : "../../images/father-daughter-fashion.jpg",
+ "imgLandscapeAlt" : "Child with father"
+ }
+ ]
+ },
+ "saleSection" : {
+ "sectionTitle": "On Sale",
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/men-blue-shoes.jpg",
+ "alt" : "blue walking shoes"
+ },
+ "headline" : "Walking Shoes",
+ "excerpt" : "This casual pair of shoes will have you looking dapper in the city",
+ "label" : "$60",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$90"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-hiking-boots.jpg",
+ "alt" : "leather boots"
+ },
+ "headline" : "Leather Boots",
+ "excerpt" : "Hike down the trail in these durable, 100% authentic leather boots.",
+ "label" : "$120",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$150"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-blue-heels.jpg",
+ "alt" : "blue heels"
+ },
+ "headline" : "Blue Suede Heels",
+ "excerpt" : "Strut your stuff on the streets with these stunning high heels",
+ "label" : "$80",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$110"
+ }
+
+ }
+ ],
+ "btnTag": false,
+ "linkTag": true,
+ "url": "link.pages-category-on-sale",
+ "buttonText" : "See All Sale Items"
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category.hbs
new file mode 100644
index 000000000..f0585d1e0
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category.hbs
@@ -0,0 +1 @@
+{{> templates-category }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category.json
new file mode 100644
index 000000000..4320309db
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category.json
@@ -0,0 +1,142 @@
+{
+ "page": {
+ "title" : "Women's Shoes",
+ "description": false
+ },
+ "stackedBlockSection" : {
+ "styleModifier": "u-margin-bottom-large",
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-blue-heels.jpg",
+ "alt" : "blue high heels"
+ },
+ "headline" : "Blue Suede Heels",
+ "excerpt" : "Available in 5 colors",
+ "label" : "$80",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$110"
+ }
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-hiking-boots.jpg",
+ "alt" : "brown leather boots"
+ },
+ "headline" : "Leather Boots",
+ "excerpt" : "Available in 2 colors. Overnight shipping available",
+ "label" : "$120",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$150"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-leather-booties.jpg",
+ "alt" : "black leather booties"
+ },
+ "headline" : "Black Leather Booties",
+ "excerpt" : "Available in 3 colors.",
+ "label" : "$95",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$135"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-boot-wedges.jpg",
+ "alt" : "women's wedge boots"
+ },
+ "headline" : "Suede Booties",
+ "excerpt" : "Available in 2 colors. Overnight shipping available",
+ "label" : "$120"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-adidas.jpg",
+ "alt" : "Adidas shoes"
+ },
+ "headline" : "White Adidas Sneakers",
+ "excerpt" : "Available in 2 colors",
+ "label" : "$90"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-boots.jpg",
+ "alt" : "light tan leather boots"
+ },
+ "headline" : "Light Tan Boots",
+ "excerpt" : "Available in 3 colors",
+ "label" : "$70"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-colorful.jpg",
+ "alt" : "technicolor sneakers"
+ },
+ "headline" : "Multicolored Running Shoes",
+ "excerpt": false,
+ "label" : "$75"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-combat-boots.jpg",
+ "alt" : "black leather high ankle boots"
+ },
+ "headline" : "Black Leather Boots",
+ "excerpt" : "Made of 100% authentic leather",
+ "label" : "$180"
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-white-heels.jpg",
+ "alt" : "white high heels"
+ },
+ "headline" : "Shiny High Heels",
+ "excerpt" : "Available in 5 colors",
+ "label" : "$95"
+ }
+ ]
+ },
+ "paginationList" : [
+ {
+ "itemModifier": "is-disabled",
+ "number" : "Prev"
+ },
+ {
+ "itemModifier": "is-active",
+ "number" : "1"
+ },
+ {
+ "url": "link.pages-category-page-two",
+ "number" : "2"
+ },
+ {
+ "number" : "Next",
+ "url": "link.pages-category-page-two"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~holiday-guide.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~holiday-guide.json
new file mode 100644
index 000000000..e06b4a3da
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~holiday-guide.json
@@ -0,0 +1,12 @@
+{
+ "page": {
+ "title": false
+ },
+ "hero": {
+ "url": "link.pages-detail",
+ "src": "../../images/holiday.jpg",
+ "alt": "Group of shoes",
+ "heading": "2019 Holiday Gift Guide"
+ },
+ "paginationList": false
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~kids.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~kids.json
new file mode 100644
index 000000000..f7a28e47e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~kids.json
@@ -0,0 +1,83 @@
+{
+ "page": {
+ "title" : "Kids' Shoes",
+ "description": false
+ },
+ "stackedBlockSection" : {
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/men-chucks.jpg",
+ "alt" : "chuck taylor shoes"
+ },
+ "headline" : "Converse Chuck Taylor's",
+ "excerpt" : "Available in both boys' and girls' sizes",
+ "label" : "$50",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$85"
+ }
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/girls-high-tops.jpg",
+ "alt" : "girl's high tops"
+ },
+ "headline" : "Girl's High Tops",
+ "excerpt" : "Available in 4 color combinations",
+ "label" : "$90"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/kids-green-shoes.jpg",
+ "alt" : "toddler green shoes"
+ },
+ "headline" : "Toddler Green Shoes",
+ "excerpt" : "Suitable for ages 0-2 years",
+ "label" : "$230"
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/kids-technicolor-nikes.jpg",
+ "alt" : "multicolored Nike shoes"
+ },
+ "headline" : "Multicolored Nikes",
+ "excerpt" : "Available in toddler and youth sizes",
+ "label" : "$120"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/girls-nike.jpg",
+ "alt" : "girl's nike sneakers"
+ },
+ "headline" : "Girl's Nike Sneakers",
+ "excerpt" : "Available in 5 colors",
+ "label" : "$70"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/kids-velcro.jpg",
+ "alt" : "velcro shoes"
+ },
+ "headline" : "Velcro Shoes",
+ "excerpt" : "Available in both boys' and girls' sizes",
+ "label" : "$70"
+ }
+ ]
+ },
+ "paginationList": false
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~men.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~men.json
new file mode 100644
index 000000000..e4f142e13
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~men.json
@@ -0,0 +1,110 @@
+{
+ "page": {
+ "title" : "Men's Shoes",
+ "description": false
+ },
+ "stackedBlockSection" : {
+ "styleModifier": "u-margin-bottom-large",
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/men-blue-shoes.jpg",
+ "alt" : "blue walking shoes"
+ },
+ "headline" : "Walking Shoes",
+ "excerpt" : "This casual pair of shoes will have you looking dapper in the city",
+ "label" : "$60",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$90"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-brown-shoes.jpg",
+ "alt" : "brown embroidered shoes"
+ },
+ "headline" : "Embroidered Dress Shoes",
+ "excerpt" : "Available in 2 colors. Made of 100% authentic leather",
+ "label" : "$120",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$155"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-brown-dress-shoes.jpg",
+ "alt" : "brown dress shoes"
+ },
+ "headline" : "Brown Dress Shoes",
+ "excerpt" : "Made of 100% authentic leather in USA",
+ "label" : "$140"
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-casual-shoes.jpg",
+ "alt" : "black striped sneakers"
+ },
+ "headline" : "Striped Casual Walking Shoes",
+ "excerpt" : "Available in 3 styles",
+ "label" : "$70"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-gray-shoes.jpg",
+ "alt" : "Gray walking shoes."
+ },
+ "headline" : "Gray casual walking shoes",
+ "excerpt" : false,
+ "label" : "$180"
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-loafers.jpg",
+ "alt" : "men's loafers"
+ },
+ "headline" : "Loafers",
+ "excerpt" : "Available in a variety of colors",
+ "label" : "$180"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-walking-shoes.jpg",
+ "alt" : "men's running shoes"
+ },
+ "headline" : "Running Shoes",
+ "excerpt" : "Available in low-top and high-top.",
+ "label" : "$95"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-winter-boots.jpg",
+ "alt" : "men's winter boots"
+ },
+ "headline" : "Steel Toe Boots",
+ "excerpt" : "Available in 2 colors. Made in USA",
+ "label" : "$190"
+ }
+ ]
+ },
+ "paginationList": false
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~on-sale.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~on-sale.json
new file mode 100644
index 000000000..994278d7e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~on-sale.json
@@ -0,0 +1,104 @@
+{
+ "page": {
+ "title" : "On Sale",
+ "description": false
+ },
+ "stackedBlockSection" : {
+ "styleModifier": "u-margin-bottom-large",
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/men-blue-shoes.jpg",
+ "alt" : "blue walking shoes"
+ },
+ "headline" : "Walking Shoes",
+ "excerpt" : "This casual pair of shoes will have you looking dapper in the city",
+ "label" : "$60",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$90"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-hiking-boots.jpg",
+ "alt" : "leather boots"
+ },
+ "headline" : "Leather Boots",
+ "excerpt" : "Hike down the trail in these durable, 100% authentic leather boots.",
+ "label" : "$120",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$150"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-blue-heels.jpg",
+ "alt" : "blue heels"
+ },
+ "headline" : "Blue Suede Heels",
+ "excerpt" : "Strut your stuff on the streets with these stunning high heels",
+ "label" : "$80",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$110"
+ }
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/men-chucks.jpg",
+ "alt" : "chuck taylor shoes"
+ },
+ "headline" : "Boys Chucks",
+ "excerpt" : "These shoes are a great mix between athlete and trend setter",
+ "label" : "$50",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$85"
+ }
+
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/men-brown-shoes.jpg",
+ "alt" : "woman in sweater"
+ },
+ "headline" : "Pinstripe Skirt and Tank Top",
+ "excerpt" : "This pinstripe skirt and tank top are a great pairing for a friendly get-together",
+ "label" : "$120",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$155"
+ }
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-leather-booties.jpg",
+ "alt" : "woman in sweater"
+ },
+ "headline" : "Long Button-Down Sweater",
+ "excerpt" : "Comes in 2 colors",
+ "label" : "$95",
+ "onSale": {
+ "badge": "Sale",
+ "price": "$135"
+ }
+ }
+ ]
+ },
+ "paginationList": false
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~page-two.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~page-two.json
new file mode 100644
index 000000000..adb64d14d
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/01-category~page-two.json
@@ -0,0 +1,41 @@
+{
+ "page": {
+ "title" : "Women's Shoes",
+ "description": false
+ },
+ "stackedBlockSection" : {
+ "styleModifier": "u-margin-bottom-large",
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../../images/women-shiny-sneakers.jpg",
+ "alt" : "patent leather sneakers"
+ },
+ "headline" : "Patent Leather Everyday Shoes",
+ "excerpt" : "Available in brown and black. Overnight shipping available",
+ "label" : "$190"
+ }
+ ]
+ },
+ "paginationList" : [
+ {
+ "url": "link.pages-category",
+ "number" : "Prev"
+ },
+ {
+ "url": "link.pages-category",
+ "number" : "1"
+ },
+ {
+ "itemModifier": "is-active",
+ "url": "link.pages-category-page-two",
+ "number" : "2"
+ },
+ {
+ "itemModifier": "is-disabled",
+ "number" : "Next"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/02-detail.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/02-detail.hbs
new file mode 100644
index 000000000..c024f1f62
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/02-detail.hbs
@@ -0,0 +1 @@
+{{> templates-detail }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/02-detail.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/02-detail.json
new file mode 100644
index 000000000..5c8446d97
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/02-detail.json
@@ -0,0 +1,125 @@
+{
+ "page": {
+ "title": "Suede Booties",
+ "description": false
+ },
+ "featureImage": {
+ "src": "../../images/women-boot-wedges.jpg",
+ "alt": "Boot wedges"
+ },
+ "htmlText": "These suede booties are the perfect shoes to accent your outfit whether heading to a casual dinner or an elaborate gala.
These booties come in a sepia (shown) or a stark black. These are made of 100% suede in U.S.A.
$120 ",
+ "priceSection": {
+ "label": "$120"
+ },
+ "checkoutForm": {
+ "formFields": {
+ "items": [
+ {
+ "selectField": {
+ "label": "Pick a Size",
+ "selectOptions" : [
+ {
+ "value" : "size-1",
+ "option" : "Size 5"
+ },
+ {
+ "value" : "size-2",
+ "option" : "Size 5.5"
+ },
+ {
+ "value" : "size-3",
+ "option" : "Size 6"
+ },
+ {
+ "value" : "size-4",
+ "option" : "Size 6.5"
+ },
+ {
+ "value" : "size-5",
+ "option" : "Size 7"
+ },
+ {
+ "value" : "size-6",
+ "option" : "Size 7.5"
+ },
+ {
+ "value" : "size-7",
+ "option" : "Size 8"
+ },
+ {
+ "value" : "size-8",
+ "option" : "Size 8.5"
+ },
+ {
+ "value" : "size-9",
+ "option" : "Size 9"
+ },
+ {
+ "value" : "size-10",
+ "option" : "Size 9.5"
+ },
+ {
+ "value" : "size-11",
+ "option" : "Size 10"
+ },
+ {
+ "value" : "size-12",
+ "option" : "Size 10.5"
+ },
+ {
+ "value" : "size-13",
+ "option" : "Size 11"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "buttonGroup": [
+ {
+ "buttonTag": false,
+ "linkTag": true,
+ "url": "link.pages-cart",
+ "buttonText": "Add To Cart"
+ }
+ ]
+ },
+ "stackedBlockSection": {
+ "sectionTitle": "Related Items",
+ "stackedBlockList": [
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/men-blue-shoes.jpg",
+ "alt" : "blue walking shoes"
+ },
+ "headline" : "Walking Shoes",
+ "excerpt" : "This casual pair of shoes will have you looking dapper in the city",
+ "label" : "$60"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-hiking-boots.jpg",
+ "alt" : "leather boots"
+ },
+ "headline" : "Leather Boots",
+ "excerpt" : "Hike down the trail in these durable, 100% authentic leather boots.",
+ "label" : "$120"
+ },
+ {
+ "styleModifier" : "",
+ "url" : "link.pages-detail",
+ "stackedBlockMedia": {
+ "src" : "../../images/women-blue-heels.jpg",
+ "alt" : "blue heels"
+ },
+ "headline" : "Blue Suede Heels",
+ "excerpt" : "Strut your stuff on the streets with these stunning high heels",
+ "label" : "$80"
+ }
+ ]
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/03-cart.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/03-cart.hbs
new file mode 100644
index 000000000..b30fd0db7
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/03-cart.hbs
@@ -0,0 +1 @@
+{{> templates-cart }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/03-cart.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/03-cart.json
new file mode 100644
index 000000000..be228c2b9
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/03-cart.json
@@ -0,0 +1,48 @@
+{
+ "page": {
+ "title": "You have 2 items in your cart",
+ "description": "Please review your cart details before checking out."
+ },
+ "stripeList": [
+ {
+ "url": "#",
+ "src": "../../images/women-boot-wedges.jpg",
+ "alt": "placeholder image",
+ "stripeField": {
+ "styleModifier": "c-field--small",
+ "label": "Quantity",
+ "value": "1"
+ },
+ "headline": "Suede Booties",
+ "cartPrice": {
+ "label": "Price",
+ "meta": "$120"
+ }
+ },
+ {
+ "url": "#",
+ "src": "../../images/men-brown-dress-shoes.jpg",
+ "alt": "placeholder image",
+ "stripeField": {
+ "styleModifier": "c-field--small",
+ "label": "Quantity",
+ "value": "1"
+ },
+ "headline": "Brown Dress Shoes",
+ "cartPrice": {
+ "label": "Price",
+ "meta": "$140"
+ }
+ }
+ ],
+ "totalPrice": {
+ "label": "Total",
+ "number": "$360"
+ },
+ "checkoutButton": {
+ "buttonTag": false,
+ "linkTag": true,
+ "url": "link.pages-checkout",
+ "buttonText": "Checkout"
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout.hbs
new file mode 100644
index 000000000..0788a94e1
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout.hbs
@@ -0,0 +1 @@
+{{> templates-checkout }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout.json
new file mode 100644
index 000000000..3a20406c0
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout.json
@@ -0,0 +1,95 @@
+{
+ "page": {
+ "title": "Shipping Information",
+ "description": "Please fill out your shipping information below."
+ },
+ "formFields" : {
+ "items": [
+ {
+ "textField": {
+ "label" : "Name"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Address"
+ }
+ },
+ {
+ "textField": {
+ "label" : "City"
+ }
+ },
+ {
+ "textField": {
+ "label" : "State"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Zip Code"
+ }
+ },
+ {
+ "inlineCheckbox": {
+ "styleModifier": "u-margin-bottom-large",
+ "label": "Billing address is the same as shipping"
+ }
+ }
+ ]
+ },
+ "selectField": false,
+ "buttonGroup" : [
+ {
+ "buttonTag" : false,
+ "linkTag" : true,
+ "url" : "link.pages-checkout-billing",
+ "buttonText": "Continue to Billing"
+ }
+ ],
+ "definitionListSection": {
+ "styleModifier":"c-definition-list-list--lined",
+ "definitionItems": [
+ {
+ "definitionList": {
+ "items": [
+ {
+ "term": "Item",
+ "description": "Suede Booties"
+ },
+ {
+ "term": "Quantity",
+ "description": "1"
+ },
+ {
+ "term": "Price",
+ "description": "$120"
+ }
+ ]
+ }
+ },
+ {
+ "definitionList": {
+ "items": [
+ {
+ "term": "Item",
+ "description": "Brown Dress Shoes"
+ },
+ {
+ "term": "Quantity",
+ "description": "1"
+ },
+ {
+ "term": "Price",
+ "description": "$140"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "totalPrice": {
+ "label": "Total",
+ "number": "$360"
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout~billing-same-shipping.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout~billing-same-shipping.json
new file mode 100644
index 000000000..de5857c32
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout~billing-same-shipping.json
@@ -0,0 +1,85 @@
+{
+ "progressTracker" : {
+ "items": [
+ {
+ "number": "1",
+ "label": "Shipping Information"
+ },
+ {
+ "styleModifier": "is-current",
+ "number": "2",
+ "label": "Billing Information"
+ },
+ {
+ "number": "3",
+ "label": "Review Order"
+ },
+ {
+ "number": "4",
+ "label": "Confirmation"
+ }
+ ]
+ },
+ "page": {
+ "title": "Billing Information",
+ "description": "Please fill out your billing address and payment information below."
+ },
+ "formFields" : {
+ "items": [
+ {
+ "textField": {
+ "label" : "Name",
+ "value": "John Smith"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Address",
+ "value": "99 Main Street"
+ }
+ },
+ {
+ "textField": {
+ "label" : "City",
+ "value": "Pittsburgh"
+ }
+ },
+ {
+ "textField": {
+ "label" : "State",
+ "value": "PA"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Zip Code",
+ "value": "15202"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Credit Card Number"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Expiration Date"
+ }
+ },
+ {
+ "textField": {
+ "label" : "CVV"
+ }
+ }
+ ]
+ },
+ "selectField": false,
+ "buttonGroup" : [
+ {
+ "buttonTag" : false,
+ "linkTag" : true,
+ "url" : "link.pages-review",
+ "buttonText": "Continue To Review Order"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout~billing.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout~billing.json
new file mode 100644
index 000000000..8d6396e92
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/04-checkout~billing.json
@@ -0,0 +1,80 @@
+{
+ "progressTracker" : {
+ "items": [
+ {
+ "number": "1",
+ "label": "Shipping Information"
+ },
+ {
+ "styleModifier": "is-current",
+ "number": "2",
+ "label": "Billing Information"
+ },
+ {
+ "number": "3",
+ "label": "Review Order"
+ },
+ {
+ "number": "4",
+ "label": "Confirmation"
+ }
+ ]
+ },
+ "page": {
+ "title": "Billing Information",
+ "description": "Please fill out your billing address and payment information below."
+ },
+ "formFields" : {
+ "items": [
+ {
+ "textField": {
+ "label" : "Name"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Address"
+ }
+ },
+ {
+ "textField": {
+ "label" : "City"
+ }
+ },
+ {
+ "textField": {
+ "label" : "State"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Zip Code"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Credit Card Number"
+ }
+ },
+ {
+ "textField": {
+ "label" : "Expiration Date"
+ }
+ },
+ {
+ "textField": {
+ "label" : "CVV"
+ }
+ }
+ ]
+ },
+ "selectField": false,
+ "buttonGroup" : [
+ {
+ "buttonTag" : false,
+ "linkTag" : true,
+ "url" : "link.pages-review",
+ "buttonText": "Continue To Review Order"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/05-review.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/05-review.hbs
new file mode 100644
index 000000000..f46f8b204
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/05-review.hbs
@@ -0,0 +1 @@
+{{> templates-review }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/05-review.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/05-review.json
new file mode 100644
index 000000000..ec0865197
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/05-review.json
@@ -0,0 +1,81 @@
+{
+ "progressTracker" : {
+ "items": [
+ {
+ "number": "1",
+ "label": "Shipping Information"
+ },
+ {
+ "number": "2",
+ "label": "Billing Information"
+ },
+ {
+ "styleModifier": "is-current",
+ "number": "3",
+ "label": "Review Order"
+ },
+ {
+ "number": "4",
+ "label": "Confirmation"
+ }
+ ]
+ },
+ "page": {
+ "title": "Review Your Order",
+ "description": "Please make sure your information is correct below before submitting your order."
+ },
+ "definitionListSection": {
+ "styleModifier":"c-definition-list-list--lined",
+ "definitionItems": [
+ {
+ "definitionList": {
+ "items": [
+ {
+ "term": "Item",
+ "description": "Suede Booties"
+ },
+ {
+ "term": "Quantity",
+ "description": "1"
+ },
+ {
+ "term": "Price",
+ "description": "$120"
+ }
+ ]
+ }
+ },
+ {
+ "definitionList": {
+ "items": [
+ {
+ "term": "Item",
+ "description": "Brown Dress Shoes"
+ },
+ {
+ "term": "Quantity",
+ "description": "1"
+ },
+ {
+ "term": "Price",
+ "description": "$140"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "totalPrice": {
+ "label": "Total",
+ "number": "$360"
+ },
+ "htmlText": "Shipping Address John Smith 99 Main Street Pittsburgh, PA 15202
Billing Address John Smith 99 Main Street Pittsburgh, PA 15202
Payment Information Card Type VisaCard # ********0000Expiration 12/25
",
+ "buttonGroup":[
+ {
+ "buttonTag": false,
+ "linkTag": true,
+ "url": "link.pages-confirmation",
+ "buttonText": "Submit Order"
+ }
+ ]
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/06-confirmation.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/06-confirmation.hbs
new file mode 100644
index 000000000..399d5b73c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/06-confirmation.hbs
@@ -0,0 +1 @@
+{{> templates-confirmation }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/06-confirmation.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/06-confirmation.json
new file mode 100644
index 000000000..20dbfd149
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/06-confirmation.json
@@ -0,0 +1,28 @@
+{
+ "progressTracker" : {
+ "items": [
+ {
+ "number": "1",
+ "label": "Shipping Information"
+ },
+ {
+ "number": "2",
+ "label": "Billing Information"
+ },
+ {
+ "number": "3",
+ "label": "Review Order"
+ },
+ {
+ "styleModifier": "is-current",
+ "number": "4",
+ "label": "Confirmation"
+ }
+ ]
+ },
+ "page": {
+ "title": "Your Order Has Been Processed",
+ "description": false
+ },
+ "htmlText": "Your confirmation number is: 1234567890 Thank you for shopping with SoulSoles!
You will receive a confirmation email shortly.
"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/page.hbs b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/page.hbs
new file mode 100644
index 000000000..2daad69fc
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/page.hbs
@@ -0,0 +1 @@
+{{> templates-page }}
diff --git a/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/page.json b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/page.json
new file mode 100644
index 000000000..122b65b5d
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/_patterns/04-pages/page.json
@@ -0,0 +1,7 @@
+{
+ "page": {
+ "title": "General Page",
+ "description": "I'm a page and I'm cool"
+ },
+ "htmlText": "This is a text passage. This is cool.
"
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/pattern-scaffolding.css b/packages/starterkit-handlebars-demo/dist/css/pattern-scaffolding.css
new file mode 100644
index 000000000..a2bfd7189
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/pattern-scaffolding.css
@@ -0,0 +1,275 @@
+/**
+ * This stylesheet is for styles you want to include only when displaying demo
+ * styles for grids, animations, color swatches, etc.
+ * These styles will not be your production CSS.
+ */
+#sg-patterns {
+ -webkit-box-sizing: border-box !important;
+ box-sizing: border-box !important;
+ max-width: 100%;
+ padding: 0 1rem;
+}
+
+.demo-animate {
+ background: #ddd;
+ padding: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+ border-radius: 8px;
+ cursor: pointer;
+}
+
+.sg-colors {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ list-style: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+
+@supports (display: grid) {
+ .sg-colors {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: repeat(
+ auto-fill,
+ minmax(180px, 1fr)
+ );
+ }
+}
+
+.sg-colors li {
+ -webkit-box-flex: 1;
+ -ms-flex: auto;
+ flex: auto;
+ padding: 0.3em;
+ margin: 0 0.5em 0.5em 0;
+ min-width: 5em;
+ max-width: 14em;
+ border: 1px solid #ddd;
+ border-radius: 8px;
+}
+
+.sg-swatch {
+ display: block;
+ height: 4em;
+ margin-bottom: 0.3em;
+ border-radius: 5px;
+}
+
+.sg-label {
+ font-size: 90%;
+ line-height: 1;
+}
+
+/**
+ * Icon grid
+ */
+.icon-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
+}
+
+/**
+ * Icon grid item
+ */
+.icon-grid__item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 5.5rem;
+ height: 5.5rem;
+ background: #f5f5f5;
+ border: 1px solid #cccccd;
+ border-radius: 8px;
+ padding: 0.5rem;
+ margin: 0.5rem;
+}
+
+/**
+ * Icon grid item title
+ */
+.icon-grid__item h3 {
+ font-size: 0.6rem;
+ margin-top: 1rem;
+}
+
+/**
+* Icon grid item svg
+*/
+.icon-grid__item svg {
+ height: 16px;
+ width: 16px;
+}
+
+.sg-pattern-example > footer > p {
+ display: none;
+}
+
+/**
+* For placeholder only block
+* 1) Used for placeholder blocks for layouts
+*/
+.fpo {
+ padding: 1rem;
+ background: #f5f5f5;
+ text-align: center;
+ font-weight: bold;
+ margin-bottom: 0.5rem;
+}
+
+/**
+* Dark for placeholder only block
+*/
+.fpo-block--dark {
+ background: #808080;
+}
+
+.sg-pattern-example small {
+ font-size: 10px;
+ display: block;
+ margin-top: 0.5rem;
+}
+
+.sg-pattern-example small code {
+ font-size: inherit;
+ padding: 0.2em;
+}
+
+/**
+ * Add height and overflow to two column fixed layout to show functionality only in style-guide example.
+ */
+.sg-pattern-example .l-page-layout--two-column-fixed {
+ height: 10rem;
+ overflow: auto;
+}
+
+/**
+ * Add min-height of 0 to two column fixed to help with showing functionality only in style-guide example.
+ */
+.sg-pattern-example .l-page-layout--two-column-fixed .l-page-layout__secondary {
+ min-height: 0;
+}
+
+/**
+ * FPO block within two column fixed layout within secondary section
+ * 1) Width expands entire container at small screens
+ */
+.sg-pattern-example
+ .l-page-layout--two-column-fixed
+ .l-page-layout__secondary
+ .fpo-block {
+ width: 100%; /* 1 */
+}
+
+/**
+ * FPO block within two column fixed layout within secondary section larger screens
+ * 1) Set height to 100% of viewport height
+ * 2) Set width = width of vertical header
+ */
+@media all and (min-width: 70em) {
+ .sg-pattern-example
+ .l-page-layout--two-column-fixed
+ .l-page-layout__secondary
+ .fpo-block {
+ width: 20rem; /* 1 */
+ height: 100vh; /* 2 */
+ margin-bottom: 0;
+ }
+}
+
+/**
+ * Two column fixed layout within pattern example
+ * 1) Set height to height of placeholder content secondary section
+ * 2) Set overflow to auto so the secondary section stays fixed while the main section scrolls
+ */
+.sg-pattern-example .l-page-layout--two-column-fixed {
+ height: 18.3rem;
+ overflow: auto;
+}
+
+/**
+ * Secondary section within pattern example and two-column fixed at larger screens
+ * 1) Position absolute to make this pattern similar to fixed vertical header
+ * 2) Height inherits so it doesn't span longer than the pattern window on "All" PL page
+ * 3) Float this left to get layout sections side by side within PL "View All" section
+ */
+
+@media all and (min-width: 70em) {
+ .sg-pattern-example
+ .l-page-layout--two-column-fixed
+ .l-page-layout__secondary {
+ position: absolute; /* 1 */
+ height: inherit; /* 2 */
+ float: left; /* 3 */
+ }
+}
+
+/**
+ * Fpo block within pattern example, two column fixed, and secondary section
+ * 1) Make fpo block width of the container on small screens
+ */
+.sg-pattern-example
+ .l-page-layout--two-column-fixed
+ .l-page-layout__secondary
+ .fpo-block {
+ width: 100%; /* 1 */
+}
+
+/**
+ * FPO Block Within pattern example, two column fixed, and secondary layout larger screens
+ * 1) Added width similar to style guide vertical header
+ * 2) Height inherits so it doesn't span longer than the pattern window on "All" PL page
+ */
+@media all and (min-width: 70em) {
+ .sg-pattern-example
+ .l-page-layout--two-column-fixed
+ .l-page-layout__secondary
+ .fpo-block {
+ width: 20rem; /* 1 */
+ height: inherit; /* 2 */
+ }
+}
+
+/**
+ * Add height of main to get appearance of side bar staying fixed while main window scrolls.
+ */
+.sg-pattern-example .l-page-layout--two-column-fixed .l-page-layout__main {
+ height: 30rem;
+}
+
+/**
+ * Add height of fpo block to equal height of main to help with scrolling main window/fixed sidebar effect.
+ */
+.sg-pattern-example
+ .l-page-layout--two-column-fixed
+ .l-page-layout__main
+ .fpo-block {
+ height: 30rem;
+ margin-bottom: 0;
+}
+
+/**
+ * Vertical header in pattern example at large screens
+ */
+@media all and (min-width: 70em) {
+ .sg-pattern-example .c-header--vertical {
+ max-width: 20rem;
+ }
+}
+
+#molecules-footer-nav .sg-pattern-example {
+ background: #041544;
+}
+
+.sg-pattern .c-hero {
+ margin: 0;
+}
+
+.sg-pattern .c-promo-block {
+ margin: 0;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_colors.scss b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_colors.scss
new file mode 100644
index 000000000..0f790f450
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_colors.scss
@@ -0,0 +1,79 @@
+/*------------------------------------*\
+ #COLORS
+\*------------------------------------*/
+
+/**
+ * In this file, we take the literal colors from our palette (defined in variables.scss)
+ * and define them against variables that we can utilise anywhere throughout the project.
+ */
+
+
+
+
+
+/*------------------------------------*\
+ #GLOBAL TEXT COLOR
+\*------------------------------------*/
+
+/**
+ * Body text and background colors
+ */
+$color-body-text: $color-neutral-gray-93 !default;
+$color-body-bg: $color-neutral-white !default;
+
+/**
+ * Highlight colors
+ */
+$color-text-highlight: $color-neutral-gray-93;
+$color-text-highlight-bg: $color-neutral-gray-13;
+
+
+
+
+
+/*------------------------------------*\
+ #LINKS
+\*------------------------------------*/
+
+$color-links: $color-neutral-gray-73 !default;
+$color-links-hover: $color-brand-orange !default;
+$color-links-active: $color-neutral-gray-93 !default;
+$color-links-visited: $color-neutral-gray-93 !default;
+
+
+
+
+
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+
+$color-btn-primary: $color-neutral-white !default;
+$color-btn-primary-bg: $color-neutral-gray-93 !default;
+$color-btn-primary-bg-hover: $color-neutral-gray-50 !default;
+$color-btn-primary-border: $color-neutral-gray-93 !default;
+
+$color-btn-secondary: $color-neutral-gray-93 !default;
+$color-btn-secondary-bg: $color-neutral-white !default;
+$color-btn-secondary-bg-hover: $color-neutral-gray-07 !default;
+$color-btn-secondary-border: $color-neutral-gray-93 !default;
+
+$color-btn-disabled: $color-neutral-gray-50 !default;
+$color-btn-disabled-bg: $color-neutral-gray-07 !default;
+
+
+
+
+
+/*------------------------------------*\
+ #FORMS
+\*------------------------------------*/
+
+$color-form: $color-neutral-gray-93 !default;
+$color-form-bg: $color-neutral-white !default;
+$color-form-border: $color-neutral-gray-73 !default;
+$color-form-border-focus: $color-neutral-gray-93 !default;
+$color-form-border-error: $color-utility-error !default;
+$color-form-label: $color-neutral-gray-93 !default;
+$color-form-info: $color-neutral-gray-73;
+$color-form-placeholder: $color-neutral-gray-50;
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_mixins.scss b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_mixins.scss
new file mode 100644
index 000000000..78d168f10
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_mixins.scss
@@ -0,0 +1,70 @@
+/*------------------------------------*\
+ #MIXINS
+\*------------------------------------*/
+
+/**
+ * Body Styles
+ * 1) Prevent Mobile Safari from scaling up text: https://blog.55minutes.com/2012/04/iphone-text-resizing/
+ */
+@mixin typographyBody() {
+ font-size: $font-size-med;
+ line-height: 1.6;
+ -webkit-text-size-adjust: 100%; /* 1 */
+}
+
+/**
+ * XL Type Styles
+ */
+ @mixin typographyBodyLarge() {
+ font-size: $font-size-med-2;
+ line-height: $line-height-large;
+}
+
+/**
+ * XL Heading Styles
+ */
+@mixin typographyHeadingXXL() {
+ font-size: $font-size-xl;
+ font-weight: normal;
+ line-height: 1.2;
+
+ @media all and (min-width: $bp-med) {
+ font-size: $font-size-xxl;
+ }
+}
+
+/**
+ * XL Heading Styles
+ */
+@mixin typographyHeadingXl() {
+ font-size: $font-size-xl;
+ font-weight: normal;
+ line-height: 1.2;
+}
+
+/**
+ * Large Heading Styles
+ */
+ @mixin typographyHeadingLarge() {
+ font-size: $font-size-large;
+ font-weight: normal;
+ line-height: 1.2;
+}
+
+/**
+ * Medium 2 Heading Styles
+ */
+ @mixin typographyHeadingMed2() {
+ font-size: $font-size-med-2;
+ font-weight: normal;
+ line-height: 1.2;
+}
+
+/**
+ * Medium Heading Styles
+ */
+ @mixin typographyHeadingMed() {
+ font-size: $font-size-med;
+ font-weight: normal;
+ line-height: 1.2;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_typography.scss b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_typography.scss
new file mode 100644
index 000000000..028b0df80
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_typography.scss
@@ -0,0 +1,10 @@
+/*------------------------------------*\
+ #TYPOGRAPHY
+\*------------------------------------*/
+
+/**
+ * In this file, we take the literal font sizes from our scale and define them
+ * against variables that we can utilise anywhere throughout the project.
+ */
+
+ $body-font-size: $font-size-med;
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_variables.scss b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_variables.scss
new file mode 100644
index 000000000..ed2f7e355
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/abstracts/_variables.scss
@@ -0,0 +1,198 @@
+/*------------------------------------*\
+ #VARIABLES
+\*------------------------------------*/
+
+/**
+ * CONTENTS
+ *
+ * COLORS
+ * Brand Colors...............Globally-available variables and config
+ * Neutral Colors.............Grayscale colors, including white and black
+ * Utility Colors.............Info, Warning, Error, Success
+ *
+ * TYPOGRAPHY
+ * Font Families..............The fonts used in the design system
+ * Sizing.....................Font sizing
+ *
+ * LAYOUT
+ * Max-widths.................Maximum layout container width
+ *
+
+ * SPACING
+ * Spacing defaults...........Spacing between elements
+ *
+ * BORDERS
+ * Border Width...............Border thicknesses
+ * Border Radius..............Border radius definitions
+ *
+ * ANIMATION
+ * Animation Speed............Transition/animation speed variables
+ * Animation easing...........Easing variables
+ *
+ * BREAKPOINTS
+ * Breakpoints................Global breakpoint definitions
+ */
+
+ /*------------------------------------*\
+ #COLORS
+ \*------------------------------------*/
+
+/**
+ * Brand Colors
+ * 1) Brand=specific colors
+ */
+$color-brand-blue: #114689;
+$color-brand-blue-dark: #041544;
+$color-brand-orange: #ba6333;
+
+/**
+ * Neutral Colors
+ * 1) Neutral colors are grayscale values used throughout the UI
+ */
+$color-neutral-white: #fff;
+$color-neutral-gray-02: #f9f9f9;
+$color-neutral-gray-07: #eee;
+$color-neutral-gray-13: #ddd;
+$color-neutral-gray-27: #bbb;
+$color-neutral-gray-50: #808080;
+$color-neutral-gray-60: #666;
+$color-neutral-gray-73: #444;
+$color-neutral-gray-93: #131313;
+$color-neutral-black: #000;
+
+/**
+ * Utility Colors
+ * 1) Utility colors are colors used to provide feedback, such as alert messages,
+ * form validation, etc.
+ */
+$color-utility-info: #0192d0;
+$color-utility-info-light: #d3f2ff;
+$color-utility-error: #b12a0b;
+$color-utility-error-light: #fdded8;
+$color-utility-success: #03804d;
+$color-utility-success-light: #d4f3e6;
+$color-utility-warning: #a59b15;
+$color-utility-warning-light: #fffecf;
+
+
+
+
+
+/*------------------------------------*\
+ #TYPOGRAPHY
+\*------------------------------------*/
+
+/**
+ * Font Family
+ */
+$font-family-primary: 'Raleway', "HelveticaNeue", "Helvetica", "Arial", sans-serif;
+$font-family-secondary: 'Abel', serif;
+
+
+/**
+ * Font Sizing
+ */
+$font-size-sm: 0.75rem;
+$font-size-sm-2: 0.85rem;
+$font-size-med: 1rem;
+$font-size-med-2: 1.2rem;
+$font-size-large: 2rem;
+$font-size-xl: 3rem;
+$font-size-xxl: 4rem;
+
+/**
+ * Line Height
+ */
+$line-height-sm: 0.8;
+$line-height-sm-2: 0.9;
+$line-height-med: 1;
+$line-height-med-2: 1.2;
+$line-height-large: 1.6;
+$line-height-xl: 1.8;
+
+
+
+
+
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+
+/**
+ * Max Width
+ */
+$l-max-width: 80rem !default;
+$l-max-width-narrow: 45rem !default;
+$l-linelength-width: 36rem !default;
+
+
+
+
+
+/*------------------------------------*\
+ #SPACING
+\*------------------------------------*/
+
+/**
+ * Spacing and offsets
+ * 1) Used to space grids and body padding
+ */
+
+$spacing: 1rem;
+$spacing-small: round(0.5 * $spacing);
+$spacing-large: round(2 * $spacing);
+
+
+
+
+
+/*------------------------------------*\
+ #BORDERS
+\*------------------------------------*/
+
+/**
+ * Border
+ */
+ $border-thickness: 1px;
+
+/**
+ * Border radius
+ */
+$border-radius: 4px;
+
+
+
+
+
+/*------------------------------------*\
+ #ANIMATION
+\*------------------------------------*/
+
+/**
+ * Transition Speed
+ */
+$anim-fade-quick: 0.15s;
+$anim-fade-long: 0.5s;
+
+/**
+ * Transition Ease
+ */
+$anim-ease: ease-out;
+
+
+
+
+
+/*------------------------------------*\
+ #BREAKPOINTS
+\*------------------------------------*/
+
+/**
+ * Breakpoints used in media queries
+ * 1) These are not the only breakpoints used, but they provide a few defaults
+ */
+$bp-small: 28em;
+$bp-small-2: 35em;
+$bp-med: 47em;
+$bp-large: 60em;
+$bp-xl: 70em;
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_body.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_body.scss
new file mode 100644
index 000000000..f215c85b2
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_body.scss
@@ -0,0 +1,25 @@
+/*------------------------------------*\
+ #BODY
+\*------------------------------------*/
+
+/**
+ * HTML base styles
+ * 1) Set the html element's height to at least 100% of the viewport.
+ * This is used to achieve a sticky footer
+ */
+html {
+ min-height: 100vh; /* 1 */
+}
+
+/**
+ * Body base styles
+ * 1) Set the body element's height to at least 100% of the viewport.
+ * This is used to achieve a sticky footer
+ */
+body {
+ min-height: 100vh; /* 1 */
+ font-family: $font-family-primary;
+ @include typographyBody();
+ background-color: $color-body-bg;
+ color: $color-body-text;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_buttons.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_buttons.scss
new file mode 100644
index 000000000..d3019f197
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_buttons.scss
@@ -0,0 +1,11 @@
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+
+/**
+ * Button and submit inputs reset
+ * 1) These should be styled using c-btn
+ */
+button {
+ cursor: pointer;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_forms.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_forms.scss
new file mode 100644
index 000000000..7e1d1a154
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_forms.scss
@@ -0,0 +1,128 @@
+/*------------------------------------*\
+ #FORMS
+\*------------------------------------*/
+
+/**
+ * 1) Form element base styles
+ */
+
+/**
+ * Input placeholder text base styles
+ */
+::-webkit-input-placeholder {
+ color: $color-form-placeholder;
+}
+
+::-moz-placeholder {
+ color: $color-form-placeholder;
+}
+
+:-ms-input-placeholder {
+ color: $color-form-placeholder;
+}
+
+/**
+ * Fieldset base styles
+ */
+fieldset {
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+/**
+ * Legend base styles
+ */
+legend {
+ margin-bottom: 0.25rem;
+}
+
+/**
+ * Label base styles
+ */
+label {
+ display: block;
+ padding-bottom: 0.25rem;
+ color: $color-form-label;
+}
+
+/**
+ * Add font size 100% of form element and margin 0 to these elements
+ */
+button, input, select, textarea {
+ font-family: inherit;
+ font-size: $font-size-med;
+ margin: 0;
+}
+
+/**
+ * Text area base styles
+ */
+textarea {
+ resize: none;
+}
+
+/**
+ * Input and text area base styles
+ */
+input, textarea {
+ width: 100%;
+ padding: 0.5rem;
+ border: $border-thickness solid $color-form-border;
+ background: $color-form-bg;
+
+ &:focus {
+ border-color: $color-form-border-focus;
+ }
+
+ &:disabled {
+ border-color: $color-neutral-gray-07;
+ background: $color-neutral-gray-07;
+ color: $color-neutral-gray-50;
+ }
+}
+
+/**
+ * Remove webkit appearance styles from these elements
+ */
+input[type=text], input[type=search], input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration, input[type=url], input[type=number], textarea {
+ -webkit-appearance: none;
+}
+
+/**
+ * Checkbox and radio button base styles
+ */
+input[type="checkbox"],
+input[type="radio"] {
+ width: auto;
+ margin-right: 0.3rem;
+ border-color: $color-form-border;
+}
+
+/**
+ * Search input base styles
+ */
+input[type="search"] {
+ -webkit-appearance: none;
+ border-radius: 0;
+}
+
+/**
+ * Select
+ * 1) Remove default styling
+ */
+select {
+ display: block;
+ font-size: $font-size-med;
+ width: 100%;
+ border: $border-thickness solid $color-form-border;
+ border-radius: 0;
+ padding: 0.5rem;
+ height: 2rem;
+ background: $color-form-bg;
+ color: $color-form;
+
+ &:focus {
+ border-color: $color-form-border-focus;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_headings.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_headings.scss
new file mode 100644
index 000000000..af247fac2
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_headings.scss
@@ -0,0 +1,36 @@
+/*------------------------------------*\
+ #HEADINGS
+\*------------------------------------*/
+
+h1, h2, h3, h4 {
+ font-family: $font-family-secondary;
+ text-transform: uppercase;
+}
+
+/**
+ * Heading 1 base styles
+ */
+h1 {
+ @include typographyHeadingXXL();
+}
+
+/**
+ * Heading 2 base styles
+ */
+h2 {
+ @include typographyHeadingMed2();
+}
+
+/**
+ * Heading 3 base styles
+ */
+h3 {
+ @include typographyHeadingMed2();
+}
+
+/**
+ * Heading 4 base styles
+ */
+h4 {
+ @include typographyHeadingMed();
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_links.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_links.scss
new file mode 100644
index 000000000..b0f287694
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_links.scss
@@ -0,0 +1,21 @@
+/*------------------------------------*\
+ #LINKS
+\*------------------------------------*/
+
+/**
+ * Link base styles
+ */
+a {
+ color: $color-links;
+ text-decoration: none;
+ outline: 0;
+ transition: color $anim-fade-quick $anim-ease;
+
+ &:hover, &:focus {
+ color: $color-links-hover;
+ }
+
+ &:active {
+ color: $color-links-active;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_lists.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_lists.scss
new file mode 100644
index 000000000..597596c90
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_lists.scss
@@ -0,0 +1,14 @@
+/*------------------------------------*\
+ #LISTS
+\*------------------------------------*/
+
+/**
+ * 1) List base styles
+ */
+
+ /**
+ * Remove list styles from unordered and ordered lists
+ */
+ol, ul {
+ list-style: none;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_main.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_main.scss
new file mode 100644
index 000000000..3f6da2cb8
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_main.scss
@@ -0,0 +1,11 @@
+/*------------------------------------*\
+ #MAIN ELEMENT
+\*------------------------------------*/
+
+/**
+ * Main element
+ */
+[role=main] {
+ display: block;
+ flex: 1 0 auto;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_media.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_media.scss
new file mode 100644
index 000000000..45fc33c5c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_media.scss
@@ -0,0 +1,12 @@
+/*------------------------------------*\
+ #MEDIA
+\*------------------------------------*/
+
+/**
+ * Responsive image styling
+ * 1) Allows for images to flex with varying screen size
+ */
+img {
+ max-width: 100%;
+ height: auto;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_reset.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_reset.scss
new file mode 100644
index 000000000..82c641215
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_reset.scss
@@ -0,0 +1,25 @@
+/*------------------------------------*\
+ #RESET
+\*------------------------------------*/
+
+/**
+ * Border-Box http:/paulirish.com/2012/box-sizing-border-box-ftw/
+ */
+* {
+ box-sizing: border-box;
+}
+
+/**
+ * 1) Zero out margins and padding for elements
+ */
+html, body, div, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ol, ul, li, form, legend, label, table, header, footer, nav, section, figure {
+ margin: 0;
+ padding: 0;
+}
+
+/**
+ * 1) Set HTML5 elements to display: block
+ */
+header, footer, nav, section, article, figure {
+ display: block;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_table.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_table.scss
new file mode 100644
index 000000000..fa3215c54
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_table.scss
@@ -0,0 +1,26 @@
+/*------------------------------------*\
+ #TABLES
+\*------------------------------------*/
+
+/**
+ * Table
+ */
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+}
+
+/**
+ * Table header cell
+ */
+th {
+ text-align: left;
+}
+
+/**
+ * Table row
+ */
+tr {
+ vertical-align: top;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/base/_text.scss b/packages/starterkit-handlebars-demo/dist/css/scss/base/_text.scss
new file mode 100644
index 000000000..b5c3c5525
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/base/_text.scss
@@ -0,0 +1,83 @@
+/*------------------------------------*\
+ #TEXT
+\*------------------------------------*/
+
+/**
+ * Paragraph base styles
+ */
+p {
+ margin-bottom: $spacing;
+}
+
+/**
+ * Blockquote base styles
+ */
+blockquote {
+ font-style:italic;
+ border-left: 1px solid $color-neutral-gray-50;
+ color: $color-neutral-gray-50;
+ padding-left: 1rem;
+ margin-bottom: $spacing;
+}
+
+/**
+ * Horizontal rule base styles
+ */
+hr {
+ border: 0;
+ height: 1px;
+ background: $color-neutral-gray-13;
+ margin: 1rem 0;
+}
+
+/**
+ * Selection styles
+ */
+::-moz-selection {
+ color: $color-text-highlight;
+ background: $color-text-highlight-bg; /* Gecko Browsers */
+}
+
+::selection {
+ color: $color-text-highlight;
+ background: $color-text-highlight-bg; /* WebKit/Blink Browsers */
+}
+
+/**
+ * Code base styles
+ */
+code {
+ display: inline-block;
+ background: $color-neutral-gray-02;
+ border: 1px solid $color-neutral-gray-13;
+ padding: .2rem .5rem;
+ line-height: 1.2;
+ font-size: .85rem;
+}
+
+/**
+ * Preformatted text base styles
+ */
+pre {
+ background: $color-neutral-gray-02;
+ border: 1px solid $color-neutral-gray-13;
+ font-size: $font-size-med;
+ padding: 1rem;
+ overflow-x: auto;
+
+ /**
+ * Remove border from code within preformatted text block
+ */
+ code {
+ border: 0;
+ }
+}
+
+/**
+ * Code with languages associated with them
+ * 1) Override Prism sysles for code blocks with language
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ font-family:monospace !important;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_buttons.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_buttons.scss
new file mode 100644
index 000000000..517fbb9ae
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_buttons.scss
@@ -0,0 +1,59 @@
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+
+/**
+ *
+ * 1) Button or link that has functionality to it
+ */
+.c-btn {
+ display: inline-block;
+ border: $border-thickness solid $color-btn-primary-border;
+ background: $color-brand-blue;
+ color: $color-neutral-white;
+ line-height: 1;
+ padding: 1rem 2rem;
+ border: 0;
+ text-transform: uppercase;
+ text-align: center;
+ transition: all $anim-fade-quick $anim-ease;
+
+ &:hover, &:focus {
+ color: $color-neutral-white;
+ background: $color-brand-blue-dark;
+ }
+}
+
+.c-btn--bare {
+ background: none;
+ color: $color-brand-blue;
+ border: 1px solid transparent;
+
+ &:hover, &:focus {
+ background: none;
+ color: $color-brand-blue;
+ border-color: $color-brand-blue;
+ }
+}
+
+/*
+ * Inner container wrapper
+ * 1) Container is direct decendant of , since there's
+ * a bug with applying flexbox directly to a
+ * 2) Only needs to be used for buttons containing both icons and text
+ */
+.c-btn__inner {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+/*
+ * Button icon
+ */
+.c-btn__icon {
+ width: 1rem;
+ height: 1rem;
+ fill: $color-btn-primary;
+ transition: fill $anim-fade-quick $anim-ease;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_definition-list-list.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_definition-list-list.scss
new file mode 100644
index 000000000..cda086b2e
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_definition-list-list.scss
@@ -0,0 +1,17 @@
+/*------------------------------------*\
+ #DEFINITION LIST LIST
+\*------------------------------------*/
+
+/**
+* 1) List of definition lists
+*/
+
+/**
+ * Definition list list item
+ */
+.c-definition-list-list__item {
+ .c-definition-list-list--lined & {
+ margin-bottom: 1rem;
+ border-bottom: 1px solid $color-neutral-gray-13;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_definition-list.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_definition-list.scss
new file mode 100644
index 000000000..a5f77e627
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_definition-list.scss
@@ -0,0 +1,41 @@
+/*------------------------------------*\
+ #DEFINITION LIST
+\*------------------------------------*/
+
+/**
+* 1) Definition list (`dl`) that contains a definition term (`dt`) and a definition description (`dd`)
+*/
+.c-definition-list {
+ margin: 0 0 1rem;
+}
+
+/**
+* Definition list item
+*/
+.c-definition-list__item {
+ display: flex;
+
+ @media all and (min-width: $bp-large) {
+ justify-content: space-between;
+ }
+}
+
+/**
+* Definition list term
+*/
+.c-definition-list__term {
+ font-weight: bold;
+ margin-bottom: 0.25rem;
+ width: 5rem;
+
+ @media all and (min-width: $bp-large) {
+ width: auto;
+ }
+}
+
+/**
+* Definition list description
+*/
+.c-definition-list__description {
+
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_field.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_field.scss
new file mode 100644
index 000000000..f1450f96a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_field.scss
@@ -0,0 +1,35 @@
+/*------------------------------------*\
+ #FIELDS
+\*------------------------------------*/
+
+/**
+ * 1) Consists of a label, form control, and an optional note about the field.
+ */
+ .c-field {
+ margin-bottom: $spacing-large;
+}
+
+/**
+ * Field label
+ */
+.c-field__label {
+ margin-bottom: 0.5rem;
+ font-size: $font-size-med;
+ font-weight: bold;
+}
+
+/**
+ * Field body
+ */
+.c-field__body {
+ position: relative;
+}
+
+/**
+ * Field note
+ */
+.c-field__note {
+ display: inline-block;
+ font-size: $font-size-sm;
+ color: $color-neutral-gray-50;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_footer-nav.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_footer-nav.scss
new file mode 100644
index 000000000..718698bf8
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_footer-nav.scss
@@ -0,0 +1,33 @@
+/*------------------------------------*\
+ #FOOTER NAV
+\*------------------------------------*/
+
+/**
+ * 1) Global block at the bottom of each page that contains a navigation and other information
+ */
+.c-footer-nav {
+ margin-bottom: 2rem;
+
+ @media all and (min-width: $bp-med) {
+ display: flex;
+ margin-bottom: 0;
+ }
+}
+
+.c-footer-nav__item {
+
+ @media all and (min-width: $bp-med) {
+ margin-right: 2rem;
+
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+}
+
+.c-footer-nav__link {
+ color: $color-neutral-white;
+ font-family: $font-family-secondary;
+ text-transform: uppercase;
+ font-size: $font-size-med-2;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_footer.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_footer.scss
new file mode 100644
index 000000000..6fbe45999
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_footer.scss
@@ -0,0 +1,39 @@
+/*------------------------------------*\
+ $FOOTER
+\*------------------------------------*/
+
+/**
+ * 1) Global block at the bottom of each page that contains a navigation and other information
+ */
+.c-footer {
+ padding: 2rem 0;
+ margin-top: 2rem;
+ background: $color-brand-blue-dark;
+}
+
+.c-footer__inner {
+ @media all and (min-width: $bp-med) {
+ display: flex;
+ }
+}
+
+.c-footer__bottom {
+ @media all and (min-width: $bp-med) {
+ margin-left: auto;
+ }
+}
+
+.c-footer__credit, .c-footer__copyright {
+ color: $color-neutral-white;
+ text-transform: uppercase;
+ font-family: $font-family-secondary;
+ font-size: $font-size-sm-2;
+
+ a {
+ color: $color-brand-orange;
+
+ &:hover, &:focus {
+ color: $color-neutral-gray-50;
+ }
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_header.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_header.scss
new file mode 100644
index 000000000..f3a0e58ef
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_header.scss
@@ -0,0 +1,91 @@
+/*------------------------------------*\
+ #HEADER
+\*------------------------------------*/
+
+/**
+ * Global block at the top of each page containing the navigation, logo, and other potential contents
+ */
+.c-header {
+ position: relative;
+ margin-bottom: 2rem;
+ border-bottom: 1px solid $color-neutral-gray-13;
+}
+
+/**
+ * Header inner
+ */
+.c-header__inner {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+
+ @media all and (min-width: $bp-small-2) {
+ display: flex;
+ align-items: center;
+ }
+}
+
+/**
+ * Header navigation button
+ * 1) Button used to toggle the navigation on/off on small screens
+ */
+.c-header__nav-btn {
+ margin-left: auto;
+
+ @media all and (min-width: $bp-xl) {
+ display: none;
+ }
+}
+
+/**
+ * Header navigation conntainer
+ * 1) Contains the primary navigation and other possible patterns
+ */
+.c-header__nav-container {
+ display: none;
+
+ @media all and (min-width: $bp-xl) {
+ display: block;
+ margin-left: auto;
+ }
+
+ /**
+ * Header navigation conntainer within vertical header
+ */
+ .c-header--vertical & {
+ @media all and (min-width: $bp-xl) {
+ margin-left: 0;
+ }
+ }
+}
+
+/**
+ * Active header nav container
+ */
+.c-header__nav-container.is-active {
+ display: block;
+ position: absolute;
+ background: $color-neutral-gray-07;
+ top: 100%;
+ left: 0;
+ width: 100%;
+ z-index: 5;
+ padding: 1rem;
+
+ @media all and (min-width: $bp-xl) {
+ display: block;
+ position: static;
+ padding: 0;
+ margin-left: auto;
+ width: inherit;
+ }
+
+ /**
+ * Active header nav container within vertical header
+ */
+ .c-header--vertical & {
+ @media all and (min-width: $bp-xl) {
+ margin-left: 0;
+ width: 100%;
+ }
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_hero.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_hero.scss
new file mode 100644
index 000000000..e963fd123
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_hero.scss
@@ -0,0 +1,69 @@
+/*------------------------------------*\
+ #HERO BLOCK
+\*------------------------------------*/
+
+/**
+ * 1) Sit hero flush with header. Normally we wouldn't
+ * do this and handle margin using utility classes,
+ * but we're taking a shortcut for a demo.
+ */
+.c-hero {
+ display: block;
+ position: relative;
+ margin: -2rem 0 2rem; /* 1 */
+}
+
+/**
+ * Hero Image
+ * 1) This is the primary hero image that runs full-bleed across the layout
+ */
+.c-hero__img {
+ display: block;
+ width: 100%;
+ object-fit: cover;
+ max-height: 70vh;
+ overflow: hidden;
+}
+
+.c-hero__body {
+ background: $color-brand-orange;
+ padding: $spacing;
+
+ @media all and (min-width: $bp-small-2) {
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ background: linear-gradient(
+ to bottom,
+ rgba(0, 0, 0, 0) 0,
+ rgba(0, 0, 0, 0) 20%,
+ #000 100%
+ );
+ }
+}
+
+/**
+ * Hero Headline
+ * 1) This sits overtop of the hero image when space permits
+ */
+.c-hero__headline {
+ text-transform: uppercase;
+ font-size: $font-size-xl;
+ background-color: $color-brand-orange;
+ color: $color-neutral-white;
+ transition: all $anim-fade-quick $anim-ease;
+
+ @media all and (min-width: $bp-small-2) {
+ padding: 0 0.4rem;
+ font-size: $font-size-xxl;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_icon.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_icon.scss
new file mode 100644
index 000000000..b94380c52
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_icon.scss
@@ -0,0 +1,11 @@
+/*------------------------------------*\
+ #ICON
+\*------------------------------------*/
+
+/**
+ * 1) Small image that represents functionality
+ */
+.c-icon {
+ height: 16px;
+ width: 16px;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_input.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_input.scss
new file mode 100644
index 000000000..9bf394411
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_input.scss
@@ -0,0 +1,12 @@
+/*------------------------------------*\
+ #INPUT
+\*------------------------------------*/
+
+/**
+ * 1) Actual input of a field
+ */
+.c-input {
+ .c-stripe & {
+ max-width: 3rem;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_logo.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_logo.scss
new file mode 100644
index 000000000..9fe0feeee
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_logo.scss
@@ -0,0 +1,43 @@
+/*------------------------------------*\
+ #LOGO
+\*------------------------------------*/
+
+/**
+ * Branding image or text of the site
+ */
+.c-logo {
+ font-size: $font-size-large;
+
+ .c-footer & {
+ margin-bottom: 2rem;
+
+ @media all and (min-width: $bp-med) {
+ margin-bottom: 0;
+ }
+ }
+}
+
+/**
+ * Logo link
+ */
+.c-logo__link {
+ display: block;
+}
+
+/**
+ * Logo image
+ */
+.c-logo__img {
+ display: block;
+}
+
+.c-logo__left {
+ color: $color-brand-blue;
+
+ .c-logo--light & {
+ color: $color-neutral-white;
+ }
+}
+.c-logo__right {
+ color: $color-brand-orange;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_page-header.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_page-header.scss
new file mode 100644
index 000000000..bdc5675bc
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_page-header.scss
@@ -0,0 +1,21 @@
+/*------------------------------------*\
+ #PAGE HEADER
+\*------------------------------------*/
+/**
+ * 1) Container that consists of of a page header title and description
+ */
+
+/**
+ * Page header title
+ */
+.c-page-header {
+ margin-top: 4rem;
+ margin-bottom: $spacing-large;
+}
+
+/**
+ * Page description
+ */
+.c-page-header__desc {
+ margin-top: 1rem;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_pagination.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_pagination.scss
new file mode 100644
index 000000000..365762382
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_pagination.scss
@@ -0,0 +1,44 @@
+/*------------------------------------*\
+ #PAGINATION
+\*------------------------------------*/
+/**
+ * Pagination
+ */
+.c-pagination {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ overflow: hidden;
+ margin-bottom: 1rem;
+ font-family: $font-family-secondary;
+ text-transform: uppercase;
+}
+
+.c-pagination__item {
+ border-right: 1px solid $color-neutral-gray-13;
+
+ &:last-child {
+ border: 0;
+ }
+}
+
+.c-pagination__link {
+ padding: 1rem;
+ text-decoration: underline;
+
+ .c-pagination__item:first-child & {
+ padding-left: 0;
+ }
+
+ .c-pagination__item.is-active & {
+ font-weight: bold;
+ text-decoration: none;
+ pointer-events: none;
+ }
+
+ .c-pagination__item.is-disabled & {
+ color: $color-neutral-gray-13;
+ pointer-events: none;
+ text-decoration: none;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_primary-nav.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_primary-nav.scss
new file mode 100644
index 000000000..d71d8abb3
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_primary-nav.scss
@@ -0,0 +1,56 @@
+/*------------------------------------*\
+ #PRIMARY NAVIGATION
+\*------------------------------------*/
+
+/**
+ * Primary navigation existing in the header and maybe the footer
+ */
+
+ .c-primary-nav {
+
+ @media all and (min-width: 32em) {
+ margin-left: auto;
+ }
+ }
+
+/**
+ * Primary navigation list
+ */
+.c-primary-nav__list {
+ display: flex;
+ align-items: center;
+}
+
+/**
+ * Primary navigation item
+ */
+.c-primary-nav__item {
+ margin-right: 2rem;
+
+ &:last-child {
+ margin-right: 0;
+ }
+}
+
+/**
+ * Primary navigation link
+ */
+.c-primary-nav__link {
+ display: block;
+ cursor: pointer;
+ font-family: $font-family-secondary;
+ font-size: $font-size-med-2;
+ line-height: 1;
+ text-transform: uppercase;
+ transition: background $anim-fade-quick $anim-ease;
+
+ &:hover, &:focus {
+ color: $color-brand-orange;
+ }
+}
+
+.c-primary-nav__icon.c-icon {
+ fill: $color-brand-blue-dark;
+ height: 24px;
+ width: 24px;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_progress-tracker.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_progress-tracker.scss
new file mode 100644
index 000000000..5020d9e32
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_progress-tracker.scss
@@ -0,0 +1,84 @@
+/*------------------------------------*\
+ #PROGRESS TRACKER
+\*------------------------------------*/
+
+/**
+ * 1) Ordered list showing progress (i.e. step by step)
+ * 2) Display flex used to put items in row. Flex wrap wraps items underneat when space is
+ * unavailable.
+ */
+
+.c-progress-tracker {
+ display: flex; /* 2 */
+ justify-content: center;
+ flex-wrap: wrap; /* 2 */
+}
+
+/* Progress tracker iterm */
+.c-progress-tracker__item {
+ margin-right: 2rem;
+ text-align: center;
+ font-size: $font-size-sm-2;
+ width: 5rem;
+
+ /* Don't display the horizontal line on the last item number */
+ &:last-child .c-progress-tracker__number:before {
+ display: none;
+ }
+}
+
+
+.c-progress-tracker__number {
+ padding: .125rem;
+ margin-bottom: .5rem;
+ color: $color-brand-blue;
+ border: 1px solid $color-brand-blue;
+ background-color: $color-neutral-white;
+ position: relative;
+
+ @media all and (min-width: $bp-small) {
+ padding: .5rem;
+ }
+
+ .is-complete & {
+ background-color: $color-neutral-gray-13;
+ border-color: $color-neutral-gray-13;
+ }
+
+ .is-current & {
+ color: $color-neutral-white;
+ background-color: $color-brand-blue;
+ font-weight: bold;
+ }
+
+ .is-disabled & {
+ color: $color-brand-blue-dark;
+ border-color: $color-brand-blue;
+ }
+
+ &:before {
+ content: " ";
+ display: block;
+ width: 4rem;
+ height: 1px;
+ background-color: $color-neutral-gray-13;
+ position: absolute;
+ top: 50%;
+ right: -4rem;
+ z-index: -1;
+ }
+}
+
+.c-progress-tracker__label {
+ display: none;
+
+ /* Do show it on larger screens */
+ @media all and (min-width: $bp-small-2) {
+ display: inline;
+ }
+
+ .is-current & {
+ font-weight: bold;
+ }
+
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_promo-block.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_promo-block.scss
new file mode 100644
index 000000000..ca564e49c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_promo-block.scss
@@ -0,0 +1,99 @@
+/*------------------------------------*\
+ #PROMO BLOCK
+\*------------------------------------*/
+
+/**
+ * Large block containing an image and copy
+ * 1) Move promo block up to sit flush with hero
+ * Normally we wouldn't do this, but we're taking
+ * a shortcut for demo purposes.
+ */
+.c-promo-block {
+ color: $color-neutral-white;
+ position: relative;
+ margin-top: -2rem; /* 1 */
+}
+
+.c-promo-block__media {
+ position: relative;
+ z-index: 0;
+
+ &:before {
+ content: "";
+ background: linear-gradient(
+ to left,
+ rgba(0, 0, 0, 0) 0,
+ rgba(0, 0, 0, 0) 40%,
+ #000 100%
+ );
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+
+ .c-promo-block--right & {
+ background: linear-gradient(
+ to right,
+ rgba(0, 0, 0, 0)
+ 0,
+ rgba(0, 0, 0, 0)
+ 20%,
+ #000 100%
+ );
+ }
+ }
+}
+
+.c-promo-block__body {
+ position: absolute;
+ top: 40%;
+ left: 4rem;
+ z-index: 1;
+ max-width: 400px;
+ transition: opacity $anim-fade-long $anim-ease,
+ transform $anim-fade-long $anim-ease;
+
+ .c-promo-block--right & {
+ left: auto;
+ right: 4rem;
+ }
+
+ &.c-promo-block__body--initial {
+ opacity: 0;
+ transform: translateY(70px);
+ }
+}
+
+.c-promo-block__img {
+ display: block;
+ width: 100%;
+}
+
+.c-promo-block__link {
+ color: $color-neutral-white;
+
+ &:hover,
+ &:focus {
+ color: $color-brand-orange;
+ }
+}
+
+.c-promo-block__heading {
+ display: inline;
+ color: inherit;
+ border-bottom: 2px solid $color-brand-orange;
+ font-size: $font-size-large;
+
+ @media all and (min-width: $bp-large) {
+ font-size: $font-size-xl;
+ }
+}
+
+.c-promo-block__description {
+ margin-top: 1rem;
+
+ @media all and (min-width: $bp-large) {
+ font-size: $font-size-med-2;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_search-form.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_search-form.scss
new file mode 100644
index 000000000..8bc508755
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_search-form.scss
@@ -0,0 +1,13 @@
+/*------------------------------------*\
+ #SEARCH FORM
+\*------------------------------------*/
+/**
+ * 1) Search form that contains a text input and button
+ */
+
+/**
+ * Page header title
+ */
+.c-search-form__body {
+ display: flex;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_section.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_section.scss
new file mode 100644
index 000000000..882c3d987
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_section.scss
@@ -0,0 +1,25 @@
+/*------------------------------------*\
+ #SECTION HEADER
+\*------------------------------------*/
+/**
+ * 1) A group of text with a title that headlines a section
+ */
+ .c-section__header {
+ display: flex;
+ align-items: center;
+ position: relative;
+ margin-bottom: 1rem;
+
+ &:after {
+ content: '';
+ display: block;
+ flex: 1;
+ height: 2px;
+ margin-left: 1rem;
+ background: $color-brand-orange;
+ }
+ }
+
+ .c-section__title {
+ font-size: $font-size-large;
+ }
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_stacked-block-list.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_stacked-block-list.scss
new file mode 100644
index 000000000..4abf08ba4
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_stacked-block-list.scss
@@ -0,0 +1,4 @@
+.c-stacked-block-list {
+ max-width: $l-max-width;
+ margin-bottom: $spacing-large;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_stacked-block.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_stacked-block.scss
new file mode 100644
index 000000000..8300f4e07
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_stacked-block.scss
@@ -0,0 +1,72 @@
+/*------------------------------------*\
+ #STACKED BLOCK
+\*------------------------------------*/
+
+/**
+ * 1) A link block consisting of media, headline, and description all stacked on top
+ * of each other
+ * 2) Capped for demo purposes
+ */
+.c-stacked-block {
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ max-width: 600px; /* 2 */
+ transition: transform $anim-fade-quick $anim-ease;
+
+ &:hover, &:focus {
+ transform: scale(1.03);
+ }
+}
+
+.c-stacked-block__body {
+ flex: 1;
+}
+
+.c-stacked-block__title {
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ color: $color-brand-blue;
+ transition: color $anim-fade-quick $anim-ease;
+
+ .c-stacked-block:hover &, .c-stacked-block:focus & {
+ color: $color-brand-orange;
+ }
+}
+
+.c-stacked-block__excerpt {
+ margin-bottom: 0;
+ color: $color-neutral-gray-73;
+}
+
+.c-stacked-block__meta {
+ color: $color-brand-blue;
+ font-size: $font-size-med-2;
+ font-family: $font-family-secondary;
+ margin-bottom: 0;
+ transition: color $anim-fade-quick $anim-ease;
+
+ .c-stacked-block:hover &, .c-stacked-block:focus & {
+ color: $color-brand-orange;
+ }
+}
+
+.c-stacked-block__badge {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 0.5rem;
+ font-family: $font-family-secondary;
+ text-transform: uppercase;
+ color: $color-neutral-white;
+ background: $color-brand-orange;
+}
+
+.c-stacked-block__optional {
+ margin-left: 0.5rem;
+ color: $color-neutral-gray-50;
+ font-family: $font-family-secondary;
+ font-size: $font-size-sm-2;
+ text-decoration: line-through;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_stripe.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_stripe.scss
new file mode 100644
index 000000000..c1bf6a1aa
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_stripe.scss
@@ -0,0 +1,99 @@
+/*------------------------------------*\
+ #STRIPE
+\*------------------------------------*/
+
+/**
+ * 1) Block that contains a right and left column of text and other possible components
+ */
+.c-stripe {
+ padding: 2rem 0;
+
+ @media all and (min-width: $bp-small-2) {
+ display: flex;
+ }
+
+ .c-stripe-list--condensed & {
+ padding: 1rem 0;
+ }
+}
+
+/**
+ * Stripe lef container
+ * 1) Contains elements that display on the left side of the stripe
+ */
+.c-stripe__left-container {
+ margin-right: 2rem;
+
+ @media all and (min-width: $bp-small-2) {
+ width: 20%;
+ }
+
+ .c-stripe-list--condensed & {
+ display: none;
+ }
+}
+
+.c-stripe__link {
+ display: block;
+
+ @media all and (min-width: $bp-small-2) {
+ max-width: 10rem;
+ }
+}
+
+/**
+ * Stripe right container
+ * 1) Contains elements that display on the right side of the stripe
+ */
+.c-stripe__right-container {
+ flex: 1;
+
+ @media all and (min-width: $bp-small-2) {
+ display: flex;
+ align-items: center;
+ }
+}
+
+.c-stripe__title {
+ margin-bottom: 2rem;
+
+ @media all and (min-width: $bp-small-2) {
+ margin-bottom: 0;
+ margin-right: 2rem;
+ width: 40%;
+ }
+}
+
+.c-stripe__meta {
+
+ @media all and (min-width: $bp-small-2) {
+ margin-left: 2rem;
+ margin-bottom: 2.25rem;
+ width: 20%;
+ text-align: right;
+ flex: 1;
+ }
+}
+
+.c-stripe__meta-label {
+ font-weight: bold;
+ margin-bottom: 0.75rem;
+}
+
+.c-stripe__meta-span {
+ font-family: $font-family-secondary;
+ color: $color-brand-blue;
+ font-size: $font-size-med-2;
+}
+
+
+/*------------------------------------*\
+ #STRIPE LIST
+\*------------------------------------*/
+
+/**
+ * 1) Block that contains a right and left column of text and other possible components
+ */
+ .c-stripe-list__item {
+ border-bottom: 1px solid $color-neutral-gray-13;
+ }
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_table.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_table.scss
new file mode 100644
index 000000000..a304e1e93
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_table.scss
@@ -0,0 +1,53 @@
+/*------------------------------------*\
+ #TABLE
+\*------------------------------------*/
+
+/**
+ * 1) Data Table
+ */
+.c-table {
+ margin-bottom: 1rem;
+ min-width: 600px; /* 2 */
+}
+
+/**
+ * Table Header
+ */
+.c-table__header {
+ background: $color-neutral-gray-07;
+}
+
+/**
+ * Table Header Cell
+ */
+.c-table__header-cell {
+ padding: 0.8rem;
+}
+
+/**
+ * Table Row
+ */
+.c-table__row {
+ border-bottom: 1px solid $color-neutral-gray-07;
+}
+
+/**
+ * Table Cell
+ */
+.c-table__cell {
+ padding: 1.6rem 0.8rem;
+}
+
+/**
+ * Table Footer
+ */
+.c-table__footer {
+
+}
+
+/**
+ * Table Footer Cell
+ */
+.c-table__footer-cell {
+ padding: 0.8rem;
+}
diff --git a/packages/uikit-workshop/src/sass/scss/components/_text-passage.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_text-passage.scss
similarity index 51%
rename from packages/uikit-workshop/src/sass/scss/components/_text-passage.scss
rename to packages/starterkit-handlebars-demo/dist/css/scss/components/_text-passage.scss
index 63e99156a..2a8c2036f 100644
--- a/packages/uikit-workshop/src/sass/scss/components/_text-passage.scss
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_text-passage.scss
@@ -3,15 +3,11 @@
\*------------------------------------*/
/**
- * 1) A passage of text which includes free-form tags (ul, blockquote, p, h2, etc)
- * generated by markdown
+ * 1) A passage of text, including various components (i.e. article, blog post)
*/
- .pl-c-text-passage {
- font-size: $pl-font-size-sm-2;
- line-height: 1.7;
+.c-text-passage {
p {
- margin-top: 0;
margin-bottom: 1rem;
}
@@ -19,20 +15,7 @@
* Link within the text passage
*/
a {
- color: $pl-color-gray-50;
text-decoration: underline;
- transition: opacity $pl-animate-quick ease;
-
- &:hover, &:focus {
- opacity: 0.8;
- }
- }
-
- /**
- * Code
- */
- code[class*="language-"], pre[class*="language-"] {
- color: inherit;
}
/**
@@ -40,65 +23,53 @@
*/
blockquote {
padding-left: 0.8rem;
- border-left: 3px solid inherit;
- }
-
- /**
- * Horizontal rule
- */
- hr {
- height: 1px;
- background: $pl-color-gray-50;
- margin: 2rem 0;
- border: 0;
- }
+ border-left: 3px solid $color-neutral-gray-73;
+ color: $color-neutral-gray-50;
+ font-size: 1rem;
+ }
/**
* First-level heading within text passage
*/
- h1 {
- margin-bottom: 1rem;
- font-weight: normal;
- }
+ h1 {
+ margin-bottom: 1rem;
+ }
/**
* Second-level heading within text passage
*/
h2 {
margin: 1rem 0 1rem;
- font-weight: normal;
+ color: $color-neutral-gray-73;
+ font-weight: bold;
}
/**
* Third-level heading within text passage
*/
h3 {
- margin: 1rem 0 1rem;
- font-weight: normal;
+ margin: 1rem 0 1rem;
}
/**
* Fourth-level heading within text passage
*/
h4 {
- margin: 1rem 0 1rem;
- font-weight: normal;
+ margin: 1rem 0 1rem;
}
/**
* Fifth-level heading within text passage
*/
h5 {
- margin: 1rem 0 1rem;
- font-weight: normal;
+ margin: 1rem 0 1rem;
}
/**
* Sixth-level heading within text passage
*/
h6 {
- margin: 1rem 0 1rem;
- font-weight: normal;
+ margin: 1rem 0 1rem;
}
@@ -106,8 +77,8 @@
* Unordered list within text passage
*/
ul {
- list-style: square;
- margin-left: 0.9rem;
+ list-style: disc;
+ margin-left: 1rem;
margin-bottom: 1rem;
li:last-child {
@@ -120,7 +91,7 @@
*/
ol {
list-style: decimal;
- margin-left: 0.9rem;
+ margin-left: 1rem;
margin-bottom: 1rem;
li:last-child {
@@ -130,5 +101,6 @@
li {
margin-bottom: 0.5rem;
+ line-height: 1.6;
}
}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_total.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_total.scss
new file mode 100644
index 000000000..722e6a110
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_total.scss
@@ -0,0 +1,61 @@
+
+/*------------------------------------*\
+ #TOTAL CONTAINER
+\*------------------------------------*/
+
+/**
+ * 1)
+ */
+
+.c-total-container {
+ margin-top: 1rem;
+
+ @media all and (min-width: $bp-small-2) {
+ text-align: right;
+ }
+}
+
+.c-total {
+ display: flex;
+ align-items: center;
+
+ @media all and (min-width: $bp-small-2) {
+ justify-content: flex-end;
+ }
+}
+
+.c-total--no-break {
+ justify-content: flex-start;
+
+ @media all and (min-width: $bp-large) {
+ justify-content: flex-end;
+ }
+}
+
+.c-total__label {
+ font-weight: bold;
+ margin-right: 0.5rem;
+ padding-bottom: 0;
+
+ .c-total--no-break & {
+ width: 5rem;
+
+ @media all and (min-width: $bp-large) {
+ width: auto;
+ }
+ }
+}
+
+.c-total__span {
+ font-family: $font-family-secondary;
+ font-size: $font-size-med-2;
+ color: $color-brand-blue;
+
+ .c-total--no-break & {
+ margin-left: 2rem;
+
+ @media all and (min-width: $bp-large) {
+ margin-left: 0;
+ }
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/components/_tout.scss b/packages/starterkit-handlebars-demo/dist/css/scss/components/_tout.scss
new file mode 100644
index 000000000..0825feb59
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/components/_tout.scss
@@ -0,0 +1,43 @@
+
+/*------------------------------------*\
+ #TOUT BLOCK
+\*------------------------------------*/
+
+/**
+ * 1) The tout block contains an image and headline overlayed over the image.
+ */
+.c-tout {
+ display: block;
+ position: relative;
+ overflow: hidden;
+ max-width: 1024px;
+}
+
+/**
+ * Tout image
+ */
+
+ .c-tout__img {
+ display: block;
+ }
+
+/**
+ * Tout headline
+ */
+.c-tout__headline {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ color: $color-neutral-white;
+ padding: 0.5rem;
+ font-size: 1.4rem;
+ transition: all $anim-fade-quick $anim-ease;
+
+ .c-tout:hover &, .c-tout:focus & {
+ padding-bottom: 2rem;
+ background: $color-brand-blue;
+ }
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/layout/_layout.scss b/packages/starterkit-handlebars-demo/dist/css/scss/layout/_layout.scss
new file mode 100644
index 000000000..064b1c34a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/layout/_layout.scss
@@ -0,0 +1,107 @@
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+
+/**
+ * Layout Container
+ * 1) Caps the width of the content to the maximum width
+ * and centers the container
+ */
+.l-container {
+ max-width: $l-max-width;
+ padding: 0 $spacing;
+ margin: 0 auto;
+
+ @media all and (min-width: $bp-large) {
+ padding: 0 $spacing-large;
+ }
+}
+
+.l-container--narrow {
+ max-width: $l-max-width-narrow;
+}
+
+/**
+ *
+ * 1) This caps the width of text passages
+ * to achieve a comfortable line length
+ */
+.l-linelength-container {
+ max-width: $l-linelength-width;
+}
+
+.l-band {
+ background: $color-neutral-gray-02;
+ padding: 2rem 1rem;
+}
+
+/**
+ * 2 column layout
+ */
+.l-page-layout--two-column {
+ display: flex;
+ flex-direction: column;
+
+ @media all and (min-width: $bp-large) {
+ flex-direction: row;
+ }
+}
+
+.l-page-layout__main {
+ .l-page-layout--two-column & {
+ @media all and (min-width: $bp-large) {
+ width: 70%;
+ padding-right: $spacing;
+ }
+ }
+}
+
+/**
+ * Sidebar
+ */
+.l-page-layout__secondary {
+
+ .l-page-layout--two-column & {
+ @media all and (min-width: $bp-large) {
+ width: 30%;
+ margin-left: 2rem;
+ }
+ }
+
+ .l-page-layout--reversed & {
+ margin-bottom: 2rem;
+
+ @media all and (min-width: $bp-large) {
+ order: 1;
+ margin-bottom: 0;
+ }
+ }
+}
+
+
+
+/*------------------------------------*\
+ #GRID
+\*------------------------------------*/
+
+/**
+ * Grid Container
+ */
+.l-grid {
+ display: flex;
+ flex-wrap: wrap;
+
+ @supports (display: grid) {
+ display: grid;
+ grid-gap: $spacing-large;
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr) );
+ margin: 0;
+ }
+}
+
+/**
+ * Grid Item
+ */
+.l-grid__item {
+ display: flex;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/utilities/_spacing.scss b/packages/starterkit-handlebars-demo/dist/css/scss/utilities/_spacing.scss
new file mode 100644
index 000000000..54b0d85e9
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/utilities/_spacing.scss
@@ -0,0 +1,289 @@
+/*------------------------------------*\
+ #SPACING
+\*------------------------------------*/
+
+/**
+ * Margin bottom none
+ * 1) Force margin bottom of 0
+ */
+ .u-margin-bottom-none {
+ margin-bottom: 0 !important;
+}
+
+/**
+ * Margin bottom small
+ * 1) Force margin bottom of $spacing-small variable
+ */
+.u-margin-bottom-small {
+ margin-bottom: $spacing-small !important;
+}
+
+/**
+ * Margin bottom
+ * 1) Force margin bottom of $spacing variable
+ */
+.u-margin-bottom {
+ margin-bottom: $spacing !important;
+}
+
+/**
+ * Margin bottom large
+ * 1) Force margin bottom of $spacing-large variable
+ */
+.u-margin-bottom-large {
+ margin-bottom: $spacing-large !important;
+}
+
+.u-margin-bottom-large-to-xxl {
+ margin-bottom: $spacing-large !important;
+
+ @media all and (min-width: $bp-large) {
+ margin-bottom: $spacing-large*4 !important;
+ }
+}
+/**
+ * Margin top none
+ * 1) Force margin top of 0
+ */
+.u-margin-top-none {
+ margin-top: 0 !important;
+}
+
+/**
+ * Margin top small
+ * 1) Force margin top of $spacing-small variable
+ */
+.u-margin-top-small {
+ margin-top: $spacing-small !important;
+}
+
+/**
+ * Margin top
+ * 1) Force margin top of $spacing variable
+ */
+.u-margin-top {
+ margin-top: $spacing !important;
+}
+
+/**
+ * Margin top large
+ * 1) Force margin top of $spacing-large variable
+ */
+.u-margin-top-large {
+ margin-top: $spacing-large !important;
+}
+
+.u-margin-top-booking {
+ margin-top: 28rem !important;
+}
+
+/**
+ * Margin right none
+ * 1) Force margin right of 0
+ */
+.u-margin-right-none {
+ margin-right: 0 !important;
+}
+
+/**
+ * Margin right small
+ * 1) Force margin right of $spacing-small variable
+ */
+.u-margin-right-small {
+ margin-right: $spacing-small !important;
+}
+
+/**
+ * Margin right
+ * 1) Force margin right of $spacing variable
+ */
+.u-margin-right {
+ margin-right: $spacing !important;
+}
+
+/**
+ * Margin right large
+ * 1) Force margin right of $spacing-large variable
+ */
+.u-margin-right-large {
+ margin-right: $spacing-large !important;
+}
+
+/**
+ * Margin left none
+ * 1) Force margin left of 0
+ */
+.u-margin-left-none {
+ margin-left: 0 !important;
+}
+
+/**
+ * Margin left small
+ * 1) Force margin left of $spacing-small variable
+ */
+.u-margin-left-small {
+ margin-left: $spacing-small !important;
+}
+
+/**
+ * Margin left
+ * 1) Force margin left of $spacing variable
+ */
+.u-margin-left {
+ margin-left: $spacing !important;
+}
+
+/**
+ * Margin left large
+ * 1) Force margin left of $spacing-large variable
+ */
+.u-margin-left-large {
+ margin-left: $spacing-large !important;
+}
+
+/**
+ * Center display block contents
+ */
+.u-margin-center {
+ margin: 0 auto !important;
+}
+
+/**
+ * Padding none
+ */
+.u-padding-none {
+ padding: 0 !important;
+}
+
+/**
+ * Padding small
+ */
+.u-padding-small {
+ padding: $spacing-small !important;
+}
+
+/**
+ * Padding
+ */
+.u-padding {
+ padding: $spacing !important;
+}
+
+/**
+ * Padding large
+ */
+.u-padding-large {
+ padding: $spacing-large !important;
+}
+
+/**
+ * Padding top none
+ */
+.u-padding-top-none {
+ padding-top: 0 !important;
+}
+
+/**
+ * Padding top small
+ */
+.u-padding-top-small {
+ padding-top: $spacing-small !important;
+}
+
+/**
+ * Padding top
+ */
+.u-padding-top {
+ padding-top: $spacing !important;
+}
+
+/**
+ * Padding top large
+ */
+.u-padding-top-large {
+ padding-top: $spacing-large !important;
+}
+
+/**
+ * Padding bottom none
+ */
+.u-padding-bottom-none {
+ padding-bottom: 0 !important;
+}
+
+/**
+ * Padding bottom small
+ */
+.u-padding-bottom-small {
+ padding-bottom: $spacing-small !important;
+}
+
+/**
+ * Padding bottom
+ */
+.u-padding-bottom {
+ padding-bottom: $spacing !important;
+}
+
+/**
+ * Padding bottom large
+ */
+.u-padding-bottom-large {
+ padding-bottom: $spacing-large !important;
+}
+
+/**
+ * Padding right none
+ */
+.u-padding-right-none {
+ padding-right: 0 !important;
+}
+
+/**
+ * Padding right small
+ */
+.u-padding-right-small {
+ padding-right: $spacing-small !important;
+}
+
+/**
+ * Padding right
+ */
+.u-padding-right {
+ padding-right: $spacing !important;
+}
+
+/**
+ * Padding right large
+ */
+.u-padding-right-large {
+ padding-right: $spacing-large !important;
+}
+
+/**
+ * Padding left none
+ */
+.u-padding-left-none {
+ padding-left: 0 !important;
+}
+
+/**
+ * Padding left small
+ */
+.u-padding-left-small {
+ padding-left: $spacing-small !important;
+}
+
+/**
+ * Padding left
+ */
+.u-padding-left {
+ padding-left: $spacing !important;
+}
+
+/**
+ * Padding left large
+ */
+.u-padding-left-large {
+ padding-left: $spacing-large !important;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/scss/utilities/_visibility.scss b/packages/starterkit-handlebars-demo/dist/css/scss/utilities/_visibility.scss
new file mode 100644
index 000000000..ab9998f07
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/scss/utilities/_visibility.scss
@@ -0,0 +1,26 @@
+/*------------------------------------*\
+ #VISIBILITY CLASSES
+\*------------------------------------*/
+
+/**
+ * Is Hidden
+ * 1) Completely remove from the flow and screen readers.
+ */
+.u-is-hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+/**
+ * Is Visibly Hidden
+ * 1) Completely remove from the flow but leave available to screen readers.
+ */
+.u-is-vishidden {
+ position: absolute !important;
+ overflow: hidden;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+}
diff --git a/packages/starterkit-handlebars-demo/dist/css/style.css b/packages/starterkit-handlebars-demo/dist/css/style.css
new file mode 100644
index 000000000..25687f425
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/style.css
@@ -0,0 +1,1824 @@
+/*------------------------------------*\
+ #TABLE OF CONTENTS
+\*------------------------------------*/
+/**
+ * ABSTRACTS..............................Declarations of Sass variables & mixins
+ * BASE...................................Default element styles
+ * LAYOUT.................................Layout-specific styles
+ * COMPONENTS.............................Component styles
+ * UTILITIES..............................Utility classes
+ */
+/*------------------------------------*\
+ #ABSTRACTS
+\*------------------------------------*/
+/*------------------------------------*\
+ #VARIABLES
+\*------------------------------------*/
+/**
+ * CONTENTS
+ *
+ * COLORS
+ * Brand Colors...............Globally-available variables and config
+ * Neutral Colors.............Grayscale colors, including white and black
+ * Utility Colors.............Info, Warning, Error, Success
+ *
+ * TYPOGRAPHY
+ * Font Families..............The fonts used in the design system
+ * Sizing.....................Font sizing
+ *
+ * LAYOUT
+ * Max-widths.................Maximum layout container width
+ *
+
+ * SPACING
+ * Spacing defaults...........Spacing between elements
+ *
+ * BORDERS
+ * Border Width...............Border thicknesses
+ * Border Radius..............Border radius definitions
+ *
+ * ANIMATION
+ * Animation Speed............Transition/animation speed variables
+ * Animation easing...........Easing variables
+ *
+ * BREAKPOINTS
+ * Breakpoints................Global breakpoint definitions
+ */
+/*------------------------------------*\
+ #COLORS
+ \*------------------------------------*/
+/**
+ * Brand Colors
+ * 1) Brand=specific colors
+ */
+/**
+ * Neutral Colors
+ * 1) Neutral colors are grayscale values used throughout the UI
+ */
+/**
+ * Utility Colors
+ * 1) Utility colors are colors used to provide feedback, such as alert messages,
+ * form validation, etc.
+ */
+/*------------------------------------*\
+ #TYPOGRAPHY
+\*------------------------------------*/
+/**
+ * Font Family
+ */
+/**
+ * Font Sizing
+ */
+/**
+ * Line Height
+ */
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+/**
+ * Max Width
+ */
+/*------------------------------------*\
+ #SPACING
+\*------------------------------------*/
+/**
+ * Spacing and offsets
+ * 1) Used to space grids and body padding
+ */
+/*------------------------------------*\
+ #BORDERS
+\*------------------------------------*/
+/**
+ * Border
+ */
+/**
+ * Border radius
+ */
+/*------------------------------------*\
+ #ANIMATION
+\*------------------------------------*/
+/**
+ * Transition Speed
+ */
+/**
+ * Transition Ease
+ */
+/*------------------------------------*\
+ #BREAKPOINTS
+\*------------------------------------*/
+/**
+ * Breakpoints used in media queries
+ * 1) These are not the only breakpoints used, but they provide a few defaults
+ */
+/*------------------------------------*\
+ #MIXINS
+\*------------------------------------*/
+/**
+ * Body Styles
+ * 1) Prevent Mobile Safari from scaling up text: https://blog.55minutes.com/2012/04/iphone-text-resizing/
+ */
+/**
+ * XL Type Styles
+ */
+/**
+ * XL Heading Styles
+ */
+/**
+ * XL Heading Styles
+ */
+/**
+ * Large Heading Styles
+ */
+/**
+ * Medium 2 Heading Styles
+ */
+/**
+ * Medium Heading Styles
+ */
+/*------------------------------------*\
+ #COLORS
+\*------------------------------------*/
+/**
+ * In this file, we take the literal colors from our palette (defined in variables.scss)
+ * and define them against variables that we can utilise anywhere throughout the project.
+ */
+/*------------------------------------*\
+ #GLOBAL TEXT COLOR
+\*------------------------------------*/
+/**
+ * Body text and background colors
+ */
+/**
+ * Highlight colors
+ */
+/*------------------------------------*\
+ #LINKS
+\*------------------------------------*/
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+/*------------------------------------*\
+ #FORMS
+\*------------------------------------*/
+/*------------------------------------*\
+ #BREAKPOINTS
+\*------------------------------------*/
+/**
+ * In this file, we take the literal colors from our palette and define them
+ * against variables that we can utilise anywhere throughout the project.
+ */
+/*------------------------------------*\
+ #BASE
+\*------------------------------------*/
+/*------------------------------------*\
+ #RESET
+\*------------------------------------*/
+/**
+ * Border-Box http:/paulirish.com/2012/box-sizing-border-box-ftw/
+ */
+* {
+ box-sizing: border-box; }
+
+/**
+ * 1) Zero out margins and padding for elements
+ */
+html, body, div, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ol, ul, li, form, legend, label, table, header, footer, nav, section, figure {
+ margin: 0;
+ padding: 0; }
+
+/**
+ * 1) Set HTML5 elements to display: block
+ */
+header, footer, nav, section, article, figure {
+ display: block; }
+
+/*------------------------------------*\
+ #BODY
+\*------------------------------------*/
+/**
+ * HTML base styles
+ * 1) Set the html element's height to at least 100% of the viewport.
+ * This is used to achieve a sticky footer
+ */
+html {
+ min-height: 100vh;
+ /* 1 */ }
+
+/**
+ * Body base styles
+ * 1) Set the body element's height to at least 100% of the viewport.
+ * This is used to achieve a sticky footer
+ */
+body {
+ min-height: 100vh;
+ /* 1 */
+ font-family: "Raleway", "HelveticaNeue", "Helvetica", "Arial", sans-serif;
+ font-size: 1rem;
+ line-height: 1.6;
+ -webkit-text-size-adjust: 100%;
+ /* 1 */
+ background-color: #fff;
+ color: #131313; }
+
+/*------------------------------------*\
+ #LINKS
+\*------------------------------------*/
+/**
+ * Link base styles
+ */
+a {
+ color: #444;
+ text-decoration: none;
+ outline: 0;
+ transition: color 0.15s ease-out; }
+ a:hover, a:focus {
+ color: #ba6333; }
+ a:active {
+ color: #131313; }
+
+/*------------------------------------*\
+ #LISTS
+\*------------------------------------*/
+/**
+ * 1) List base styles
+ */
+/**
+ * Remove list styles from unordered and ordered lists
+ */
+ol, ul {
+ list-style: none; }
+
+/*------------------------------------*\
+ #HEADINGS
+\*------------------------------------*/
+h1, h2, h3, h4 {
+ font-family: "Abel", serif;
+ text-transform: uppercase; }
+
+/**
+ * Heading 1 base styles
+ */
+h1 {
+ font-size: 3rem;
+ font-weight: normal;
+ line-height: 1.2; }
+ @media all and (min-width: 47em) {
+ h1 {
+ font-size: 4rem; } }
+
+/**
+ * Heading 2 base styles
+ */
+h2 {
+ font-size: 1.2rem;
+ font-weight: normal;
+ line-height: 1.2; }
+
+/**
+ * Heading 3 base styles
+ */
+h3 {
+ font-size: 1.2rem;
+ font-weight: normal;
+ line-height: 1.2; }
+
+/**
+ * Heading 4 base styles
+ */
+h4 {
+ font-size: 1rem;
+ font-weight: normal;
+ line-height: 1.2; }
+
+/*------------------------------------*\
+ #FORMS
+\*------------------------------------*/
+/**
+ * 1) Form element base styles
+ */
+/**
+ * Input placeholder text base styles
+ */
+::-webkit-input-placeholder {
+ color: #808080; }
+
+::-moz-placeholder {
+ color: #808080; }
+
+:-ms-input-placeholder {
+ color: #808080; }
+
+/**
+ * Fieldset base styles
+ */
+fieldset {
+ border: 0;
+ padding: 0;
+ margin: 0; }
+
+/**
+ * Legend base styles
+ */
+legend {
+ margin-bottom: 0.25rem; }
+
+/**
+ * Label base styles
+ */
+label {
+ display: block;
+ padding-bottom: 0.25rem;
+ color: #131313; }
+
+/**
+ * Add font size 100% of form element and margin 0 to these elements
+ */
+button, input, select, textarea {
+ font-family: inherit;
+ font-size: 1rem;
+ margin: 0; }
+
+/**
+ * Text area base styles
+ */
+textarea {
+ resize: none; }
+
+/**
+ * Input and text area base styles
+ */
+input, textarea {
+ width: 100%;
+ padding: 0.5rem;
+ border: 1px solid #444;
+ background: #fff; }
+ input:focus, textarea:focus {
+ border-color: #131313; }
+ input:disabled, textarea:disabled {
+ border-color: #eee;
+ background: #eee;
+ color: #808080; }
+
+/**
+ * Remove webkit appearance styles from these elements
+ */
+input[type=text], input[type=search], input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration, input[type=url], input[type=number], textarea {
+ -webkit-appearance: none; }
+
+/**
+ * Checkbox and radio button base styles
+ */
+input[type="checkbox"],
+input[type="radio"] {
+ width: auto;
+ margin-right: 0.3rem;
+ border-color: #444; }
+
+/**
+ * Search input base styles
+ */
+input[type="search"] {
+ -webkit-appearance: none;
+ border-radius: 0; }
+
+/**
+ * Select
+ * 1) Remove default styling
+ */
+select {
+ display: block;
+ font-size: 1rem;
+ width: 100%;
+ border: 1px solid #444;
+ border-radius: 0;
+ padding: 0.5rem;
+ height: 2rem;
+ background: #fff;
+ color: #131313; }
+ select:focus {
+ border-color: #131313; }
+
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+/**
+ * Button and submit inputs reset
+ * 1) These should be styled using c-btn
+ */
+button {
+ cursor: pointer; }
+
+/*------------------------------------*\
+ #MAIN ELEMENT
+\*------------------------------------*/
+/**
+ * Main element
+ */
+[role=main] {
+ display: block;
+ flex: 1 0 auto; }
+
+/*------------------------------------*\
+ #MEDIA
+\*------------------------------------*/
+/**
+ * Responsive image styling
+ * 1) Allows for images to flex with varying screen size
+ */
+img {
+ max-width: 100%;
+ height: auto; }
+
+/*------------------------------------*\
+ #TEXT
+\*------------------------------------*/
+/**
+ * Paragraph base styles
+ */
+p {
+ margin-bottom: 1rem; }
+
+/**
+ * Blockquote base styles
+ */
+blockquote {
+ font-style: italic;
+ border-left: 1px solid #808080;
+ color: #808080;
+ padding-left: 1rem;
+ margin-bottom: 1rem; }
+
+/**
+ * Horizontal rule base styles
+ */
+hr {
+ border: 0;
+ height: 1px;
+ background: #ddd;
+ margin: 1rem 0; }
+
+/**
+ * Selection styles
+ */
+::-moz-selection {
+ color: #131313;
+ background: #ddd;
+ /* Gecko Browsers */ }
+
+::selection {
+ color: #131313;
+ background: #ddd;
+ /* WebKit/Blink Browsers */ }
+
+/**
+ * Code base styles
+ */
+code {
+ display: inline-block;
+ background: #f9f9f9;
+ border: 1px solid #ddd;
+ padding: .2rem .5rem;
+ line-height: 1.2;
+ font-size: .85rem; }
+
+/**
+ * Preformatted text base styles
+ */
+pre {
+ background: #f9f9f9;
+ border: 1px solid #ddd;
+ font-size: 1rem;
+ padding: 1rem;
+ overflow-x: auto;
+ /**
+ * Remove border from code within preformatted text block
+ */ }
+ pre code {
+ border: 0; }
+
+/**
+ * Code with languages associated with them
+ * 1) Override Prism sysles for code blocks with language
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ font-family: monospace !important; }
+
+/*------------------------------------*\
+ #TABLES
+\*------------------------------------*/
+/**
+ * Table
+ */
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%; }
+
+/**
+ * Table header cell
+ */
+th {
+ text-align: left; }
+
+/**
+ * Table row
+ */
+tr {
+ vertical-align: top; }
+
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+/**
+ * Layout Container
+ * 1) Caps the width of the content to the maximum width
+ * and centers the container
+ */
+.l-container {
+ max-width: 80rem;
+ padding: 0 1rem;
+ margin: 0 auto; }
+ @media all and (min-width: 60em) {
+ .l-container {
+ padding: 0 2rem; } }
+
+.l-container--narrow {
+ max-width: 45rem; }
+
+/**
+ *
+ * 1) This caps the width of text passages
+ * to achieve a comfortable line length
+ */
+.l-linelength-container {
+ max-width: 36rem; }
+
+.l-band {
+ background: #f9f9f9;
+ padding: 2rem 1rem; }
+
+/**
+ * 2 column layout
+ */
+.l-page-layout--two-column {
+ display: flex;
+ flex-direction: column; }
+ @media all and (min-width: 60em) {
+ .l-page-layout--two-column {
+ flex-direction: row; } }
+
+@media all and (min-width: 60em) {
+ .l-page-layout--two-column .l-page-layout__main {
+ width: 70%;
+ padding-right: 1rem; } }
+
+/**
+ * Sidebar
+ */
+@media all and (min-width: 60em) {
+ .l-page-layout--two-column .l-page-layout__secondary {
+ width: 30%;
+ margin-left: 2rem; } }
+
+.l-page-layout--reversed .l-page-layout__secondary {
+ margin-bottom: 2rem; }
+ @media all and (min-width: 60em) {
+ .l-page-layout--reversed .l-page-layout__secondary {
+ order: 1;
+ margin-bottom: 0; } }
+
+/*------------------------------------*\
+ #GRID
+\*------------------------------------*/
+/**
+ * Grid Container
+ */
+.l-grid {
+ display: flex;
+ flex-wrap: wrap; }
+ @supports (display: grid) {
+ .l-grid {
+ display: grid;
+ grid-gap: 2rem;
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
+ margin: 0; } }
+
+/**
+ * Grid Item
+ */
+.l-grid__item {
+ display: flex; }
+
+/*------------------------------------*\
+ #COMPONENTS
+\*------------------------------------*/
+/*------------------------------------*\
+ #BUTTONS
+\*------------------------------------*/
+/**
+ *
+ * 1) Button or link that has functionality to it
+ */
+.c-btn {
+ display: inline-block;
+ border: 1px solid #131313;
+ background: #114689;
+ color: #fff;
+ line-height: 1;
+ padding: 1rem 2rem;
+ border: 0;
+ text-transform: uppercase;
+ text-align: center;
+ transition: all 0.15s ease-out; }
+ .c-btn:hover, .c-btn:focus {
+ color: #fff;
+ background: #041544; }
+
+.c-btn--bare {
+ background: none;
+ color: #114689;
+ border: 1px solid transparent; }
+ .c-btn--bare:hover, .c-btn--bare:focus {
+ background: none;
+ color: #114689;
+ border-color: #114689; }
+
+/*
+ * Inner container wrapper
+ * 1) Container is direct decendant of , since there's
+ * a bug with applying flexbox directly to a
+ * 2) Only needs to be used for buttons containing both icons and text
+ */
+.c-btn__inner {
+ display: flex;
+ align-items: center;
+ justify-content: center; }
+
+/*
+ * Button icon
+ */
+.c-btn__icon {
+ width: 1rem;
+ height: 1rem;
+ fill: #fff;
+ transition: fill 0.15s ease-out; }
+
+/*------------------------------------*\
+ #DEFINITION LIST
+\*------------------------------------*/
+/**
+* 1) Definition list (`dl`) that contains a definition term (`dt`) and a definition description (`dd`)
+*/
+.c-definition-list {
+ margin: 0 0 1rem; }
+
+/**
+* Definition list item
+*/
+.c-definition-list__item {
+ display: flex; }
+ @media all and (min-width: 60em) {
+ .c-definition-list__item {
+ justify-content: space-between; } }
+
+/**
+* Definition list term
+*/
+.c-definition-list__term {
+ font-weight: bold;
+ margin-bottom: 0.25rem;
+ width: 5rem; }
+ @media all and (min-width: 60em) {
+ .c-definition-list__term {
+ width: auto; } }
+
+/**
+* Definition list description
+*/
+/*------------------------------------*\
+ #DEFINITION LIST LIST
+\*------------------------------------*/
+/**
+* 1) List of definition lists
+*/
+/**
+ * Definition list list item
+ */
+.c-definition-list-list--lined .c-definition-list-list__item {
+ margin-bottom: 1rem;
+ border-bottom: 1px solid #ddd; }
+
+/*------------------------------------*\
+ #HERO BLOCK
+\*------------------------------------*/
+/**
+ * 1) Sit hero flush with header. Normally we wouldn't
+ * do this and handle margin using utility classes,
+ * but we're taking a shortcut for a demo.
+ */
+.c-hero {
+ display: block;
+ position: relative;
+ margin: -2rem 0 2rem;
+ /* 1 */ }
+
+/**
+ * Hero Image
+ * 1) This is the primary hero image that runs full-bleed across the layout
+ */
+.c-hero__img {
+ display: block;
+ width: 100%;
+ object-fit: cover;
+ max-height: 70vh;
+ overflow: hidden; }
+
+.c-hero__body {
+ background: #ba6333;
+ padding: 1rem; }
+ @media all and (min-width: 35em) {
+ .c-hero__body {
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 20%, #000 100%); } }
+
+/**
+ * Hero Headline
+ * 1) This sits overtop of the hero image when space permits
+ */
+.c-hero__headline {
+ text-transform: uppercase;
+ font-size: 3rem;
+ background-color: #ba6333;
+ color: #fff;
+ transition: all 0.15s ease-out; }
+ @media all and (min-width: 35em) {
+ .c-hero__headline {
+ padding: 0 0.4rem;
+ font-size: 4rem; } }
+
+/*------------------------------------*\
+ #TOUT BLOCK
+\*------------------------------------*/
+/**
+ * 1) The tout block contains an image and headline overlayed over the image.
+ */
+.c-tout {
+ display: block;
+ position: relative;
+ overflow: hidden;
+ max-width: 1024px; }
+
+/**
+ * Tout image
+ */
+.c-tout__img {
+ display: block; }
+
+/**
+ * Tout headline
+ */
+.c-tout__headline {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ color: #fff;
+ padding: 0.5rem;
+ font-size: 1.4rem;
+ transition: all 0.15s ease-out; }
+ .c-tout:hover .c-tout__headline, .c-tout:focus .c-tout__headline {
+ padding-bottom: 2rem;
+ background: #114689; }
+
+/*------------------------------------*\
+ #SECTION HEADER
+\*------------------------------------*/
+/**
+ * 1) A group of text with a title that headlines a section
+ */
+.c-section__header {
+ display: flex;
+ align-items: center;
+ position: relative;
+ margin-bottom: 1rem; }
+ .c-section__header:after {
+ content: '';
+ display: block;
+ flex: 1;
+ height: 2px;
+ margin-left: 1rem;
+ background: #ba6333; }
+
+.c-section__title {
+ font-size: 2rem; }
+
+/*------------------------------------*\
+ #STACKED BLOCK
+\*------------------------------------*/
+/**
+ * 1) A link block consisting of media, headline, and description all stacked on top
+ * of each other
+ * 2) Capped for demo purposes
+ */
+.c-stacked-block {
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ max-width: 600px;
+ /* 2 */
+ transition: transform 0.15s ease-out; }
+ .c-stacked-block:hover, .c-stacked-block:focus {
+ transform: scale(1.03); }
+
+.c-stacked-block__body {
+ flex: 1; }
+
+.c-stacked-block__title {
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ color: #114689;
+ transition: color 0.15s ease-out; }
+ .c-stacked-block:hover .c-stacked-block__title, .c-stacked-block:focus .c-stacked-block__title {
+ color: #ba6333; }
+
+.c-stacked-block__excerpt {
+ margin-bottom: 0;
+ color: #444; }
+
+.c-stacked-block__meta {
+ color: #114689;
+ font-size: 1.2rem;
+ font-family: "Abel", serif;
+ margin-bottom: 0;
+ transition: color 0.15s ease-out; }
+ .c-stacked-block:hover .c-stacked-block__meta, .c-stacked-block:focus .c-stacked-block__meta {
+ color: #ba6333; }
+
+.c-stacked-block__badge {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 0.5rem;
+ font-family: "Abel", serif;
+ text-transform: uppercase;
+ color: #fff;
+ background: #ba6333; }
+
+.c-stacked-block__optional {
+ margin-left: 0.5rem;
+ color: #808080;
+ font-family: "Abel", serif;
+ font-size: 0.85rem;
+ text-decoration: line-through; }
+
+/*------------------------------------*\
+ #STRIPE
+\*------------------------------------*/
+/**
+ * 1) Block that contains a right and left column of text and other possible components
+ */
+.c-stripe {
+ padding: 2rem 0; }
+ @media all and (min-width: 35em) {
+ .c-stripe {
+ display: flex; } }
+ .c-stripe-list--condensed .c-stripe {
+ padding: 1rem 0; }
+
+/**
+ * Stripe lef container
+ * 1) Contains elements that display on the left side of the stripe
+ */
+.c-stripe__left-container {
+ margin-right: 2rem; }
+ @media all and (min-width: 35em) {
+ .c-stripe__left-container {
+ width: 20%; } }
+ .c-stripe-list--condensed .c-stripe__left-container {
+ display: none; }
+
+.c-stripe__link {
+ display: block; }
+ @media all and (min-width: 35em) {
+ .c-stripe__link {
+ max-width: 10rem; } }
+
+/**
+ * Stripe right container
+ * 1) Contains elements that display on the right side of the stripe
+ */
+.c-stripe__right-container {
+ flex: 1; }
+ @media all and (min-width: 35em) {
+ .c-stripe__right-container {
+ display: flex;
+ align-items: center; } }
+
+.c-stripe__title {
+ margin-bottom: 2rem; }
+ @media all and (min-width: 35em) {
+ .c-stripe__title {
+ margin-bottom: 0;
+ margin-right: 2rem;
+ width: 40%; } }
+
+@media all and (min-width: 35em) {
+ .c-stripe__meta {
+ margin-left: 2rem;
+ margin-bottom: 2.25rem;
+ width: 20%;
+ text-align: right;
+ flex: 1; } }
+
+.c-stripe__meta-label {
+ font-weight: bold;
+ margin-bottom: 0.75rem; }
+
+.c-stripe__meta-span {
+ font-family: "Abel", serif;
+ color: #114689;
+ font-size: 1.2rem; }
+
+/*------------------------------------*\
+ #STRIPE LIST
+\*------------------------------------*/
+/**
+ * 1) Block that contains a right and left column of text and other possible components
+ */
+.c-stripe-list__item {
+ border-bottom: 1px solid #ddd; }
+
+/*------------------------------------*\
+ $FOOTER
+\*------------------------------------*/
+/**
+ * 1) Global block at the bottom of each page that contains a navigation and other information
+ */
+.c-footer {
+ padding: 2rem 0;
+ margin-top: 2rem;
+ background: #041544; }
+
+@media all and (min-width: 47em) {
+ .c-footer__inner {
+ display: flex; } }
+
+@media all and (min-width: 47em) {
+ .c-footer__bottom {
+ margin-left: auto; } }
+
+.c-footer__credit, .c-footer__copyright {
+ color: #fff;
+ text-transform: uppercase;
+ font-family: "Abel", serif;
+ font-size: 0.85rem; }
+ .c-footer__credit a, .c-footer__copyright a {
+ color: #ba6333; }
+ .c-footer__credit a:hover, .c-footer__credit a:focus, .c-footer__copyright a:hover, .c-footer__copyright a:focus {
+ color: #808080; }
+
+/*------------------------------------*\
+ #FOOTER NAV
+\*------------------------------------*/
+/**
+ * 1) Global block at the bottom of each page that contains a navigation and other information
+ */
+.c-footer-nav {
+ margin-bottom: 2rem; }
+ @media all and (min-width: 47em) {
+ .c-footer-nav {
+ display: flex;
+ margin-bottom: 0; } }
+
+@media all and (min-width: 47em) {
+ .c-footer-nav__item {
+ margin-right: 2rem; }
+ .c-footer-nav__item:last-child {
+ margin-right: 0; } }
+
+.c-footer-nav__link {
+ color: #fff;
+ font-family: "Abel", serif;
+ text-transform: uppercase;
+ font-size: 1.2rem; }
+
+/*------------------------------------*\
+ #HEADER
+\*------------------------------------*/
+/**
+ * Global block at the top of each page containing the navigation, logo, and other potential contents
+ */
+.c-header {
+ position: relative;
+ margin-bottom: 2rem;
+ border-bottom: 1px solid #ddd; }
+
+/**
+ * Header inner
+ */
+.c-header__inner {
+ padding-top: 1rem;
+ padding-bottom: 1rem; }
+ @media all and (min-width: 35em) {
+ .c-header__inner {
+ display: flex;
+ align-items: center; } }
+
+/**
+ * Header navigation button
+ * 1) Button used to toggle the navigation on/off on small screens
+ */
+.c-header__nav-btn {
+ margin-left: auto; }
+ @media all and (min-width: 70em) {
+ .c-header__nav-btn {
+ display: none; } }
+
+/**
+ * Header navigation conntainer
+ * 1) Contains the primary navigation and other possible patterns
+ */
+.c-header__nav-container {
+ display: none;
+ /**
+ * Header navigation conntainer within vertical header
+ */ }
+ @media all and (min-width: 70em) {
+ .c-header__nav-container {
+ display: block;
+ margin-left: auto; } }
+ @media all and (min-width: 70em) {
+ .c-header--vertical .c-header__nav-container {
+ margin-left: 0; } }
+
+/**
+ * Active header nav container
+ */
+.c-header__nav-container.is-active {
+ display: block;
+ position: absolute;
+ background: #eee;
+ top: 100%;
+ left: 0;
+ width: 100%;
+ z-index: 5;
+ padding: 1rem;
+ /**
+ * Active header nav container within vertical header
+ */ }
+ @media all and (min-width: 70em) {
+ .c-header__nav-container.is-active {
+ display: block;
+ position: static;
+ padding: 0;
+ margin-left: auto;
+ width: inherit; } }
+ @media all and (min-width: 70em) {
+ .c-header--vertical .c-header__nav-container.is-active {
+ margin-left: 0;
+ width: 100%; } }
+
+/*------------------------------------*\
+ #LOGO
+\*------------------------------------*/
+/**
+ * Branding image or text of the site
+ */
+.c-logo {
+ font-size: 2rem; }
+ .c-footer .c-logo {
+ margin-bottom: 2rem; }
+ @media all and (min-width: 47em) {
+ .c-footer .c-logo {
+ margin-bottom: 0; } }
+
+/**
+ * Logo link
+ */
+.c-logo__link {
+ display: block; }
+
+/**
+ * Logo image
+ */
+.c-logo__img {
+ display: block; }
+
+.c-logo__left {
+ color: #114689; }
+ .c-logo--light .c-logo__left {
+ color: #fff; }
+
+.c-logo__right {
+ color: #ba6333; }
+
+/*------------------------------------*\
+ #ICON
+\*------------------------------------*/
+/**
+ * 1) Small image that represents functionality
+ */
+.c-icon {
+ height: 16px;
+ width: 16px; }
+
+/*------------------------------------*\
+ #INPUT
+\*------------------------------------*/
+/**
+ * 1) Actual input of a field
+ */
+.c-stripe .c-input {
+ max-width: 3rem; }
+
+/*------------------------------------*\
+ #PAGE HEADER
+\*------------------------------------*/
+/**
+ * 1) Container that consists of of a page header title and description
+ */
+/**
+ * Page header title
+ */
+.c-page-header {
+ margin-top: 4rem;
+ margin-bottom: 2rem; }
+
+/**
+ * Page description
+ */
+.c-page-header__desc {
+ margin-top: 1rem; }
+
+/*------------------------------------*\
+ #PAGINATION
+\*------------------------------------*/
+/**
+ * Pagination
+ */
+.c-pagination {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ overflow: hidden;
+ margin-bottom: 1rem;
+ font-family: "Abel", serif;
+ text-transform: uppercase; }
+
+.c-pagination__item {
+ border-right: 1px solid #ddd; }
+ .c-pagination__item:last-child {
+ border: 0; }
+
+.c-pagination__link {
+ padding: 1rem;
+ text-decoration: underline; }
+ .c-pagination__item:first-child .c-pagination__link {
+ padding-left: 0; }
+ .c-pagination__item.is-active .c-pagination__link {
+ font-weight: bold;
+ text-decoration: none;
+ pointer-events: none; }
+ .c-pagination__item.is-disabled .c-pagination__link {
+ color: #ddd;
+ pointer-events: none;
+ text-decoration: none; }
+
+/*------------------------------------*\
+ #PRIMARY NAVIGATION
+\*------------------------------------*/
+/**
+ * Primary navigation existing in the header and maybe the footer
+ */
+@media all and (min-width: 32em) {
+ .c-primary-nav {
+ margin-left: auto; } }
+
+/**
+ * Primary navigation list
+ */
+.c-primary-nav__list {
+ display: flex;
+ align-items: center; }
+
+/**
+ * Primary navigation item
+ */
+.c-primary-nav__item {
+ margin-right: 2rem; }
+ .c-primary-nav__item:last-child {
+ margin-right: 0; }
+
+/**
+ * Primary navigation link
+ */
+.c-primary-nav__link {
+ display: block;
+ cursor: pointer;
+ font-family: "Abel", serif;
+ font-size: 1.2rem;
+ line-height: 1;
+ text-transform: uppercase;
+ transition: background 0.15s ease-out; }
+ .c-primary-nav__link:hover, .c-primary-nav__link:focus {
+ color: #ba6333; }
+
+.c-primary-nav__icon.c-icon {
+ fill: #041544;
+ height: 24px;
+ width: 24px; }
+
+/*------------------------------------*\
+ #PROMO BLOCK
+\*------------------------------------*/
+/**
+ * Large block containing an image and copy
+ * 1) Move promo block up to sit flush with hero
+ * Normally we wouldn't do this, but we're taking
+ * a shortcut for demo purposes.
+ */
+.c-promo-block {
+ color: #fff;
+ position: relative;
+ margin-top: -2rem;
+ /* 1 */ }
+
+.c-promo-block__media {
+ position: relative;
+ z-index: 0; }
+ .c-promo-block__media:before {
+ content: "";
+ background: linear-gradient(to left, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 40%, #000 100%);
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0; }
+ .c-promo-block--right .c-promo-block__media:before {
+ background: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 20%, #000 100%); }
+
+.c-promo-block__body {
+ position: absolute;
+ top: 40%;
+ left: 4rem;
+ z-index: 1;
+ max-width: 400px;
+ transition: opacity 0.5s ease-out, transform 0.5s ease-out; }
+ .c-promo-block--right .c-promo-block__body {
+ left: auto;
+ right: 4rem; }
+ .c-promo-block__body.c-promo-block__body--initial {
+ opacity: 0;
+ transform: translateY(70px); }
+
+.c-promo-block__img {
+ display: block;
+ width: 100%; }
+
+.c-promo-block__link {
+ color: #fff; }
+ .c-promo-block__link:hover, .c-promo-block__link:focus {
+ color: #ba6333; }
+
+.c-promo-block__heading {
+ display: inline;
+ color: inherit;
+ border-bottom: 2px solid #ba6333;
+ font-size: 2rem; }
+ @media all and (min-width: 60em) {
+ .c-promo-block__heading {
+ font-size: 3rem; } }
+
+.c-promo-block__description {
+ margin-top: 1rem; }
+ @media all and (min-width: 60em) {
+ .c-promo-block__description {
+ font-size: 1.2rem; } }
+
+/*------------------------------------*\
+ #PROGRESS TRACKER
+\*------------------------------------*/
+/**
+ * 1) Ordered list showing progress (i.e. step by step)
+ * 2) Display flex used to put items in row. Flex wrap wraps items underneat when space is
+ * unavailable.
+ */
+.c-progress-tracker {
+ display: flex;
+ /* 2 */
+ justify-content: center;
+ flex-wrap: wrap;
+ /* 2 */ }
+
+/* Progress tracker iterm */
+.c-progress-tracker__item {
+ margin-right: 2rem;
+ text-align: center;
+ font-size: 0.85rem;
+ width: 5rem;
+ /* Don't display the horizontal line on the last item number */ }
+ .c-progress-tracker__item:last-child .c-progress-tracker__number:before {
+ display: none; }
+
+.c-progress-tracker__number {
+ padding: .125rem;
+ margin-bottom: .5rem;
+ color: #114689;
+ border: 1px solid #114689;
+ background-color: #fff;
+ position: relative; }
+ @media all and (min-width: 28em) {
+ .c-progress-tracker__number {
+ padding: .5rem; } }
+ .is-complete .c-progress-tracker__number {
+ background-color: #ddd;
+ border-color: #ddd; }
+ .is-current .c-progress-tracker__number {
+ color: #fff;
+ background-color: #114689;
+ font-weight: bold; }
+ .is-disabled .c-progress-tracker__number {
+ color: #041544;
+ border-color: #114689; }
+ .c-progress-tracker__number:before {
+ content: " ";
+ display: block;
+ width: 4rem;
+ height: 1px;
+ background-color: #ddd;
+ position: absolute;
+ top: 50%;
+ right: -4rem;
+ z-index: -1; }
+
+.c-progress-tracker__label {
+ display: none;
+ /* Do show it on larger screens */ }
+ @media all and (min-width: 35em) {
+ .c-progress-tracker__label {
+ display: inline; } }
+ .is-current .c-progress-tracker__label {
+ font-weight: bold; }
+
+/*------------------------------------*\
+ #TEXT PASSAGE
+\*------------------------------------*/
+/**
+ * 1) A passage of text, including various components (i.e. article, blog post)
+ */
+.c-text-passage {
+ /**
+ * Link within the text passage
+ */
+ /**
+ * Blockquote within text passage
+ */
+ /**
+ * First-level heading within text passage
+ */
+ /**
+ * Second-level heading within text passage
+ */
+ /**
+ * Third-level heading within text passage
+ */
+ /**
+ * Fourth-level heading within text passage
+ */
+ /**
+ * Fifth-level heading within text passage
+ */
+ /**
+ * Sixth-level heading within text passage
+ */
+ /**
+ * Unordered list within text passage
+ */
+ /**
+ * Ordered list within text passage
+ */ }
+ .c-text-passage p {
+ margin-bottom: 1rem; }
+ .c-text-passage a {
+ text-decoration: underline; }
+ .c-text-passage blockquote {
+ padding-left: 0.8rem;
+ border-left: 3px solid #444;
+ color: #808080;
+ font-size: 1rem; }
+ .c-text-passage h1 {
+ margin-bottom: 1rem; }
+ .c-text-passage h2 {
+ margin: 1rem 0 1rem;
+ color: #444;
+ font-weight: bold; }
+ .c-text-passage h3 {
+ margin: 1rem 0 1rem; }
+ .c-text-passage h4 {
+ margin: 1rem 0 1rem; }
+ .c-text-passage h5 {
+ margin: 1rem 0 1rem; }
+ .c-text-passage h6 {
+ margin: 1rem 0 1rem; }
+ .c-text-passage ul {
+ list-style: disc;
+ margin-left: 1rem;
+ margin-bottom: 1rem; }
+ .c-text-passage ul li:last-child {
+ margin-bottom: 0; }
+ .c-text-passage ol {
+ list-style: decimal;
+ margin-left: 1rem;
+ margin-bottom: 1rem; }
+ .c-text-passage ol li:last-child {
+ margin-bottom: 0; }
+ .c-text-passage li {
+ margin-bottom: 0.5rem;
+ line-height: 1.6; }
+
+/*------------------------------------*\
+ #FIELDS
+\*------------------------------------*/
+/**
+ * 1) Consists of a label, form control, and an optional note about the field.
+ */
+.c-field {
+ margin-bottom: 2rem; }
+
+/**
+ * Field label
+ */
+.c-field__label {
+ margin-bottom: 0.5rem;
+ font-size: 1rem;
+ font-weight: bold; }
+
+/**
+ * Field body
+ */
+.c-field__body {
+ position: relative; }
+
+/**
+ * Field note
+ */
+.c-field__note {
+ display: inline-block;
+ font-size: 0.75rem;
+ color: #808080; }
+
+/*------------------------------------*\
+ #SEARCH FORM
+\*------------------------------------*/
+/**
+ * 1) Search form that contains a text input and button
+ */
+/**
+ * Page header title
+ */
+.c-search-form__body {
+ display: flex; }
+
+.c-stacked-block-list {
+ max-width: 80rem;
+ margin-bottom: 2rem; }
+
+/*------------------------------------*\
+ #TOTAL CONTAINER
+\*------------------------------------*/
+/**
+ * 1)
+ */
+.c-total-container {
+ margin-top: 1rem; }
+ @media all and (min-width: 35em) {
+ .c-total-container {
+ text-align: right; } }
+
+.c-total {
+ display: flex;
+ align-items: center; }
+ @media all and (min-width: 35em) {
+ .c-total {
+ justify-content: flex-end; } }
+
+.c-total--no-break {
+ justify-content: flex-start; }
+ @media all and (min-width: 60em) {
+ .c-total--no-break {
+ justify-content: flex-end; } }
+
+.c-total__label {
+ font-weight: bold;
+ margin-right: 0.5rem;
+ padding-bottom: 0; }
+ .c-total--no-break .c-total__label {
+ width: 5rem; }
+ @media all and (min-width: 60em) {
+ .c-total--no-break .c-total__label {
+ width: auto; } }
+
+.c-total__span {
+ font-family: "Abel", serif;
+ font-size: 1.2rem;
+ color: #114689; }
+ .c-total--no-break .c-total__span {
+ margin-left: 2rem; }
+ @media all and (min-width: 60em) {
+ .c-total--no-break .c-total__span {
+ margin-left: 0; } }
+
+/*------------------------------------*\
+ #UTILITIES
+\*------------------------------------*/
+/*------------------------------------*\
+ #VISIBILITY CLASSES
+\*------------------------------------*/
+/**
+ * Is Hidden
+ * 1) Completely remove from the flow and screen readers.
+ */
+.u-is-hidden {
+ display: none !important;
+ visibility: hidden !important; }
+
+/**
+ * Is Visibly Hidden
+ * 1) Completely remove from the flow but leave available to screen readers.
+ */
+.u-is-vishidden {
+ position: absolute !important;
+ overflow: hidden;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px); }
+
+/*------------------------------------*\
+ #SPACING
+\*------------------------------------*/
+/**
+ * Margin bottom none
+ * 1) Force margin bottom of 0
+ */
+.u-margin-bottom-none {
+ margin-bottom: 0 !important; }
+
+/**
+ * Margin bottom small
+ * 1) Force margin bottom of $spacing-small variable
+ */
+.u-margin-bottom-small {
+ margin-bottom: 1rem !important; }
+
+/**
+ * Margin bottom
+ * 1) Force margin bottom of $spacing variable
+ */
+.u-margin-bottom {
+ margin-bottom: 1rem !important; }
+
+/**
+ * Margin bottom large
+ * 1) Force margin bottom of $spacing-large variable
+ */
+.u-margin-bottom-large {
+ margin-bottom: 2rem !important; }
+
+.u-margin-bottom-large-to-xxl {
+ margin-bottom: 2rem !important; }
+ @media all and (min-width: 60em) {
+ .u-margin-bottom-large-to-xxl {
+ margin-bottom: 8rem !important; } }
+
+/**
+ * Margin top none
+ * 1) Force margin top of 0
+ */
+.u-margin-top-none {
+ margin-top: 0 !important; }
+
+/**
+ * Margin top small
+ * 1) Force margin top of $spacing-small variable
+ */
+.u-margin-top-small {
+ margin-top: 1rem !important; }
+
+/**
+ * Margin top
+ * 1) Force margin top of $spacing variable
+ */
+.u-margin-top {
+ margin-top: 1rem !important; }
+
+/**
+ * Margin top large
+ * 1) Force margin top of $spacing-large variable
+ */
+.u-margin-top-large {
+ margin-top: 2rem !important; }
+
+.u-margin-top-booking {
+ margin-top: 28rem !important; }
+
+/**
+ * Margin right none
+ * 1) Force margin right of 0
+ */
+.u-margin-right-none {
+ margin-right: 0 !important; }
+
+/**
+ * Margin right small
+ * 1) Force margin right of $spacing-small variable
+ */
+.u-margin-right-small {
+ margin-right: 1rem !important; }
+
+/**
+ * Margin right
+ * 1) Force margin right of $spacing variable
+ */
+.u-margin-right {
+ margin-right: 1rem !important; }
+
+/**
+ * Margin right large
+ * 1) Force margin right of $spacing-large variable
+ */
+.u-margin-right-large {
+ margin-right: 2rem !important; }
+
+/**
+ * Margin left none
+ * 1) Force margin left of 0
+ */
+.u-margin-left-none {
+ margin-left: 0 !important; }
+
+/**
+ * Margin left small
+ * 1) Force margin left of $spacing-small variable
+ */
+.u-margin-left-small {
+ margin-left: 1rem !important; }
+
+/**
+ * Margin left
+ * 1) Force margin left of $spacing variable
+ */
+.u-margin-left {
+ margin-left: 1rem !important; }
+
+/**
+ * Margin left large
+ * 1) Force margin left of $spacing-large variable
+ */
+.u-margin-left-large {
+ margin-left: 2rem !important; }
+
+/**
+ * Center display block contents
+ */
+.u-margin-center {
+ margin: 0 auto !important; }
+
+/**
+ * Padding none
+ */
+.u-padding-none {
+ padding: 0 !important; }
+
+/**
+ * Padding small
+ */
+.u-padding-small {
+ padding: 1rem !important; }
+
+/**
+ * Padding
+ */
+.u-padding {
+ padding: 1rem !important; }
+
+/**
+ * Padding large
+ */
+.u-padding-large {
+ padding: 2rem !important; }
+
+/**
+ * Padding top none
+ */
+.u-padding-top-none {
+ padding-top: 0 !important; }
+
+/**
+ * Padding top small
+ */
+.u-padding-top-small {
+ padding-top: 1rem !important; }
+
+/**
+ * Padding top
+ */
+.u-padding-top {
+ padding-top: 1rem !important; }
+
+/**
+ * Padding top large
+ */
+.u-padding-top-large {
+ padding-top: 2rem !important; }
+
+/**
+ * Padding bottom none
+ */
+.u-padding-bottom-none {
+ padding-bottom: 0 !important; }
+
+/**
+ * Padding bottom small
+ */
+.u-padding-bottom-small {
+ padding-bottom: 1rem !important; }
+
+/**
+ * Padding bottom
+ */
+.u-padding-bottom {
+ padding-bottom: 1rem !important; }
+
+/**
+ * Padding bottom large
+ */
+.u-padding-bottom-large {
+ padding-bottom: 2rem !important; }
+
+/**
+ * Padding right none
+ */
+.u-padding-right-none {
+ padding-right: 0 !important; }
+
+/**
+ * Padding right small
+ */
+.u-padding-right-small {
+ padding-right: 1rem !important; }
+
+/**
+ * Padding right
+ */
+.u-padding-right {
+ padding-right: 1rem !important; }
+
+/**
+ * Padding right large
+ */
+.u-padding-right-large {
+ padding-right: 2rem !important; }
+
+/**
+ * Padding left none
+ */
+.u-padding-left-none {
+ padding-left: 0 !important; }
+
+/**
+ * Padding left small
+ */
+.u-padding-left-small {
+ padding-left: 1rem !important; }
+
+/**
+ * Padding left
+ */
+.u-padding-left {
+ padding-left: 1rem !important; }
+
+/**
+ * Padding left large
+ */
+.u-padding-left-large {
+ padding-left: 2rem !important; }
diff --git a/packages/starterkit-handlebars-demo/dist/css/style.scss b/packages/starterkit-handlebars-demo/dist/css/style.scss
new file mode 100644
index 000000000..00abeb34a
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/style.scss
@@ -0,0 +1,88 @@
+ /*------------------------------------*\
+ #TABLE OF CONTENTS
+\*------------------------------------*/
+/**
+ * ABSTRACTS..............................Declarations of Sass variables & mixins
+ * BASE...................................Default element styles
+ * LAYOUT.................................Layout-specific styles
+ * COMPONENTS.............................Component styles
+ * UTILITIES..............................Utility classes
+ */
+
+/*------------------------------------*\
+ #ABSTRACTS
+\*------------------------------------*/
+@import "scss/abstracts/variables";
+@import "scss/abstracts/mixins";
+@import "scss/abstracts/colors";
+@import "scss/abstracts/typography";
+
+
+
+
+
+/*------------------------------------*\
+ #BASE
+\*------------------------------------*/
+@import "scss/base/reset";
+@import "scss/base/body";
+@import "scss/base/links";
+@import "scss/base/lists";
+@import "scss/base/headings";
+@import "scss/base/forms";
+@import "scss/base/buttons";
+@import "scss/base/main";
+@import "scss/base/media";
+@import "scss/base/text";
+@import "scss/base/table";
+
+
+
+
+
+/*------------------------------------*\
+ #LAYOUT
+\*------------------------------------*/
+@import "scss/layout/layout";
+
+
+
+
+
+/*------------------------------------*\
+ #COMPONENTS
+\*------------------------------------*/
+@import "scss/components/buttons";
+@import "scss/components/definition-list";
+@import "scss/components/definition-list-list";
+@import "scss/components/hero";
+@import "scss/components/tout";
+@import "scss/components/section";
+@import "scss/components/stacked-block";
+@import "scss/components/stripe";
+@import "scss/components/footer";
+@import "scss/components/footer-nav";
+@import "scss/components/header";
+@import "scss/components/logo";
+@import "scss/components/icon";
+@import "scss/components/input";
+@import "scss/components/page-header";
+@import "scss/components/pagination";
+@import "scss/components/primary-nav";
+@import "scss/components/promo-block";
+@import "scss/components/progress-tracker";
+@import "scss/components/text-passage";
+@import "scss/components/field";
+@import "scss/components/search-form";
+@import "scss/components/stacked-block-list";
+@import "scss/components/total";
+
+
+
+
+
+/*------------------------------------*\
+ #UTILITIES
+\*------------------------------------*/
+@import "scss/utilities/visibility";
+@import "scss/utilities/spacing";
diff --git a/packages/starterkit-handlebars-demo/dist/css/svg-sprite.css b/packages/starterkit-handlebars-demo/dist/css/svg-sprite.css
new file mode 100644
index 000000000..004940eeb
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/css/svg-sprite.css
@@ -0,0 +1,68 @@
+/*------------------------------------*\
+ #SVG SPRITE OVERRIDES
+\*------------------------------------*/
+
+#atoms-icons section {
+ border-top: none
+ padding: 0;
+}
+
+#atoms-icons header {
+ display: none;
+}
+
+#atoms-icons pre {
+ display: none;
+}
+
+#atoms-icons br {
+ display: none;
+}
+
+
+#atoms-icons .icon-boxes {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+#atoms-icons style + svg + header {
+ display: none;
+}
+
+#atoms-icons .icon-box {
+ width: initial;
+ height: auto;
+ background: none;
+ border: none;
+}
+
+#atoms-icons .icon-boxes li {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 6rem;
+ height: 6rem;
+ margin-right: 1rem;
+ margin-bottom: 1rem;
+ background: #fbfbfb;
+ border: 1px solid #cccccd;
+ border-radius: 8px;
+}
+
+#atoms-icons .icon-boxes li h2 {
+ color: #000;
+ font-size: 0.75rem;
+ white-space: inherit;
+ text-overflow: unset;
+ overflow: inherit;
+}
+
+#atoms-icons .icon-box .icon {
+ height: 16px;
+ width: 16px;
+}
+
+#atoms-icons .icon-boxes li button {
+ display: none;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/favicon.ico b/packages/starterkit-handlebars-demo/dist/favicon.ico
new file mode 100644
index 000000000..eee4aa78f
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/favicon.ico differ
diff --git a/packages/starterkit-handlebars-demo/dist/icons/minus.svg b/packages/starterkit-handlebars-demo/dist/icons/minus.svg
new file mode 100755
index 000000000..e60d7231f
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/minus.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/plus.svg b/packages/starterkit-handlebars-demo/dist/icons/plus.svg
new file mode 100755
index 000000000..011b27b4b
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/plus.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/search.svg b/packages/starterkit-handlebars-demo/dist/icons/search.svg
new file mode 100755
index 000000000..ab16b8b0c
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/search.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/shopping-cart.svg b/packages/starterkit-handlebars-demo/dist/icons/shopping-cart.svg
new file mode 100755
index 000000000..ad23dac73
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/shopping-cart.svg
@@ -0,0 +1,5 @@
+
+
+shopping-cart
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/triangle-down.svg b/packages/starterkit-handlebars-demo/dist/icons/triangle-down.svg
new file mode 100755
index 000000000..1b580134d
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/triangle-down.svg
@@ -0,0 +1,5 @@
+
+
+triangle-down
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/triangle-left.svg b/packages/starterkit-handlebars-demo/dist/icons/triangle-left.svg
new file mode 100755
index 000000000..7669d4695
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/triangle-left.svg
@@ -0,0 +1,5 @@
+
+
+triangle-left
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/triangle-right.svg b/packages/starterkit-handlebars-demo/dist/icons/triangle-right.svg
new file mode 100755
index 000000000..1fc4be0f5
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/triangle-right.svg
@@ -0,0 +1,5 @@
+
+
+triangle-right
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/icons/triangle-up.svg b/packages/starterkit-handlebars-demo/dist/icons/triangle-up.svg
new file mode 100755
index 000000000..fa41067d9
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/icons/triangle-up.svg
@@ -0,0 +1,5 @@
+
+
+triangle-up
+
+
diff --git a/packages/starterkit-handlebars-demo/dist/images/girls-high-tops.jpg b/packages/starterkit-handlebars-demo/dist/images/girls-high-tops.jpg
new file mode 100644
index 000000000..5185b0c09
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/girls-high-tops.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/girls-nike.jpg b/packages/starterkit-handlebars-demo/dist/images/girls-nike.jpg
new file mode 100644
index 000000000..1dba2c886
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/girls-nike.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/group-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/group-shoes.jpg
new file mode 100644
index 000000000..95e7e201d
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/group-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/holiday.jpg b/packages/starterkit-handlebars-demo/dist/images/holiday.jpg
new file mode 100644
index 000000000..16681f0e9
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/holiday.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/kids-green-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/kids-green-shoes.jpg
new file mode 100644
index 000000000..d5b302cf8
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/kids-green-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/kids-technicolor-nikes.jpg b/packages/starterkit-handlebars-demo/dist/images/kids-technicolor-nikes.jpg
new file mode 100644
index 000000000..b3382c430
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/kids-technicolor-nikes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/kids-velcro.jpg b/packages/starterkit-handlebars-demo/dist/images/kids-velcro.jpg
new file mode 100644
index 000000000..168018371
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/kids-velcro.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-blue-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/men-blue-shoes.jpg
new file mode 100644
index 000000000..f1d13f845
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-blue-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-brown-dress-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/men-brown-dress-shoes.jpg
new file mode 100644
index 000000000..f392f5610
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-brown-dress-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-brown-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/men-brown-shoes.jpg
new file mode 100644
index 000000000..2f4b748ef
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-brown-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-casual-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/men-casual-shoes.jpg
new file mode 100644
index 000000000..cc4e93c4c
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-casual-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-chucks.jpg b/packages/starterkit-handlebars-demo/dist/images/men-chucks.jpg
new file mode 100644
index 000000000..520405803
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-chucks.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-gray-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/men-gray-shoes.jpg
new file mode 100644
index 000000000..fc9191c6e
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-gray-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-loafers.jpg b/packages/starterkit-handlebars-demo/dist/images/men-loafers.jpg
new file mode 100644
index 000000000..f6c8eae80
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-loafers.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-walking-shoes.jpg b/packages/starterkit-handlebars-demo/dist/images/men-walking-shoes.jpg
new file mode 100644
index 000000000..a5c49ae26
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-walking-shoes.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/men-winter-boots.jpg b/packages/starterkit-handlebars-demo/dist/images/men-winter-boots.jpg
new file mode 100644
index 000000000..96926439d
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/men-winter-boots.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-adidas.jpg b/packages/starterkit-handlebars-demo/dist/images/women-adidas.jpg
new file mode 100644
index 000000000..8b6947f50
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-adidas.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-blue-heels.jpg b/packages/starterkit-handlebars-demo/dist/images/women-blue-heels.jpg
new file mode 100644
index 000000000..745bef578
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-blue-heels.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-boot-wedges.jpg b/packages/starterkit-handlebars-demo/dist/images/women-boot-wedges.jpg
new file mode 100644
index 000000000..216cd4ca1
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-boot-wedges.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-boots.jpg b/packages/starterkit-handlebars-demo/dist/images/women-boots.jpg
new file mode 100644
index 000000000..97a7b85bd
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-boots.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-colorful.jpg b/packages/starterkit-handlebars-demo/dist/images/women-colorful.jpg
new file mode 100644
index 000000000..190a2c5f7
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-colorful.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-combat-boots.jpg b/packages/starterkit-handlebars-demo/dist/images/women-combat-boots.jpg
new file mode 100644
index 000000000..19e4c6fe2
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-combat-boots.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-hiking-boots.jpg b/packages/starterkit-handlebars-demo/dist/images/women-hiking-boots.jpg
new file mode 100644
index 000000000..e68e54546
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-hiking-boots.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-leather-booties.jpg b/packages/starterkit-handlebars-demo/dist/images/women-leather-booties.jpg
new file mode 100644
index 000000000..4927779d3
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-leather-booties.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-shiny-sneakers.jpg b/packages/starterkit-handlebars-demo/dist/images/women-shiny-sneakers.jpg
new file mode 100644
index 000000000..af0e1a650
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-shiny-sneakers.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/images/women-white-heels.jpg b/packages/starterkit-handlebars-demo/dist/images/women-white-heels.jpg
new file mode 100644
index 000000000..19e771421
Binary files /dev/null and b/packages/starterkit-handlebars-demo/dist/images/women-white-heels.jpg differ
diff --git a/packages/starterkit-handlebars-demo/dist/js/primary-nav.js b/packages/starterkit-handlebars-demo/dist/js/primary-nav.js
new file mode 100644
index 000000000..0a476eb63
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/js/primary-nav.js
@@ -0,0 +1,55 @@
+/*------------------------------------*\
+ #PRIMARY NAVIGATION
+\*------------------------------------*/
+/**
+ * Toggles active class on the primary nav item
+ * 1) Select all nav dropdown triggers and cycle through them
+ * 2) On click, find the nav dropdown trigger parent
+ * 3) If the nav dropdown trigger parent already has active class, remove it.
+ * 4) If the nav dropdown trigger parent does not have an active class, add it.
+ */
+(function(){
+
+ var navLink = document.querySelectorAll('.js_nav-dropdown-trigger'); /* 1 */
+
+ for (i=0; i {
+ promoBlock.classList.add('c-promo-block__body--initial');
+
+ observer.observe(promoBlock);
+
+ });
+ }
+
+ function handleIntersect(entries, observer) {
+ entries.forEach(function(entry) {
+
+ if (entry.intersectionRatio > 0) {
+ entry.target.classList.remove('c-promo-block__body--initial');
+ observer.unobserve(entry.target);
+ }
+ });
+ }
+
+})();
diff --git a/packages/starterkit-handlebars-demo/dist/styleguide/css/styleguide-specific.css b/packages/starterkit-handlebars-demo/dist/styleguide/css/styleguide-specific.css
new file mode 100644
index 000000000..e88b76619
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/styleguide/css/styleguide-specific.css
@@ -0,0 +1,54 @@
+/*------------------------------------*\
+ $PATTERN LAB-SPECIFIC STYLES
+\*------------------------------------*/
+/**
+ * This stylesheet is for styles you want to include only when the interface is being viewed within Pattern Lab.
+ * This is helpful for displaying demo styles for grids, animations, color swatches, etc
+ * It's also helpful for overriding context-specific styles like fixed or absolutely positioned elements
+ * These styles will not be your production CSS.
+ */
+.demo-animate {
+ background: #ddd;
+ padding: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+ border-radius: 8px;
+ cursor: pointer;
+}
+
+.sg-colors {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+.sg-colors li {
+ -webkit-box-flex: 1;
+ -webkit-flex: auto;
+ -ms-flex: auto;
+ flex: auto;
+ padding: 0.3em;
+ margin: 0 0.5em 0.5em 0;
+ min-width: 5em;
+ border: 1px solid #ddd;
+ border-radius: 8px;
+}
+
+.sg-swatch {
+ display: block;
+ height: 4em;
+ margin-bottom: 0.3em;
+ border-radius: 5px;
+}
+
+.sg-label {
+ font-size: 90%;
+ line-height: 1;
+}
+
+.sg-fonts p {
+ margin-bottom: 0.3em;
+}
diff --git a/packages/starterkit-handlebars-demo/dist/styleguide/css/styleguide-specific.min.css b/packages/starterkit-handlebars-demo/dist/styleguide/css/styleguide-specific.min.css
new file mode 100644
index 000000000..934637125
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/dist/styleguide/css/styleguide-specific.min.css
@@ -0,0 +1 @@
+.demo-animate{background:#ddd;padding:1em;margin-bottom:1em;text-align:center;border-radius:8px;cursor:pointer}.sg-colors{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.sg-colors li{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;padding:.3em;margin:0 .5em .5em 0;min-width:5em;border:1px solid #ddd;border-radius:8px}.sg-swatch{display:block;height:4em;margin-bottom:.3em;border-radius:5px}.sg-label{font-size:90%;line-height:1}.sg-fonts p{margin-bottom:.3em}
\ No newline at end of file
diff --git a/packages/starterkit-handlebars-demo/package.json b/packages/starterkit-handlebars-demo/package.json
new file mode 100644
index 000000000..e3ffa26dd
--- /dev/null
+++ b/packages/starterkit-handlebars-demo/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "@pattern-lab/starterkit-handlebars-demo",
+ "version": "5.7.2",
+ "description": "Pattern Lab's Demo StarterKit for Handlebars.",
+ "main": "README.md",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/pattern-lab/patternlab-node.git"
+ },
+ "keywords": [
+ "Pattern Lab",
+ "Atomic Design",
+ "Handlebars",
+ "Starterkit"
+ ],
+ "author": "Brad Frost",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/pattern-lab/patternlab-node/issues"
+ },
+ "homepage": "https://github.com/pattern-lab/patternlab-node/tree/master/packages/starterkit-handebars-demo",
+ "publishConfig": {
+ "access": "public"
+ },
+ "scripts": {
+ "build": "cd dist/css && npx node-sass style.scss style.css"
+ }
+}
diff --git a/packages/starterkit-twig-demo/CHANGELOG.md b/packages/starterkit-twig-demo/CHANGELOG.md
new file mode 100644
index 000000000..2323aa596
--- /dev/null
+++ b/packages/starterkit-twig-demo/CHANGELOG.md
@@ -0,0 +1,20 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+# [5.8.0](https://github.com/pattern-lab/starterkit-twig-demo/compare/v5.7.2...v5.8.0) (2020-04-03)
+
+
+### Bug Fixes
+
+* the namespace notation should not be mixed with PatternLab shorthand pattern naming & name is not defined in the textarea macro ([8250fe8](https://github.com/pattern-lab/starterkit-twig-demo/commit/8250fe88231d03735424d597eae40496da2cb48c))
+
+
+
+
+
+
+# [5.0.0](https://github.com/pattern-lab/starterkit-twig-demo/compare/v3.0.0-beta.3...v5.0.0) (2019-10-25)
+
+**Note:** Version bump only for package @pattern-lab/starterkit-twig-demo
diff --git a/packages/starterkit-twig-demo/LICENSE b/packages/starterkit-twig-demo/LICENSE
new file mode 100755
index 000000000..0b7607f3e
--- /dev/null
+++ b/packages/starterkit-twig-demo/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Brad Frost, http://bradfrostweb.com & Dave Olsen, http://dmolsen.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/starterkit-twig-demo/README.md b/packages/starterkit-twig-demo/README.md
new file mode 100755
index 000000000..d2b215dd8
--- /dev/null
+++ b/packages/starterkit-twig-demo/README.md
@@ -0,0 +1,24 @@
+
+[](https://packagist.org/packages/pattern-lab/starterkit-twig-demo) [](https://gitter.im/pattern-lab/php)
+
+# Demo StarterKit for Twig
+
+The Demo StarterKit for Twig is meant to be used as a demo that highlights how to combine Twig and Pattern Lab. It is currently very thin. We're looking for maintainers who may be interested in making this demo the equal to if not better than the Mustache demo.
+
+## Requirements
+
+The Demo StarterKit for Twig requires the following PatternEngine:
+
+* `pattern-lab/patternengine-twig`: [documentation](https://github.com/pattern-lab/patternengine-php-twig#twig-patternengine-for-pattern-lab), [GitHub](https://github.com/pattern-lab/patternengine-php-twig), [Packagist](https://packagist.org/packages/pattern-lab/patternengine-twig)
+
+## Install
+
+This StarterKit can be installed using the following command:
+
+ php core/console --starterkit --install pattern-lab/starterkit-twig-demo
+
+It is recommended that you **do not** install this StarterKit as a dependency for your Pattern Lab project via Composer.
+
+## Edit Files
+
+After installation the files for this StarterKit can be found in `source/`.
diff --git a/packages/starterkit-twig-demo/composer.json b/packages/starterkit-twig-demo/composer.json
new file mode 100755
index 000000000..cc9b8e80e
--- /dev/null
+++ b/packages/starterkit-twig-demo/composer.json
@@ -0,0 +1,39 @@
+{
+ "name": "pattern-lab/starterkit-twig-demo",
+ "description": "Pattern Lab's Demo StarterKit for Twig.",
+ "keywords": ["twig", "pattern lab", "starterkit", "demo"],
+ "homepage": "http://patternlab.io",
+ "license": "MIT",
+ "type": "patternlab-starterkit",
+ "authors": [
+ {
+ "name": "Dave Olsen",
+ "email": "dmolsen@gmail.com",
+ "homepage": "http://dmolsen.com",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Brad Frost",
+ "homepage": "http://bradfrostweb.com",
+ "role": "Creator"
+ }
+ ],
+ "support": {
+ "issues": "https://github.com/pattern-lab/starterkit-twig-demo/issues",
+ "wiki": "http://patternlab.io/docs/",
+ "source": "https://github.com/pattern-lab/starterkit-twig-demo/releases"
+ },
+ "require": {
+ "pattern-lab/core": "^2.0.0",
+ "pattern-lab/patternengine-twig": "^2.0.0"
+ },
+ "extra": {
+ "patternlab": {
+ "dist": {
+ "sourceDir": [
+ { "*": "*" }
+ ]
+ }
+ }
+ }
+}
diff --git a/packages/starterkit-twig-demo/dist/_annotations/annotations.js b/packages/starterkit-twig-demo/dist/_annotations/annotations.js
new file mode 100755
index 000000000..6ae3d7dc3
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_annotations/annotations.js
@@ -0,0 +1,9 @@
+{
+ "comments" : [
+ {
+ "el": "header[role=banner]",
+ "title" : "Masthead",
+ "comment": "The main header of the site doesn't take up too much screen real estate in order to keep the focus on the core content. It's using a linear CSS gradient instead of a background image to give greater design flexibility and reduce HTTP requests."
+ }
+ ]
+}
diff --git a/packages/starterkit-twig-demo/dist/_data/data.json b/packages/starterkit-twig-demo/dist/_data/data.json
new file mode 100755
index 000000000..8752e40dc
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_data/data.json
@@ -0,0 +1,93 @@
+{
+ "title" : "Pattern Lab",
+ "htmlClass": "pl",
+ "bodyClass": "body",
+ "img": {
+ "landscape_4x3": {
+ "src": "../../images/fpo_4x3.png",
+ "alt": "4x3 Image"
+ },
+ "landscape_16x9": {
+ "src": "../../images/fpo_16x9.png",
+ "alt": "16x9 Image"
+ },
+ "square": {
+ "src": "../../images/fpo_square.png",
+ "alt": "Square Thumbnail"
+ },
+ "avatar" : {
+ "src" : "../../images/fpo_avatar.png",
+ "alt" : "Person Name"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/tech",
+ "alt": "Rectangle"
+ }
+ },
+ "headline" : {
+ "short" : "Lorem ipsum dolor sit (37 characters)",
+ "medium" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. (72 characters)"
+ },
+ "excerpt" : {
+ "short" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
+ "medium" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
+ "long" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+ },
+ "description" : "So, setting about it as methodically as men might smoke out a wasps' nest, the Martians spread this strange stifling vapour over the Londonward country. The horns of the crescent slowly moved apart, until at last they formed a line from Hanwell to Coombe and Malden. All night through their destructive tubes advanced.",
+ "url" : "#",
+ "name" : {
+ "first": "Lacy",
+ "firsti": "L",
+ "middle": "Tommie",
+ "middlei": "T",
+ "last": "Way",
+ "lasti": "W"
+ },
+ "year" : {
+ "long": "2013",
+ "short": "13"
+ },
+ "month" : {
+ "long": "February",
+ "short": "Feb",
+ "digit": "02"
+ },
+ "dayofweek" : {
+ "long": "Monday",
+ "short": "Mon"
+ },
+ "day" : {
+ "long": "10",
+ "short": "10",
+ "ordinal": "th"
+ },
+ "hour" : {
+ "long": "01",
+ "short": "1",
+ "military": "13",
+ "ampm": "pm"
+ },
+ "minute" : {
+ "long": "20",
+ "short": "20"
+ },
+ "seconds" : "31",
+ "author" : {
+ "first_name": "Author",
+ "last_name": "Name"
+ },
+ "hero": true,
+ "emergency" : false,
+ "touts" : [
+ { },
+ { },
+ { }
+ ],
+ "latest_posts" : [
+ { },
+ { },
+ { },
+ { },
+ { }
+ ]
+}
diff --git a/packages/starterkit-twig-demo/dist/_data/listitems.json b/packages/starterkit-twig-demo/dist/_data/listitems.json
new file mode 100755
index 000000000..42c29f0e4
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_data/listitems.json
@@ -0,0 +1,878 @@
+{
+ "1": {
+ "title": "Nullizzle shizznit velizzle, hizzle, suscipit own yo', gravida vizzle, arcu.",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/people",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/nature",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/tech",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/tech",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/tech",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Lorizzle pimpin' dolizzle sit amet I",
+ "medium": "Rizzle adipiscing elizzle. Nullam sapien velizzle, shit volutpizzle, my"
+ },
+ "excerpt": {
+ "short": "Shizz fo shizzle mah nizzle fo rizzle, mah home g-dizzle, gravida vizzle, arcu. Pellentesque crunk tortizzle. Sed erizzle. Black izzle sheezy telliv.",
+ "medium": "Izzle crazy tempizzle sizzle. We gonna chung gangsta get down get down fo shizzle turpizzle. Away break it down black. Pellentesque bling bling rhoncus fo shizzle. In hac the bizzle platea dictumst. Black dapibizzle. Crackalackin.",
+ "long": "Curabitizzle fo shizzle diam quizzle nisi nizzle mollizzle. Suspendisse boofron. Morbi odio. Sure pizzle. Crazy orci. Shut the shizzle up maurizzle get down get down, check out this a, go to hizzle sit amizzle, malesuada izzle, pede. Pellentesque gravida. Vestibulizzle check it out mi, volutpat izzle, shiz sed, shiznit sempizzle, da bomb. Funky fresh in ipsum. Da bomb volutpat felis vizzle daahng dawg. Crizzle quis dope izzle fo shizzle my ni."
+ },
+ "description": "Fizzle crazy tortor. Sed rizzle. Ass pimpin' dolor dapibizzle turpis tempizzle fo shizzle my nizzle. Maurizzle pellentesque its fo rizzle izzle turpis. Get down get down we gonna chung nizzle. Shizzlin dizzle eleifend rhoncizzle break it down. In yo ghetto platea dictumst. Bling bling dapibizzle. Curabitur break yo neck, yall fo, pretizzle eu, go to hizzle dope, own yo' vitae, nunc. Bizzle suscipizzle. Ass semper velit sizzle fo.",
+ "url": "http://lorizzle.nl/",
+ "name": {
+ "first": "Junius",
+ "firsti": "J",
+ "middle": "Marius",
+ "middlei": "M",
+ "last": "Koolen",
+ "lasti": "K"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "January",
+ "short": "Jan",
+ "digit": "01"
+ },
+ "dayofweek": {
+ "long": "Sunday",
+ "short": "Sun"
+ },
+ "day": {
+ "long": "01",
+ "short": "1",
+ "ordinal": "st"
+ },
+ "hour": {
+ "long": "06",
+ "short": "6",
+ "military": "06",
+ "ampm": "am"
+ },
+ "minute": {
+ "long": "20",
+ "short": "20"
+ },
+ "seconds": "31"
+ },
+ "2": {
+ "title": "Veggies sunt bona vobis, proinde vos postulo",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/nature",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/tech",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/people",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/people",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/people",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Veggies sunt bona vobis, proinde vos",
+ "medium": "Postulo esse magis azuki bean burdock brussels sprout quandong komatsun"
+ },
+ "excerpt": {
+ "short": "A fava bean collard greens endive tomatillo lotus root okra winter purslane zucchini parsley spinach artichoke. Brussels sprout pea turnip catsear.",
+ "medium": "Bush tomato gumbo potato garbanzo ricebean burdock daikon coriander kale quandong. Bok choy celery leek avocado shallot horseradish aubergine parsley. Bok choy bell pepper kale celery desert raisin kakadu plum bok choy bunya nuts.",
+ "long": "Spinach tigernut. Corn cucumber grape black-eyed pea asparagus spinach avocado dulse bunya nuts epazote celery desert raisin celtuce burdock plantain yarrow napa cabbage. Plantain okra seakale endive tigernut pea sprouts asparagus corn chard peanut beet greens groundnut radicchio carrot coriander gumbo gram celtuce. Jícama nori bamboo shoot collard greens okra radicchio tomato. Catsear mustard corn tigernut celery kale water spinach bok choy."
+ },
+ "description": "Mung bean squash sorrel taro coriander collard greens gumbo bitterleaf tomato. Taro water chestnut celtuce turnip yarrow celery endive scallion black-eyed pea onion. Aubergine dulse turnip greens mustard salsify garlic soybean parsley bitterleaf desert raisin courgette.",
+ "url": "http://veggieipsum.com",
+ "name": {
+ "first": "Siguror",
+ "firsti": "S",
+ "middle": "Aron",
+ "middlei": "A",
+ "last": "Hanigan",
+ "lasti": "H"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "February",
+ "short": "Feb",
+ "digit": "02"
+ },
+ "dayofweek": {
+ "long": "Monday",
+ "short": "Mon"
+ },
+ "day": {
+ "long": "10",
+ "short": "10",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "01",
+ "short": "1",
+ "military": "13",
+ "ampm": "pm"
+ },
+ "minute": {
+ "long": "20",
+ "short": "20"
+ },
+ "seconds": "31"
+ },
+ "3": {
+ "title": "Bacon ipsum dolor sit amet turducken strip steak beef ribs shank",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/tech",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/people",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/nature",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/nature",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/nature",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Bacon ipsum dolor sit amet spare rib",
+ "medium": "Tongue pancetta short ribs bacon. Kielbasa ball tip cow bresaola, capic"
+ },
+ "excerpt": {
+ "short": "Tail jerky rump shoulder t-bone meatball meatloaf salami. Filet mignon shank t-bone venison, ham hock ribeye drumstick bresaola kielbasa. Frankfurter.",
+ "medium": "Doner biltong turducken leberkas. Rump swine pork loin ribeye ball tip meatloaf, pork chop ground round pig pancetta cow biltong brisket. Beef corned beef beef ribs, bacon pork belly sausage meatball boudin doner ham hock. Swine gro.",
+ "long": "Und round meatball, bacon pig leberkas corned beef tongue shoulder. Drumstick pork loin prosciutto ball tip shank pancetta spare ribs jowl pastrami. Frankfurter boudin filet mignon ribeye. Pig hamburger strip steak ham turducken prosciutto bresaola ground round pancetta frankfurter jowl. Frankfurter tongue brisket tenderloin, beef ribs pastrami biltong tail bresaola flank. Biltong pork chop beef boudin hamburger bacon. Capicola bresaola sausage."
+ },
+ "description": "Boudin sausage jerky pastrami ground round salami biltong. Sausage fatback strip steak doner pork loin, pork belly drumstick ham short loin hamburger shankle. Short ribs sirloin rump tri-tip beef biltong. Meatball pig salami, jowl pork loin fatback short loin drumstick andouille.",
+ "url": "http://baconipsum.com/",
+ "name": {
+ "first": "Teun",
+ "firsti": "T",
+ "middle": "Jodocus",
+ "middlei": "J",
+ "last": "Richard",
+ "lasti": "R"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "March",
+ "short": "Mar",
+ "digit": "03"
+ },
+ "dayofweek": {
+ "long": "Tuesday",
+ "short": "Tue"
+ },
+ "day": {
+ "long": "22",
+ "short": "22",
+ "ordinal": "nd"
+ },
+ "hour": {
+ "long": "04",
+ "short": "4",
+ "military": "16",
+ "ampm": "pm"
+ },
+ "minute": {
+ "long": "45",
+ "short": "45"
+ },
+ "seconds": "11"
+ },
+ "4": {
+ "title": "Whatever swag accusamus occupy, gentrify butcher tote bag",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/animals",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/arch",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/people/grayscale",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/people/greyscale",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/people/greyscale",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Nesciunt sunt cillum keytar Pitchfork",
+ "medium": "Tote bag mixtape PBR Helvetica scenester forage four loko. Irure Tonx"
+ },
+ "excerpt": {
+ "short": "Golf quis +1, Wes Anderson church-key lo-fi keffiyeh selvage culpa authentic Brooklyn fap chambray. Id synth yr, 3 wolf moon locavore +1 mixtape do.",
+ "medium": "Sed single-origin coffee anim eu. Bicycle rights Neutra Truffaut pop-up. Paleo hella irure meh Banksy, Wes Anderson typewriter VHS jean shorts yr. Eiusmod officia banjo Thundercats, odio laborum magna deep v cornhole nostrud kitsch.",
+ "long": "Tattooed Williamsburg. Jean shorts proident kogi laboris. Non tote bag pariatur elit slow-carb, Vice irure eu Echo Park ea aliqua chillwave. Cornhole Etsy quinoa Pinterest cardigan. Excepteur quis forage, Blue Bottle keffiyeh velit hoodie direct trade typewriter Etsy. Fingerstache squid non, sriracha drinking vinegar Shoreditch pork belly. Paleo sartorial mollit 3 wolf moon chambray whatever, sed tote bag small batch freegan. Master cleanse."
+ },
+ "description": "Fanny pack ullamco et veniam semiotics. Shoreditch PBR reprehenderit cliche, magna Tonx aesthetic. Narwhal photo booth DIY aute post-ironic anim. Vice cliche brunch est before they sold out fap, street art Odd Future fashion axe messenger bag nihil Tonx tattooed. Nihil hashtag incididunt, do eu art party Banksy jean shorts four loko typewriter.",
+ "url": "http://hipsteripsum.me/",
+ "name": {
+ "first": "Duane",
+ "firsti": "D",
+ "middle": "Edvin",
+ "middlei": "E",
+ "last": "Wilms",
+ "lasti": "W"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "April",
+ "short": "Apr",
+ "digit": "04"
+ },
+ "dayofweek": {
+ "long": "Wednesday",
+ "short": "Wed"
+ },
+ "day": {
+ "long": "13",
+ "short": "13",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "10",
+ "short": "10",
+ "military": "10",
+ "ampm": "am"
+ },
+ "minute": {
+ "long": "14",
+ "short": "14"
+ },
+ "seconds": "52"
+ },
+ "5": {
+ "title": "Marshall McLuhan Colbert bump backpack journalist vast wasteland Romenesko CPM",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/people/grayscale",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/animals",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/arch",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/arch",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/arch",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Blog meme masthead DocumentCloud Fou",
+ "medium": "Square tabloid Andy Carvin stupid commenters, Nick Denton mathewi semip"
+ },
+ "excerpt": {
+ "short": "I love the Weather & Opera section Groupon copyright in the slot, Journal Register open newsroom analytics future totally blowing up on Twitter AOL.",
+ "medium": "CTR mthomps Flipboard do what you do best and link to the rest Buttry media bias Journal Register RT, newspaper strike do what you do best and link to the rest semipermeable learnings cognitive surplus mathewi, Encyclo Google News.",
+ "long": "Pulse mathewi Project Thunderdome digital first. HuffPo social media optimization try PR dying the notion of the public monetization data visualization audience atomization overcome community, libel lawyer twitterati should isn't a business model fair use innovation Facebook AOL, Walter Cronkite died for your sins horse-race coverage crowdfunding Patch but what's the business model rubber cement horse-race coverage. Lucius Nieman content farm."
+ },
+ "description": "Like button audience atomization overcome Colbert bump Free Darko inverted pyramid we will make them pay, digital circulation strategy Like button totally blowing up on Twitter church of the savvy. Pictures of Goats section open source discuss Frontline analog thinking filters paidContent.",
+ "url": "http://www.niemanlab.org/journo-ipsum/",
+ "name": {
+ "first": "Frans",
+ "firsti": "F",
+ "middle": "Fabius",
+ "middlei": "F",
+ "last": "Keegan",
+ "lasti": "K"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "May",
+ "short": "May",
+ "digit": "05"
+ },
+ "dayofweek": {
+ "long": "Thursday",
+ "short": "Thu"
+ },
+ "day": {
+ "long": "26",
+ "short": "26",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "06",
+ "short": "6",
+ "military": "18",
+ "ampm": "pm"
+ },
+ "minute": {
+ "long": "37",
+ "short": "37"
+ },
+ "seconds": "24"
+ },
+ "6": {
+ "title": "Thunder, thunder, thundercats, Ho!",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/arch",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/animals",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/people/grayscale",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/people/grayscale",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/people/grayscale",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Hong Kong Phooey, number one super g",
+ "medium": "Hong Kong Phooey, quicker than the human eye. He's got style, a groovy"
+ },
+ "excerpt": {
+ "short": "Style, and a car that just won't stop. When the going gets tough, he's really rough, with a Hong Kong Phooey chop (Hi-Ya!). Hong Kong Phooey, number.",
+ "medium": "One super guy. Hong Kong Phooey, quicker than the human eye. Hong Kong Phooey, he's fan-riffic! One for all and all for one, Muskehounds are always ready. One for all and all for one, helping everybody. One for all and all for one.",
+ "long": "It's a pretty story. Sharing everything with fun, that's the way to be. One for all and all for one, Muskehounds are always ready. One for all and all for one, helping everybody. One for all and all for one, can sound pretty corny. If you've got a problem chum, think how it could be. This is my boss, Jonathan Hart, a self-made millionaire, he's quite a guy. This is Mrs H., she's gorgeous, she's one lady who knows how to take care of herself."
+ },
+ "description": "Beats all you've ever saw, been in trouble with the law since the day they was born. Straight'nin' the curve, flat'nin' the hills. Someday the mountain might get 'em, but the law never will. Makin' their way, the only way they know how, that's just a little bit more than the law will allow. Just good ol' boys, wouldn't change if they could, fightin' the system like a true modern day Robin Hood.",
+ "url": "http://www.malevole.com/mv/misc/text/",
+ "name": {
+ "first": "Fergus",
+ "firsti": "F",
+ "middle": "Jon",
+ "middlei": "J",
+ "last": "Althuis",
+ "lasti": "A"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "June",
+ "short": "Jun",
+ "digit": "06"
+ },
+ "dayofweek": {
+ "long": "Friday",
+ "short": "Fri"
+ },
+ "day": {
+ "long": "08",
+ "short": "8",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "11",
+ "short": "11",
+ "military": "23",
+ "ampm": "pm"
+ },
+ "minute": {
+ "long": "37",
+ "short": "37"
+ },
+ "seconds": "33"
+ },
+ "7": {
+ "title": "Yeah, I like animals better than people sometimes",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/any",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/any",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/any",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/any",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/any",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Now that we know who you are, I know",
+ "medium": "Who I am. I'm not a mistake! It all makes sense! In a comic, you know"
+ },
+ "excerpt": {
+ "short": "How you can tell who the arch-villain's going to be? He's the exact opposite of the hero. And most times they're friends, like you and me! I should've known way back when... You know why, David? Because of the kids. They called me.",
+ "medium": "The lysine contingency - it's intended to prevent the spread of the animals is case they ever got off the island. Dr. Wu inserted a gene that makes a single faulty enzyme in protein metabolism. The animals can't manufacture the amin.",
+ "long": "Do you see any Teletubbies in here? Do you see a slender plastic tag clipped to my shirt with my name printed on it? Do you see a little Asian child with a blank expression on his face sitting outside on a mechanical helicopter that shakes when you put quarters in it? No? Well, that's what you see at a toy store. And you must think you're in a toy store, because you're here shopping for an infant named Jeb. Acid lysine. Unless they're."
+ },
+ "description": "Especially dogs. Dogs are the best. Every time you come home, they act like they haven't seen you in a year. And the good thing about dogs... is they got different dogs for different people. Like pit bulls. The dog of dogs. Pit bull can be the right man's best friend... or the wrong man's worst enemy. You going to give me a dog for a pet, give me a pit bull.",
+ "url": "http://slipsum.com/lite/",
+ "name": {
+ "first": "Bertil",
+ "firsti": "B",
+ "middle": "Pier",
+ "middlei": "P",
+ "last": "Aaij",
+ "lasti": "A"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "July",
+ "short": "Jul",
+ "digit": "07"
+ },
+ "dayofweek": {
+ "long": "Saturday",
+ "short": "Sat"
+ },
+ "day": {
+ "long": "22",
+ "short": "22",
+ "ordinal": "nd"
+ },
+ "hour": {
+ "long": "11",
+ "short": "11",
+ "military": "11",
+ "ampm": "am"
+ },
+ "minute": {
+ "long": "12",
+ "short": "12"
+ },
+ "seconds": "47"
+ },
+ "8": {
+ "title": "Webtwo ipsum dolor sit amet, eskobo chumby doostang bebo",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/any/grayscale",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/any/grayscale",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/any/grayscale",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/any/grayscale",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/any/grayscale",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Webtwo ipsum dolor sit amet, eskobo",
+ "medium": "Chumby doostang bebo. Wakoopa oooj geni zoho loopt eskobo sifteo chart"
+ },
+ "excerpt": {
+ "short": "Dropio, chumby waze dopplr plugg oooj yammer jibjab imvu yuntaa knewton, mobly trulia airbnb bitly chegg tivo empressr knewton. Plickers spock voxy.",
+ "medium": "Zooomr kippt voxy zinch appjet napster trulia, zappos wufoo zapier spotify mzinga jaiku fleck, disqus lijit voxy voki yoono. Dogster elgg jibjab xobni kazaa bebo udemy sifteo kiko, elgg knewton skype mog octopart zoodles kazaa udem.",
+ "long": "Appjet spock handango empressr lijit palantir weebly dropio jibjab revver kaboodle spotify orkut mobly chegg akismet, handango ebay woopra revver joukuu kosmix unigo oooooc wufoo zanga kno zinch spock knewton. Balihoo greplin bebo squidoo skype kaboodle meebo disqus joost gooru, zlio tumblr edmodo palantir eskobo shopify kiko gsnap. Greplin balihoo chartly plugg imeem diigo trulia plickers qeyno wikia akismet, palantir grockit prezi jabber zo."
+ },
+ "description": "Wufoo diigo grockit sifteo divvyshot, unigo zooomr revver. Edmodo appjet joyent skype bubbli jajah zoodles joukuu xobni hojoki edmodo appjet, mozy mzinga akismet yuntaa joost yuntaa geni tivo insala yoono chumby, grockit sococo loopt zanga etsy cloudera koofers empressr jiglu blippy. Omgpop lanyrd joukuu sococo zimbra airbnb movity jibjab, foodzie.",
+ "url": "http://web20ipsum.com",
+ "name": {
+ "first": "Freyr",
+ "firsti": "F",
+ "middle": "Ninian",
+ "middlei": "N",
+ "last": "Hines",
+ "lasti": "H"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "August",
+ "short": "Aug",
+ "digit": "08"
+ },
+ "dayofweek": {
+ "long": "Sunday",
+ "short": "Sun"
+ },
+ "day": {
+ "long": "31",
+ "short": "31",
+ "ordinal": "st"
+ },
+ "hour": {
+ "long": "03",
+ "short": "3",
+ "military": "15",
+ "ampm": "pm"
+ },
+ "minute": {
+ "long": "42",
+ "short": "42"
+ },
+ "seconds": "21"
+ },
+ "9": {
+ "title": "Rebel Mission to Ord Mantell",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/any/sepia",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/any/sepia",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/any/sepia",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/any/sepia",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/any/sepia",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "All right. Well, take care of yourself, Han",
+ "medium": "You don't believe in the Force, do you? The Force is strong with this one"
+ },
+ "excerpt": {
+ "short": "I'm trying not to, kid. I find your lack of faith disturbing. You are a part of the Rebel Alliance and a traitor! Take her away! I want to come with.",
+ "medium": "I'm surprised you had the courage to take the responsibility yourself. Don't be too proud of this technological terror you've constructed. The ability to destroy a planet is insignificant next to the power of the Force. You don't be.",
+ "long": "A tremor in the Force. The last time I felt it was in the presence of my old master. You don't believe in the Force, do you? I have traced the Rebel spies to her. Now she is my only link to finding their secret base. A tremor in the Force. The last time I felt it was in the presence of my old master. I'm trying not to, kid. The more you tighten your grip, Tarkin, the more star systems will slip through your fingers. There's nothing for me here."
+ },
+ "description": "I find your lack of faith disturbing. A tremor in the Force. The last time I felt it was in the presence of my old master. Don't act so surprised, Your Highness. You weren't on any mercy mission this time. Several transmissions were beamed to this ship by Rebel spies. I want to know what happened to the plans they sent you. The plans you refer to will soon be back in our hands.",
+ "url": "http://chrisvalleskey.com/fillerama/",
+ "name": {
+ "first": "Jacobus",
+ "firsti": "J",
+ "middle": "Domitianus",
+ "middlei": "D",
+ "last": "Sneiders",
+ "lasti": "S"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "September",
+ "short": "Sep",
+ "digit": "09"
+ },
+ "dayofweek": {
+ "long": "Monday",
+ "short": "Mon"
+ },
+ "day": {
+ "long": "04",
+ "short": "4",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "09",
+ "short": "9",
+ "military": "09",
+ "ampm": "am"
+ },
+ "minute": {
+ "long": "04",
+ "short": "4"
+ },
+ "seconds": "37"
+ },
+ "10": {
+ "title": "Help, help, I'm being repressed!",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/tech/grayscale",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/nature/grayscale",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/arch/grayscale",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/arch/grayscale",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/arch/grayscale",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "The swallow may fly south with the sun",
+ "medium": "On second thoughts, let's not go there. It is a silly place. You don't"
+ },
+ "excerpt": {
+ "short": "The swallow may fly south with the sun, and the house martin or the plover may seek warmer climes in winter, yet these are not strangers to our land.",
+ "medium": "The Knights Who Say Ni demand a sacrifice! Found them? In Mercia?! The coconut's tropical! Where'd you get the coconuts? Why do you think that she is a witch? I am your king. You don't vote for kings. But you are dressed as one. Oh, ow!",
+ "long": "Well, I didn't vote for you. Burn her! Be quiet! He hasn't got shit all over him. Where'd you get the coconuts? The swallow may fly south with the sun, and the house martin or the plover may seek warmer climes in winter, yet these are not strangers to our land. No! Yes, yes. A bit. But she's got a wart. Shut up! Will you shut up?! I have to push the pram a lot. Now, look here, my good man. Frighten us, English pig-dogs! Go and boil your bottoms."
+ },
+ "description": "The Knights Who Say Ni demand a sacrifice! …Are you suggesting that coconuts migrate? Knights of Ni, we are but simple travelers who seek the enchanter who lives beyond these woods. You don't frighten us, English pig-dogs! Go and boil your bottoms, sons of a silly person! I blow my nose at you, so-called Ah-thoor Keeng, you and all your silly English K-n-n-n-n-n-n-n-niggits!",
+ "url": "http://chrisvalleskey.com/fillerama/",
+ "name": {
+ "first": "Plinius",
+ "firsti": "P",
+ "middle": "Varinius",
+ "middlei": "V",
+ "last": "Sloane",
+ "lasti": "S"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "October",
+ "short": "Oct",
+ "digit": "10"
+ },
+ "dayofweek": {
+ "long": "Tuesday",
+ "short": "Tue"
+ },
+ "day": {
+ "long": "25",
+ "short": "25",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "03",
+ "short": "3",
+ "military": "03",
+ "ampm": "am"
+ },
+ "minute": {
+ "long": "51",
+ "short": "51"
+ },
+ "second": "19"
+ },
+ "11": {
+ "title": "Danish danish candy canes bonbon cheesecake danish marzipan",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/tech/sepia",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/animals/sepia",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/arch/sepia",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/arch/sepia",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/arch/sepia",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Carrot cake fruitcake dessert apple",
+ "medium": "Pie powder lemon drops sesame snaps cake brownie. Biscuit ice cream gin"
+ },
+ "excerpt": {
+ "short": "Bread cotton candy marzipan. Baker too go gingerbread topping cupcake donut. Fruitcake marzipan bear claw tart toffee candy cheesecake. Lemon drops.",
+ "medium": "Cupcake chupa chups pudding gummies. Unerdwear.com cupcake candy soufflé sesame snaps macaroon sesame snaps. Tart dragée muffin. Sweet roll gummi bears caramels fruitcake candy cake. Cotton candy carrot cake tart cotton candy. Jelly.",
+ "long": "Gingerbread candy icing pastry cake bonbon fruitcake donut. Powder liquorice dessert tart croissant cake. Dessert chocolate cake sweet roll candy candy sesame snaps tiramisu ice cream. Candy candy canes marzipan biscuit cupcake pie pudding. Donut cotton candy muffin. Pastry bear claw icing halvah. Gingerbread cotton candy sweet roll toffee chocolate jujubes. Wafer jujubes danish ice cream lemon drops wafer. Sesame snaps cupcake gummies browni."
+ },
+ "description": "Sugar plum wafer soufflé ice cream. Wafer topping biscuit pie gummi bears topping. Gummies toffee powder applicake oat cake cookie. Bear claw candy tootsie roll fruitcake danish applicake candy canes macaroon. Liquorice tiramisu danish cotton candy gummies. Tiramisu dessert gummi bears macaroon sweet roll jelly-o gummi bears marzipan.",
+ "url": "http://cupcakeipsum.com/",
+ "name": {
+ "first": "Matthias",
+ "firsti": "M",
+ "middle": "Brady",
+ "middlei": "B",
+ "last": "Macguinness",
+ "lasti": "M"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "November",
+ "short": "Nov",
+ "digit": "11"
+ },
+ "dayofweek": {
+ "long": "Wednesday",
+ "short": "Wed"
+ },
+ "day": {
+ "long": "19",
+ "short": "19",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "11",
+ "short": "11",
+ "military": "23",
+ "ampm": "pm"
+ },
+ "minute": {
+ "long": "55",
+ "short": "55"
+ },
+ "seconds": "12"
+ },
+ "12": {
+ "title": "Cottage cheese brie lancashire. Boursin when the cheese comes out.",
+ "img": {
+ "avatar": {
+ "src": "http://placeimg.com/100/100/people/sepia",
+ "alt": "Avatar"
+ },
+ "square": {
+ "src": "http://placeimg.com/300/300/people/sepia",
+ "alt": "Square"
+ },
+ "rectangle": {
+ "src": "http://placeimg.com/400/300/people/sepia",
+ "alt": "Rectangle"
+ },
+ "landscape-4x3": {
+ "src": "http://placeimg.com/400/300/people/sepia",
+ "alt": "4x3 Image"
+ },
+ "landscape-16x9": {
+ "src": "http://placeimg.com/640/360/people/sepia",
+ "alt": "16x9 Image"
+ }
+ },
+ "headline": {
+ "short": "Cauliflower cheese cream cheese baby",
+ "medium": "Lancashire cheesy feet rubber cheese cheese and wine gouda the big chee"
+ },
+ "excerpt": {
+ "short": "Queso fromage. Taleggio boursin bavarian bergkase cream cheese when the cheese comes out everybody's happy port-salut halloumi pecorino. Caerphilly cut the cheese manchego camembert de normandie goat melted cheese cheese and biscuit.",
+ "medium": "Pecorino queso lancashire. Manchego lancashire cheesy feet emmental babybel cheese strings dolcelatte bavarian bergkase. Ricotta cheese slices cheesy grin cow cheesecake smelly cheese mascarpone lancashire. Cow say cheese babybel do.",
+ "long": "Cheesy grin macaroni cheese airedale. Fromage frais airedale cheese and wine brie cow swiss swiss mozzarella. Emmental cheese triangles edam rubber cheese pepper jack ricotta airedale airedale. Brie parmesan smelly cheese cheese strings stinking bishop cheese strings taleggio. Bocconcini blue castello gouda. Everyone loves caerphilly rubber cheese halloumi smelly cheese melted cheese melted cheese bavarian bergkase. Rubber cheese ricotta emm."
+ },
+ "description": "Queso caerphilly cheesecake. Parmesan chalk and cheese port-salut port-salut babybel cottage cheese cheesy grin pepper jack. Croque monsieur paneer st. agur blue cheese emmental airedale monterey jack bavarian bergkase cheese triangles. Halloumi parmesan.",
+ "url": "http://www.cheeseipsum.co.uk/",
+ "name": {
+ "first": "Aquila",
+ "firsti": "A",
+ "middle": "Gaius",
+ "middlei": "G",
+ "last": "Achterkamp",
+ "lasti": "A"
+ },
+ "year": {
+ "long": "2013",
+ "short": "13"
+ },
+ "month": {
+ "long": "December",
+ "short": "Dec",
+ "digit": "12"
+ },
+ "dayofweek": {
+ "long": "Thursday",
+ "short": "Thu"
+ },
+ "day": {
+ "long": "28",
+ "short": "28",
+ "ordinal": "th"
+ },
+ "hour": {
+ "long": "08",
+ "short": "8",
+ "military": "08",
+ "ampm": "am"
+ },
+ "minute": {
+ "long": "34",
+ "short": "34"
+ },
+ "seconds": "56"
+ }
+}
diff --git a/packages/starterkit-twig-demo/dist/_layouts/.gitkeep b/packages/starterkit-twig-demo/dist/_layouts/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_layouts/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_macros/.gitkeep b/packages/starterkit-twig-demo/dist/_macros/.gitkeep
new file mode 100755
index 000000000..cdd065ddb
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_macros/.gitkeep
@@ -0,0 +1 @@
+keeping this directory
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_macros/forms.twig b/packages/starterkit-twig-demo/dist/_macros/forms.twig
new file mode 100755
index 000000000..3149edc74
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_macros/forms.twig
@@ -0,0 +1,21 @@
+{% macro input(name, type, classes, label, placeholder, value, size, required) %}
+ {% set show_label = label|default(true) %}
+
+{% endmacro %}
+
+{% macro textarea(label, placeholder, rows, classes) %}
+ {% set show_label = label|default(true) %}
+
+ {% if show_label %}
+
{{ label|default('Label') }}{% if required %}* {% endif %}
+ {% endif %}
+
+ {% if show_label %} {% endif %}
+
+{% endmacro %}
diff --git a/packages/starterkit-twig-demo/dist/_meta/_00-head.twig b/packages/starterkit-twig-demo/dist/_meta/_00-head.twig
new file mode 100755
index 000000000..123ccf8a8
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_meta/_00-head.twig
@@ -0,0 +1,17 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{ patternLabHead | raw }}
+
+
+
+
+
diff --git a/packages/starterkit-twig-demo/dist/_meta/_01-foot.twig b/packages/starterkit-twig-demo/dist/_meta/_01-foot.twig
new file mode 100755
index 000000000..4d65e2a55
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_meta/_01-foot.twig
@@ -0,0 +1,6 @@
+
+
+ {{ patternLabFoot | raw }}
+
+
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/00-colors.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/00-colors.twig
new file mode 100755
index 000000000..7f2653f8d
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/00-colors.twig
@@ -0,0 +1,38 @@
+
+
+
+ #ff0000
+
+
+
+ #00ff00
+
+
+
+ #0000ff
+
+
+
+ #ffff00
+
+
+
+ #00ffff
+
+
+
+ #ff00ff
+
+
+
+ #ffffff
+
+
+
+ #808080
+
+
+
+ #000000
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/01-fonts.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/01-fonts.twig
new file mode 100755
index 000000000..a292ff438
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/01-fonts.twig
@@ -0,0 +1,6 @@
+Primary font: "HelveticaNeue", "Helvetica", "Arial", sans-serif;
+Primary font italic: "HelveticaNeue", "Helvetica", "Arial", sans-serif;
+Primary font bold: "HelveticaNeue", "Helvetica", "Arial", sans-serif;
+Secondary font: Georgia, Times, "Times New Roman", serif;
+Secondary font italic: Georgia, Times, "Times New Roman", serif;
+Secondary font bold; Georgia, Times, "Times New Roman", serif;
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/02-animations.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/02-animations.twig
new file mode 100755
index 000000000..7d3074575
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/02-animations.twig
@@ -0,0 +1,3 @@
+Fade: Duration: 0.3s Easing: ease-out (Hover to see effect)
+
+
Movement: Duration: 0.8s Easing: ease-in-out; (Hover to see effect)
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/03-visibility.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/03-visibility.twig
new file mode 100755
index 000000000..13e602122
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/01-global/03-visibility.twig
@@ -0,0 +1,11 @@
+This text is hidden on smaller screens
+
+This text is only visible on smaller screens
+
+This text is hidden on medium screens only
+
+This text is only visible on medium screens
+
+This text is hidden on large screens
+
+This text is only visible on large screens
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/00-headings.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/00-headings.twig
new file mode 100755
index 000000000..43f648c7f
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/00-headings.twig
@@ -0,0 +1,6 @@
+Heading Level 1
+Heading Level 2
+Heading Level 3
+Heading Level 4
+Heading Level 5
+Heading Level 6
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/01-paragraph.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/01-paragraph.twig
new file mode 100755
index 000000000..4ed3f6c01
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/01-paragraph.twig
@@ -0,0 +1 @@
+A paragraph (from the Greek paragraphos, "to write beside" or "written beside") is a self-contained unit of a discourse in writing dealing with a particular point or idea. A paragraph consists of one or more sentences. Though not required by the syntax of any language, paragraphs are usually an expected part of formal writing, used to organize longer prose.
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/02-blockquote.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/02-blockquote.twig
new file mode 100755
index 000000000..2f11319b3
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/02-blockquote.twig
@@ -0,0 +1,3 @@
+
+ A block quotation (also known as a long quotation or extract) is a quotation in a written document, that is set off from the main text as a paragraph, or block of text, and typically distinguished visually using indentation and a different typeface or smaller size quotation.
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/03-inline-elements.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/03-inline-elements.twig
new file mode 100755
index 000000000..c9ec16501
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/03-inline-elements.twig
@@ -0,0 +1,41 @@
+
+
This is a text link .
+
+
Strong is used to indicate strong importance .
+
+
This text has added emphasis .
+
+
The b element is stylistically different text from normal text, without any special importance.
+
+
The i element is text that is set off from the normal text.
+
+
The u element is text with an unarticulated, though explicitly rendered, non-textual annotation.
+
+
This text is deleted and This text is inserted .
+
+
This text has a strikethrough .
+
+
Superscript® .
+
+
Subscript for things like H2 O.
+
+
This small text is small for for fine print, etc. .
+
+
Abbreviation: HTML .
+
+
Keyboard input: Cmd .
+
+
This text is a short inline quotation .
+
+
This is a citation
+
+
The dfn element indicates a definition.
+
+
The mark element indicates a highlight.
+
+
This is what inline code looks like.
+
+
This is sample output from a computer program .
+
+
The variable element , such as x = y .
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/04-time.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/04-time.twig
new file mode 100755
index 000000000..26cecc136
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/04-time.twig
@@ -0,0 +1 @@
+2 weeks ago
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/05-preformatted-text.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/05-preformatted-text.twig
new file mode 100755
index 000000000..70de25e11
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/05-preformatted-text.twig
@@ -0,0 +1,9 @@
+
+P R E F O R M A T T E D T E X T
+! " # $ % & ' ( ) * + , - . /
+0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+@ A B C D E F G H I J K L M N O
+P Q R S T U V W X Y Z [ \ ] ^ _
+` a b c d e f g h i j k l m n o
+p q r s t u v w x y z { | } ~
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/06-hr.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/06-hr.twig
new file mode 100755
index 000000000..1d6667d2e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/02-text/06-hr.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/00-unordered.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/00-unordered.twig
new file mode 100755
index 000000000..3f9de349f
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/00-unordered.twig
@@ -0,0 +1,14 @@
+
+
+ This is a list item in an unordered list
+ An unordered list is a list in which the sequence of items is not important. Sometimes, an unordered list is a bulleted list. And this is a long list item in an unordered list that can wrap onto a new line.
+
+ Lists can be nested inside of each other
+
+ This is a nested list item
+ This is another nested list item in an unordered list
+
+
+ This is the last list item
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/01-ordered.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/01-ordered.twig
new file mode 100755
index 000000000..e206c7b10
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/01-ordered.twig
@@ -0,0 +1,14 @@
+
+
+ This is a list item in an ordered list
+ An ordered list is a list in which the sequence of items is important. An ordered list does not necessarily contain sequence characters.
+
+ Lists can be nested inside of each other
+
+ This is a nested list item
+ This is another nested list item in an ordered list
+
+
+ This is the last list item
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/02-definition.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/02-definition.twig
new file mode 100755
index 000000000..0488e0812
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/03-lists/02-definition.twig
@@ -0,0 +1,10 @@
+
+ Definition List
+ A number of connected items or names written or printed consecutively, typically one below the other.
+ This is a term.
+ This is the definition of that term, which both live in a dl.
+ Here is another term.
+ And it gets a definition too, which is this line.
+ Here is term that shares a definition with the term below.
+ And it gets a definition too, which is this line.
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/00-logo.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/00-logo.twig
new file mode 100755
index 000000000..8fa9d34c3
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/00-logo.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/01-landscape-4x3.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/01-landscape-4x3.twig
new file mode 100755
index 000000000..f22956757
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/01-landscape-4x3.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/02-landscape-16x9.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/02-landscape-16x9.twig
new file mode 100755
index 000000000..2fd96beec
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/02-landscape-16x9.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/03-square.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/03-square.twig
new file mode 100755
index 000000000..805cce5f2
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/03-square.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/04-avatar.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/04-avatar.twig
new file mode 100755
index 000000000..6b79ad0c5
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/04-avatar.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/05-icons.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/05-icons.twig
new file mode 100755
index 000000000..4e2512348
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/05-icons.twig
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/06-loading-icon.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/06-loading-icon.twig
new file mode 100755
index 000000000..9a10165ab
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/06-loading-icon.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/07-favicon.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/07-favicon.twig
new file mode 100755
index 000000000..58ac2d914
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/04-images/07-favicon.twig
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/00-text-fields.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/00-text-fields.twig
new file mode 100755
index 000000000..ef7eef8c6
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/00-text-fields.twig
@@ -0,0 +1,13 @@
+{% import "@macros/forms.twig" as forms %}
+
+ {{ forms.input('Text Input') }}
+ {{ forms.input('Password', 'password') }}
+ {{ forms.input('Web Address', 'url') }}
+ {{ forms.input('Email', 'email') }}
+ {{ forms.input('Search', 'search') }}
+ {{ forms.input('Number', 'number') }}
+ {{ forms.input('Number', 'number') }}
+ {{ forms.textarea('Textarea', 'Enter your message here') }}
+ {{ forms.input('Error Input', 'text', 'error') }}
+ {{ forms.input('Valid Input', 'text', 'valid') }}
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/01-select-menu.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/01-select-menu.twig
new file mode 100755
index 000000000..760c9199a
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/01-select-menu.twig
@@ -0,0 +1,12 @@
+
+
+ Select
+
+
+ Option One
+ Option Two
+ Option Three
+
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/02-checkbox.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/02-checkbox.twig
new file mode 100755
index 000000000..017a8dc5c
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/02-checkbox.twig
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/03-radio-buttons.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/03-radio-buttons.twig
new file mode 100755
index 000000000..68c83eaeb
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/03-radio-buttons.twig
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/04-html5-inputs.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/04-html5-inputs.twig
new file mode 100755
index 000000000..d4c39b8e7
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/05-forms/04-html5-inputs.twig
@@ -0,0 +1,10 @@
+
+ Color input
+ Number input
+ Range input
+ Date input
+ Month input
+ Week input
+ Datetime input
+ Datetime-local input
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/06-buttons/00-buttons.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/06-buttons/00-buttons.twig
new file mode 100755
index 000000000..bdbeec360
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/06-buttons/00-buttons.twig
@@ -0,0 +1,4 @@
+Button
+Alternate Button
+Disabled Button
+Text Button
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/07-tables/00-table.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/07-tables/00-table.twig
new file mode 100755
index 000000000..53153d519
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/07-tables/00-table.twig
@@ -0,0 +1,50 @@
+
+
+
+ Table Heading 1
+ Table Heading 2
+ Table Heading 3
+ Table Heading 4
+ Table Heading 5
+
+
+
+
+ Table Footer 1
+ Table Footer 2
+ Table Footer 3
+ Table Footer 4
+ Table Footer 5
+
+
+
+
+ Table Cell 1
+ Table Cell 2
+ Table Cell 3
+ Table Cell 4
+ Table Cell 5
+
+
+ Table Cell 1
+ Table Cell 2
+ Table Cell 3
+ Table Cell 4
+ Table Cell 5
+
+
+ Table Cell 1
+ Table Cell 2
+ Table Cell 3
+ Table Cell 4
+ Table Cell 5
+
+
+ Table Cell 1
+ Table Cell 2
+ Table Cell 3
+ Table Cell 4
+ Table Cell 5
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/08-media/_00-video.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/08-media/_00-video.twig
new file mode 100755
index 000000000..f28fcd7fc
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/08-media/_00-video.twig
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/00-atoms/08-media/_01-audio.twig b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/08-media/_01-audio.twig
new file mode 100755
index 000000000..91c82135e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/00-atoms/08-media/_01-audio.twig
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/00-byline.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/00-byline.twig
new file mode 100755
index 000000000..92c98e915
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/00-byline.twig
@@ -0,0 +1 @@
+by {{ author.first_name }} {{ author.last_name }}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/01-address.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/01-address.twig
new file mode 100755
index 000000000..a13ea79fc
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/01-address.twig
@@ -0,0 +1,11 @@
+
+
Company Name
+
+
1234 Main St.
+
Anywhere ,
+
101010 ,
+
CA
+
U.S.A
+
+
+1.888.123.4567
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/02-heading-group.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/02-heading-group.twig
new file mode 100755
index 000000000..bf18f5ac4
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/02-heading-group.twig
@@ -0,0 +1,4 @@
+
+
This is the heading group's main heading
+ This is the heading group's subheading
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/03-blockquote-with-citation.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/03-blockquote-with-citation.twig
new file mode 100755
index 000000000..b9b6c98fc
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/03-blockquote-with-citation.twig
@@ -0,0 +1,4 @@
+
+ A block quotation (also known as a long quotation or extract) is a quotation in a written document, that is set off from the main text as a paragraph, or block of text, and typically distinguished visually using indentation and a different typeface or smaller size quotation.
+ Quote Source
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/04-intro-text.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/04-intro-text.twig
new file mode 100755
index 000000000..b2b1bdef8
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/00-text/04-intro-text.twig
@@ -0,0 +1 @@
+The intro text may be a lead-in to the passage of text, or it may just be used to create a visual distinction between the rest of the passage of text.
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/00-one-up.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/00-one-up.twig
new file mode 100755
index 000000000..eb58a0e24
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/00-one-up.twig
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/01-two-up.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/01-two-up.twig
new file mode 100755
index 000000000..ff1553aee
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/01-two-up.twig
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/02-three-up.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/02-three-up.twig
new file mode 100755
index 000000000..d68fb4854
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/02-three-up.twig
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/03-four-up.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/03-four-up.twig
new file mode 100755
index 000000000..f7351c023
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/01-layout/03-four-up.twig
@@ -0,0 +1,9 @@
+
+
+
+
1/4
+
1/4
+
1/4
+
1/4
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/00-media-block.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/00-media-block.twig
new file mode 100755
index 000000000..30f3dd5ea
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/00-media-block.twig
@@ -0,0 +1,11 @@
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/01-block-headline-byline.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/01-block-headline-byline.twig
new file mode 100755
index 000000000..2faac3c02
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/01-block-headline-byline.twig
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/02-block-hero.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/02-block-hero.twig
new file mode 100755
index 000000000..f16575896
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/02-block-hero.twig
@@ -0,0 +1,10 @@
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/03-block-thumb-headline.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/03-block-thumb-headline.twig
new file mode 100755
index 000000000..5a86fa7f0
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/03-block-thumb-headline.twig
@@ -0,0 +1,10 @@
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/04-block-headline.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/04-block-headline.twig
new file mode 100755
index 000000000..5a32707f3
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/04-block-headline.twig
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/05-block-inset.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/05-block-inset.twig
new file mode 100755
index 000000000..f7e983ef2
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/02-blocks/05-block-inset.twig
@@ -0,0 +1,10 @@
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/03-media/00-figure-with-caption.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/03-media/00-figure-with-caption.twig
new file mode 100755
index 000000000..52d5c62d9
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/03-media/00-figure-with-caption.twig
@@ -0,0 +1,4 @@
+
+ {% include "@atoms/04-images/01-landscape-4x3.twig" %}
+ This is an example of an image with a caption. Photo captions, also known as cutlines, are a few lines of text used to explain or elaborate on published photographs.
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/00-search.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/00-search.twig
new file mode 100755
index 000000000..604b6125f
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/00-search.twig
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/01-comment-form.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/01-comment-form.twig
new file mode 100755
index 000000000..e4360727b
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/01-comment-form.twig
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/02-newsletter.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/02-newsletter.twig
new file mode 100755
index 000000000..041e2319e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/04-forms/02-newsletter.twig
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/00-primary-nav.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/00-primary-nav.twig
new file mode 100755
index 000000000..84942ffb7
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/00-primary-nav.twig
@@ -0,0 +1,8 @@
+
+
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/01-footer-nav.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/01-footer-nav.twig
new file mode 100755
index 000000000..d46a36b0c
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/01-footer-nav.twig
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/02-breadcrumbs.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/02-breadcrumbs.twig
new file mode 100755
index 000000000..3b5c15351
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/02-breadcrumbs.twig
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/03-pagination.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/03-pagination.twig
new file mode 100755
index 000000000..8b6de64a3
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/03-pagination.twig
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/04-tabs.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/04-tabs.twig
new file mode 100755
index 000000000..8e4ec10e2
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/05-navigation/04-tabs.twig
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/00-social-share.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/00-social-share.twig
new file mode 100755
index 000000000..120527d78
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/00-social-share.twig
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/01-accordion.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/01-accordion.twig
new file mode 100755
index 000000000..253962dcb
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/01-accordion.twig
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/02-single-comment.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/02-single-comment.twig
new file mode 100755
index 000000000..4566255a8
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/06-components/02-single-comment.twig
@@ -0,0 +1,9 @@
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/01-molecules/07-messaging/00-alert.twig b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/07-messaging/00-alert.twig
new file mode 100755
index 000000000..971484885
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/01-molecules/07-messaging/00-alert.twig
@@ -0,0 +1,3 @@
+
+ {{ excerpt.short }}
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/00-global/00-header.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/00-global/00-header.twig
new file mode 100755
index 000000000..706bd8d59
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/00-global/00-header.twig
@@ -0,0 +1,9 @@
+
+
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/00-global/01-footer.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/00-global/01-footer.twig
new file mode 100755
index 000000000..63f6fa5ef
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/00-global/01-footer.twig
@@ -0,0 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/01-article/00-article-body.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/01-article/00-article-body.twig
new file mode 100755
index 000000000..218bf5c2c
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/01-article/00-article-body.twig
@@ -0,0 +1,22 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer fringilla sem a urna porttitor fringilla. Nulla eget justo felis.
+
+Aliquam erat volutpat. Mauris vulputate scelerisque feugiat. Cras a erat a diam venenatis aliquam. Sed tempus, purus ac pretium varius, risus orci sagittis purus, quis auctor libero magna nec magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas eros dolor, rutrum eu sollicitudin eu, commodo at leo. Suspendisse potenti. Sed eu nibh sit amet quam auctor feugiat vel et risus. Maecenas eu urna adipiscing neque dictum mollis suscipit in augue. Praesent pulvinar condimentum sagittis. Maecenas laoreet neque non eros consectetur fringilla. Donec vitae risus leo, vitae pharetra ipsum. Sed placerat eros eget elit iaculis semper. Aliquam congue blandit orci ac pretium.
+
+{% include "@atoms/04-images/02-landscape-16x9.twig" %}
+
+Aliquam ultrices cursus mauris, eget volutpat justo mattis nec. Sed a orci turpis. Aliquam aliquet placerat dui, consectetur tincidunt leo tristique et. Vivamus enim nisi, blandit a venenatis quis, convallis et arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris libero sapien, placerat in sodales eu, tempor quis dui. Vivamus egestas faucibus pulvinar. Maecenas eget diam nunc. Phasellus at sem eros, ac suscipit neque. Phasellus sollicitudin libero a odio dignissim scelerisque. Aliquam purus nulla, tempor eget ullamcorper quis, rhoncus non dui.
+
+
+{% include "@atoms/02-text/02-blockquote.twig" %}
+
+Cras at fringilla ipsum. Donec nec libero eget est blandit dignissim a eu ante. Morbi augue nulla, luctus eu sagittis vel, malesuada ut felis. Aliquam erat volutpat. Morbi malesuada augue ac massa hendrerit fermentum. Integer scelerisque lacus a dolor convallis lobortis. Curabitur mollis ante in massa ultricies dignissim.
+
+
+{% include "@atoms/03-lists/00-unordered.twig" %}
+
+{% include "@atoms/03-lists/01-ordered.twig" %}
+
+Donec posuere fringilla nunc, vitae venenatis diam scelerisque vel. Nullam vitae mauris magna. Mauris et diam quis justo volutpat tincidunt congue nec magna. Curabitur vitae orci elit. Ut mollis massa id magna vestibulum consequat. Proin rutrum lectus justo, sit amet tincidunt est. Vivamus vitae lacinia risus.
+
+
+Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis, suscipit repellendus nulla accusantium deserunt sed explicabo voluptate sapiente ratione inventore molestiae nihil earum repellat quia odit vitae perspiciatis aliquam amet?
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/02-comments/00-comment-thread.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/02-comments/00-comment-thread.twig
new file mode 100755
index 000000000..f6d5a8c60
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/02-comments/00-comment-thread.twig
@@ -0,0 +1,12 @@
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/00-latest-posts.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/00-latest-posts.twig
new file mode 100755
index 000000000..c85c91804
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/00-latest-posts.twig
@@ -0,0 +1,9 @@
+
+ Latest Posts
+
+ {% for post in latest_posts %}
+ {% include "@molecules/02-blocks/00-media-block.twig" %}
+ {% endfor %}
+
+ View more posts
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/01-recent-tweets.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/01-recent-tweets.twig
new file mode 100755
index 000000000..d2d655305
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/01-recent-tweets.twig
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/02-related-posts.twig b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/02-related-posts.twig
new file mode 100755
index 000000000..b4a75cbed
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/02-organisms/03-sections/02-related-posts.twig
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/00-site.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/00-site.twig
new file mode 100755
index 000000000..18d596f1c
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/00-site.twig
@@ -0,0 +1,9 @@
+
+ {% include "@organisms/00-global/00-header.twig" %}
+
+ {% block hero %}{% endblock %}
+ {% block title %}{% endblock %}
+ {% block content %}{% endblock %}
+
+ {% include "@organisms/00-global/01-footer.twig" %}
+
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/01-page-1col.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/01-page-1col.twig
new file mode 100755
index 000000000..ad48b2f37
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/01-page-1col.twig
@@ -0,0 +1,10 @@
+{% extends "@templates/00-layouts/00-site.twig" %}
+{% block content %}
+
+
+ {% block main %}
+
Content Placeholder
+ {% endblock %}
+
+
+{% endblock %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/01-page-2col.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/01-page-2col.twig
new file mode 100755
index 000000000..802647d7a
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/00-layouts/01-page-2col.twig
@@ -0,0 +1,15 @@
+{% extends "@templates/00-layouts/00-site.twig" %}
+{% block content %}
+
+
+ {% block main %}
+
Content Placeholder
+ {% endblock %}
+
+
+
+{% endblock %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/01-homepage.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/01-homepage.twig
new file mode 100755
index 000000000..bf96fb39f
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/01-homepage.twig
@@ -0,0 +1,35 @@
+{% extends "@templates/00-layouts/01-page-2col.twig" %}
+{% block hero %}
+ {% if emergency %}
+ {% include "@molecules/07-messaging/00-alert.twig" with emergency %}
+ {% endif %}
+ {% if hero %}
+ {% include "@molecules/02-blocks/02-block-hero.twig" %}
+ {% endif %}
+
+
+ {% for tout in touts %}
+
+ {% include "@molecules/02-blocks/05-block-inset.twig" %}
+
+ {% endfor %}
+
+
+
+{% endblock %}
+
+{% block main %}
+
+ Latest Posts
+
+ {% for post in latest_posts %}
+ {% include "@molecules/02-blocks/00-media-block.twig" %}
+ {% endfor %}
+
+ View more posts
+
+{% endblock %}
+
+{% block sidebar %}
+ {% include "@organisms/03-sections/01-recent-tweets.twig" %}
+{% endblock %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/02-blog.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/02-blog.twig
new file mode 100755
index 000000000..6690bc73e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/02-blog.twig
@@ -0,0 +1,11 @@
+{% extends "@templates/00-layouts/00-site.twig" %}
+{% block title %}Our Outdoor Blog {% endblock %}
+
+{% block main %}
+ {% include "@organisms/03-sections/00-latest-posts.twig" %}
+ {% include "@molecules/05-navigation/03-pagination.twig" %}
+{% endblock %}
+
+{% block sidebar %}
+ {% include "@organisms/03-sections/01-recent-tweets.twig" %}
+{% endblock %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/03-article-2col.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/03-article-2col.twig
new file mode 100755
index 000000000..825ca9471
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/03-article-2col.twig
@@ -0,0 +1,17 @@
+{% extends "@templates/00-layouts/01-page-2col.twig" %}
+{% block main %}
+
+
+ Article Headline Lorem ipsum dolor sit aweofij
+ {% include "@molecules/00-text/00-byline.twig" %}
+
+ {% include "@organisms/01-article/00-article-body.twig" %}
+
+ {% include "@molecules/06-components/00-social-share.twig" %}
+ {% include "@organisms/02-comments/00-comment-thread.twig" %}
+{% endblock %}
+
+{% block sidebar %}
+ {% include "@organisms/03-sections/02-related-posts.twig" %}
+ {% include "@organisms/03-sections/01-recent-tweets.twig" %}
+{% endblock %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/03-templates/03-article.twig b/packages/starterkit-twig-demo/dist/_patterns/03-templates/03-article.twig
new file mode 100755
index 000000000..0b960e162
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/03-templates/03-article.twig
@@ -0,0 +1,12 @@
+{% extends "@templates/00-layouts/01-page-1col.twig" %}
+{% block main %}
+
+
+ Article Headline Lorem ipsum dolor sit aweofij
+ {% include "@molecules/00-text/00-byline.twig" %}
+
+ {% include "@organisms/01-article/00-article-body.twig" %}
+
+ {% include "@molecules/06-components/00-social-share.twig" %}
+ {% include "@organisms/02-comments/00-comment-thread.twig" %}
+{% endblock %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage.json b/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage.json
new file mode 100755
index 000000000..8a879bd07
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage.json
@@ -0,0 +1,135 @@
+{
+ "title" : "Home Page",
+ "bodyClass": "home",
+ "emergency" : false,
+ "hero" : [
+ {
+ "img": {
+ "landscape_16x9": {
+ "src": "../../images/sample/landscape-16x9-mountains.jpg",
+ "alt": "Mountains"
+ }
+ },
+ "headline" : {
+ "medium" : "Top 10 mountain ranges for hiking"
+ }
+ }
+ ],
+ "touts" : [
+ {
+ "img": {
+ "landscape_4x3": {
+ "src": "../../images/sample/tout-4x3-climber.jpg",
+ "alt": "Climber"
+ }
+ },
+ "headline" : {
+ "short" : "Extreme climbing tips"
+ }
+ },
+ {
+ "img": {
+ "landscape_4x3": {
+ "src": "../../images/sample/tout-4x3-stream.jpg",
+ "alt": "Stream hiking"
+ }
+ },
+ "headline" : {
+ "short" : "Stream hiking"
+ }
+ },
+ {
+ "img": {
+ "landscape_4x3": {
+ "src": "../../images/sample/tout-4x3-climbers.jpg",
+ "alt": "Explore hiking trails"
+ }
+ },
+ "headline" : {
+ "short" : "Explore hiking trails"
+ }
+ }
+ ],
+ "latest-posts" : [
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-river.jpg",
+ "alt": "Post Thumbnail"
+ }
+ },
+ "headline" : {
+ "short" : "Navigate the Allegheny River"
+ },
+ "excerpt" : {
+ "medium" : "The Allegheny River is a principal tributary of the Ohio River; it is located in the Eastern United States. The Allegheny River joins with the Monongahela River to form the Ohio River at the Point of Point State Park in Downtown Pittsburgh, Pennsylvania."
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-ivy.jpg",
+ "alt": "Ivy"
+ }
+ },
+ "headline" : {
+ "short" : "How to detect and avoid poison ivy"
+ },
+ "excerpt" : {
+ "medium" : "Toxicodendron radicans, commonly known as poison ivy is a poisonous North American plant that is well known for its production of urushiol"
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-yosemite.jpg",
+ "alt": "Yosemite"
+ }
+ },
+ "headline" : {
+ "short" : "Top 10 hiking mountains"
+ },
+ "excerpt" : {
+ "medium" : "Yosemite National Park is a United States National Park spanning eastern portions of Tuolumne, Mariposa and Madera counties in the central eastern portion of the U.S. state of California."
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-fire.jpg",
+ "alt": "Fire"
+ }
+ },
+ "headline" : {
+ "short" : "How to build a campfire"
+ },
+ "excerpt" : {
+ "medium" : "A campfire is a fire lit at a campsite, to serve the following functions: light, warmth, a beacon, an insect and/or apex predator deterrent, to cook, and for a psychological sense of security. "
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-gear.jpg",
+ "alt": "Camping Gear"
+ }
+ },
+ "headline" : {
+ "short" : "Pick the right camping gear"
+ },
+ "excerpt" : {
+ "medium" : "The equipment used in camping varies with the particular type of camping. For instance, in survival camping the equipment consists of small items which have the purpose of helping the camper in providing food, heat and safety."
+ }
+ }
+ ],
+ "inset-blocks" : [
+ {
+ "headline" : "This is the headline for the inset block"
+ }
+ ],
+ "latest-block" : [
+ {
+ "headline" : "This is the headline for the latest block"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage.twig b/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage.twig
new file mode 100755
index 000000000..41c4fe12a
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage.twig
@@ -0,0 +1 @@
+{% include "@templates/01-homepage.twig" %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage~emergency.json b/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage~emergency.json
new file mode 100755
index 000000000..14255064f
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/00-homepage~emergency.json
@@ -0,0 +1,8 @@
+{
+ "emergency": {
+ "styleModifier" : "error",
+ "excerpt" : {
+ "short" : "Emergency! This is a variation of the core homepage template."
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/01-blog.json b/packages/starterkit-twig-demo/dist/_patterns/04-pages/01-blog.json
new file mode 100755
index 000000000..c5067e3e7
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/01-blog.json
@@ -0,0 +1,86 @@
+{
+ "title" : "Blog",
+ "bodyClass": "blog",
+ "latest-posts" : [
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-river.jpg",
+ "alt": "Post Thumbnail"
+ }
+ },
+ "headline" : {
+ "short" : "Navigate the Allegheny River"
+ },
+ "excerpt" : {
+ "medium" : "The Allegheny River is a principal tributary of the Ohio River; it is located in the Eastern United States. The Allegheny River joins with the Monongahela River to form the Ohio River at the Point of Point State Park in Downtown Pittsburgh, Pennsylvania."
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-ivy.jpg",
+ "alt": "Ivy"
+ }
+ },
+ "headline" : {
+ "short" : "How to detect and avoid poison ivy"
+ },
+ "excerpt" : {
+ "medium" : "Toxicodendron radicans, commonly known as poison ivy is a poisonous North American plant that is well known for its production of urushiol"
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-yosemite.jpg",
+ "alt": "Yosemite"
+ }
+ },
+ "headline" : {
+ "short" : "Top 10 hiking mountains"
+ },
+ "excerpt" : {
+ "medium" : "Yosemite National Park is a United States National Park spanning eastern portions of Tuolumne, Mariposa and Madera counties in the central eastern portion of the U.S. state of California."
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-fire.jpg",
+ "alt": "Fire"
+ }
+ },
+ "headline" : {
+ "short" : "How to build a campfire"
+ },
+ "excerpt" : {
+ "medium" : "A campfire is a fire lit at a campsite, to serve the following functions: light, warmth, a beacon, an insect and/or apex predator deterrent, to cook, and for a psychological sense of security. "
+ }
+ },
+ {
+ "img": {
+ "square": {
+ "src": "../../images/sample/thumb-square-gear.jpg",
+ "alt": "Camping Gear"
+ }
+ },
+ "headline" : {
+ "short" : "Pick the right camping gear"
+ },
+ "excerpt" : {
+ "medium" : "The equipment used in camping varies with the particular type of camping. For instance, in survival camping the equipment consists of small items which have the purpose of helping the camper in providing food, heat and safety."
+ }
+ }
+ ],
+ "inset_blocks" : [
+ {
+ "headline" : "This is the headline for the inset block"
+ }
+ ],
+ "latest_block" : [
+ {
+ "headline" : "This is the headline for the latest block"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/01-blog.twig b/packages/starterkit-twig-demo/dist/_patterns/04-pages/01-blog.twig
new file mode 100755
index 000000000..89884f577
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/01-blog.twig
@@ -0,0 +1 @@
+{% include "@templates/02-blog.twig" %}
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/02-article.json b/packages/starterkit-twig-demo/dist/_patterns/04-pages/02-article.json
new file mode 100755
index 000000000..1d8574600
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/02-article.json
@@ -0,0 +1,28 @@
+{
+ "title" : "Top 10 Trails You Have To Hike Before You Die",
+ "bodyClass": "article",
+ "author" : {
+ "first-name" : "Julianne",
+ "last-name" : "McCormick"
+ },
+ "img": {
+ "landscape_4x3": {
+ "src": "../../images/sample/landscape-16x9-mountains.jpg",
+ "alt": "Mountains"
+ },
+ "landscape_16x9": {
+ "src": "../../images/sample/landscape-16x9-mountains.jpg",
+ "alt": "Mountains"
+ }
+ },
+ "inset_blocks" : [
+ {
+ "headline" : "This is the headline for the inset block"
+ }
+ ],
+ "latest_block" : [
+ {
+ "headline" : "This is the headline for the latest block"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/_patterns/04-pages/02-article.twig b/packages/starterkit-twig-demo/dist/_patterns/04-pages/02-article.twig
new file mode 100755
index 000000000..eb40c4bfd
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/_patterns/04-pages/02-article.twig
@@ -0,0 +1 @@
+{% include "@templates/03-article-2col.twig" %}
diff --git a/packages/starterkit-twig-demo/dist/css/pattern-scaffolding.css b/packages/starterkit-twig-demo/dist/css/pattern-scaffolding.css
new file mode 100755
index 000000000..b09172fc8
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/pattern-scaffolding.css
@@ -0,0 +1,54 @@
+/**
+ * This stylesheet is for styles you want to include only when displaying demo
+ * styles for grids, animations, color swatches, etc.
+ * These styles will not be your production CSS.
+ */
+#sg-patterns {
+ -webkit-box-sizing: border-box !important;
+ box-sizing: border-box !important;
+ max-width: 100%;
+ padding: 0 0.5em;
+}
+
+.demo-animate {
+ background: #ddd;
+ padding: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+ border-radius: 8px;
+ cursor: pointer;
+}
+
+.sg-colors {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ list-style: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sg-colors li {
+ -webkit-box-flex: 1;
+ -ms-flex: auto;
+ flex: auto;
+ padding: 0.3em;
+ margin: 0 0.5em 0.5em 0;
+ min-width: 5em;
+ max-width: 14em;
+ border: 1px solid #ddd;
+ border-radius: 8px;
+}
+
+.sg-swatch {
+ display: block;
+ height: 4em;
+ margin-bottom: 0.3em;
+ border-radius: 5px;
+}
+
+.sg-label {
+ font-size: 90%;
+ line-height: 1;
+}
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_animation.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_animation.scss
new file mode 100755
index 000000000..d28bc9136
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_animation.scss
@@ -0,0 +1,13 @@
+.animate-fade {
+ @include transition(opacity, 0.3s, ease-out);
+
+ &:hover {
+ opacity: 0;
+ }
+}
+
+.animate-move {
+ > .demo-shape {
+ @include transition(all, 0.8s, ease-in-out);
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_forms.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_forms.scss
new file mode 100755
index 000000000..1c02c6a83
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_forms.scss
@@ -0,0 +1,111 @@
+/*------------------------------------*\
+ $FORMS
+\*------------------------------------*/
+form ol, form ul {
+ list-style: none;
+ margin-left: 0;
+}
+
+fieldset {
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+label {
+ display: block;
+ padding-bottom: $space-half;
+}
+
+button, input, select, textarea {
+ font-family: inherit;
+ font-size: 100%;
+ margin: 0 1px 0;
+}
+
+input, textarea {
+ width: 100%;
+ border: 1px solid $gray;
+ padding: $pad-half 0.65rem;
+}
+
+input[type=text], input[type=search], input[type=url], input[type=number], textarea {
+ -webkit-appearance: none;
+}
+
+button, input[type="submit"] {
+ padding: $pad-half;
+ background: $gray-dark;
+ border: 1px solid $gray;
+ cursor: pointer;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ width: auto;
+ margin-right: 0.3em;
+}
+
+input[type="search"] {
+ -webkit-appearance: none;
+ border-radius: 0;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+//Form Field Container
+.field-container {
+ margin-bottom: $space;
+}
+
+.inline-form {
+ fieldset, .inline-container {
+ position: relative;
+ }
+
+ input[type=submit], button, .btn {
+ font-size: $font-size-small-2;
+ padding: 0.65rem 1.3rem;
+ background: $gray-dark;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1;
+ width: auto;
+
+ &:hover, &:focus {
+ background: $gray;
+ color: $white;
+ }
+ }
+}
+
+/* Validation */
+.has-error {
+ border-color: $error;
+}
+.is-valid {
+ border-color: $valid;
+}
+
+
+
+
+/*------------------------------------*\
+ $SPECIFIC FORMS
+\*------------------------------------*/
+
+/* Search Form */
+.search-field {
+ padding-right: 3em;
+}
+.inline-form .search-submit {
+ background: none;
+ padding: 0.78em 1em;
+ border: 0;
+ border-left: 1px solid $gray;
+ color: $gray;
+}
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_global-classes.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_global-classes.scss
new file mode 100755
index 000000000..2e13f8858
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_global-classes.scss
@@ -0,0 +1,104 @@
+/*------------------------------------*\
+ $GLOBAL CLASSES
+\*------------------------------------*/
+
+/* Clearfix */
+.cf {
+ *zoom: 1;
+}
+.cf:before, .cf:after {
+ content: " "; /* 1 */
+ display: table; /* 2 */
+}
+
+.cf:after {
+ clear: both;
+}
+
+/* Completely remove from the flow and screen readers. */
+.is-hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+/* Completely remove from the flow but leave available to screen readers. */
+.is-vishidden {
+ position: absolute !important;
+ overflow: hidden;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+}
+
+/* Floats */
+.right {
+ float: right;
+ padding: 0 0 $pad $pad;
+}
+
+.right-search {
+ float: right;
+ padding: 0 0 $pad 0;
+}
+
+.left {
+ float: left;
+ padding: 0 $pad $pad 0;
+}
+
+/* Text-Align */
+.align-right {
+ text-align: right;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-left {
+ text-align: left;
+}
+
+/* Display Classes */
+.hide-small {
+ @media all and (max-width: $bp-med) {
+ display: none;
+ }
+}
+
+.hide-med {
+ @media all and (min-width: $bp-med) and (max-width: $bp-large) {
+ display: none;
+ }
+}
+
+.hide-large {
+ @media all and (min-width: $bp-large) {
+ display: none;
+ }
+}
+
+//States
+.valid {
+ color: $valid;
+}
+
+.error {
+ color: $error;
+}
+
+.warning {
+ color: $warning;
+}
+
+.information {
+ color: $information;
+}
+
+.font-secondary {
+ font-family: $font-secondary;
+}
+
+
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_headings.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_headings.scss
new file mode 100755
index 000000000..5f2433645
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_headings.scss
@@ -0,0 +1,31 @@
+/* Headings */
+/*Further Reading: http:/csswizardry.com/2012/02/pragmatic-practical-font-sizing-in-css/ */
+h1, .alpha {
+ line-height: 1.2;
+}
+
+h2, .beta {
+ line-height: 1.2;
+}
+
+h3, .gamma {
+ line-height: 1.2;
+}
+
+h4, .delta {
+
+}
+
+h5, .epsilon {
+
+}
+
+h6, .zeta {
+
+}
+
+/* Subheadings */
+.subheading {
+ font-family: $font-secondary;
+ font-weight: normal;
+}
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_links.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_links.scss
new file mode 100755
index 000000000..d70545d76
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_links.scss
@@ -0,0 +1,10 @@
+/* Links */
+a {
+ color: $gray-dark;
+ text-decoration: none;
+ outline: 0;
+
+ &:hover, &:focus {
+ color: $gray;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_lists.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_lists.scss
new file mode 100755
index 000000000..4ceb7cf5c
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_lists.scss
@@ -0,0 +1,19 @@
+ol, ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+/* Definition Lists */
+dl {
+ overflow: hidden;
+ margin: 0 0 $space;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_main.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_main.scss
new file mode 100755
index 000000000..f92fd1b34
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_main.scss
@@ -0,0 +1,6 @@
+body {
+ background: $white;
+ font: 100%/1.5 $font;
+ -webkit-text-size-adjust: 100%;
+ color: $gray-dark;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_media.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_media.scss
new file mode 100755
index 000000000..ec74c8ffc
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_media.scss
@@ -0,0 +1,23 @@
+/*------------------------------------*\
+ $MEDIA ELEMENTS
+\*------------------------------------*/
+
+/* Flexible Media */
+img, video, object {
+ max-width: 100%;
+ height: auto;
+}
+
+iframe {
+ margin-bottom: $space;
+}
+
+figure {
+ margin-bottom: $space;
+ img {
+ margin-bottom: $space-half;
+ }
+}
+figcaption {
+ font-style: italic;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_tables.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_tables.scss
new file mode 100755
index 000000000..1b2a2b2c4
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_tables.scss
@@ -0,0 +1,18 @@
+/*------------------------------------*\
+ $Table
+\*------------------------------------*/
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px solid $gray;
+ width: 100%;
+}
+th {
+ text-align: left;
+ border: 1px solid $gray;
+ padding: 0.2em;
+}
+td {
+ border: 1px solid $gray;
+ padding: 0.2em;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/base/_text.scss b/packages/starterkit-twig-demo/dist/css/scss/base/_text.scss
new file mode 100755
index 000000000..de17e3ec6
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/base/_text.scss
@@ -0,0 +1,26 @@
+/* Text-Related Elements */
+p {
+ margin-bottom: $space;
+}
+
+/* Blockquote */
+blockquote {
+ font-style:italic;
+ border-left: 1px solid $gray;
+ color: $gray;
+ padding-left: $pad;
+ margin-bottom: $space;
+}
+
+/* Horizontal Rule */
+hr {
+ border: 0;
+ height: 2px;
+ background: $gray-light-2;
+ margin: $space-double 0;
+}
+
+abbr {
+ border-bottom: 1px dotted $gray;
+ cursor: help;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/generic/_mixins.scss b/packages/starterkit-twig-demo/dist/css/scss/generic/_mixins.scss
new file mode 100755
index 000000000..14d8a2a3d
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/generic/_mixins.scss
@@ -0,0 +1,23 @@
+/*------------------------------------*\
+ $MIXINS
+\*------------------------------------*/
+
+/* CSS Transition
+ Usage: @include transition(width,0.3s,ease-out);
+ */
+@mixin transition($transition-property, $transition-time, $method) {
+ -webkit-transition: $transition-property $transition-time $method;
+ -moz-transition: $transition-property $transition-time $method;
+ -ms-transition: $transition-property $transition-time $method;
+ -o-transition: $transition-property $transition-time $method;
+ transition: $transition-property $transition-time $method;
+}
+
+/* Rem Unit font sizes with relative fallback http:/seesparkbox.com/foundry/scss_rem_mixin_now_with_a_better_fallback
+ Usage: @include font-size(1, large);
+*/
+@mixin font-size( $decimal-size, $keyword: null ) {
+ @if $keyword{ font-size: $keyword; }
+ @else { font-size: $decimal-size * $base-font-multiplier * 16px;}
+ font-size: $decimal-size * 1rem;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/generic/_reset.scss b/packages/starterkit-twig-demo/dist/css/scss/generic/_reset.scss
new file mode 100755
index 000000000..e7807ec72
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/generic/_reset.scss
@@ -0,0 +1,17 @@
+/*------------------------------------*\
+ $RESET
+\*------------------------------------*/
+
+/* Border-Box http:/paulirish.com/2012/box-sizing-border-box-ftw/ */
+* {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+html, body, div, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ol, ul, li, form, legend, label, table, header, footer, nav, section, figure {
+ margin: 0;
+ padding: 0;
+}
+header, footer, nav, section, article, hgroup, figure {
+ display: block;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/generic/_variables.scss b/packages/starterkit-twig-demo/dist/css/scss/generic/_variables.scss
new file mode 100755
index 000000000..3e7ccbcba
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/generic/_variables.scss
@@ -0,0 +1,65 @@
+/*------------------------------------*\
+ $VARIABLES
+\*------------------------------------*/
+
+//Colors
+$gray : #808080;
+$gray-light : #f9f9f9;
+$gray-light-2 : #eee;
+$gray-light-3 : #ddd;
+$gray-med : #666;
+$gray-dark : #333;
+$gray-dark-2 : #131313;
+$white : #fff;
+$black : #000;
+$dim : rgba(0,0,0,0.5);
+$error : #f00;
+$valid : #089e00;
+$warning : #fff664;
+$information : #000db5;
+
+
+//Typography
+$font : "HelveticaNeue", "Helvetica", "Arial", sans-serif;
+$font-secondary : Georgia, Times, "Times New Roman", serif;
+
+$font-size-small : 0.75em;
+$font-size-small-2 : 0.875em;
+$font-size-med : 1em;
+$font-size-med-2: 1.0625em;
+$font-size-large : 1.4375em;
+
+
+//Layout
+$max-width: 72em;
+
+//Defaults
+$space : 1em;
+$space-and-half : $space*1.5;
+$space-double : $space*2;
+$space-quad : $space*4;
+$space-half : $space/2;
+$pad : 1em;
+$pad-and-half : $pad*1.5;
+$pad-double : $pad*2;
+$pad-half : $pad/2;
+$pad-quarter :$pad/4;
+
+//Borders
+$border-med: 3px;
+$border-thick: 7px;
+
+
+//Breakpoints
+$bp-small : 24em;
+$bp-small-2 : 29.75em;
+$bp-small-3 : 39.8em;
+$bp-med : 46.8em;
+$bp-med-2 : 48em;
+$bp-large : 50em;
+$bp-large-2 : 66em;
+$bp-xl : 73em;
+$bp-xxl : 89em;
+$bp-xxxl : 93em;
+
+//
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_accordion.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_accordion.scss
new file mode 100755
index 000000000..3423544c9
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_accordion.scss
@@ -0,0 +1,33 @@
+.accordion {
+ margin-bottom: $space;
+}
+
+.acc-handle {
+ background: $gray-dark-2;
+ color: $white;
+ font-family: $font-secondary;
+ font-weight: bold;
+ display: block;
+ position: relative;
+ padding: $pad-half;
+ border-bottom: 1px solid $gray-light-3;
+
+ &:after {
+ content:"+";
+ float: right;
+ }
+
+ &:hover {
+ color: $white;
+ background: $gray-dark;
+
+ }
+
+ &.active {
+ background: $gray-dark;
+
+ &:after {
+ content:"-";
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_article.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_article.scss
new file mode 100755
index 000000000..55387309e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_article.scss
@@ -0,0 +1,34 @@
+//Article
+.article-header {
+ h1 {
+ font-size: 2.5em;
+ }
+}
+
+.byline {
+ font-size: $font-size-small-2;
+ font-style: italic;
+ margin-bottom: $space-half;
+}
+
+//Social Share
+.social-share {
+ overflow: hidden;
+ margin-bottom: $space;
+
+ li {
+ float: left;
+ margin-right: $space-half;
+ }
+
+ a {
+ background: $gray-dark;
+ color: $white;
+ display: block;
+ padding: $pad-half;
+
+ &:hover {
+ background: $gray;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_blocks.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_blocks.scss
new file mode 100755
index 000000000..160963bd6
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_blocks.scss
@@ -0,0 +1,138 @@
+/* Generic Placeholder Brick: REMOVE FOR PRODUCTION */
+.brick {
+ background: #dcdddc;
+ padding: $pad-double;
+ text-align: center;
+ font-weight: bold;
+ border-bottom: 1px solid $gray-light-2;
+}
+
+/* Block */
+.block {
+ overflow: hidden;
+
+ p:last-child {
+ margin-bottom: 0;
+ }
+}
+
+.headline {
+ line-height: 1.2;
+}
+
+/* Hero Block */
+.block-hero {
+ margin-bottom: $space-half;
+
+ .b-thumb {
+ img {
+ display: block;
+ }
+ }
+
+ @media all and (min-width: $bp-large) {
+ position: relative;
+
+ .b-text {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ background: $dim;
+ color: $white;
+ padding: $pad-and-half;
+ }
+ }
+}
+
+/* Block Thumbnail with Headline */
+.block-thumb {
+ display: table;
+ width: 100%;
+ border-collapse: collapse;
+
+ .b-inner {
+ display: table-row;
+ vertical-align: top;
+ overflow: hidden;
+ }
+
+ .b-thumb {
+ @media all and (min-width: $bp-small-2) {
+ display: table-cell;
+ vertical-align: top;
+ width: 30%;
+ max-width: 10em;
+
+ img {
+ display: block;
+ width: 100%;
+ height: auto;
+ }
+ }
+ }
+
+ .b-text {
+ @media all and (min-width: $bp-small-2) {
+ display: table-cell;
+ width: 70%;
+ padding: 0 $pad;
+ }
+ }
+}
+
+
+/* Block Headline Summary */
+.block-headline-summary {
+ a {
+ display: block;
+ padding: $pad-half;
+ }
+}
+
+/* Block Inset */
+.block-inset {
+ position: relative;
+
+ .b-thumb {
+ position: relative;
+ z-index: 0;
+
+ img {
+ display: block;
+ }
+ }
+}
+
+/* Hero Block */
+.block-inset {
+ margin-bottom: $space-half;
+ position: relative;
+
+ .headline {
+ font-size: 1.1em;
+ }
+
+ .b-text {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ background: $dim;
+ color: $white;
+ padding: $pad-half;
+ }
+}
+
+/* Block Thumb with Summary */
+.block-thumb-summary {
+ .b-thumb {
+ float: left;
+ width: 50%;
+ }
+
+ .b-text {
+ margin-left: 50%;
+ padding: $pad-half;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_buttons.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_buttons.scss
new file mode 100755
index 000000000..0ae2805e1
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_buttons.scss
@@ -0,0 +1,40 @@
+/*------------------------------------*\
+ $BUTTONS
+\*------------------------------------*/
+.btn {
+ display: inline-block;
+ background: $gray-dark;
+ color: $white;
+ line-height: 1;
+ font-weight: bold;
+ padding: $pad;
+ border: 0;
+ text-align: center;
+
+ &:hover, &:focus {
+ background: $gray;
+ color: $white;
+ }
+
+ &.disabled {
+ background: $gray-light-2;
+ color: $gray;
+ }
+}
+
+.btn-small {
+ padding: $pad-half;
+}
+
+.btn-large {
+ padding: $pad-half;
+ text-transform: uppercase;
+ background: $gray;
+ font-size: 1.4rem;
+ font-weight: normal;
+}
+
+
+.text-btn {
+ font-style: italic;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_carousels.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_carousels.scss
new file mode 100755
index 000000000..77e3f197b
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_carousels.scss
@@ -0,0 +1,38 @@
+/* Horizontal Carousel */
+.carousel-horizontal {
+ margin-bottom: $space;
+ overflow: hidden;
+ position: relative;
+}
+
+.carousel-island-container {
+ overflow: hidden;
+}
+
+.carousel-container {
+ position: relative;
+}
+
+.carousel-list {
+
+}
+
+.carousel-controls {
+ display: table;
+ width: 100%;
+ margin: (-$space-half) 0 $space;
+
+ a, div {
+ display: table-cell;
+ padding: $pad-half;
+ }
+
+ .carousel-pagination {
+ text-align: center;
+ }
+
+ .carousel-next {
+ text-align: right;
+ }
+
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_comments.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_comments.scss
new file mode 100755
index 000000000..9959b7abf
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_comments.scss
@@ -0,0 +1,30 @@
+.comments {
+ li {
+ margin-bottom: $space;
+ }
+}
+
+.comment-container {
+ overflow: hidden;
+ margin-bottom: $space;
+ list-style: none;
+}
+
+.comment-meta {
+ float: left;
+ width: 6.5em;
+
+ img {
+ display: block;
+ border: 1px solid $gray-light-2;
+ margin-bottom: $space-half;
+ }
+}
+
+.comment-name {
+ font-size: $font-size-small;
+}
+
+.comment-text {
+ margin-left: 9em;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_footer.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_footer.scss
new file mode 100755
index 000000000..850f94bf4
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_footer.scss
@@ -0,0 +1,39 @@
+/*------------------------------------*\
+ $FOOTER
+\*------------------------------------*/
+.footer {
+ clear: both;
+ overflow: hidden;
+ background: $gray-dark-2;
+ color: $white;
+ line-height: 1.2;
+
+ a {
+ color: $gray-light;
+ }
+}
+
+//Footer Nav
+.nav-footer {
+ margin: (-$pad) (-$pad) $space;
+
+ li {
+ border-bottom: 1px solid $gray-dark;
+
+ @media all and (min-width: $bp-med) {
+ border: 0;
+ float: left;
+ }
+ }
+
+ a {
+ display: block;
+ padding: $pad;
+ }
+}
+
+.copyright {
+ @media all and (min-width: $bp-med) {
+ float: right;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_header.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_header.scss
new file mode 100755
index 000000000..8fb78d7ce
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_header.scss
@@ -0,0 +1,45 @@
+.header {
+ background: $white;
+ padding: 0;
+ border-bottom: 1px solid #dbdbdb;
+ @extend .lc;
+}
+
+.logo {
+ float: left;
+ max-width: 8rem;
+ margin: 0.4rem;
+
+ @media all and (min-width: $bp-med) {
+ max-width: 9rem;
+ }
+}
+
+.nav-toggle {
+ float: right;
+ display: block;
+ padding: 0.9rem 1rem 0.7rem;
+ font-size: 1.3rem;
+ line-height: 1;
+ border-left: 1px solid #dbdbdb;
+
+ @media all and (min-width: $bp-med) {
+ display: none;
+ }
+
+ @media all and (max-width: 17em) {
+ padding-left: 0.2rem;
+ padding-right: 0.2rem;
+ }
+}
+
+.search-form {
+ overflow: hidden;
+ max-height: 0;
+
+ @media all and (min-width: $bp-med) {
+ float: right;
+ max-height: none;
+ margin: 0.65em 0.5em 0 0;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_icons.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_icons.scss
new file mode 100755
index 000000000..cacbf1fbd
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_icons.scss
@@ -0,0 +1,125 @@
+
+/* Icon Font */
+@font-face {
+ font-family: 'icons';
+ src:url('../fonts/icons.eot');
+ src:url('../fonts/icons.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/icons.woff') format('woff'),
+ url('../fonts/icons.ttf') format('truetype'),
+ url('../fonts/icons.svg#icons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* Use the following CSS code if you want to use data attributes for inserting your icons */
+[data-icon]:before {
+ font-family: 'icons';
+ content: attr(data-icon);
+ speak: none;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+}
+
+.icon-twitter:before, .icon-stumbleupon:before, .icon-pinterest:before, .icon-linkedin:before, .icon-google-plus:before, .icon-search:before, .icon-play:before, .icon-menu:before, .icon-arrow-left:before, .icon-arrow-right:before, .icon-bubble:before, .icon-facebook:before, .icon-feed:before, .icon-youtube:before, .icon-tag:before, .icon-tumblr:before, .icon-instagram, .icon-podcast, .icon-apple,.icon-android, .icon-arrow:after, .icon-envelope:before {
+ font-family: 'icons';
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+}
+.icon-twitter:before {
+ content: "\74";
+}
+.icon-stumbleupon:before {
+ content: "\75";
+}
+.icon-pinterest:before {
+ content: "\70";
+}
+.icon-linkedin:before {
+ content: "\69";
+}
+.icon-google-plus:before {
+ content: "\67";
+}
+.icon-search:before {
+ content: "\73";
+}
+.icon-play:before {
+ content: "\61";
+}
+.icon-menu:before {
+ content: "\21";
+}
+.icon-arrow-left:before {
+ content: "\23";
+}
+.icon-arrow-right:before {
+ content: "\24";
+}
+.icon-bubble:before {
+ content: "\25";
+}
+.icon-facebook:before {
+ content: "\66";
+}
+.icon-feed:before {
+ content: "\27";
+}
+.icon-youtube:before {
+ content: "\79";
+}
+.icon-tag:before {
+ content: "\28";
+}
+.icon-tumblr:before {
+ content: "\6d";
+}
+.icon-instagram:before {
+ content: "\22";
+}
+.icon-podcast:before {
+ content: "\26";
+}
+.icon-android:before {
+ content: "\29";
+}
+.icon-apple:before {
+ content: "\2a";
+}
+.icon-envelope:before {
+ content: "\2b";
+}
+
+
+.icon-arrow:after {
+ content: "\61";
+ display: inline-block;
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+
+.icon-play:before {
+ font-size: 0.7rem;
+ padding-left: 0.2em;
+}
+
+.icon-play-box {
+ display: block;
+ margin-left: $pad-double;
+}
+
+.icon-play-box:before {
+ padding: $pad-quarter;
+ background: $gray;
+ color: $white;
+ margin-left: -1.7rem;
+ margin-right: $pad-half;
+}
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_layout.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_layout.scss
new file mode 100755
index 000000000..4929d28e3
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_layout.scss
@@ -0,0 +1,288 @@
+/*------------------------------------*\
+ $LAYOUT
+\*------------------------------------*/
+
+/* Layout Container */
+.lc {
+ max-width: $max-width;
+ margin: 0 auto;
+ padding: $pad-half;
+}
+
+/*------------------------------------*\
+ $TEMPLATES
+\*------------------------------------*/
+
+/* Two Column Layout */
+.l-two-col {
+ @extend .cf;
+
+ .l-main {
+ @media all and (min-width: $bp-large) {
+ float: left;
+ width: 70%;
+ padding-right: $pad;
+ }
+ }
+
+ .l-sidebar {
+ @media all and (max-width: $bp-large) {
+ clear: both;
+ }
+
+ @media all and (min-width: $bp-large) {
+ float: left;
+ width: 30%;
+ padding: 0 0 0 $pad;
+ }
+ }
+}
+
+
+/*------------------------------------*\
+ $GRIDS
+\*------------------------------------*/
+
+/* Grid Container */
+.g {
+ overflow: hidden;
+ margin: 0 (-$pad-half);
+}
+
+/* Grid Item */
+.gi {
+ padding: $pad-half;
+
+ img {
+ display: block;
+ }
+
+ @media all and (min-width: $bp-med) {
+ float: left;
+ }
+}
+
+/* Grid 1up */
+.g-1up {
+ .gi {
+ width: 100%;
+ }
+}
+
+/* Grid 2up */
+.g-2up {
+ @media all and (min-width: $bp-med) {
+ > .gi {
+ float: left;
+ width: 50%;
+
+ &:nth-of-type(odd) {
+ clear: left;
+ }
+ }
+ }
+}
+
+/* Grid Half (Always displayed side by side) */
+.g-half {
+ > .gi {
+ float: left;
+ width: 50%;
+
+ &:nth-of-type(odd) {
+ clear: left;
+ }
+ }
+}
+
+/* Grid 3up */
+.g-3up {
+ @media all and (min-width: $bp-med) {
+ > .gi {
+ float: left;
+ width: 50%;
+
+ &:nth-of-type(2n+1) {
+ clear: left;
+ }
+ }
+ }
+
+ @media all and (min-width: $bp-large) {
+ > .gi {
+ width: 33.3333333%;
+
+ &:nth-of-type(2n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(3n+1) {
+ clear: left;
+ }
+ }
+ }
+}
+
+/* Grid 4up */
+.g-4up {
+ @media all and (min-width: $bp-med) {
+ >.gi {
+ float: left;
+ width: 50%;
+
+ &:nth-of-type(2n+1) {
+ clear: both;
+ }
+ }
+ }
+
+ @media all and (min-width: $bp-large) {
+ >.gi {
+ width: 25%;
+
+ &:nth-of-type(2n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(4n+1) {
+ clear: left;
+ }
+ }
+ }
+}
+
+/* Grid Quarter (Always displayed side by side) */
+.g-quarter {
+ > .gi {
+ float: left;
+ width: 24%;
+
+ &:nth-of-type(4n+1) {
+ clear: left;
+ }
+ }
+}
+
+.g-max4 {
+
+ @media all and (min-width: $bp-small-2) {
+ >.gi {
+ float: left;
+ width: 50%;
+
+ &:nth-of-type(2n+1) {
+ clear: both;
+ }
+ }
+ }
+
+ @media all and (min-width: $bp-small-3) {
+ >.gi {
+ width: 33.3333333%;
+
+ &:nth-of-type(2n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(3n+1) {
+ clear: left;
+ }
+ }
+ }
+
+ @media all and (min-width: $bp-large) {
+ >.gi {
+ width: 25%;
+
+ &:nth-of-type(3n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(4n+1) {
+ clear: left;
+ }
+ }
+ }
+}
+
+/* Grid 5up */
+.g-max5 {
+
+ >.gi {
+ float: left;
+ width: 50%;
+
+ &:nth-of-type(2n+1) {
+ clear: both;
+ }
+ }
+
+ @media all and (min-width: $bp-small-3) {
+ >.gi {
+ width: 33.3333333%;
+
+ &:nth-of-type(2n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(3n+1) {
+ clear: left;
+ }
+ }
+ }
+
+ @media all and (min-width: $bp-med) {
+ >.gi {
+ width: 25%;
+
+ &:nth-of-type(3n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(4n+1) {
+ clear: left;
+ }
+ }
+ }
+
+ @media all and (min-width: $bp-med-2) {
+ >.gi {
+ width: 20%;
+
+ &:nth-of-type(4n+1) {
+ clear: none;
+ }
+
+ &:nth-of-type(5n+1) {
+ clear: left;
+ }
+ }
+ }
+}
+
+/* Grid 2/3 */
+.gi-2-3 {
+ @media all and (min-width: $bp-med) {
+ float: left;
+ width: 66.666666%;
+ }
+}
+
+.gi-1-3 {
+ @media all and (min-width: $bp-med) {
+ float: left;
+ width: 33.333333%;
+ }
+}
+
+/* Grid 4up block */
+.g-opposites {
+ .gi {
+ float: left;
+
+ &:last-child {
+ float: right;
+ text-align: right;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_lists.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_lists.scss
new file mode 100755
index 000000000..0c4e8beaa
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_lists.scss
@@ -0,0 +1,63 @@
+.inline-list {
+ li {
+ display: inline-block;
+ }
+}
+
+/* Social List */
+.social-list {
+ li {
+ margin: 0 0.4rem $space 0;
+ }
+
+ a {
+ font-size: 1.6em;
+ }
+}
+
+
+/* Headline List */
+.headline-list {
+ margin-bottom: $space;
+
+ &.flush {
+ margin: 0;
+ }
+
+ h4 {
+ font-weight: normal;
+ }
+
+ li {
+ padding: $pad-quarter 0;
+ border-top: 1px solid $gray-light-3;
+ }
+}
+
+/* Post List */
+.post-list {
+ li {
+ margin-bottom: $space;
+ }
+}
+
+/* Bullet List */
+.bullet-list {
+ list-style: square;
+ margin: 0 0 1em 1.2em;
+ line-height: 1.3;
+
+ li {
+ margin-bottom: $space;
+ }
+}
+
+/* Text List */
+.text-list {
+ margin: 0 0 1em;
+ line-height: 1.3;
+
+ li {
+ margin-bottom: $space;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_main.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_main.scss
new file mode 100755
index 000000000..592c01dea
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_main.scss
@@ -0,0 +1,9 @@
+/*------------------------------------*\
+ $MAIN CONTENT AREA
+\*------------------------------------*/
+[role=main] {
+ padding: $pad-half $pad-half $pad-double;
+ overflow: hidden;
+ @extend .lc;
+ @extend .cf;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_messaging.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_messaging.scss
new file mode 100755
index 000000000..a2d31a92e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_messaging.scss
@@ -0,0 +1,18 @@
+/*------------------------------------*\
+ $MESSAGING
+\*------------------------------------*/
+
+// Alerts
+.alert {
+ text-align: center;
+ padding: $pad;
+ margin-bottom: $space-half;
+ border: 1px solid $gray;
+ background: $gray-light;
+}
+
+.alert-error {
+ color: $error;
+ border-color: $error;
+ background: #ffbebe;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_nav.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_nav.scss
new file mode 100755
index 000000000..b98e3300e
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_nav.scss
@@ -0,0 +1,52 @@
+/*------------------------------------*\
+ $NAVIGATION
+\*------------------------------------*/
+
+.nav {
+ clear: both;
+ overflow: hidden;
+ max-height: 0;
+
+ a {
+ display: block;
+ padding: $pad;
+ border-top: 1px solid $gray-light-2;
+ }
+
+ &.active {
+ max-height: 40em;
+ }
+
+ @media all and (min-width: $bp-med) {
+ max-height: none;
+ float: right;
+ clear: none;
+
+ li {
+ float: left;
+ }
+
+ a {
+ border: 0;
+ }
+
+ }
+}
+
+//Pagination
+.pagination {
+ overflow: hidden;
+
+ li {
+ float: left;
+ border-right: 1px solid $gray-light-2;
+
+ &:last-child {
+ border: 0;
+ }
+ }
+
+ a {
+ padding: $pad;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_sections.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_sections.scss
new file mode 100755
index 000000000..7235af263
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_sections.scss
@@ -0,0 +1,7 @@
+.section {
+ margin: 0 0 $space;
+}
+
+.section-title {
+ margin-bottom: $space-half;
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_tabs.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_tabs.scss
new file mode 100755
index 000000000..b22ca7438
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_tabs.scss
@@ -0,0 +1,33 @@
+.tabs {
+ overflow: hidden;
+
+ ul {
+ display: table;
+ width: 100%;
+ }
+
+ li {
+ display: table-cell;
+ text-align: center;
+ border-right: 1px solid $gray-light-3;
+
+ &:last-child {
+ border-right: 0;
+ }
+ }
+
+ a {
+ display: block;
+ padding: $pad-half;
+ background: $gray;
+
+ &:hover, &:focus {
+ background: $gray-light-3;
+ }
+
+ &.active {
+ background: $gray-dark;
+ color: $white;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_text.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_text.scss
new file mode 100755
index 000000000..d645f5646
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_text.scss
@@ -0,0 +1,41 @@
+//Intro text
+.intro {
+ font-size: $font-size-med-2;
+ font-weight: bold;
+}
+
+//Pullquote
+.pullquote {
+ font-family: $font-secondary;
+ font-size: $font-size-large;
+}
+
+//Caption
+.caption {
+ font-style: italic;
+}
+
+//Passages of text
+.text {
+ a {
+ text-decoration: underline;
+ }
+
+ ul {
+ list-style: disc;
+ margin: 0 0 $space 1.2em;
+
+ ul {
+ margin-bottom: 0;
+ }
+ }
+
+ ol {
+ list-style: decimal;
+ margin: 0 0 $space 1.5em;
+
+ ol {
+ margin-bottom: 0;
+ }
+ }
+}
diff --git a/packages/starterkit-twig-demo/dist/css/scss/objects/_tooltip.scss b/packages/starterkit-twig-demo/dist/css/scss/objects/_tooltip.scss
new file mode 100755
index 000000000..e0fdd95da
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/scss/objects/_tooltip.scss
@@ -0,0 +1,42 @@
+.tooltip-container {
+ display: inline-block;
+ position: relative;
+
+ &:hover {
+ .tooltip {
+ display: block;
+ }
+ }
+}
+
+.tooltip-link {
+ background: $gray-light;
+}
+
+.tooltip {
+ display: none;
+ position: absolute;
+ top: 1.5em;
+ left: 0;
+ width: 18em;
+ padding: $pad;
+ background: $white;
+ border: 1px solid $gray;
+ box-shadow: 0.3em 0.3em 1em 0 rgba(0,0,0,0.2);
+
+ h2 {
+ margin-top: 0;
+ }
+
+ @media all and (min-width: $bp-small) {
+ width: 22em;
+ }
+
+ @media all and (min-width: $bp-small-2) {
+ width: 27em;
+ }
+
+ @media all and (min-width: $bp-small-3) {
+ width: 30em;
+ }
+}
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/css/style.css b/packages/starterkit-twig-demo/dist/css/style.css
new file mode 100755
index 000000000..e176c1aae
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/style.css
@@ -0,0 +1,1481 @@
+/*
+ ,, ,, ,,
+ .M"""bgd mm db `7MM mm mm `7MM OO OO OO
+,MI "Y MM MM MM MM MM 88 88 88
+`MMb. mmMMmm ,pW"Wq.`7MMpdMAo. `7Mb,od8 `7MM .P"Ybmmm MMpMMMb.mmMMmm mmMMmm MMpMMMb. .gP"Ya `7Mb,od8 .gP"Ya || || ||
+ `YMMNq. MM 6W' `Wb MM `Wb MM' "' MM :MI I8 MM MM MM MM MM MM ,M' Yb MM' "',M' Yb || || ||
+. `MM MM 8M M8 MM M8 MM MM WmmmP" MM MM MM MM MM MM 8M"""""" MM 8M"""""" `' `' `'
+Mb dM MM YA. ,A9 MM ,AP MM MM 8M MM MM MM MM MM MM YM. , MM YM. , ,, ,, ,,
+P"Ybmmd" `Mbmo`Ybmd9' MMbmmd' .JMML. .JMML.YMMMMMb .JMML JMML.`Mbmo `Mbmo.JMML JMML.`Mbmmd'.JMML. `Mbmmd' db db db
+ MM 6' dP
+ .JMML. Ybmmmd'
+
+Pattern Lab doesn't have any CSS requirements, which means you can write your styles however you want. Hooray!
+You can use Sass, Less, vanilla CSS, or some other crazy thing I haven't heard of yet.
+So please don't use these styles. They're just here to put together the demo, and nothing more.
+They're intentionally gray, boring, and crappy because you're supposed to do this stuff yourself.
+
+Atomic design is philosophically complimentary with these CSS approaches:
+
+* SMACSS by Jonathan Snook http://smacss.com/
+* OOCSS by Nicole Sullivan http://oocss.org/
+* BEM CSS Methology : http://bem.info/method/
+* CSS Guidelines by Harry Roberts : https://cssguidelin.es/
+
+So feel free to use any of these approaches. Or don't. It's totally up to you.
+
+*/
+/*------------------------------------*\
+ $TABLE OF CONTENTS
+ based generally on Harry Roberts excellent CSS Guidelines https://cssguidelin.es/
+\*------------------------------------*/
+/**
+ * VARIABLES..............................Declarations of Sass variables
+ * .....Colors
+ * .....Typography
+ * .....Layout
+ * .....Defaults
+ * .....Breakpoints
+ * MIXINS.................................Sass mixins
+ * RESET..................................Set reset defaults
+ * GLOBAL CLASSES.........................Set reset defaults
+ * GLOBAL ELEMENTS........................Establish global styles
+ * .....Main
+ * .....Headings
+ * .....Text-related elements (p, blockquote, lists)
+ * .....Defaults
+ * .....Breakpoints
+ * TYPOGRAPHY------------------------------
+ * MEDIA------------------------------
+ * LAYOUT------------------------------
+ * NAVIGATION------------------------------
+ * TOC To Be Continued
+ */
+/*------------------------------------*\
+ $VARIABLES
+\*------------------------------------*/
+/*------------------------------------*\
+ $MIXINS
+\*------------------------------------*/
+/* CSS Transition
+ Usage: @include transition(width,0.3s,ease-out);
+ */
+/* Rem Unit font sizes with relative fallback http:/seesparkbox.com/foundry/scss_rem_mixin_now_with_a_better_fallback
+ Usage: @include font-size(1, large);
+*/
+/*------------------------------------*\
+ $RESET
+\*------------------------------------*/
+/* Border-Box http:/paulirish.com/2012/box-sizing-border-box-ftw/ */
+* {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+html,
+body,
+div,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+ol,
+ul,
+li,
+form,
+legend,
+label,
+table,
+header,
+footer,
+nav,
+section,
+figure {
+ margin: 0;
+ padding: 0;
+}
+
+header,
+footer,
+nav,
+section,
+article,
+hgroup,
+figure {
+ display: block;
+}
+
+/*------------------------------------*\
+ $GLOBAL ELEMENTS
+\*------------------------------------*/
+/*------------------------------------*\
+ $GLOBAL CLASSES
+\*------------------------------------*/
+/* Clearfix */
+.cf,
+.l-two-col,
+[role='main'] {
+ *zoom: 1;
+}
+
+.cf:before,
+.l-two-col:before,
+[role='main']:before,
+.cf:after,
+.l-two-col:after,
+[role='main']:after {
+ content: ' ';
+ /* 1 */
+ display: table;
+ /* 2 */
+}
+
+.cf:after,
+.l-two-col:after,
+[role='main']:after {
+ clear: both;
+}
+
+/* Completely remove from the flow and screen readers. */
+.is-hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+/* Completely remove from the flow but leave available to screen readers. */
+.is-vishidden {
+ position: absolute !important;
+ overflow: hidden;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+}
+
+/* Floats */
+.right {
+ float: right;
+ padding: 0 0 1em 1em;
+}
+
+.right-search {
+ float: right;
+ padding: 0 0 1em 0;
+}
+
+.left {
+ float: left;
+ padding: 0 1em 1em 0;
+}
+
+/* Text-Align */
+.align-right {
+ text-align: right;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-left {
+ text-align: left;
+}
+
+/* Display Classes */
+@media all and (max-width: 46.8em) {
+ .hide-small {
+ display: none;
+ }
+}
+
+@media all and (min-width: 46.8em) and (max-width: 50em) {
+ .hide-med {
+ display: none;
+ }
+}
+
+@media all and (min-width: 50em) {
+ .hide-large {
+ display: none;
+ }
+}
+
+.valid {
+ color: #089e00;
+}
+
+.error {
+ color: red;
+}
+
+.warning {
+ color: #fff664;
+}
+
+.information {
+ color: #000db5;
+}
+
+.font-secondary {
+ font-family: Georgia, Times, 'Times New Roman', serif;
+}
+
+body {
+ background: white;
+ font: 100%/1.5 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif;
+ -webkit-text-size-adjust: 100%;
+ color: #333333;
+}
+
+/* Links */
+a {
+ color: #333333;
+ text-decoration: none;
+ outline: 0;
+}
+a:hover,
+a:focus {
+ color: gray;
+}
+
+/* Headings */
+/*Further Reading: http:/csswizardry.com/2012/02/pragmatic-practical-font-sizing-in-css/ */
+h1,
+.alpha {
+ line-height: 1.2;
+}
+
+h2,
+.beta {
+ line-height: 1.2;
+}
+
+h3,
+.gamma {
+ line-height: 1.2;
+}
+
+/* Subheadings */
+.subheading {
+ font-family: Georgia, Times, 'Times New Roman', serif;
+ font-weight: normal;
+}
+
+/* Text-Related Elements */
+p {
+ margin-bottom: 1em;
+}
+
+/* Blockquote */
+blockquote {
+ font-style: italic;
+ border-left: 1px solid gray;
+ color: gray;
+ padding-left: 1em;
+ margin-bottom: 1em;
+}
+
+/* Horizontal Rule */
+hr {
+ border: 0;
+ height: 2px;
+ background: #eeeeee;
+ margin: 2em 0;
+}
+
+abbr {
+ border-bottom: 1px dotted gray;
+ cursor: help;
+}
+
+ol,
+ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+/* Definition Lists */
+dl {
+ overflow: hidden;
+ margin: 0 0 1em;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
+
+/*------------------------------------*\
+ $MEDIA ELEMENTS
+\*------------------------------------*/
+/* Flexible Media */
+img,
+video,
+object {
+ max-width: 100%;
+ height: auto;
+}
+
+iframe {
+ margin-bottom: 1em;
+}
+
+figure {
+ margin-bottom: 1em;
+}
+figure img {
+ margin-bottom: 0.5em;
+}
+
+figcaption {
+ font-style: italic;
+}
+
+/*------------------------------------*\
+ $FORMS
+\*------------------------------------*/
+form ol,
+form ul {
+ list-style: none;
+ margin-left: 0;
+}
+
+fieldset {
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+label {
+ display: block;
+ padding-bottom: 0.5em;
+}
+
+button,
+input,
+select,
+textarea {
+ font-family: inherit;
+ font-size: 100%;
+ margin: 0 1px 0;
+}
+
+input,
+textarea {
+ width: 100%;
+ border: 1px solid gray;
+ padding: 0.5em 0.65rem;
+}
+
+input[type='text'],
+input[type='search'],
+input[type='url'],
+input[type='number'],
+textarea {
+ -webkit-appearance: none;
+}
+
+button,
+input[type='submit'] {
+ padding: 0.5em;
+ background: #333333;
+ border: 1px solid gray;
+ cursor: pointer;
+}
+
+input[type='checkbox'],
+input[type='radio'] {
+ width: auto;
+ margin-right: 0.3em;
+}
+
+input[type='search'] {
+ -webkit-appearance: none;
+ border-radius: 0;
+}
+
+input[type='search']::-webkit-search-cancel-button,
+input[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+.field-container {
+ margin-bottom: 1em;
+}
+
+.inline-form fieldset,
+.inline-form .inline-container {
+ position: relative;
+}
+.inline-form input[type='submit'],
+.inline-form button,
+.inline-form .btn {
+ font-size: 0.875em;
+ padding: 0.65rem 1.3rem;
+ background: #333333;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1;
+ width: auto;
+}
+.inline-form input[type='submit']:hover,
+.inline-form input[type='submit']:focus,
+.inline-form button:hover,
+.inline-form button:focus,
+.inline-form .btn:hover,
+.inline-form .btn:focus {
+ background: gray;
+ color: white;
+}
+
+/* Validation */
+.has-error {
+ border-color: red;
+}
+
+.is-valid {
+ border-color: #089e00;
+}
+
+/*------------------------------------*\
+ $SPECIFIC FORMS
+\*------------------------------------*/
+/* Search Form */
+.search-field {
+ padding-right: 3em;
+}
+
+.inline-form .search-submit {
+ background: none;
+ padding: 0.78em 1em;
+ border: 0;
+ border-left: 1px solid gray;
+ color: gray;
+}
+
+/*------------------------------------*\
+ $Table
+\*------------------------------------*/
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px solid gray;
+ width: 100%;
+}
+
+th {
+ text-align: left;
+ border: 1px solid gray;
+ padding: 0.2em;
+}
+
+td {
+ border: 1px solid gray;
+ padding: 0.2em;
+}
+
+.animate-fade {
+ -webkit-transition: opacity 0.3s ease-out;
+ -moz-transition: opacity 0.3s ease-out;
+ -ms-transition: opacity 0.3s ease-out;
+ -o-transition: opacity 0.3s ease-out;
+ transition: opacity 0.3s ease-out;
+}
+.animate-fade:hover {
+ opacity: 0;
+}
+
+.animate-move > .demo-shape {
+ -webkit-transition: all 0.8s ease-in-out;
+ -moz-transition: all 0.8s ease-in-out;
+ -ms-transition: all 0.8s ease-in-out;
+ -o-transition: all 0.8s ease-in-out;
+ transition: all 0.8s ease-in-out;
+}
+
+/*------------------------------------*\
+ $LAYOUT
+\*------------------------------------*/
+/*------------------------------------*\
+ $LAYOUT
+\*------------------------------------*/
+/* Layout Container */
+.lc,
+.header,
+[role='main'] {
+ max-width: 72em;
+ margin: 0 auto;
+ padding: 0.5em;
+}
+
+/*------------------------------------*\
+ $TEMPLATES
+\*------------------------------------*/
+/* Two Column Layout */
+@media all and (min-width: 50em) {
+ .l-two-col .l-main {
+ float: left;
+ width: 70%;
+ padding-right: 1em;
+ }
+}
+@media all and (max-width: 50em) {
+ .l-two-col .l-sidebar {
+ clear: both;
+ }
+}
+@media all and (min-width: 50em) {
+ .l-two-col .l-sidebar {
+ float: left;
+ width: 30%;
+ padding: 0 0 0 1em;
+ }
+}
+
+/*------------------------------------*\
+ $GRIDS
+\*------------------------------------*/
+/* Grid Container */
+.g {
+ overflow: hidden;
+ margin: 0 -0.5em;
+}
+
+/* Grid Item */
+.gi {
+ padding: 0.5em;
+}
+.gi img {
+ display: block;
+}
+@media all and (min-width: 46.8em) {
+ .gi {
+ float: left;
+ }
+}
+
+/* Grid 1up */
+.g-1up .gi {
+ width: 100%;
+}
+
+/* Grid 2up */
+@media all and (min-width: 46.8em) {
+ .g-2up > .gi {
+ float: left;
+ width: 50%;
+ }
+ .g-2up > .gi:nth-of-type(odd) {
+ clear: left;
+ }
+}
+
+/* Grid Half (Always displayed side by side) */
+.g-half > .gi {
+ float: left;
+ width: 50%;
+}
+.g-half > .gi:nth-of-type(odd) {
+ clear: left;
+}
+
+/* Grid 3up */
+@media all and (min-width: 46.8em) {
+ .g-3up > .gi {
+ float: left;
+ width: 50%;
+ }
+ .g-3up > .gi:nth-of-type(2n + 1) {
+ clear: left;
+ }
+}
+@media all and (min-width: 50em) {
+ .g-3up > .gi {
+ width: 33.3333333%;
+ }
+ .g-3up > .gi:nth-of-type(2n + 1) {
+ clear: none;
+ }
+ .g-3up > .gi:nth-of-type(3n + 1) {
+ clear: left;
+ }
+}
+
+/* Grid 4up */
+@media all and (min-width: 46.8em) {
+ .g-4up > .gi {
+ float: left;
+ width: 50%;
+ }
+ .g-4up > .gi:nth-of-type(2n + 1) {
+ clear: both;
+ }
+}
+@media all and (min-width: 50em) {
+ .g-4up > .gi {
+ width: 25%;
+ }
+ .g-4up > .gi:nth-of-type(2n + 1) {
+ clear: none;
+ }
+ .g-4up > .gi:nth-of-type(4n + 1) {
+ clear: left;
+ }
+}
+
+/* Grid Quarter (Always displayed side by side) */
+.g-quarter > .gi {
+ float: left;
+ width: 24%;
+}
+.g-quarter > .gi:nth-of-type(4n + 1) {
+ clear: left;
+}
+
+@media all and (min-width: 29.75em) {
+ .g-max4 > .gi {
+ float: left;
+ width: 50%;
+ }
+ .g-max4 > .gi:nth-of-type(2n + 1) {
+ clear: both;
+ }
+}
+@media all and (min-width: 39.8em) {
+ .g-max4 > .gi {
+ width: 33.3333333%;
+ }
+ .g-max4 > .gi:nth-of-type(2n + 1) {
+ clear: none;
+ }
+ .g-max4 > .gi:nth-of-type(3n + 1) {
+ clear: left;
+ }
+}
+@media all and (min-width: 50em) {
+ .g-max4 > .gi {
+ width: 25%;
+ }
+ .g-max4 > .gi:nth-of-type(3n + 1) {
+ clear: none;
+ }
+ .g-max4 > .gi:nth-of-type(4n + 1) {
+ clear: left;
+ }
+}
+
+/* Grid 5up */
+.g-max5 > .gi {
+ float: left;
+ width: 50%;
+}
+.g-max5 > .gi:nth-of-type(2n + 1) {
+ clear: both;
+}
+@media all and (min-width: 39.8em) {
+ .g-max5 > .gi {
+ width: 33.3333333%;
+ }
+ .g-max5 > .gi:nth-of-type(2n + 1) {
+ clear: none;
+ }
+ .g-max5 > .gi:nth-of-type(3n + 1) {
+ clear: left;
+ }
+}
+@media all and (min-width: 46.8em) {
+ .g-max5 > .gi {
+ width: 25%;
+ }
+ .g-max5 > .gi:nth-of-type(3n + 1) {
+ clear: none;
+ }
+ .g-max5 > .gi:nth-of-type(4n + 1) {
+ clear: left;
+ }
+}
+@media all and (min-width: 48em) {
+ .g-max5 > .gi {
+ width: 20%;
+ }
+ .g-max5 > .gi:nth-of-type(4n + 1) {
+ clear: none;
+ }
+ .g-max5 > .gi:nth-of-type(5n + 1) {
+ clear: left;
+ }
+}
+
+/* Grid 2/3 */
+@media all and (min-width: 46.8em) {
+ .gi-2-3 {
+ float: left;
+ width: 66.666666%;
+ }
+}
+
+@media all and (min-width: 46.8em) {
+ .gi-1-3 {
+ float: left;
+ width: 33.333333%;
+ }
+}
+
+/* Grid 4up block */
+.g-opposites .gi {
+ float: left;
+}
+.g-opposites .gi:last-child {
+ float: right;
+ text-align: right;
+}
+
+/*------------------------------------*\
+ $PAGE STRUCTURE
+\*------------------------------------*/
+.header {
+ background: white;
+ padding: 0;
+ border-bottom: 1px solid #dbdbdb;
+}
+
+.logo {
+ float: left;
+ max-width: 8rem;
+ margin: 0.4rem;
+}
+@media all and (min-width: 46.8em) {
+ .logo {
+ max-width: 9rem;
+ }
+}
+
+.nav-toggle {
+ float: right;
+ display: block;
+ padding: 0.9rem 1rem 0.7rem;
+ font-size: 1.3rem;
+ line-height: 1;
+ border-left: 1px solid #dbdbdb;
+}
+@media all and (min-width: 46.8em) {
+ .nav-toggle {
+ display: none;
+ }
+}
+@media all and (max-width: 17em) {
+ .nav-toggle {
+ padding-left: 0.2rem;
+ padding-right: 0.2rem;
+ }
+}
+
+.search-form {
+ overflow: hidden;
+ max-height: 0;
+}
+@media all and (min-width: 46.8em) {
+ .search-form {
+ float: right;
+ max-height: none;
+ margin: 0.65em 0.5em 0 0;
+ }
+}
+
+/*------------------------------------*\
+ $NAVIGATION
+\*------------------------------------*/
+.nav {
+ clear: both;
+ overflow: hidden;
+ max-height: 0;
+}
+.nav a {
+ display: block;
+ padding: 1em;
+ border-top: 1px solid #eeeeee;
+}
+.nav.active {
+ max-height: 40em;
+}
+@media all and (min-width: 46.8em) {
+ .nav {
+ max-height: none;
+ float: right;
+ clear: none;
+ }
+ .nav li {
+ float: left;
+ }
+ .nav a {
+ border: 0;
+ }
+}
+
+.pagination {
+ overflow: hidden;
+}
+.pagination li {
+ float: left;
+ border-right: 1px solid #eeeeee;
+}
+.pagination li:last-child {
+ border: 0;
+}
+.pagination a {
+ padding: 1em;
+}
+
+/*------------------------------------*\
+ $MAIN CONTENT AREA
+\*------------------------------------*/
+[role='main'] {
+ padding: 0.5em 0.5em 2em;
+ overflow: hidden;
+}
+
+/*------------------------------------*\
+ $FOOTER
+\*------------------------------------*/
+.footer {
+ clear: both;
+ overflow: hidden;
+ background: #131313;
+ color: white;
+ line-height: 1.2;
+}
+.footer a {
+ color: #f9f9f9;
+}
+
+.nav-footer {
+ margin: -1em -1em 1em;
+}
+.nav-footer li {
+ border-bottom: 1px solid #333333;
+}
+@media all and (min-width: 46.8em) {
+ .nav-footer li {
+ border: 0;
+ float: left;
+ }
+}
+.nav-footer a {
+ display: block;
+ padding: 1em;
+}
+
+@media all and (min-width: 46.8em) {
+ .copyright {
+ float: right;
+ }
+}
+
+/*------------------------------------*\
+ $TEXT Styles
+\*------------------------------------*/
+.intro {
+ font-size: 1.0625em;
+ font-weight: bold;
+}
+
+.pullquote {
+ font-family: Georgia, Times, 'Times New Roman', serif;
+ font-size: 1.4375em;
+}
+
+.caption {
+ font-style: italic;
+}
+
+.text a {
+ text-decoration: underline;
+}
+.text ul {
+ list-style: disc;
+ margin: 0 0 1em 1.2em;
+}
+.text ul ul {
+ margin-bottom: 0;
+}
+.text ol {
+ list-style: decimal;
+ margin: 0 0 1em 1.5em;
+}
+.text ol ol {
+ margin-bottom: 0;
+}
+
+/*------------------------------------*\
+ $COMPONENTS
+\*------------------------------------*/
+/* Icon Font */
+@font-face {
+ font-family: 'icons';
+ src: url('../fonts/icons.eot');
+ src: url('../fonts/icons.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/icons.woff') format('woff'),
+ url('../fonts/icons.ttf') format('truetype'),
+ url('../fonts/icons.svg#icons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* Use the following CSS code if you want to use data attributes for inserting your icons */
+[data-icon]:before {
+ font-family: 'icons';
+ content: attr(data-icon);
+ speak: none;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+}
+
+.icon-twitter:before,
+.icon-stumbleupon:before,
+.icon-pinterest:before,
+.icon-linkedin:before,
+.icon-google-plus:before,
+.icon-search:before,
+.icon-play:before,
+.icon-menu:before,
+.icon-arrow-left:before,
+.icon-arrow-right:before,
+.icon-bubble:before,
+.icon-facebook:before,
+.icon-feed:before,
+.icon-youtube:before,
+.icon-tag:before,
+.icon-tumblr:before,
+.icon-instagram,
+.icon-podcast,
+.icon-apple,
+.icon-android,
+.icon-arrow:after,
+.icon-envelope:before {
+ font-family: 'icons';
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+}
+
+.icon-twitter:before {
+ content: '\74';
+}
+
+.icon-stumbleupon:before {
+ content: '\75';
+}
+
+.icon-pinterest:before {
+ content: '\70';
+}
+
+.icon-linkedin:before {
+ content: '\69';
+}
+
+.icon-google-plus:before {
+ content: '\67';
+}
+
+.icon-search:before {
+ content: '\73';
+}
+
+.icon-play:before {
+ content: '\61';
+}
+
+.icon-menu:before {
+ content: '\21';
+}
+
+.icon-arrow-left:before {
+ content: '\23';
+}
+
+.icon-arrow-right:before {
+ content: '\24';
+}
+
+.icon-bubble:before {
+ content: '\25';
+}
+
+.icon-facebook:before {
+ content: '\66';
+}
+
+.icon-feed:before {
+ content: '\27';
+}
+
+.icon-youtube:before {
+ content: '\79';
+}
+
+.icon-tag:before {
+ content: '\28';
+}
+
+.icon-tumblr:before {
+ content: '\6d';
+}
+
+.icon-instagram:before {
+ content: '\22';
+}
+
+.icon-podcast:before {
+ content: '\26';
+}
+
+.icon-android:before {
+ content: '\29';
+}
+
+.icon-apple:before {
+ content: '\2a';
+}
+
+.icon-envelope:before {
+ content: '\2b';
+}
+
+.icon-arrow:after {
+ content: '\61';
+ display: inline-block;
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+
+.icon-play:before {
+ font-size: 0.7rem;
+ padding-left: 0.2em;
+}
+
+.icon-play-box {
+ display: block;
+ margin-left: 2em;
+}
+
+.icon-play-box:before {
+ padding: 0.25em;
+ background: gray;
+ color: white;
+ margin-left: -1.7rem;
+ margin-right: 0.5em;
+}
+
+/*------------------------------------*\
+ $BUTTONS
+\*------------------------------------*/
+.btn {
+ display: inline-block;
+ background: #333333;
+ color: white;
+ line-height: 1;
+ font-weight: bold;
+ padding: 1em;
+ border: 0;
+ text-align: center;
+}
+.btn:hover,
+.btn:focus {
+ background: gray;
+ color: white;
+}
+.btn.disabled {
+ background: #eeeeee;
+ color: gray;
+}
+
+.btn-small {
+ padding: 0.5em;
+}
+
+.btn-large {
+ padding: 0.5em;
+ text-transform: uppercase;
+ background: gray;
+ font-size: 1.4rem;
+ font-weight: normal;
+}
+
+.text-btn {
+ font-style: italic;
+}
+
+/* Generic Placeholder Brick: REMOVE FOR PRODUCTION */
+.brick {
+ background: #dcdddc;
+ padding: 2em;
+ text-align: center;
+ font-weight: bold;
+ border-bottom: 1px solid #eeeeee;
+}
+
+/* Block */
+.block {
+ overflow: hidden;
+}
+.block p:last-child {
+ margin-bottom: 0;
+}
+
+.headline {
+ line-height: 1.2;
+}
+
+/* Hero Block */
+.block-hero {
+ margin-bottom: 0.5em;
+}
+.block-hero .b-thumb img {
+ display: block;
+}
+@media all and (min-width: 50em) {
+ .block-hero {
+ position: relative;
+ }
+ .block-hero .b-text {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ background: rgba(0, 0, 0, 0.5);
+ color: white;
+ padding: 1.5em;
+ }
+}
+
+/* Block Thumbnail with Headline */
+.block-thumb {
+ display: table;
+ width: 100%;
+ border-collapse: collapse;
+}
+.block-thumb .b-inner {
+ display: table-row;
+ vertical-align: top;
+ overflow: hidden;
+}
+@media all and (min-width: 29.75em) {
+ .block-thumb .b-thumb {
+ display: table-cell;
+ vertical-align: top;
+ width: 30%;
+ max-width: 10em;
+ }
+ .block-thumb .b-thumb img {
+ display: block;
+ width: 100%;
+ height: auto;
+ }
+}
+@media all and (min-width: 29.75em) {
+ .block-thumb .b-text {
+ display: table-cell;
+ width: 70%;
+ padding: 0 1em;
+ }
+}
+
+/* Block Headline Summary */
+.block-headline-summary a {
+ display: block;
+ padding: 0.5em;
+}
+
+/* Block Inset */
+.block-inset {
+ position: relative;
+}
+.block-inset .b-thumb {
+ position: relative;
+ z-index: 0;
+}
+.block-inset .b-thumb img {
+ display: block;
+}
+
+/* Hero Block */
+.block-inset {
+ margin-bottom: 0.5em;
+ position: relative;
+}
+.block-inset .headline {
+ font-size: 1.1em;
+}
+.block-inset .b-text {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ background: rgba(0, 0, 0, 0.5);
+ color: white;
+ padding: 0.5em;
+}
+
+/* Block Thumb with Summary */
+.block-thumb-summary .b-thumb {
+ float: left;
+ width: 50%;
+}
+.block-thumb-summary .b-text {
+ margin-left: 50%;
+ padding: 0.5em;
+}
+
+.inline-list li {
+ display: inline-block;
+}
+
+/* Social List */
+.social-list li {
+ margin: 0 0.4rem 1em 0;
+}
+.social-list a {
+ font-size: 1.6em;
+}
+
+/* Headline List */
+.headline-list {
+ margin-bottom: 1em;
+}
+.headline-list.flush {
+ margin: 0;
+}
+.headline-list h4 {
+ font-weight: normal;
+}
+.headline-list li {
+ padding: 0.25em 0;
+ border-top: 1px solid #dddddd;
+}
+
+/* Post List */
+.post-list li {
+ margin-bottom: 1em;
+}
+
+/* Bullet List */
+.bullet-list {
+ list-style: square;
+ margin: 0 0 1em 1.2em;
+ line-height: 1.3;
+}
+.bullet-list li {
+ margin-bottom: 1em;
+}
+
+/* Text List */
+.text-list {
+ margin: 0 0 1em;
+ line-height: 1.3;
+}
+.text-list li {
+ margin-bottom: 1em;
+}
+
+.tooltip-container {
+ display: inline-block;
+ position: relative;
+}
+.tooltip-container:hover .tooltip {
+ display: block;
+}
+
+.tooltip-link {
+ background: #f9f9f9;
+}
+
+.tooltip {
+ display: none;
+ position: absolute;
+ top: 1.5em;
+ left: 0;
+ width: 18em;
+ padding: 1em;
+ background: white;
+ border: 1px solid gray;
+ box-shadow: 0.3em 0.3em 1em 0 rgba(0, 0, 0, 0.2);
+}
+.tooltip h2 {
+ margin-top: 0;
+}
+@media all and (min-width: 24em) {
+ .tooltip {
+ width: 22em;
+ }
+}
+@media all and (min-width: 29.75em) {
+ .tooltip {
+ width: 27em;
+ }
+}
+@media all and (min-width: 39.8em) {
+ .tooltip {
+ width: 30em;
+ }
+}
+
+.accordion {
+ margin-bottom: 1em;
+}
+
+.acc-handle {
+ background: #131313;
+ color: white;
+ font-family: Georgia, Times, 'Times New Roman', serif;
+ font-weight: bold;
+ display: block;
+ position: relative;
+ padding: 0.5em;
+ border-bottom: 1px solid #dddddd;
+}
+.acc-handle:after {
+ content: '+';
+ float: right;
+}
+.acc-handle:hover {
+ color: white;
+ background: #333333;
+}
+.acc-handle.active {
+ background: #333333;
+}
+.acc-handle.active:after {
+ content: '-';
+}
+
+.tabs {
+ overflow: hidden;
+}
+.tabs ul {
+ display: table;
+ width: 100%;
+}
+.tabs li {
+ display: table-cell;
+ text-align: center;
+ border-right: 1px solid #dddddd;
+}
+.tabs li:last-child {
+ border-right: 0;
+}
+.tabs a {
+ display: block;
+ padding: 0.5em;
+ background: gray;
+}
+.tabs a:hover,
+.tabs a:focus {
+ background: #dddddd;
+}
+.tabs a.active {
+ background: #333333;
+ color: white;
+}
+
+.section {
+ margin: 0 0 1em;
+}
+
+.section-title {
+ margin-bottom: 0.5em;
+}
+
+.article-header h1 {
+ font-size: 2.5em;
+}
+
+.byline {
+ font-size: 0.875em;
+ font-style: italic;
+ margin-bottom: 0.5em;
+}
+
+.social-share {
+ overflow: hidden;
+ margin-bottom: 1em;
+}
+.social-share li {
+ float: left;
+ margin-right: 0.5em;
+}
+.social-share a {
+ background: #333333;
+ color: white;
+ display: block;
+ padding: 0.5em;
+}
+.social-share a:hover {
+ background: gray;
+}
+
+.comments li {
+ margin-bottom: 1em;
+}
+
+.comment-container {
+ overflow: hidden;
+ margin-bottom: 1em;
+ list-style: none;
+}
+
+.comment-meta {
+ float: left;
+ width: 6.5em;
+}
+.comment-meta img {
+ display: block;
+ border: 1px solid #eeeeee;
+ margin-bottom: 0.5em;
+}
+
+.comment-name {
+ font-size: 0.75em;
+}
+
+.comment-text {
+ margin-left: 9em;
+}
+
+/*------------------------------------*\
+ $MESSAGING
+\*------------------------------------*/
+.alert {
+ text-align: center;
+ padding: 1em;
+ margin-bottom: 0.5em;
+ border: 1px solid gray;
+ background: #f9f9f9;
+}
+
+.alert-error {
+ color: red;
+ border-color: red;
+ background: #ffbebe;
+}
diff --git a/packages/starterkit-twig-demo/dist/css/style.scss b/packages/starterkit-twig-demo/dist/css/style.scss
new file mode 100755
index 000000000..b749f20f7
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/css/style.scss
@@ -0,0 +1,121 @@
+/*
+ ,, ,, ,,
+ .M"""bgd mm db `7MM mm mm `7MM OO OO OO
+,MI "Y MM MM MM MM MM 88 88 88
+`MMb. mmMMmm ,pW"Wq.`7MMpdMAo. `7Mb,od8 `7MM .P"Ybmmm MMpMMMb.mmMMmm mmMMmm MMpMMMb. .gP"Ya `7Mb,od8 .gP"Ya || || ||
+ `YMMNq. MM 6W' `Wb MM `Wb MM' "' MM :MI I8 MM MM MM MM MM MM ,M' Yb MM' "',M' Yb || || ||
+. `MM MM 8M M8 MM M8 MM MM WmmmP" MM MM MM MM MM MM 8M"""""" MM 8M"""""" `' `' `'
+Mb dM MM YA. ,A9 MM ,AP MM MM 8M MM MM MM MM MM MM YM. , MM YM. , ,, ,, ,,
+P"Ybmmd" `Mbmo`Ybmd9' MMbmmd' .JMML. .JMML.YMMMMMb .JMML JMML.`Mbmo `Mbmo.JMML JMML.`Mbmmd'.JMML. `Mbmmd' db db db
+ MM 6' dP
+ .JMML. Ybmmmd'
+
+Pattern Lab doesn't have any CSS requirements, which means you can write your styles however you want. Hooray!
+You can use Sass, Less, vanilla CSS, or some other crazy thing I haven't heard of yet.
+So please don't use these styles. They're just here to put together the demo, and nothing more.
+They're intentionally gray, boring, and crappy because you're supposed to do this stuff yourself.
+
+Atomic design is philosophically complimentary with these CSS approaches:
+
+* SMACSS by Jonathan Snook http://smacss.com/
+* OOCSS by Nicole Sullivan http://oocss.org/
+* BEM CSS Methology : http://bem.info/method/
+* CSS Guidelines by Harry Roberts : https://github.com/csswizardry/CSS-Guidelines
+
+So feel free to use any of these approaches. Or don't. It's totally up to you.
+
+*/
+
+/*------------------------------------*\
+ $TABLE OF CONTENTS
+ based generally on Harry Roberts excellent CSS Guidelines https://github.com/csswizardry/CSS-Guidelines
+\*------------------------------------*/
+/**
+ * VARIABLES..............................Declarations of Sass variables
+ * .....Colors
+ * .....Typography
+ * .....Layout
+ * .....Defaults
+ * .....Breakpoints
+ * MIXINS.................................Sass mixins
+ * RESET..................................Set reset defaults
+ * GLOBAL CLASSES.........................Set reset defaults
+ * GLOBAL ELEMENTS........................Establish global styles
+ * .....Main
+ * .....Headings
+ * .....Text-related elements (p, blockquote, lists)
+ * .....Defaults
+ * .....Breakpoints
+ * TYPOGRAPHY------------------------------
+ * MEDIA------------------------------
+ * LAYOUT------------------------------
+ * NAVIGATION------------------------------
+ * TOC To Be Continued
+ */
+
+
+
+@import "scss/generic/variables";
+@import "scss/generic/mixins";
+@import "scss/generic/reset";
+
+
+
+
+
+/*------------------------------------*\
+ $GLOBAL ELEMENTS
+\*------------------------------------*/
+@import "scss/base/global-classes";
+@import "scss/base/main";
+@import "scss/base/links";
+@import "scss/base/headings";
+@import "scss/base/text";
+@import "scss/base/lists";
+@import "scss/base/media";
+@import "scss/base/forms";
+@import "scss/base/tables";
+@import "scss/base/animation";
+
+
+
+
+
+/*------------------------------------*\
+ $LAYOUT
+\*------------------------------------*/
+@import "scss/objects/layout";
+
+
+/*------------------------------------*\
+ $PAGE STRUCTURE
+\*------------------------------------*/
+@import "scss/objects/header";
+@import "scss/objects/nav";
+@import "scss/objects/main";
+@import "scss/objects/footer";
+
+
+
+/*------------------------------------*\
+ $TEXT Styles
+\*------------------------------------*/
+@import "scss/objects/text";
+
+
+/*------------------------------------*\
+ $COMPONENTS
+\*------------------------------------*/
+@import "scss/objects/icons";
+@import "scss/objects/buttons";
+@import "scss/objects/blocks";
+@import "scss/objects/lists";
+@import "scss/objects/tooltip";
+@import "scss/objects/accordion";
+@import "scss/objects/tabs";
+@import "scss/objects/sections";
+@import "scss/objects/article";
+@import "scss/objects/comments";
+@import "scss/objects/messaging";
+
+
diff --git a/packages/starterkit-twig-demo/dist/favicon.ico b/packages/starterkit-twig-demo/dist/favicon.ico
new file mode 100755
index 000000000..eee4aa78f
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/favicon.ico differ
diff --git a/packages/starterkit-twig-demo/dist/fonts/icons.dev.svg b/packages/starterkit-twig-demo/dist/fonts/icons.dev.svg
new file mode 100755
index 000000000..ca8e49e3a
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/fonts/icons.dev.svg
@@ -0,0 +1,103 @@
+
+
+
+
+This is a custom SVG font generated by IcoMoon.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/fonts/icons.eot b/packages/starterkit-twig-demo/dist/fonts/icons.eot
new file mode 100755
index 000000000..81a314b08
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/fonts/icons.eot differ
diff --git a/packages/starterkit-twig-demo/dist/fonts/icons.svg b/packages/starterkit-twig-demo/dist/fonts/icons.svg
new file mode 100755
index 000000000..3c64026b6
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/fonts/icons.svg
@@ -0,0 +1,103 @@
+
+
+
+
+This is a custom SVG font generated by IcoMoon.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/starterkit-twig-demo/dist/fonts/icons.ttf b/packages/starterkit-twig-demo/dist/fonts/icons.ttf
new file mode 100755
index 000000000..e6bff0814
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/fonts/icons.ttf differ
diff --git a/packages/starterkit-twig-demo/dist/fonts/icons.woff b/packages/starterkit-twig-demo/dist/fonts/icons.woff
new file mode 100755
index 000000000..10e663234
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/fonts/icons.woff differ
diff --git a/packages/starterkit-twig-demo/dist/images/ajax-loader.gif b/packages/starterkit-twig-demo/dist/images/ajax-loader.gif
new file mode 100755
index 000000000..f2a1bc0c6
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/ajax-loader.gif differ
diff --git a/packages/starterkit-twig-demo/dist/images/favicon_16x16.jpg b/packages/starterkit-twig-demo/dist/images/favicon_16x16.jpg
new file mode 100755
index 000000000..05e744965
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/favicon_16x16.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/favicon_32x32.jpg b/packages/starterkit-twig-demo/dist/images/favicon_32x32.jpg
new file mode 100755
index 000000000..0970980b7
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/favicon_32x32.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/fpo_16x9.png b/packages/starterkit-twig-demo/dist/images/fpo_16x9.png
new file mode 100755
index 000000000..013949dcc
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/fpo_16x9.png differ
diff --git a/packages/starterkit-twig-demo/dist/images/fpo_4x3.png b/packages/starterkit-twig-demo/dist/images/fpo_4x3.png
new file mode 100755
index 000000000..7ff84b81b
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/fpo_4x3.png differ
diff --git a/packages/starterkit-twig-demo/dist/images/fpo_avatar.png b/packages/starterkit-twig-demo/dist/images/fpo_avatar.png
new file mode 100755
index 000000000..e666a40ed
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/fpo_avatar.png differ
diff --git a/packages/starterkit-twig-demo/dist/images/fpo_square.png b/packages/starterkit-twig-demo/dist/images/fpo_square.png
new file mode 100755
index 000000000..ce8a1e4e6
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/fpo_square.png differ
diff --git a/packages/starterkit-twig-demo/dist/images/logo.png b/packages/starterkit-twig-demo/dist/images/logo.png
new file mode 100755
index 000000000..93db733d2
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/logo.png differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/landscape-16x9-mountains.jpg b/packages/starterkit-twig-demo/dist/images/sample/landscape-16x9-mountains.jpg
new file mode 100755
index 000000000..3c0d92b29
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/landscape-16x9-mountains.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/thumb-square-fire.jpg b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-fire.jpg
new file mode 100755
index 000000000..20a5c5ed6
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-fire.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/thumb-square-gear.jpg b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-gear.jpg
new file mode 100755
index 000000000..052a52a17
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-gear.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/thumb-square-ivy.jpg b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-ivy.jpg
new file mode 100755
index 000000000..64183a7a3
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-ivy.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/thumb-square-river.jpg b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-river.jpg
new file mode 100755
index 000000000..f19018689
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-river.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/thumb-square-yosemite.jpg b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-yosemite.jpg
new file mode 100755
index 000000000..8f388d798
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/thumb-square-yosemite.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-climber.jpg b/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-climber.jpg
new file mode 100755
index 000000000..1348cd7e7
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-climber.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-climbers.jpg b/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-climbers.jpg
new file mode 100755
index 000000000..d8461a191
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-climbers.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-stream.jpg b/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-stream.jpg
new file mode 100755
index 000000000..8e091d1d0
Binary files /dev/null and b/packages/starterkit-twig-demo/dist/images/sample/tout-4x3-stream.jpg differ
diff --git a/packages/starterkit-twig-demo/dist/js/fitvids.js b/packages/starterkit-twig-demo/dist/js/fitvids.js
new file mode 100755
index 000000000..d3fa97f50
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/js/fitvids.js
@@ -0,0 +1,91 @@
+/*global jQuery */
+/*!
+* FitVids 1.0
+*
+* Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
+* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
+* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
+*
+* Date: Thu Sept 01 18:00:00 2011 -0500
+*/
+
+(function($) {
+ $.fn.fitVids = function(options) {
+ var settings = {
+ customSelector: null,
+ };
+
+ var div = document.createElement('div'),
+ ref =
+ document.getElementsByTagName('base')[0] ||
+ document.getElementsByTagName('script')[0];
+
+ div.className = 'fit-vids-style';
+ div.innerHTML =
+ '';
+
+ ref.parentNode.insertBefore(div, ref);
+
+ if (options) {
+ $.extend(settings, options);
+ }
+
+ return this.each(function() {
+ var selectors = [
+ "iframe[src*='player.vimeo.com']",
+ "iframe[src*='www.youtube.com']",
+ "iframe[src*='www.kickstarter.com']",
+ 'object',
+ 'embed',
+ ];
+
+ if (settings.customSelector) {
+ selectors.push(settings.customSelector);
+ }
+
+ var $allVideos = $(this).find(selectors.join(','));
+
+ $allVideos.each(function() {
+ var $this = $(this);
+ if (
+ (this.tagName.toLowerCase() == 'embed' &&
+ $this.parent('object').length) ||
+ $this.parent('.fluid-width-video-wrapper').length
+ ) {
+ return;
+ }
+ var height =
+ this.tagName.toLowerCase() == 'object' || $this.attr('height')
+ ? $this.attr('height')
+ : $this.height(),
+ width = $this.attr('width') ? $this.attr('width') : $this.width(),
+ aspectRatio = height / width;
+ if (!$this.attr('id')) {
+ var videoID = 'fitvid' + Math.floor(Math.random() * 999999);
+ $this.attr('id', videoID);
+ }
+ $this
+ .wrap('
')
+ .parent('.fluid-width-video-wrapper')
+ .css('padding-top', aspectRatio * 100 + '%');
+ $this.removeAttr('height').removeAttr('width');
+ });
+ });
+ };
+})(jQuery);
diff --git a/packages/starterkit-twig-demo/dist/js/init.js b/packages/starterkit-twig-demo/dist/js/init.js
new file mode 100755
index 000000000..723a99732
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/js/init.js
@@ -0,0 +1,26 @@
+(function(w) {
+ var sw = document.body.clientWidth,
+ sh = document.body.clientHeight;
+
+ $(w).resize(function() {
+ //Update dimensions on resize
+ sw = document.body.clientWidth;
+ sh = document.body.clientHeight;
+
+ //updateAds();
+ });
+
+ //Navigation toggle
+ $('.nav-toggle-menu').click(function(e) {
+ e.preventDefault();
+ $(this).toggleClass('active');
+ $('.nav').toggleClass('active');
+ });
+
+ //Navigation toggle
+ $('.nav-toggle-search').click(function(e) {
+ e.preventDefault();
+ $(this).toggleClass('active');
+ $('.header .search-form').toggleClass('active');
+ });
+})(this);
diff --git a/packages/starterkit-twig-demo/dist/js/jquery-2.0.0b2.js b/packages/starterkit-twig-demo/dist/js/jquery-2.0.0b2.js
new file mode 100755
index 000000000..c518c3bdc
--- /dev/null
+++ b/packages/starterkit-twig-demo/dist/js/jquery-2.0.0b2.js
@@ -0,0 +1,9462 @@
+/*!
+ * jQuery JavaScript Library v2.0.0b2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-3-1
+ */
+(function(window, undefined) {
+ // Can't do this because several apps including ASP.NET trace
+ // the stack via arguments.caller.callee and Firefox dies if
+ // you try to trace through "use strict" call chains. (#13335)
+ // Support: Firefox 18+
+ //"use strict";
+ var // A central reference to the root jQuery(document)
+ rootjQuery,
+ // The deferred used on DOM ready
+ readyList,
+ // Support: IE9
+ // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+ core_strundefined = typeof undefined,
+ // Use the correct document accordingly with window argument (sandbox)
+ location = window.location,
+ document = window.document,
+ docElem = document.documentElement,
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+ // [[Class]] -> type pairs
+ class2type = {},
+ // List of deleted data cache ids, so we can reuse them
+ core_deletedIds = [],
+ core_version = '2.0.0b2',
+ // Save a reference to some core methods
+ core_concat = core_deletedIds.concat,
+ core_push = core_deletedIds.push,
+ core_slice = core_deletedIds.slice,
+ core_indexOf = core_deletedIds.indexOf,
+ core_toString = class2type.toString,
+ core_hasOwn = class2type.hasOwnProperty,
+ core_trim = core_version.trim,
+ // Define a local copy of jQuery
+ jQuery = function(selector, context) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init(selector, context, rootjQuery);
+ },
+ // Used for matching numbers
+ core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+ // Used for splitting on whitespace
+ core_rnotwhite = /\S+/g,
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function(all, letter) {
+ return letter.toUpperCase();
+ },
+ // The ready event handler and self cleanup method
+ completed = function() {
+ document.removeEventListener('DOMContentLoaded', completed, false);
+ window.removeEventListener('load', completed, false);
+ jQuery.ready();
+ };
+
+ jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: core_version,
+
+ constructor: jQuery,
+ init: function(selector, context, rootjQuery) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if (!selector) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if (typeof selector === 'string') {
+ if (
+ selector.charAt(0) === '<' &&
+ selector.charAt(selector.length - 1) === '>' &&
+ selector.length >= 3
+ ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [null, selector, null];
+ } else {
+ match = rquickExpr.exec(selector);
+ }
+
+ // Match html or make sure no context is specified for #id
+ if (match && (match[1] || !context)) {
+ // HANDLE: $(html) -> $(array)
+ if (match[1]) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ jQuery.merge(
+ this,
+ jQuery.parseHTML(
+ match[1],
+ context && context.nodeType
+ ? context.ownerDocument || context
+ : document,
+ true
+ )
+ );
+
+ // HANDLE: $(html, props)
+ if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
+ for (match in context) {
+ // Properties of context are called as methods if possible
+ if (jQuery.isFunction(this[match])) {
+ this[match](context[match]);
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr(match, context[match]);
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById(match[2]);
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if (elem && elem.parentNode) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if (elem.id !== match[2]) {
+ return rootjQuery.find(selector);
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if (!context || context.jquery) {
+ return (context || rootjQuery).find(selector);
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor(context).find(selector);
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if (selector.nodeType) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if (jQuery.isFunction(selector)) {
+ return rootjQuery.ready(selector);
+ }
+
+ if (selector.selector !== undefined) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray(selector, this);
+ },
+
+ // Start with an empty selector
+ selector: '',
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return core_slice.call(this);
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function(num) {
+ return num == null
+ ? // Return a 'clean' array
+ this.toArray()
+ : // Return just the object
+ num < 0 ? this[this.length + num] : this[num];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function(elems) {
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge(this.constructor(), elems);
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function(callback, args) {
+ return jQuery.each(this, callback, args);
+ },
+
+ ready: function(fn) {
+ // Add the callback
+ jQuery.ready.promise().done(fn);
+
+ return this;
+ },
+
+ slice: function() {
+ return this.pushStack(core_slice.apply(this, arguments));
+ },
+
+ first: function() {
+ return this.eq(0);
+ },
+
+ last: function() {
+ return this.eq(-1);
+ },
+
+ eq: function(i) {
+ var len = this.length,
+ j = +i + (i < 0 ? len : 0);
+ return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
+ },
+
+ map: function(callback) {
+ return this.pushStack(
+ jQuery.map(this, function(elem, i) {
+ return callback.call(elem, i, elem);
+ })
+ );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: core_push,
+ sort: [].sort,
+ splice: [].splice,
+ };
+
+ // Give the init function the jQuery prototype for later instantiation
+ jQuery.fn.init.prototype = jQuery.fn;
+
+ jQuery.extend = jQuery.fn.extend = function() {
+ var options,
+ name,
+ src,
+ copy,
+ copyIsArray,
+ clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if (typeof target === 'boolean') {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if (typeof target !== 'object' && !jQuery.isFunction(target)) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if (length === i) {
+ target = this;
+ --i;
+ }
+
+ for (; i < length; i++) {
+ // Only deal with non-null/undefined values
+ if ((options = arguments[i]) != null) {
+ // Extend the base object
+ for (name in options) {
+ src = target[name];
+ copy = options[name];
+
+ // Prevent never-ending loop
+ if (target === copy) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if (
+ deep &&
+ copy &&
+ (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))
+ ) {
+ if (copyIsArray) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[name] = jQuery.extend(deep, clone, copy);
+
+ // Don't bring in undefined values
+ } else if (copy !== undefined) {
+ target[name] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+ };
+
+ jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: 'jQuery' + (core_version + Math.random()).replace(/\D/g, ''),
+
+ noConflict: function(deep) {
+ if (window.$ === jQuery) {
+ window.$ = _$;
+ }
+
+ if (deep && window.jQuery === jQuery) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function(hold) {
+ if (hold) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready(true);
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function(wait) {
+ // Abort if there are pending holds or we're already ready
+ if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if (wait !== true && --jQuery.readyWait > 0) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith(document, [jQuery]);
+
+ // Trigger any bound ready events
+ if (jQuery.fn.trigger) {
+ jQuery(document)
+ .trigger('ready')
+ .off('ready');
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function(obj) {
+ return jQuery.type(obj) === 'function';
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function(obj) {
+ return obj != null && obj == obj.window;
+ },
+
+ isNumeric: function(obj) {
+ return !isNaN(parseFloat(obj)) && isFinite(obj);
+ },
+
+ type: function(obj) {
+ if (obj == null) {
+ return String(obj);
+ }
+ // Support: Safari <=5.1 (functionish RegExp)
+ return typeof obj === 'object' || typeof obj === 'function'
+ ? class2type[core_toString.call(obj)] || 'object'
+ : typeof obj;
+ },
+
+ isPlainObject: function(obj) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if (
+ jQuery.type(obj) !== 'object' ||
+ obj.nodeType ||
+ jQuery.isWindow(obj)
+ ) {
+ return false;
+ }
+
+ // Support: Firefox >16
+ // The try/catch suppresses exceptions thrown when attempting to access
+ // the "constructor" property of certain host objects, ie. |window.location|
+ try {
+ if (
+ obj.constructor &&
+ !core_hasOwn.call(obj.constructor.prototype, 'isPrototypeOf')
+ ) {
+ return false;
+ }
+ } catch (e) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function(obj) {
+ var name;
+ for (name in obj) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function(msg) {
+ throw new Error(msg);
+ },
+
+ // data: string of html
+ // context (optional): If specified, the fragment will be created in this context, defaults to document
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ parseHTML: function(data, context, keepScripts) {
+ if (!data || typeof data !== 'string') {
+ return null;
+ }
+ if (typeof context === 'boolean') {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec(data),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if (parsed) {
+ return [context.createElement(parsed[1])];
+ }
+
+ parsed = jQuery.buildFragment([data], context, scripts);
+
+ if (scripts) {
+ jQuery(scripts).remove();
+ }
+
+ return jQuery.merge([], parsed.childNodes);
+ },
+
+ parseJSON: JSON.parse,
+
+ // Cross-browser xml parsing
+ parseXML: function(data) {
+ var xml, tmp;
+ if (!data || typeof data !== 'string') {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString(data, 'text/xml');
+ } catch (e) {
+ xml = undefined;
+ }
+
+ if (!xml || xml.getElementsByTagName('parsererror').length) {
+ jQuery.error('Invalid XML: ' + data);
+ }
+ return xml;
+ },
+
+ noop: function() {},
+
+ // Evaluates a script in a global context
+ globalEval: function(data) {
+ var indirect = eval;
+ if (jQuery.trim(data)) {
+ indirect(data + ';');
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function(string) {
+ return string.replace(rmsPrefix, 'ms-').replace(rdashAlpha, fcamelCase);
+ },
+
+ nodeName: function(elem, name) {
+ return (
+ elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase()
+ );
+ },
+
+ // args is for internal usage only
+ each: function(obj, callback, args) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike(obj);
+
+ if (args) {
+ if (isArray) {
+ for (; i < length; i++) {
+ value = callback.apply(obj[i], args);
+
+ if (value === false) {
+ break;
+ }
+ }
+ } else {
+ for (i in obj) {
+ value = callback.apply(obj[i], args);
+
+ if (value === false) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if (isArray) {
+ for (; i < length; i++) {
+ value = callback.call(obj[i], i, obj[i]);
+
+ if (value === false) {
+ break;
+ }
+ }
+ } else {
+ for (i in obj) {
+ value = callback.call(obj[i], i, obj[i]);
+
+ if (value === false) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ trim: function(text) {
+ return text == null ? '' : core_trim.call(text);
+ },
+
+ // results is for internal usage only
+ makeArray: function(arr, results) {
+ var ret = results || [];
+
+ if (arr != null) {
+ if (isArraylike(Object(arr))) {
+ jQuery.merge(ret, typeof arr === 'string' ? [arr] : arr);
+ } else {
+ core_push.call(ret, arr);
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function(elem, arr, i) {
+ return arr == null ? -1 : core_indexOf.call(arr, elem, i);
+ },
+
+ merge: function(first, second) {
+ var l = second.length,
+ i = first.length,
+ j = 0;
+
+ if (typeof l === 'number') {
+ for (; j < l; j++) {
+ first[i++] = second[j];
+ }
+ } else {
+ while (second[j] !== undefined) {
+ first[i++] = second[j++];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function(elems, callback, inv) {
+ var retVal,
+ ret = [],
+ i = 0,
+ length = elems.length;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for (; i < length; i++) {
+ retVal = !!callback(elems[i], i);
+ if (inv !== retVal) {
+ ret.push(elems[i]);
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function(elems, callback, arg) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike(elems),
+ ret = [];
+
+ // Go through the array, translating each of the items to their
+ if (isArray) {
+ for (; i < length; i++) {
+ value = callback(elems[i], i, arg);
+
+ if (value != null) {
+ ret[ret.length] = value;
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for (i in elems) {
+ value = callback(elems[i], i, arg);
+
+ if (value != null) {
+ ret[ret.length] = value;
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return core_concat.apply([], ret);
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function(fn, context) {
+ var tmp, args, proxy;
+
+ if (typeof context === 'string') {
+ tmp = fn[context];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if (!jQuery.isFunction(fn)) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = core_slice.call(arguments, 2);
+ proxy = function() {
+ return fn.apply(
+ context || this,
+ args.concat(core_slice.call(arguments))
+ );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Multifunctional method to get and set values of a collection
+ // The value/s can optionally be executed if it's a function
+ access: function(elems, fn, key, value, chainable, emptyGet, raw) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if (jQuery.type(key) === 'object') {
+ chainable = true;
+ for (i in key) {
+ jQuery.access(elems, fn, i, key[i], true, emptyGet, raw);
+ }
+
+ // Sets one value
+ } else if (value !== undefined) {
+ chainable = true;
+
+ if (!jQuery.isFunction(value)) {
+ raw = true;
+ }
+
+ if (bulk) {
+ // Bulk operations run against the entire set
+ if (raw) {
+ fn.call(elems, value);
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function(elem, key, value) {
+ return bulk.call(jQuery(elem), value);
+ };
+ }
+ }
+
+ if (fn) {
+ for (; i < length; i++) {
+ fn(
+ elems[i],
+ key,
+ raw ? value : value.call(elems[i], i, fn(elems[i], key))
+ );
+ }
+ }
+ }
+
+ return chainable
+ ? elems
+ : // Gets
+ bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet;
+ },
+
+ now: Date.now,
+ });
+
+ jQuery.ready.promise = function(obj) {
+ if (!readyList) {
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if (document.readyState === 'complete') {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout(jQuery.ready);
+ } else {
+ // Use the handy event callback
+ document.addEventListener('DOMContentLoaded', completed, false);
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener('load', completed, false);
+ }
+ }
+ return readyList.promise(obj);
+ };
+
+ // Populate the class2type map
+ jQuery.each(
+ 'Boolean Number String Function Array Date RegExp Object Error'.split(' '),
+ function(i, name) {
+ class2type['[object ' + name + ']'] = name.toLowerCase();
+ }
+ );
+
+ function isArraylike(obj) {
+ var length = obj.length,
+ type = jQuery.type(obj);
+
+ if (jQuery.isWindow(obj)) {
+ return false;
+ }
+
+ if (obj.nodeType === 1 && length) {
+ return true;
+ }
+
+ return (
+ type === 'array' ||
+ (type !== 'function' &&
+ (length === 0 ||
+ (typeof length === 'number' && length > 0 && length - 1 in obj)))
+ );
+ }
+
+ // All jQuery objects should point back to these
+ rootjQuery = jQuery(document);
+ // String to Object options format cache
+ var optionsCache = {};
+
+ // Convert String-formatted options into Object-formatted ones and store in cache
+ function createOptions(options) {
+ var object = (optionsCache[options] = {});
+ jQuery.each(options.match(core_rnotwhite) || [], function(_, flag) {
+ object[flag] = true;
+ });
+ return object;
+ }
+
+ /*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+ jQuery.Callbacks = function(options) {
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options =
+ typeof options === 'string'
+ ? optionsCache[options] || createOptions(options)
+ : jQuery.extend({}, options);
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function(data) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for (; list && firingIndex < firingLength; firingIndex++) {
+ if (
+ list[firingIndex].apply(data[0], data[1]) === false &&
+ options.stopOnFalse
+ ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if (list) {
+ if (stack) {
+ if (stack.length) {
+ fire(stack.shift());
+ }
+ } else if (memory) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if (list) {
+ // First, we save the current length
+ var start = list.length;
+ (function add(args) {
+ jQuery.each(args, function(_, arg) {
+ var type = jQuery.type(arg);
+ if (type === 'function') {
+ if (!options.unique || !self.has(arg)) {
+ list.push(arg);
+ }
+ } else if (arg && arg.length && type !== 'string') {
+ // Inspect recursively
+ add(arg);
+ }
+ });
+ })(arguments);
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if (firing) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if (memory) {
+ firingStart = start;
+ fire(memory);
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if (list) {
+ jQuery.each(arguments, function(_, arg) {
+ var index;
+ while ((index = jQuery.inArray(arg, list, index)) > -1) {
+ list.splice(index, 1);
+ // Handle firing indexes
+ if (firing) {
+ if (index <= firingLength) {
+ firingLength--;
+ }
+ if (index <= firingIndex) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function(fn) {
+ return fn ? jQuery.inArray(fn, list) > -1 : !!(list && list.length);
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if (!memory) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function(context, args) {
+ args = args || [];
+ args = [context, args.slice ? args.slice() : args];
+ if (list && (!fired || stack)) {
+ if (firing) {
+ stack.push(args);
+ } else {
+ fire(args);
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith(this, arguments);
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ },
+ };
+
+ return self;
+ };
+ jQuery.extend({
+ Deferred: function(func) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ ['resolve', 'done', jQuery.Callbacks('once memory'), 'resolved'],
+ ['reject', 'fail', jQuery.Callbacks('once memory'), 'rejected'],
+ ['notify', 'progress', jQuery.Callbacks('memory')],
+ ],
+ state = 'pending',
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done(arguments).fail(arguments);
+ return this;
+ },
+ then: function(/* fnDone, fnFail, fnProgress */) {
+ var fns = arguments;
+ return jQuery
+ .Deferred(function(newDefer) {
+ jQuery.each(tuples, function(i, tuple) {
+ var action = tuple[0],
+ fn = jQuery.isFunction(fns[i]) && fns[i];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[tuple[1]](function() {
+ var returned = fn && fn.apply(this, arguments);
+ if (returned && jQuery.isFunction(returned.promise)) {
+ returned
+ .promise()
+ .done(newDefer.resolve)
+ .fail(newDefer.reject)
+ .progress(newDefer.notify);
+ } else {
+ newDefer[action + 'With'](
+ this === promise ? newDefer.promise() : this,
+ fn ? [returned] : arguments
+ );
+ }
+ });
+ });
+ fns = null;
+ })
+ .promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function(obj) {
+ return obj != null ? jQuery.extend(obj, promise) : promise;
+ },
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each(tuples, function(i, tuple) {
+ var list = tuple[2],
+ stateString = tuple[3];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[tuple[1]] = list.add;
+
+ // Handle state
+ if (stateString) {
+ list.add(
+ function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ },
+ tuples[i ^ 1][2].disable,
+ tuples[2][2].lock
+ );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[tuple[0]] = function() {
+ deferred[tuple[0] + 'With'](
+ this === deferred ? promise : this,
+ arguments
+ );
+ return this;
+ };
+ deferred[tuple[0] + 'With'] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise(deferred);
+
+ // Call given func if any
+ if (func) {
+ func.call(deferred, deferred);
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function(subordinate /* , ..., subordinateN */) {
+ var i = 0,
+ resolveValues = core_slice.call(arguments),
+ length = resolveValues.length,
+ // the count of uncompleted subordinates
+ remaining =
+ length !== 1 ||
+ (subordinate && jQuery.isFunction(subordinate.promise))
+ ? length
+ : 0,
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+ // Update function for both resolve and progress values
+ updateFunc = function(i, contexts, values) {
+ return function(value) {
+ contexts[i] = this;
+ values[i] =
+ arguments.length > 1 ? core_slice.call(arguments) : value;
+ if (values === progressValues) {
+ deferred.notifyWith(contexts, values);
+ } else if (!--remaining) {
+ deferred.resolveWith(contexts, values);
+ }
+ };
+ },
+ progressValues,
+ progressContexts,
+ resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if (length > 1) {
+ progressValues = new Array(length);
+ progressContexts = new Array(length);
+ resolveContexts = new Array(length);
+ for (; i < length; i++) {
+ if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
+ resolveValues[i]
+ .promise()
+ .done(updateFunc(i, resolveContexts, resolveValues))
+ .fail(deferred.reject)
+ .progress(updateFunc(i, progressContexts, progressValues));
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if (!remaining) {
+ deferred.resolveWith(resolveContexts, resolveValues);
+ }
+
+ return deferred.promise();
+ },
+ });
+ jQuery.support = (function(support) {
+ var input = document.createElement('input'),
+ fragment = document.createDocumentFragment(),
+ div = document.createElement('div'),
+ select = document.createElement('select'),
+ opt = select.appendChild(document.createElement('option'));
+
+ // Finish early in limited environments
+ if (!input.type) {
+ return support;
+ }
+
+ input.type = 'checkbox';
+
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value === '';
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+ support.boxModel = document.compatMode === 'CSS1Compat';
+
+ // Will be defined later
+ support.reliableMarginRight = true;
+ support.boxSizingReliable = true;
+ support.pixelPosition = false;
+
+ // Make sure checked status is properly cloned
+ // Support: IE9, IE10
+ input.checked = true;
+ support.noCloneChecked = input.cloneNode(true).checked;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10, Opera
+ input = document.createElement('input');
+ input.value = 't';
+ input.type = 'radio';
+ support.radioValue = input.value === 't';
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute('checked', 't');
+ input.setAttribute('name', 't');
+
+ fragment.appendChild(input);
+
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment
+ .cloneNode(true)
+ .cloneNode(true).lastChild.checked;
+
+ // Support: Firefox 17+
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+ support.focusinBubbles = 'onfocusin' in window;
+
+ div.style.backgroundClip = 'content-box';
+ div.cloneNode(true).style.backgroundClip = '';
+ support.clearCloneStyle = div.style.backgroundClip === 'content-box';
+
+ // Run tests that need a body at doc ready
+ jQuery(function() {
+ var container,
+ marginDiv,
+ divReset =
+ 'padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;',
+ body = document.getElementsByTagName('body')[0];
+
+ if (!body) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ container = document.createElement('div');
+ container.style.cssText =
+ 'border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px';
+
+ // Check box-sizing and margin behavior
+ body.appendChild(container).appendChild(div);
+ div.innerHTML = '';
+ div.style.cssText =
+ 'box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;';
+
+ support.boxSizing = div.offsetWidth === 4;
+ support.doesNotIncludeMarginInBodyOffset = body.offsetTop !== 1;
+
+ // Use window.getComputedStyle because jsdom on node.js will break without it.
+ if (window.getComputedStyle) {
+ support.pixelPosition =
+ (window.getComputedStyle(div, null) || {}).top !== '1%';
+ support.boxSizingReliable =
+ (window.getComputedStyle(div, null) || { width: '4px' }).width ===
+ '4px';
+
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ marginDiv = div.appendChild(document.createElement('div'));
+ marginDiv.style.cssText = div.style.cssText = divReset;
+ marginDiv.style.marginRight = marginDiv.style.width = '0';
+ div.style.width = '1px';
+
+ support.reliableMarginRight = !parseFloat(
+ (window.getComputedStyle(marginDiv, null) || {}).marginRight
+ );
+ }
+
+ body.removeChild(container);
+ });
+
+ return support;
+ })({});
+
+ /*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+ var data_user,
+ data_priv,
+ rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+ function Data() {
+ this.cache = {};
+ this.expando = jQuery.expando + Math.random();
+ }
+
+ Data.uid = 1;
+
+ Data.prototype = {
+ key: function(owner) {
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[this.expando];
+
+ // If not, create one
+ if (!unlock) {
+ unlock = Data.uid++;
+ descriptor[this.expando] = { value: unlock };
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ Object.defineProperties(owner, descriptor);
+
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch (e) {
+ descriptor[this.expando] = unlock;
+ jQuery.extend(owner, descriptor);
+ }
+ }
+
+ // Ensure the cache object
+ if (!this.cache[unlock]) {
+ this.cache[unlock] = {};
+ }
+
+ return unlock;
+ },
+ set: function(owner, data, value) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key(owner),
+ cache = this.cache[unlock];
+
+ // Handle: [ owner, key, value ] args
+ if (typeof data === 'string') {
+ cache[data] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Support an expectation from the old data system where plain
+ // objects used to initialize would be set to the cache by
+ // reference, instead of having properties and values copied.
+ // Note, this will kill the connection between
+ // "this.cache[ unlock ]" and "cache"
+ if (jQuery.isEmptyObject(cache)) {
+ this.cache[unlock] = data;
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for (prop in data) {
+ cache[prop] = data[prop];
+ }
+ }
+ }
+
+ return this;
+ },
+ get: function(owner, key) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object.
+ var cache = this.cache[this.key(owner)];
+
+ return key === undefined ? cache : cache[key];
+ },
+ access: function(owner, key, value) {
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if (
+ key === undefined ||
+ (key && typeof key === 'string' && value === undefined)
+ ) {
+ return this.get(owner, key);
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set(owner, key, value);
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function(owner, key) {
+ var i,
+ name,
+ unlock = this.key(owner),
+ cache = this.cache[unlock];
+
+ if (key === undefined) {
+ this.cache[unlock] = {};
+ } else {
+ // Support array or space separated string of keys
+ if (jQuery.isArray(key)) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat(key.map(jQuery.camelCase));
+ } else {
+ // Try the string as a key before any manipulation
+ if (key in cache) {
+ name = [key];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = jQuery.camelCase(key);
+ name = name in cache ? [name] : name.match(core_rnotwhite) || [];
+ }
+ }
+
+ i = name.length;
+ while (i--) {
+ delete cache[name[i]];
+ }
+ }
+ },
+ hasData: function(owner) {
+ return !jQuery.isEmptyObject(this.cache[this.key(owner)]);
+ },
+ discard: function(owner) {
+ delete this.cache[this.key(owner)];
+ },
+ };
+
+ // This will be used by remove()/cleanData() in manipulation to sever
+ // remaining references to node objects. One day we'll replace the dual
+ // arrays with a WeakMap and this won't be an issue.
+ // (Splices the data objects out of the internal cache arrays)
+ function data_discard(owner) {
+ data_user.discard(owner);
+ data_priv.discard(owner);
+ }
+
+ // These may be used throughout the jQuery core codebase
+ data_user = new Data();
+ data_priv = new Data();
+
+ jQuery.extend({
+ // This is no longer relevant to jQuery core, but must remain
+ // supported for the sake of jQuery 1.9.x API surface compatibility.
+ acceptData: function() {
+ return true;
+ },
+
+ hasData: function(elem) {
+ return data_user.hasData(elem) || data_priv.hasData(elem);
+ },
+
+ data: function(elem, name, data) {
+ return data_user.access(elem, name, data);
+ },
+
+ removeData: function(elem, name) {
+ return data_user.remove(elem, name);
+ },
+
+ // TODO: Replace all calls to _data and _removeData with direct
+ // calls to
+ //
+ // data_priv.access( elem, name, data );
+ //
+ // data_priv.remove( elem, name );
+ //
+ _data: function(elem, name, data) {
+ return data_priv.access(elem, name, data);
+ },
+
+ _removeData: function(elem, name) {
+ return data_priv.remove(elem, name);
+ },
+ });
+
+ jQuery.fn.extend({
+ data: function(key, value) {
+ var attrs,
+ name,
+ elem = this[0],
+ i = 0,
+ data = null;
+
+ // Gets all values
+ if (key === undefined) {
+ if (this.length) {
+ data = data_user.get(elem);
+
+ if (elem.nodeType === 1 && !data_priv.get(elem, 'hasDataAttrs')) {
+ attrs = elem.attributes;
+ for (; i < attrs.length; i++) {
+ name = attrs[i].name;
+
+ if (name.indexOf('data-') === 0) {
+ name = jQuery.camelCase(name.substring(5));
+ dataAttr(elem, name, data[name]);
+ }
+ }
+ data_priv.set(elem, 'hasDataAttrs', true);
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if (typeof key === 'object') {
+ return this.each(function() {
+ data_user.set(this, key);
+ });
+ }
+
+ return jQuery.access(
+ this,
+ function(value) {
+ var data,
+ camelKey = jQuery.camelCase(key);
+
+ // Get the Data...
+ if (value === undefined) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get(elem, key);
+ if (data !== undefined) {
+ return data;
+ }
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr(elem, key, undefined);
+ if (data !== undefined) {
+ return data;
+ }
+
+ // As a last resort, attempt to find
+ // the data by checking AGAIN, but with
+ // a camelCased key.
+ data = data_user.get(elem, camelKey);
+ if (data !== undefined) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return undefined;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get(this, camelKey);
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set(this, camelKey, value);
+
+ // *... In the case of properties that might ACTUALLY
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if (/-/.test(key) && data !== undefined) {
+ data_user.set(this, key, value);
+ }
+ });
+ },
+ null,
+ value,
+ arguments.length > 1,
+ null,
+ true
+ );
+ },
+
+ removeData: function(key) {
+ return this.each(function() {
+ data_user.remove(this, key);
+ });
+ },
+ });
+
+ function dataAttr(elem, key, data) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if (data === undefined && elem.nodeType === 1) {
+ name = 'data-' + key.replace(rmultiDash, '-$1').toLowerCase();
+ data = elem.getAttribute(name);
+
+ if (typeof data === 'string') {
+ try {
+ data =
+ data === 'true'
+ ? true
+ : data === 'false'
+ ? false
+ : data === 'null'
+ ? null
+ : // Only convert to a number if it doesn't change the string
+ +data + '' === data
+ ? +data
+ : rbrace.test(data) ? JSON.parse(data) : data;
+ } catch (e) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set(elem, key, data);
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+ }
+ jQuery.extend({
+ queue: function(elem, type, data) {
+ var queue;
+
+ if (elem) {
+ type = (type || 'fx') + 'queue';
+ queue = jQuery._data(elem, type);
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if (data) {
+ if (!queue || jQuery.isArray(data)) {
+ queue = jQuery._data(elem, type, jQuery.makeArray(data));
+ } else {
+ queue.push(data);
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function(elem, type) {
+ type = type || 'fx';
+
+ var queue = jQuery.queue(elem, type),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks(elem, type),
+ next = function() {
+ jQuery.dequeue(elem, type);
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if (fn === 'inprogress') {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ hooks.cur = fn;
+ if (fn) {
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if (type === 'fx') {
+ queue.unshift('inprogress');
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call(elem, next, hooks);
+ }
+
+ if (!startLength && hooks) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function(elem, type) {
+ var key = type + 'queueHooks';
+ return (
+ jQuery._data(elem, key) ||
+ jQuery._data(elem, key, {
+ empty: jQuery.Callbacks('once memory').add(function() {
+ jQuery._removeData(elem, type + 'queue');
+ jQuery._removeData(elem, key);
+ }),
+ })
+ );
+ },
+ });
+
+ jQuery.fn.extend({
+ queue: function(type, data) {
+ var setter = 2;
+
+ if (typeof type !== 'string') {
+ data = type;
+ type = 'fx';
+ setter--;
+ }
+
+ if (arguments.length < setter) {
+ return jQuery.queue(this[0], type);
+ }
+
+ return data === undefined
+ ? this
+ : this.each(function() {
+ var queue = jQuery.queue(this, type, data);
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks(this, type);
+
+ if (type === 'fx' && queue[0] !== 'inprogress') {
+ jQuery.dequeue(this, type);
+ }
+ });
+ },
+ dequeue: function(type) {
+ return this.each(function() {
+ jQuery.dequeue(this, type);
+ });
+ },
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function(time, type) {
+ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+ type = type || 'fx';
+
+ return this.queue(type, function(next, hooks) {
+ var timeout = setTimeout(next, time);
+ hooks.stop = function() {
+ clearTimeout(timeout);
+ };
+ });
+ },
+ clearQueue: function(type) {
+ return this.queue(type || 'fx', []);
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function(type, obj) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if (!--count) {
+ defer.resolveWith(elements, [elements]);
+ }
+ };
+
+ if (typeof type !== 'string') {
+ obj = type;
+ type = undefined;
+ }
+ type = type || 'fx';
+
+ while (i--) {
+ tmp = jQuery._data(elements[i], type + 'queueHooks');
+ if (tmp && tmp.empty) {
+ count++;
+ tmp.empty.add(resolve);
+ }
+ }
+ resolve();
+ return defer.promise(obj);
+ },
+ });
+ var nodeHook,
+ boolHook,
+ rclass = /[\t\r\n]/g,
+ rreturn = /\r/g,
+ rfocusable = /^(?:input|select|textarea|button|object)$/i,
+ rclickable = /^(?:a|area)$/i,
+ rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i;
+
+ jQuery.fn.extend({
+ attr: function(name, value) {
+ return jQuery.access(
+ this,
+ jQuery.attr,
+ name,
+ value,
+ arguments.length > 1
+ );
+ },
+
+ removeAttr: function(name) {
+ return this.each(function() {
+ jQuery.removeAttr(this, name);
+ });
+ },
+
+ prop: function(name, value) {
+ return jQuery.access(
+ this,
+ jQuery.prop,
+ name,
+ value,
+ arguments.length > 1
+ );
+ },
+
+ removeProp: function(name) {
+ name = jQuery.propFix[name] || name;
+ return this.each(function() {
+ // try/catch handles cases where IE balks (such as removing a property on window)
+ try {
+ this[name] = undefined;
+ delete this[name];
+ } catch (e) {}
+ });
+ },
+
+ addClass: function(value) {
+ var classes,
+ elem,
+ cur,
+ clazz,
+ j,
+ i = 0,
+ len = this.length,
+ proceed = typeof value === 'string' && value;
+
+ if (jQuery.isFunction(value)) {
+ return this.each(function(j) {
+ jQuery(this).addClass(value.call(this, j, this.className));
+ });
+ }
+
+ if (proceed) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = (value || '').match(core_rnotwhite) || [];
+
+ for (; i < len; i++) {
+ elem = this[i];
+ cur =
+ elem.nodeType === 1 &&
+ (elem.className
+ ? (' ' + elem.className + ' ').replace(rclass, ' ')
+ : ' ');
+
+ if (cur) {
+ j = 0;
+ while ((clazz = classes[j++])) {
+ if (cur.indexOf(' ' + clazz + ' ') < 0) {
+ cur += clazz + ' ';
+ }
+ }
+ elem.className = jQuery.trim(cur);
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function(value) {
+ var classes,
+ elem,
+ cur,
+ clazz,
+ j,
+ i = 0,
+ len = this.length,
+ proceed =
+ arguments.length === 0 || (typeof value === 'string' && value);
+
+ if (jQuery.isFunction(value)) {
+ return this.each(function(j) {
+ jQuery(this).removeClass(value.call(this, j, this.className));
+ });
+ }
+ if (proceed) {
+ classes = (value || '').match(core_rnotwhite) || [];
+
+ for (; i < len; i++) {
+ elem = this[i];
+ // This expression is here for better compressibility (see addClass)
+ cur =
+ elem.nodeType === 1 &&
+ (elem.className
+ ? (' ' + elem.className + ' ').replace(rclass, ' ')
+ : '');
+
+ if (cur) {
+ j = 0;
+ while ((clazz = classes[j++])) {
+ // Remove *all* instances
+ while (cur.indexOf(' ' + clazz + ' ') >= 0) {
+ cur = cur.replace(' ' + clazz + ' ', ' ');
+ }
+ }
+ elem.className = value ? jQuery.trim(cur) : '';
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function(value, stateVal) {
+ var type = typeof value,
+ isBool = typeof stateVal === 'boolean';
+
+ if (jQuery.isFunction(value)) {
+ return this.each(function(i) {
+ jQuery(this).toggleClass(
+ value.call(this, i, this.className, stateVal),
+ stateVal
+ );
+ });
+ }
+
+ return this.each(function() {
+ if (type === 'string') {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery(this),
+ state = stateVal,
+ classNames = value.match(core_rnotwhite) || [];
+
+ while ((className = classNames[i++])) {
+ // check each className given, space separated list
+ state = isBool ? state : !self.hasClass(className);
+ self[state ? 'addClass' : 'removeClass'](className);
+ }
+
+ // Toggle whole class name
+ } else if (type === core_strundefined || type === 'boolean') {
+ if (this.className) {
+ // store className if set
+ jQuery._data(this, '__className__', this.className);
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className =
+ this.className || value === false
+ ? ''
+ : jQuery._data(this, '__className__') || '';
+ }
+ });
+ },
+
+ hasClass: function(selector) {
+ var className = ' ' + selector + ' ',
+ i = 0,
+ l = this.length;
+ for (; i < l; i++) {
+ if (
+ this[i].nodeType === 1 &&
+ (' ' + this[i].className + ' ')
+ .replace(rclass, ' ')
+ .indexOf(className) >= 0
+ ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function(value) {
+ var hooks,
+ ret,
+ isFunction,
+ elem = this[0];
+
+ if (!arguments.length) {
+ if (elem) {
+ hooks =
+ jQuery.valHooks[elem.type] ||
+ jQuery.valHooks[elem.nodeName.toLowerCase()];
+
+ if (
+ hooks &&
+ 'get' in hooks &&
+ (ret = hooks.get(elem, 'value')) !== undefined
+ ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === 'string'
+ ? // handle most common string cases
+ ret.replace(rreturn, '')
+ : // handle cases where value is null/undef or number
+ ret == null ? '' : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction(value);
+
+ return this.each(function(i) {
+ var val,
+ self = jQuery(this);
+
+ if (this.nodeType !== 1) {
+ return;
+ }
+
+ if (isFunction) {
+ val = value.call(this, i, self.val());
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if (val == null) {
+ val = '';
+ } else if (typeof val === 'number') {
+ val += '';
+ } else if (jQuery.isArray(val)) {
+ val = jQuery.map(val, function(value) {
+ return value == null ? '' : value + '';
+ });
+ }
+
+ hooks =
+ jQuery.valHooks[this.type] ||
+ jQuery.valHooks[this.nodeName.toLowerCase()];
+
+ // If set returns undefined, fall back to normal setting
+ if (
+ !hooks ||
+ !('set' in hooks) ||
+ hooks.set(this, val, 'value') === undefined
+ ) {
+ this.value = val;
+ }
+ });
+ },
+ });
+
+ jQuery.extend({
+ valHooks: {
+ option: {
+ get: function(elem) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ },
+ },
+ select: {
+ get: function(elem) {
+ var value,
+ option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === 'select-one' || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ? max : one ? index : 0;
+
+ // Loop through all the selected options
+ for (; i < max; i++) {
+ option = options[i];
+
+ // oldIE doesn't update selected after form reset (#2551)
+ if (
+ (option.selected || i === index) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ (jQuery.support.optDisabled
+ ? !option.disabled
+ : option.getAttribute('disabled') === null) &&
+ (!option.parentNode.disabled ||
+ !jQuery.nodeName(option.parentNode, 'optgroup'))
+ ) {
+ // Get the specific value for the option
+ value = jQuery(option).val();
+
+ // We don't need an array for one selects
+ if (one) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push(value);
+ }
+ }
+
+ return values;
+ },
+
+ set: function(elem, value) {
+ var values = jQuery.makeArray(value);
+
+ jQuery(elem)
+ .find('option')
+ .each(function() {
+ this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0;
+ });
+
+ if (!values.length) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ },
+ },
+ },
+
+ attr: function(elem, name, value) {
+ var ret,
+ hooks,
+ notxml,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if (!elem || nType === 3 || nType === 8 || nType === 2) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if (typeof elem.getAttribute === core_strundefined) {
+ return jQuery.prop(elem, name, value);
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc(elem);
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if (notxml) {
+ name = name.toLowerCase();
+ hooks =
+ jQuery.attrHooks[name] || (rboolean.test(name) ? boolHook : nodeHook);
+ }
+
+ if (value !== undefined) {
+ if (value === null) {
+ jQuery.removeAttr(elem, name);
+ } else if (
+ hooks &&
+ notxml &&
+ 'set' in hooks &&
+ (ret = hooks.set(elem, value, name)) !== undefined
+ ) {
+ return ret;
+ } else {
+ elem.setAttribute(name, value + '');
+ return value;
+ }
+ } else if (
+ hooks &&
+ notxml &&
+ 'get' in hooks &&
+ (ret = hooks.get(elem, name)) !== null
+ ) {
+ return ret;
+ } else {
+ // In IE9+, Flash objects don't have .getAttribute (#12945)
+ // Support: IE9+
+ if (typeof elem.getAttribute !== core_strundefined) {
+ ret = elem.getAttribute(name);
+ }
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ? undefined : ret;
+ }
+ },
+
+ removeAttr: function(elem, value) {
+ var name,
+ propName,
+ i = 0,
+ attrNames = value && value.match(core_rnotwhite);
+
+ if (attrNames && elem.nodeType === 1) {
+ while ((name = attrNames[i++])) {
+ propName = jQuery.propFix[name] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ // Set corresponding property to false for boolean attributes
+ if (rboolean.test(name)) {
+ elem[propName] = false;
+ }
+
+ elem.removeAttribute(name);
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function(elem, value) {
+ if (
+ !jQuery.support.radioValue &&
+ value === 'radio' &&
+ jQuery.nodeName(elem, 'input')
+ ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute('type', value);
+ if (val) {
+ elem.value = val;
+ }
+ return value;
+ }
+ },
+ },
+ },
+
+ propFix: {
+ tabindex: 'tabIndex',
+ readonly: 'readOnly',
+ for: 'htmlFor',
+ class: 'className',
+ maxlength: 'maxLength',
+ cellspacing: 'cellSpacing',
+ cellpadding: 'cellPadding',
+ rowspan: 'rowSpan',
+ colspan: 'colSpan',
+ usemap: 'useMap',
+ frameborder: 'frameBorder',
+ contenteditable: 'contentEditable',
+ },
+
+ prop: function(elem, name, value) {
+ var ret,
+ hooks,
+ notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if (!elem || nType === 3 || nType === 8 || nType === 2) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc(elem);
+
+ if (notxml) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[name] || name;
+ hooks = jQuery.propHooks[name];
+ }
+
+ if (value !== undefined) {
+ if (
+ hooks &&
+ 'set' in hooks &&
+ (ret = hooks.set(elem, value, name)) !== undefined
+ ) {
+ return ret;
+ } else {
+ return (elem[name] = value);
+ }
+ } else {
+ if (hooks && 'get' in hooks && (ret = hooks.get(elem, name)) !== null) {
+ return ret;
+ } else {
+ return elem[name];
+ }
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function(elem) {
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ var attributeNode = elem.getAttributeNode('tabindex');
+
+ return attributeNode && attributeNode.specified
+ ? parseInt(attributeNode.value, 10)
+ : rfocusable.test(elem.nodeName) ||
+ (rclickable.test(elem.nodeName) && elem.href)
+ ? 0
+ : undefined;
+ },
+ },
+ },
+ });
+
+ // Hook for boolean attributes
+ boolHook = {
+ get: function(elem, name) {
+ return elem.getAttribute(name) !== null ? name.toLowerCase() : undefined;
+ },
+ set: function(elem, value, name) {
+ if (value === false) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr(elem, name);
+ } else {
+ elem.setAttribute(name, name);
+ }
+ return name;
+ },
+ };
+
+ // Radios and checkboxes getter/setter
+ if (!jQuery.support.checkOn) {
+ jQuery.each(['radio', 'checkbox'], function() {
+ jQuery.valHooks[this] = {
+ get: function(elem) {
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute('value') === null ? 'on' : elem.value;
+ },
+ };
+ });
+ }
+ jQuery.each(['radio', 'checkbox'], function() {
+ jQuery.valHooks[this] = jQuery.extend(jQuery.valHooks[this], {
+ set: function(elem, value) {
+ if (jQuery.isArray(value)) {
+ return (elem.checked =
+ jQuery.inArray(jQuery(elem).val(), value) >= 0);
+ }
+ },
+ });
+ });
+
+ // IE9/10 do not see a selected option inside an optgroup unless you access it
+ // Support: IE9, IE10
+ if (!jQuery.support.optSelected) {
+ jQuery.propHooks.selected = jQuery.extend(jQuery.propHooks.selected, {
+ get: function(elem) {
+ var parent = elem.parentNode;
+ if (parent && parent.parentNode) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ },
+ });
+ }
+ var rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+ function returnTrue() {
+ return true;
+ }
+
+ function returnFalse() {
+ return false;
+ }
+
+ /*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+ jQuery.event = {
+ global: {},
+
+ add: function(elem, types, handler, data, selector) {
+ var handleObjIn,
+ eventHandle,
+ tmp,
+ events,
+ t,
+ handleObj,
+ special,
+ handlers,
+ type,
+ namespaces,
+ origType,
+ elemData = data_priv.get(elem);
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if (!elemData) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if (handler.handler) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if (!handler.guid) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if (!(events = elemData.events)) {
+ events = elemData.events = {};
+ }
+ if (!(eventHandle = elemData.handle)) {
+ eventHandle = elemData.handle = function(e) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== core_strundefined &&
+ (!e || jQuery.event.triggered !== e.type)
+ ? jQuery.event.dispatch.apply(eventHandle.elem, arguments)
+ : undefined;
+ };
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ types = (types || '').match(core_rnotwhite) || [''];
+ t = types.length;
+ while (t--) {
+ tmp = rtypenamespace.exec(types[t]) || [];
+ type = origType = tmp[1];
+ namespaces = (tmp[2] || '').split('.').sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if (!type) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[type] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = (selector ? special.delegateType : special.bindType) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[type] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend(
+ {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext:
+ selector && jQuery.expr.match.needsContext.test(selector),
+ namespace: namespaces.join('.'),
+ },
+ handleObjIn
+ );
+
+ // Init the event handler queue if we're the first
+ if (!(handlers = events[type])) {
+ handlers = events[type] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if (
+ !special.setup ||
+ special.setup.call(elem, data, namespaces, eventHandle) === false
+ ) {
+ if (elem.addEventListener) {
+ elem.addEventListener(type, eventHandle, false);
+ }
+ }
+ }
+
+ if (special.add) {
+ special.add.call(elem, handleObj);
+
+ if (!handleObj.handler.guid) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if (selector) {
+ handlers.splice(handlers.delegateCount++, 0, handleObj);
+ } else {
+ handlers.push(handleObj);
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[type] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ // Detach an event or set of events from an element
+ remove: function(elem, types, handler, selector, mappedTypes) {
+ var j,
+ origCount,
+ tmp,
+ events,
+ t,
+ handleObj,
+ special,
+ handlers,
+ type,
+ namespaces,
+ origType,
+ elemData = data_priv.hasData(elem) && data_priv.get(elem);
+
+ if (!elemData || !(events = elemData.events)) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = (types || '').match(core_rnotwhite) || [''];
+ t = types.length;
+ while (t--) {
+ tmp = rtypenamespace.exec(types[t]) || [];
+ type = origType = tmp[1];
+ namespaces = (tmp[2] || '').split('.').sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if (!type) {
+ for (type in events) {
+ jQuery.event.remove(elem, type + types[t], handler, selector, true);
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[type] || {};
+ type = (selector ? special.delegateType : special.bindType) || type;
+ handlers = events[type] || [];
+ tmp =
+ tmp[2] &&
+ new RegExp('(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)');
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while (j--) {
+ handleObj = handlers[j];
+
+ if (
+ (mappedTypes || origType === handleObj.origType) &&
+ (!handler || handler.guid === handleObj.guid) &&
+ (!tmp || tmp.test(handleObj.namespace)) &&
+ (!selector ||
+ selector === handleObj.selector ||
+ (selector === '**' && handleObj.selector))
+ ) {
+ handlers.splice(j, 1);
+
+ if (handleObj.selector) {
+ handlers.delegateCount--;
+ }
+ if (special.remove) {
+ special.remove.call(elem, handleObj);
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if (origCount && !handlers.length) {
+ if (
+ !special.teardown ||
+ special.teardown.call(elem, namespaces, elemData.handle) === false
+ ) {
+ jQuery.removeEvent(elem, type, elemData.handle);
+ }
+
+ delete events[type];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if (jQuery.isEmptyObject(events)) {
+ delete elemData.handle;
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery._removeData(elem, 'events');
+ }
+ },
+
+ trigger: function(event, data, elem, onlyHandlers) {
+ var i,
+ cur,
+ tmp,
+ bubbleType,
+ ontype,
+ handle,
+ special,
+ eventPath = [elem || document],
+ type = core_hasOwn.call(event, 'type') ? event.type : event,
+ namespaces = core_hasOwn.call(event, 'namespace')
+ ? event.namespace.split('.')
+ : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if (elem.nodeType === 3 || elem.nodeType === 8) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if (rfocusMorph.test(type + jQuery.event.triggered)) {
+ return;
+ }
+
+ if (type.indexOf('.') >= 0) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split('.');
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(':') < 0 && 'on' + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[jQuery.expando]
+ ? event
+ : new jQuery.Event(type, typeof event === 'object' && event);
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join('.');
+ event.namespace_re = event.namespace
+ ? new RegExp('(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)')
+ : null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if (!event.target) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ? [event] : jQuery.makeArray(data, [event]);
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[type] || {};
+ if (
+ !onlyHandlers &&
+ special.trigger &&
+ special.trigger.apply(elem, data) === false
+ ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {
+ bubbleType = special.delegateType || type;
+ if (!rfocusMorph.test(bubbleType + type)) {
+ cur = cur.parentNode;
+ }
+ for (; cur; cur = cur.parentNode) {
+ eventPath.push(cur);
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if (tmp === (elem.ownerDocument || document)) {
+ eventPath.push(tmp.defaultView || tmp.parentWindow || window);
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
+ event.type = i > 1 ? bubbleType : special.bindType || type;
+
+ // jQuery handler
+ handle =
+ (jQuery._data(cur, 'events') || {})[event.type] &&
+ jQuery._data(cur, 'handle');
+ if (handle) {
+ handle.apply(cur, data);
+ }
+
+ // Native handler
+ handle = ontype && cur[ontype];
+ if (
+ handle &&
+ jQuery.acceptData(cur) &&
+ handle.apply &&
+ handle.apply(cur, data) === false
+ ) {
+ event.preventDefault();
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if (!onlyHandlers && !event.isDefaultPrevented()) {
+ if (
+ (!special._default ||
+ special._default.apply(elem.ownerDocument, data) === false) &&
+ !(type === 'click' && jQuery.nodeName(elem, 'a')) &&
+ jQuery.acceptData(elem)
+ ) {
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if (
+ ontype &&
+ jQuery.isFunction(elem[type]) &&
+ !jQuery.isWindow(elem)
+ ) {
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ontype];
+
+ if (tmp) {
+ elem[ontype] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[type]();
+ jQuery.event.triggered = undefined;
+
+ if (tmp) {
+ elem[ontype] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function(event) {
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix(event);
+
+ var i,
+ j,
+ ret,
+ matched,
+ handleObj,
+ handlerQueue = [],
+ args = core_slice.call(arguments),
+ handlers = (jQuery._data(this, 'events') || {})[event.type] || [],
+ special = jQuery.event.special[event.type] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if (
+ special.preDispatch &&
+ special.preDispatch.call(this, event) === false
+ ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call(this, event, handlers);
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while (
+ (handleObj = matched.handlers[j++]) &&
+ !event.isImmediatePropagationStopped()
+ ) {
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if (
+ !event.namespace_re ||
+ event.namespace_re.test(handleObj.namespace)
+ ) {
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = (
+ (jQuery.event.special[handleObj.origType] || {}).handle ||
+ handleObj.handler
+ ).apply(matched.elem, args);
+
+ if (ret !== undefined) {
+ if ((event.result = ret) === false) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if (special.postDispatch) {
+ special.postDispatch.call(this, event);
+ }
+
+ return event.result;
+ },
+
+ handlers: function(event, handlers) {
+ var i,
+ matches,
+ sel,
+ handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if (
+ delegateCount &&
+ cur.nodeType &&
+ (!event.button || event.type !== 'click')
+ ) {
+ for (; cur != this; cur = cur.parentNode || this) {
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if (cur.disabled !== true || event.type !== 'click') {
+ matches = [];
+ for (i = 0; i < delegateCount; i++) {
+ handleObj = handlers[i];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + ' ';
+
+ if (matches[sel] === undefined) {
+ matches[sel] = handleObj.needsContext
+ ? jQuery(sel, this).index(cur) >= 0
+ : jQuery.find(sel, this, null, [cur]).length;
+ }
+ if (matches[sel]) {
+ matches.push(handleObj);
+ }
+ }
+ if (matches.length) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if (delegateCount < handlers.length) {
+ handlerQueue.push({
+ elem: this,
+ handlers: handlers.slice(delegateCount),
+ });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: 'altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which'.split(
+ ' '
+ ),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: 'char charCode key keyCode'.split(' '),
+ filter: function(event, original) {
+ // Add which for key events
+ if (event.which == null) {
+ event.which =
+ original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ },
+ },
+
+ mouseHooks: {
+ props: 'button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement'.split(
+ ' '
+ ),
+ filter: function(event, original) {
+ var eventDoc,
+ doc,
+ body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if (event.pageX == null && original.clientX != null) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX =
+ original.clientX +
+ ((doc && doc.scrollLeft) || (body && body.scrollLeft) || 0) -
+ ((doc && doc.clientLeft) || (body && body.clientLeft) || 0);
+ event.pageY =
+ original.clientY +
+ ((doc && doc.scrollTop) || (body && body.scrollTop) || 0) -
+ ((doc && doc.clientTop) || (body && body.clientTop) || 0);
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if (!event.which && button !== undefined) {
+ event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
+ }
+
+ return event;
+ },
+ },
+
+ fix: function(event) {
+ if (event[jQuery.expando]) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i,
+ prop,
+ copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[type];
+
+ if (!fixHook) {
+ this.fixHooks[type] = fixHook = rmouseEvent.test(type)
+ ? this.mouseHooks
+ : rkeyEvent.test(type) ? this.keyHooks : {};
+ }
+ copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;
+
+ event = new jQuery.Event(originalEvent);
+
+ i = copy.length;
+ while (i--) {
+ prop = copy[i];
+ event[prop] = originalEvent[prop];
+ }
+
+ // Support: Chrome 23+, Safari?
+ // Target should not be a text node (#504, #13143)
+ if (event.target.nodeType === 3) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true,
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if (
+ this.type === 'checkbox' &&
+ this.click &&
+ jQuery.nodeName(this, 'input')
+ ) {
+ this.click();
+ return false;
+ }
+ },
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if (this !== document.activeElement && this.focus) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: 'focusin',
+ },
+ blur: {
+ trigger: function() {
+ if (this === document.activeElement && this.blur) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: 'focusout',
+ },
+
+ beforeunload: {
+ postDispatch: function(event) {
+ // Support: Firefox 10+
+ if (event.result !== undefined) {
+ event.originalEvent.returnValue = event.result;
+ }
+ },
+ },
+ },
+
+ simulate: function(type, elem, event, bubble) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(new jQuery.Event(), event, {
+ type: type,
+ isSimulated: true,
+ originalEvent: {},
+ });
+ if (bubble) {
+ jQuery.event.trigger(e, null, elem);
+ } else {
+ jQuery.event.dispatch.call(elem, e);
+ }
+ if (e.isDefaultPrevented()) {
+ event.preventDefault();
+ }
+ },
+ };
+
+ jQuery.removeEvent = function(elem, type, handle) {
+ if (elem.removeEventListener) {
+ elem.removeEventListener(type, handle, false);
+ }
+ };
+
+ jQuery.Event = function(src, props) {
+ // Allow instantiation without the 'new' keyword
+ if (!(this instanceof jQuery.Event)) {
+ return new jQuery.Event(src, props);
+ }
+
+ // Event object
+ if (src && src.type) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented =
+ src.defaultPrevented ||
+ (src.getPreventDefault && src.getPreventDefault())
+ ? returnTrue
+ : returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if (props) {
+ jQuery.extend(this, props);
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = (src && src.timeStamp) || jQuery.now();
+
+ // Mark it as fixed
+ this[jQuery.expando] = true;
+ };
+
+ // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+ // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+ jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if (e && e.preventDefault) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if (e && e.stopPropagation) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ },
+ };
+
+ // Create mouseenter/leave events using mouseover/out and event-time checks
+ // Support: Chrome 15+
+ jQuery.each(
+ {
+ mouseenter: 'mouseover',
+ mouseleave: 'mouseout',
+ },
+ function(orig, fix) {
+ jQuery.event.special[orig] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function(event) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if (
+ !related ||
+ (related !== target && !jQuery.contains(target, related))
+ ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply(this, arguments);
+ event.type = fix;
+ }
+ return ret;
+ },
+ };
+ }
+ );
+
+ // Create "bubbling" focus and blur events
+ // Support: Firefox 10+
+ if (!jQuery.support.focusinBubbles) {
+ jQuery.each({ focus: 'focusin', blur: 'focusout' }, function(orig, fix) {
+ // Attach a single capturing handler while someone wants focusin/focusout
+ var attaches = 0,
+ handler = function(event) {
+ jQuery.event.simulate(
+ fix,
+ event.target,
+ jQuery.event.fix(event),
+ true
+ );
+ };
+
+ jQuery.event.special[fix] = {
+ setup: function() {
+ if (attaches++ === 0) {
+ document.addEventListener(orig, handler, true);
+ }
+ },
+ teardown: function() {
+ if (--attaches === 0) {
+ document.removeEventListener(orig, handler, true);
+ }
+ },
+ };
+ });
+ }
+
+ jQuery.fn.extend({
+ on: function(types, selector, data, fn, /*INTERNAL*/ one) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if (typeof types === 'object') {
+ // ( types-Object, selector, data )
+ if (typeof selector !== 'string') {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for (type in types) {
+ this.on(type, selector, data, types[type], one);
+ }
+ return this;
+ }
+
+ if (data == null && fn == null) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if (fn == null) {
+ if (typeof selector === 'string') {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if (fn === false) {
+ fn = returnFalse;
+ } else if (!fn) {
+ return this;
+ }
+
+ if (one === 1) {
+ origFn = fn;
+ fn = function(event) {
+ // Can use an empty set, since event contains the info
+ jQuery().off(event);
+ return origFn.apply(this, arguments);
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
+ }
+ return this.each(function() {
+ jQuery.event.add(this, types, fn, data, selector);
+ });
+ },
+ one: function(types, selector, data, fn) {
+ return this.on(types, selector, data, fn, 1);
+ },
+ off: function(types, selector, fn) {
+ var handleObj, type;
+ if (types && types.preventDefault && types.handleObj) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery(types.delegateTarget).off(
+ handleObj.namespace
+ ? handleObj.origType + '.' + handleObj.namespace
+ : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if (typeof types === 'object') {
+ // ( types-object [, selector] )
+ for (type in types) {
+ this.off(type, selector, types[type]);
+ }
+ return this;
+ }
+ if (selector === false || typeof selector === 'function') {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if (fn === false) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove(this, types, fn, selector);
+ });
+ },
+
+ bind: function(types, data, fn) {
+ return this.on(types, null, data, fn);
+ },
+ unbind: function(types, fn) {
+ return this.off(types, null, fn);
+ },
+
+ delegate: function(selector, types, data, fn) {
+ return this.on(types, selector, data, fn);
+ },
+ undelegate: function(selector, types, fn) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1
+ ? this.off(selector, '**')
+ : this.off(types, selector || '**', fn);
+ },
+
+ trigger: function(type, data) {
+ return this.each(function() {
+ jQuery.event.trigger(type, data, this);
+ });
+ },
+ triggerHandler: function(type, data) {
+ var elem = this[0];
+ if (elem) {
+ return jQuery.event.trigger(type, data, elem, true);
+ }
+ },
+ });
+ /*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+ (function(window, undefined) {
+ var i,
+ cachedruns,
+ Expr,
+ getText,
+ isXML,
+ compile,
+ outermostContext,
+ recompare,
+ sortInput,
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsXML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+ // Instance-specific data
+ expando = 'sizzle' + -new Date(),
+ preferredDoc = window.document,
+ support = {},
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ hasDuplicate = false,
+ sortOrder = function() {
+ return 0;
+ },
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+ // Array methods
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf =
+ arr.indexOf ||
+ function(elem) {
+ var i = 0,
+ len = this.length;
+ for (; i < len; i++) {
+ if (this[i] === elem) {
+ return i;
+ }
+ }
+ return -1;
+ },
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = '[\\x20\\t\\r\\n\\f]',
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = '(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+',
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace('w', 'w#'),
+ // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+ operators = '([*^$|!~]?=)',
+ attributes =
+ '\\[' +
+ whitespace +
+ '*(' +
+ characterEncoding +
+ ')' +
+ whitespace +
+ '*(?:' +
+ operators +
+ whitespace +
+ '*(?:([\'"])((?:\\\\.|[^\\\\])*?)\\3|(' +
+ identifier +
+ ')|)|)' +
+ whitespace +
+ '*\\]',
+ // Prefer arguments quoted,
+ // then not containing pseudos/brackets,
+ // then attribute selectors/non-parenthetical expressions,
+ // then anything else
+ // These preferences are here to reduce the number of selectors
+ // needing tokenize in the PSEUDO preFilter
+ pseudos =
+ ':(' +
+ characterEncoding +
+ ')(?:\\((([\'"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|' +
+ attributes.replace(3, 8) +
+ ')*)|.*)\\)|)',
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp(
+ '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$',
+ 'g'
+ ),
+ rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'),
+ rcombinators = new RegExp(
+ '^' + whitespace + '*([\\x20\\t\\r\\n\\f>+~])' + whitespace + '*'
+ ),
+ rpseudo = new RegExp(pseudos),
+ ridentifier = new RegExp('^' + identifier + '$'),
+ matchExpr = {
+ ID: new RegExp('^#(' + characterEncoding + ')'),
+ CLASS: new RegExp('^\\.(' + characterEncoding + ')'),
+ NAME: new RegExp('^\\[name=[\'"]?(' + characterEncoding + ')[\'"]?\\]'),
+ TAG: new RegExp('^(' + characterEncoding.replace('w', 'w*') + ')'),
+ ATTR: new RegExp('^' + attributes),
+ PSEUDO: new RegExp('^' + pseudos),
+ CHILD: new RegExp(
+ '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' +
+ whitespace +
+ '*(even|odd|(([+-]|)(\\d*)n|)' +
+ whitespace +
+ '*(?:([+-]|)' +
+ whitespace +
+ '*(\\d+)|))' +
+ whitespace +
+ '*\\)|)',
+ 'i'
+ ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ needsContext: new RegExp(
+ '^' +
+ whitespace +
+ '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' +
+ whitespace +
+ '*((?:-\\d)?\\d*)' +
+ whitespace +
+ '*\\)|)(?=[^-]|$)',
+ 'i'
+ ),
+ },
+ rsibling = /[\x20\t\r\n\f]*[+~]/,
+ rnative = /^[^{]+\{\s*\[native code/,
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+ rescape = /'|\\/g,
+ rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
+ funescape = function(_, escaped) {
+ var high = '0x' + escaped - 0x10000;
+ // NaN means non-codepoint
+ return high !== high
+ ? escaped
+ : // BMP codepoint
+ high < 0
+ ? String.fromCharCode(high + 0x10000)
+ : // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode(
+ (high >> 10) | 0xd800,
+ (high & 0x3ff) | 0xdc00
+ );
+ };
+
+ // Optimize for push.apply( _, NodeList )
+ try {
+ push.apply(
+ (arr = slice.call(preferredDoc.childNodes)),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[preferredDoc.childNodes.length].nodeType;
+ } catch (e) {
+ push = {
+ apply: arr.length
+ ? // Leverage slice if possible
+ function(target, els) {
+ push_native.apply(target, slice.call(els));
+ }
+ : // Support: IE<9
+ // Otherwise append directly
+ function(target, els) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ((target[j++] = els[i++])) {}
+ target.length = j - 1;
+ },
+ };
+ }
+
+ /**
+ * For feature detection
+ * @param {Function} fn The function to test for native support
+ */
+ function isNative(fn) {
+ return rnative.test(fn + '');
+ }
+
+ /**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+ function createCache() {
+ var cache,
+ keys = [];
+
+ return (cache = function(key, value) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if (keys.push((key += ' ')) > Expr.cacheLength) {
+ // Only keep the most recent entries
+ delete cache[keys.shift()];
+ }
+ return (cache[key] = value);
+ });
+ }
+
+ /**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+ function markFunction(fn) {
+ fn[expando] = true;
+ return fn;
+ }
+
+ /**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+ function assert(fn) {
+ var div = document.createElement('div');
+
+ try {
+ return !!fn(div);
+ } catch (e) {
+ return false;
+ } finally {
+ // release memory in IE
+ div = null;
+ }
+ }
+
+ function Sizzle(selector, context, results, seed) {
+ var match,
+ elem,
+ m,
+ nodeType,
+ // QSA vars
+ i,
+ groups,
+ old,
+ nid,
+ newContext,
+ newSelector;
+
+ if (
+ (context ? context.ownerDocument || context : preferredDoc) !== document
+ ) {
+ setDocument(context);
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if (!selector || typeof selector !== 'string') {
+ return results;
+ }
+
+ if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) {
+ return [];
+ }
+
+ if (!documentIsXML && !seed) {
+ // Shortcuts
+ if ((match = rquickExpr.exec(selector))) {
+ // Speed-up: Sizzle("#ID")
+ if ((m = match[1])) {
+ if (nodeType === 9) {
+ elem = context.getElementById(m);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if (elem && elem.parentNode) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if (elem.id === m) {
+ results.push(elem);
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if (
+ context.ownerDocument &&
+ (elem = context.ownerDocument.getElementById(m)) &&
+ contains(context, elem) &&
+ elem.id === m
+ ) {
+ results.push(elem);
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if (match[2]) {
+ push.apply(results, context.getElementsByTagName(selector));
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if (
+ (m = match[3]) &&
+ support.getByClassName &&
+ context.getElementsByClassName
+ ) {
+ push.apply(results, context.getElementsByClassName(m));
+ return results;
+ }
+ }
+
+ // QSA path
+ if (support.qsa && !rbuggyQSA.test(selector)) {
+ old = true;
+ nid = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if (nodeType === 1 && context.nodeName.toLowerCase() !== 'object') {
+ groups = tokenize(selector);
+
+ if ((old = context.getAttribute('id'))) {
+ nid = old.replace(rescape, '\\$&');
+ } else {
+ context.setAttribute('id', nid);
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while (i--) {
+ groups[i] = nid + toSelector(groups[i]);
+ }
+ newContext =
+ (rsibling.test(selector) && context.parentNode) || context;
+ newSelector = groups.join(',');
+ }
+
+ if (newSelector) {
+ try {
+ push.apply(results, newContext.querySelectorAll(newSelector));
+ return results;
+ } catch (qsaError) {
+ } finally {
+ if (!old) {
+ context.removeAttribute('id');
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select(selector.replace(rtrim, '$1'), context, results, seed);
+ }
+
+ /**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+ isXML = Sizzle.isXML = function(elem) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement =
+ elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== 'HTML' : false;
+ };
+
+ /**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+ setDocument = Sizzle.setDocument = function(node) {
+ var doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // If no document and documentElement is available, return
+ if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsXML = isXML(doc);
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.tagNameNoComments = assert(function(div) {
+ div.appendChild(doc.createComment(''));
+ return !div.getElementsByTagName('*').length;
+ });
+
+ // Check if attributes should be retrieved by attribute nodes
+ support.attributes = assert(function(div) {
+ div.innerHTML = ' ';
+ var type = typeof div.lastChild.getAttribute('multiple');
+ // IE8 returns a string for some attributes even when not present
+ return type !== 'boolean' && type !== 'string';
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getByClassName = assert(function(div) {
+ // Opera can't find a second classname (in 9.6)
+ div.innerHTML =
+ "
";
+ if (
+ !div.getElementsByClassName ||
+ !div.getElementsByClassName('e').length
+ ) {
+ return false;
+ }
+
+ // Safari 3.2 caches class attributes and doesn't catch changes
+ div.lastChild.className = 'e';
+ return div.getElementsByClassName('e').length === 2;
+ });
+
+ // Check if getElementsByName privileges form controls or returns elements by ID
+ // If so, assume (for broader support) that getElementById returns elements by name
+ support.getByName = assert(function(div) {
+ // Inject content
+ div.id = expando + 0;
+ // Support: Windows 8 Native Apps
+ // Assigning innerHTML with "name" attributes throws uncatchable exceptions
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx
+ div
+ .appendChild(document.createElement('a'))
+ .setAttribute('name', expando);
+ div
+ .appendChild(document.createElement('i'))
+ .setAttribute('name', expando);
+ docElem.appendChild(div);
+
+ // Test
+ var pass =
+ doc.getElementsByName &&
+ // buggy browsers will return fewer than the correct 2
+ doc.getElementsByName(expando).length ===
+ 2 +
+ // buggy browsers will return more than the correct 0
+ doc.getElementsByName(expando + 0).length;
+
+ // Cleanup
+ docElem.removeChild(div);
+
+ return pass;
+ });
+
+ // Support: Webkit<537.32
+ // Detached nodes confoundingly follow *each other*
+ support.sortDetached = assert(function(div1) {
+ return (
+ div1.compareDocumentPosition &&
+ // Should return 1, but Webkit returns 4 (following)
+ div1.compareDocumentPosition(document.createElement('div')) & 1
+ );
+ });
+
+ // IE6/7 return modified attributes
+ Expr.attrHandle = assert(function(div) {
+ div.innerHTML = " ";
+ return (
+ div.firstChild &&
+ typeof div.firstChild.getAttribute !== strundefined &&
+ div.firstChild.getAttribute('href') === '#'
+ );
+ })
+ ? {}
+ : {
+ href: function(elem) {
+ return elem.getAttribute('href', 2);
+ },
+ type: function(elem) {
+ return elem.getAttribute('type');
+ },
+ };
+
+ // ID find and filter
+ if (support.getByName) {
+ Expr.find['ID'] = function(id, context) {
+ if (
+ typeof context.getElementById !== strundefined &&
+ !documentIsXML
+ ) {
+ var m = context.getElementById(id);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ };
+ Expr.filter['ID'] = function(id) {
+ var attrId = id.replace(runescape, funescape);
+ return function(elem) {
+ return elem.getAttribute('id') === attrId;
+ };
+ };
+ } else {
+ Expr.find['ID'] = function(id, context) {
+ if (
+ typeof context.getElementById !== strundefined &&
+ !documentIsXML
+ ) {
+ var m = context.getElementById(id);
+
+ return m
+ ? m.id === id ||
+ (typeof m.getAttributeNode !== strundefined &&
+ m.getAttributeNode('id').value === id)
+ ? [m]
+ : undefined
+ : [];
+ }
+ };
+ Expr.filter['ID'] = function(id) {
+ var attrId = id.replace(runescape, funescape);
+ return function(elem) {
+ var node =
+ typeof elem.getAttributeNode !== strundefined &&
+ elem.getAttributeNode('id');
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find['TAG'] = support.tagNameNoComments
+ ? function(tag, context) {
+ if (typeof context.getElementsByTagName !== strundefined) {
+ return context.getElementsByTagName(tag);
+ }
+ }
+ : function(tag, context) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName(tag);
+
+ // Filter out possible comments
+ if (tag === '*') {
+ while ((elem = results[i++])) {
+ if (elem.nodeType === 1) {
+ tmp.push(elem);
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Name
+ Expr.find['NAME'] =
+ support.getByName &&
+ function(tag, context) {
+ if (typeof context.getElementsByName !== strundefined) {
+ return context.getElementsByName(name);
+ }
+ };
+
+ // Class
+ Expr.find['CLASS'] =
+ support.getByClassName &&
+ function(className, context) {
+ if (
+ typeof context.getElementsByClassName !== strundefined &&
+ !documentIsXML
+ ) {
+ return context.getElementsByClassName(className);
+ }
+ };
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21),
+ // no need to also add to buggyMatches since matches checks buggyQSA
+ // A support test would require too much code (would include document ready)
+ rbuggyQSA = [':focus'];
+
+ if ((support.qsa = isNative(doc.querySelectorAll))) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function(div) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explictly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = " ";
+
+ // IE8 - Some boolean attributes are not treated correctly
+ if (!div.querySelectorAll('[selected]').length) {
+ rbuggyQSA.push(
+ '\\[' +
+ whitespace +
+ '*(?:checked|disabled|ismap|multiple|readonly|selected|value)'
+ );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if (!div.querySelectorAll(':checked').length) {
+ rbuggyQSA.push(':checked');
+ }
+ });
+
+ assert(function(div) {
+ // Opera 10-12/IE8 - ^= $= *= and empty values
+ // Should not select anything
+ div.innerHTML = " ";
+ if (div.querySelectorAll("[i^='']").length) {
+ rbuggyQSA.push('[*^$]=' + whitespace + '*(?:""|\'\')');
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if (!div.querySelectorAll(':enabled').length) {
+ rbuggyQSA.push(':enabled', ':disabled');
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll('*,:x');
+ rbuggyQSA.push(',.*:');
+ });
+ }
+
+ if (
+ (support.matchesSelector = isNative(
+ (matches =
+ docElem.matchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.webkitMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector)
+ ))
+ ) {
+ assert(function(div) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call(div, 'div');
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call(div, "[s!='']:x");
+ rbuggyMatches.push('!=', pseudos);
+ });
+ }
+
+ rbuggyQSA = new RegExp(rbuggyQSA.join('|'));
+ rbuggyMatches =
+ rbuggyMatches.length && new RegExp(rbuggyMatches.join('|'));
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains =
+ isNative(docElem.contains) || docElem.compareDocumentPosition
+ ? function(a, b) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return (
+ a === bup ||
+ !!(
+ bup &&
+ bup.nodeType === 1 &&
+ (adown.contains
+ ? adown.contains(bup)
+ : a.compareDocumentPosition &&
+ a.compareDocumentPosition(bup) & 16)
+ )
+ );
+ }
+ : function(a, b) {
+ if (b) {
+ while ((b = b.parentNode)) {
+ if (b === a) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ // Document order sorting
+ sortOrder = docElem.compareDocumentPosition
+ ? function(a, b) {
+ // Flag for duplicate removal
+ if (a === b) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var compare =
+ b.compareDocumentPosition &&
+ a.compareDocumentPosition &&
+ a.compareDocumentPosition(b);
+
+ if (compare) {
+ // Disconnected nodes
+ if (
+ compare & 1 ||
+ (recompare && b.compareDocumentPosition(a) === compare)
+ ) {
+ // Choose the first element that is related to our preferred document
+ if (a === doc || contains(preferredDoc, a)) {
+ return -1;
+ }
+ if (b === doc || contains(preferredDoc, b)) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput
+ ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b)
+ : 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ }
+
+ // Not directly comparable, sort on existence of method
+ return a.compareDocumentPosition ? -1 : 1;
+ }
+ : function(a, b) {
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [a],
+ bp = [b];
+
+ // Exit early if the nodes are identical
+ if (a === b) {
+ hasDuplicate = true;
+ return 0;
+
+ // Parentless nodes are either documents or disconnected
+ } else if (!aup || !bup) {
+ return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if (aup === bup) {
+ return siblingCheck(a, b);
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ((cur = cur.parentNode)) {
+ ap.unshift(cur);
+ }
+ cur = b;
+ while ((cur = cur.parentNode)) {
+ bp.unshift(cur);
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while (ap[i] === bp[i]) {
+ i++;
+ }
+
+ return i
+ ? // Do a sibling check if the nodes have a common ancestor
+ siblingCheck(ap[i], bp[i])
+ : // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
+ };
+
+ return document;
+ };
+
+ Sizzle.matches = function(expr, elements) {
+ return Sizzle(expr, null, null, elements);
+ };
+
+ Sizzle.matchesSelector = function(elem, expr) {
+ // Set document vars if needed
+ if ((elem.ownerDocument || elem) !== document) {
+ setDocument(elem);
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(rattributeQuotes, "='$1']");
+
+ // rbuggyQSA always contains :focus, so no need for an existence check
+ if (
+ support.matchesSelector &&
+ !documentIsXML &&
+ (!rbuggyMatches || !rbuggyMatches.test(expr)) &&
+ !rbuggyQSA.test(expr)
+ ) {
+ try {
+ var ret = matches.call(elem, expr);
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if (
+ ret ||
+ support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ (elem.document && elem.document.nodeType !== 11)
+ ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle(expr, document, null, [elem]).length > 0;
+ };
+
+ Sizzle.contains = function(context, elem) {
+ // Set document vars if needed
+ if ((context.ownerDocument || context) !== document) {
+ setDocument(context);
+ }
+ return contains(context, elem);
+ };
+
+ Sizzle.attr = function(elem, name) {
+ var val;
+
+ // Set document vars if needed
+ if ((elem.ownerDocument || elem) !== document) {
+ setDocument(elem);
+ }
+
+ if (!documentIsXML) {
+ name = name.toLowerCase();
+ }
+ if ((val = Expr.attrHandle[name])) {
+ return val(elem);
+ }
+ if (documentIsXML || support.attributes) {
+ return elem.getAttribute(name);
+ }
+ return ((val = elem.getAttributeNode(name)) || elem.getAttribute(name)) &&
+ elem[name] === true
+ ? name
+ : val && val.specified ? val.value : null;
+ };
+
+ Sizzle.error = function(msg) {
+ throw new Error('Syntax error, unrecognized expression: ' + msg);
+ };
+
+ // Document sorting and removing duplicates
+ Sizzle.uniqueSort = function(results) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ // Compensate for sort limitations
+ recompare = !support.sortDetached;
+ sortInput = !support.sortStable && results.slice(0);
+ results.sort(sortOrder);
+
+ if (hasDuplicate) {
+ while ((elem = results[i++])) {
+ if (elem === results[i]) {
+ j = duplicates.push(i);
+ }
+ }
+ while (j--) {
+ results.splice(duplicates[j], 1);
+ }
+ }
+
+ return results;
+ };
+
+ /**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns Returns -1 if a precedes b, 1 if a follows b
+ */
+ function siblingCheck(a, b) {
+ var cur = b && a,
+ diff =
+ cur &&
+ (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);
+
+ // Use IE sourceIndex if available on both nodes
+ if (diff) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if (cur) {
+ while ((cur = cur.nextSibling)) {
+ if (cur === b) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+ }
+
+ // Returns a function to use in pseudos for input types
+ function createInputPseudo(type) {
+ return function(elem) {
+ var name = elem.nodeName.toLowerCase();
+ return name === 'input' && elem.type === type;
+ };
+ }
+
+ // Returns a function to use in pseudos for buttons
+ function createButtonPseudo(type) {
+ return function(elem) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === 'input' || name === 'button') && elem.type === type;
+ };
+ }
+
+ // Returns a function to use in pseudos for positionals
+ function createPositionalPseudo(fn) {
+ return markFunction(function(argument) {
+ argument = +argument;
+ return markFunction(function(seed, matches) {
+ var j,
+ matchIndexes = fn([], seed.length, argument),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while (i--) {
+ if (seed[(j = matchIndexes[i])]) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+ }
+
+ /**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+ getText = Sizzle.getText = function(elem) {
+ var node,
+ ret = '',
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if (!nodeType) {
+ // If no nodeType, this is expected to be an array
+ for (; (node = elem[i]); i++) {
+ // Do not traverse comment nodes
+ ret += getText(node);
+ }
+ } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (see #11153)
+ if (typeof elem.textContent === 'string') {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ ret += getText(elem);
+ }
+ }
+ } else if (nodeType === 3 || nodeType === 4) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+ };
+
+ Expr = Sizzle.selectors = {
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ find: {},
+
+ relative: {
+ '>': { dir: 'parentNode', first: true },
+ ' ': { dir: 'parentNode' },
+ '+': { dir: 'previousSibling', first: true },
+ '~': { dir: 'previousSibling' },
+ },
+
+ preFilter: {
+ ATTR: function(match) {
+ match[1] = match[1].replace(runescape, funescape);
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = (match[4] || match[5] || '').replace(runescape, funescape);
+
+ if (match[2] === '~=') {
+ match[3] = ' ' + match[3] + ' ';
+ }
+
+ return match.slice(0, 4);
+ },
+
+ CHILD: function(match) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if (match[1].slice(0, 3) === 'nth') {
+ // nth-* requires argument
+ if (!match[3]) {
+ Sizzle.error(match[0]);
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +(match[4]
+ ? match[5] + (match[6] || 1)
+ : 2 * (match[3] === 'even' || match[3] === 'odd'));
+ match[5] = +(match[7] + match[8] || match[3] === 'odd');
+
+ // other types prohibit arguments
+ } else if (match[3]) {
+ Sizzle.error(match[0]);
+ }
+
+ return match;
+ },
+
+ PSEUDO: function(match) {
+ var excess,
+ unquoted = !match[5] && match[2];
+
+ if (matchExpr['CHILD'].test(match[0])) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if (match[4]) {
+ match[2] = match[4];
+
+ // Strip excess characters from unquoted arguments
+ } else if (
+ unquoted &&
+ rpseudo.test(unquoted) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize(unquoted, true)) &&
+ // advance to the next closing parenthesis
+ (excess =
+ unquoted.indexOf(')', unquoted.length - excess) - unquoted.length)
+ ) {
+ // excess is a negative index
+ match[0] = match[0].slice(0, excess);
+ match[2] = unquoted.slice(0, excess);
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice(0, 3);
+ },
+ },
+
+ filter: {
+ TAG: function(nodeName) {
+ if (nodeName === '*') {
+ return function() {
+ return true;
+ };
+ }
+
+ nodeName = nodeName.replace(runescape, funescape).toLowerCase();
+ return function(elem) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ CLASS: function(className) {
+ var pattern = classCache[className + ' '];
+
+ return (
+ pattern ||
+ ((pattern = new RegExp(
+ '(^|' + whitespace + ')' + className + '(' + whitespace + '|$)'
+ )) &&
+ classCache(className, function(elem) {
+ return pattern.test(
+ elem.className ||
+ (typeof elem.getAttribute !== strundefined &&
+ elem.getAttribute('class')) ||
+ ''
+ );
+ }))
+ );
+ },
+
+ ATTR: function(name, operator, check) {
+ return function(elem) {
+ var result = Sizzle.attr(elem, name);
+
+ if (result == null) {
+ return operator === '!=';
+ }
+ if (!operator) {
+ return true;
+ }
+
+ result += '';
+
+ return operator === '='
+ ? result === check
+ : operator === '!='
+ ? result !== check
+ : operator === '^='
+ ? check && result.indexOf(check) === 0
+ : operator === '*='
+ ? check && result.indexOf(check) > -1
+ : operator === '$='
+ ? check && result.slice(-check.length) === check
+ : operator === '~='
+ ? (' ' + result + ' ').indexOf(check) > -1
+ : operator === '|='
+ ? result === check ||
+ result.slice(0, check.length + 1) === check + '-'
+ : false;
+ };
+ },
+
+ CHILD: function(type, what, argument, first, last) {
+ var simple = type.slice(0, 3) !== 'nth',
+ forward = type.slice(-4) !== 'last',
+ ofType = what === 'of-type';
+
+ return first === 1 && last === 0
+ ? // Shortcut for :nth-*(n)
+ function(elem) {
+ return !!elem.parentNode;
+ }
+ : function(elem, context, xml) {
+ var cache,
+ outerCache,
+ node,
+ diff,
+ nodeIndex,
+ start,
+ dir = simple !== forward ? 'nextSibling' : 'previousSibling',
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if (parent) {
+ // :(first|last|only)-(child|of-type)
+ if (simple) {
+ while (dir) {
+ node = elem;
+ while ((node = node[dir])) {
+ if (
+ ofType
+ ? node.nodeName.toLowerCase() === name
+ : node.nodeType === 1
+ ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === 'only' && !start && 'nextSibling';
+ }
+ return true;
+ }
+
+ start = [forward ? parent.firstChild : parent.lastChild];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if (forward && useCache) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[expando] || (parent[expando] = {});
+ cache = outerCache[type] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[nodeIndex];
+
+ while (
+ (node =
+ (++nodeIndex && node && node[dir]) ||
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) ||
+ start.pop())
+ ) {
+ // When found, cache indexes on `parent` and break
+ if (node.nodeType === 1 && ++diff && node === elem) {
+ outerCache[type] = [dirruns, nodeIndex, diff];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if (
+ useCache &&
+ (cache = (elem[expando] || (elem[expando] = {}))[type]) &&
+ cache[0] === dirruns
+ ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while (
+ (node =
+ (++nodeIndex && node && node[dir]) ||
+ (diff = nodeIndex = 0) ||
+ start.pop())
+ ) {
+ if (
+ (ofType
+ ? node.nodeName.toLowerCase() === name
+ : node.nodeType === 1) &&
+ ++diff
+ ) {
+ // Cache the index of each encountered element
+ if (useCache) {
+ (node[expando] || (node[expando] = {}))[type] = [
+ dirruns,
+ diff,
+ ];
+ }
+
+ if (node === elem) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return (
+ diff === first || (diff % first === 0 && diff / first >= 0)
+ );
+ }
+ };
+ },
+
+ PSEUDO: function(pseudo, argument) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn =
+ Expr.pseudos[pseudo] ||
+ Expr.setFilters[pseudo.toLowerCase()] ||
+ Sizzle.error('unsupported pseudo: ' + pseudo);
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if (fn[expando]) {
+ return fn(argument);
+ }
+
+ // But maintain support for old signatures
+ if (fn.length > 1) {
+ args = [pseudo, pseudo, '', argument];
+ return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())
+ ? markFunction(function(seed, matches) {
+ var idx,
+ matched = fn(seed, argument),
+ i = matched.length;
+ while (i--) {
+ idx = indexOf.call(seed, matched[i]);
+ seed[idx] = !(matches[idx] = matched[i]);
+ }
+ })
+ : function(elem) {
+ return fn(elem, 0, args);
+ };
+ }
+
+ return fn;
+ },
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ not: markFunction(function(selector) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile(selector.replace(rtrim, '$1'));
+
+ return matcher[expando]
+ ? markFunction(function(seed, matches, context, xml) {
+ var elem,
+ unmatched = matcher(seed, null, xml, []),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while (i--) {
+ if ((elem = unmatched[i])) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ })
+ : function(elem, context, xml) {
+ input[0] = elem;
+ matcher(input, null, xml, results);
+ return !results.pop();
+ };
+ }),
+
+ has: markFunction(function(selector) {
+ return function(elem) {
+ return Sizzle(selector, elem).length > 0;
+ };
+ }),
+
+ contains: markFunction(function(text) {
+ return function(elem) {
+ return (
+ (elem.textContent || elem.innerText || getText(elem)).indexOf(
+ text
+ ) > -1
+ );
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ lang: markFunction(function(lang) {
+ // lang value must be a valid identifider
+ if (!ridentifier.test(lang || '')) {
+ Sizzle.error('unsupported lang: ' + lang);
+ }
+ lang = lang.replace(runescape, funescape).toLowerCase();
+ return function(elem) {
+ var elemLang;
+ do {
+ if (
+ (elemLang = documentIsXML
+ ? elem.getAttribute('xml:lang') || elem.getAttribute('lang')
+ : elem.lang)
+ ) {
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf(lang + '-') === 0;
+ }
+ } while ((elem = elem.parentNode) && elem.nodeType === 1);
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ target: function(elem) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice(1) === elem.id;
+ },
+
+ root: function(elem) {
+ return elem === docElem;
+ },
+
+ focus: function(elem) {
+ return (
+ elem === document.activeElement &&
+ (!document.hasFocus || document.hasFocus()) &&
+ !!(elem.type || elem.href || ~elem.tabIndex)
+ );
+ },
+
+ // Boolean properties
+ enabled: function(elem) {
+ return elem.disabled === false;
+ },
+
+ disabled: function(elem) {
+ return elem.disabled === true;
+ },
+
+ checked: function(elem) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (
+ (nodeName === 'input' && !!elem.checked) ||
+ (nodeName === 'option' && !!elem.selected)
+ );
+ },
+
+ selected: function(elem) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if (elem.parentNode) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ empty: function(elem) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+ // not comment, processing instructions, or others
+ // Thanks to Diego Perini for the nodeName shortcut
+ // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+ for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ if (
+ elem.nodeName > '@' ||
+ elem.nodeType === 3 ||
+ elem.nodeType === 4
+ ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ parent: function(elem) {
+ return !Expr.pseudos['empty'](elem);
+ },
+
+ // Element/input types
+ header: function(elem) {
+ return rheader.test(elem.nodeName);
+ },
+
+ input: function(elem) {
+ return rinputs.test(elem.nodeName);
+ },
+
+ button: function(elem) {
+ var name = elem.nodeName.toLowerCase();
+ return (
+ (name === 'input' && elem.type === 'button') || name === 'button'
+ );
+ },
+
+ text: function(elem) {
+ var attr;
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+ // use getAttribute instead to test this case
+ return (
+ elem.nodeName.toLowerCase() === 'input' &&
+ elem.type === 'text' &&
+ ((attr = elem.getAttribute('type')) == null ||
+ attr.toLowerCase() === elem.type)
+ );
+ },
+
+ // Position-in-collection
+ first: createPositionalPseudo(function() {
+ return [0];
+ }),
+
+ last: createPositionalPseudo(function(matchIndexes, length) {
+ return [length - 1];
+ }),
+
+ eq: createPositionalPseudo(function(matchIndexes, length, argument) {
+ return [argument < 0 ? argument + length : argument];
+ }),
+
+ even: createPositionalPseudo(function(matchIndexes, length) {
+ var i = 0;
+ for (; i < length; i += 2) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ odd: createPositionalPseudo(function(matchIndexes, length) {
+ var i = 1;
+ for (; i < length; i += 2) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ lt: createPositionalPseudo(function(matchIndexes, length, argument) {
+ var i = argument < 0 ? argument + length : argument;
+ for (; --i >= 0; ) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ gt: createPositionalPseudo(function(matchIndexes, length, argument) {
+ var i = argument < 0 ? argument + length : argument;
+ for (; ++i < length; ) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+ },
+ };
+
+ // Add button/input type pseudos
+ for (i in {
+ radio: true,
+ checkbox: true,
+ file: true,
+ password: true,
+ image: true,
+ }) {
+ Expr.pseudos[i] = createInputPseudo(i);
+ }
+ for (i in { submit: true, reset: true }) {
+ Expr.pseudos[i] = createButtonPseudo(i);
+ }
+
+ function tokenize(selector, parseOnly) {
+ var matched,
+ match,
+ tokens,
+ type,
+ soFar,
+ groups,
+ preFilters,
+ cached = tokenCache[selector + ' '];
+
+ if (cached) {
+ return parseOnly ? 0 : cached.slice(0);
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while (soFar) {
+ // Comma and first run
+ if (!matched || (match = rcomma.exec(soFar))) {
+ if (match) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice(match[0].length) || soFar;
+ }
+ groups.push((tokens = []));
+ }
+
+ matched = false;
+
+ // Combinators
+ if ((match = rcombinators.exec(soFar))) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace(rtrim, ' '),
+ });
+ soFar = soFar.slice(matched.length);
+ }
+
+ // Filters
+ for (type in Expr.filter) {
+ if (
+ (match = matchExpr[type].exec(soFar)) &&
+ (!preFilters[type] || (match = preFilters[type](match)))
+ ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match,
+ });
+ soFar = soFar.slice(matched.length);
+ }
+ }
+
+ if (!matched) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly
+ ? soFar.length
+ : soFar
+ ? Sizzle.error(selector)
+ : // Cache the tokens
+ tokenCache(selector, groups).slice(0);
+ }
+
+ function toSelector(tokens) {
+ var i = 0,
+ len = tokens.length,
+ selector = '';
+ for (; i < len; i++) {
+ selector += tokens[i].value;
+ }
+ return selector;
+ }
+
+ function addCombinator(matcher, combinator, base) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === 'parentNode',
+ doneName = done++;
+
+ return combinator.first
+ ? // Check against closest ancestor/preceding element
+ function(elem, context, xml) {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ return matcher(elem, context, xml);
+ }
+ }
+ }
+ : // Check against all ancestor/preceding elements
+ function(elem, context, xml) {
+ var data,
+ cache,
+ outerCache,
+ dirkey = dirruns + ' ' + doneName;
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if (xml) {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ if (matcher(elem, context, xml)) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ outerCache = elem[expando] || (elem[expando] = {});
+ if ((cache = outerCache[dir]) && cache[0] === dirkey) {
+ if ((data = cache[1]) === true || data === cachedruns) {
+ return data === true;
+ }
+ } else {
+ cache = outerCache[dir] = [dirkey];
+ cache[1] = matcher(elem, context, xml) || cachedruns;
+ if (cache[1] === true) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+ }
+
+ function elementMatcher(matchers) {
+ return matchers.length > 1
+ ? function(elem, context, xml) {
+ var i = matchers.length;
+ while (i--) {
+ if (!matchers[i](elem, context, xml)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ : matchers[0];
+ }
+
+ function condense(unmatched, map, filter, context, xml) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for (; i < len; i++) {
+ if ((elem = unmatched[i])) {
+ if (!filter || filter(elem, context, xml)) {
+ newUnmatched.push(elem);
+ if (mapped) {
+ map.push(i);
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+ }
+
+ function setMatcher(
+ preFilter,
+ selector,
+ matcher,
+ postFilter,
+ postFinder,
+ postSelector
+ ) {
+ if (postFilter && !postFilter[expando]) {
+ postFilter = setMatcher(postFilter);
+ }
+ if (postFinder && !postFinder[expando]) {
+ postFinder = setMatcher(postFinder, postSelector);
+ }
+ return markFunction(function(seed, results, context, xml) {
+ var temp,
+ i,
+ elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+ // Get initial elements from seed or context
+ elems =
+ seed ||
+ multipleContexts(
+ selector || '*',
+ context.nodeType ? [context] : context,
+ []
+ ),
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn =
+ preFilter && (seed || !selector)
+ ? condense(elems, preMap, preFilter, context, xml)
+ : elems,
+ matcherOut = matcher
+ ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || (seed ? preFilter : preexisting || postFilter)
+ ? // ...intermediate processing is necessary
+ []
+ : // ...otherwise use results directly
+ results
+ : matcherIn;
+
+ // Find primary matches
+ if (matcher) {
+ matcher(matcherIn, matcherOut, context, xml);
+ }
+
+ // Apply postFilter
+ if (postFilter) {
+ temp = condense(matcherOut, postMap);
+ postFilter(temp, [], context, xml);
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while (i--) {
+ if ((elem = temp[i])) {
+ matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
+ }
+ }
+ }
+
+ if (seed) {
+ if (postFinder || preFilter) {
+ if (postFinder) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while (i--) {
+ if ((elem = matcherOut[i])) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push((matcherIn[i] = elem));
+ }
+ }
+ postFinder(null, (matcherOut = []), temp, xml);
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while (i--) {
+ if (
+ (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1
+ ) {
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results
+ ? matcherOut.splice(preexisting, matcherOut.length)
+ : matcherOut
+ );
+ if (postFinder) {
+ postFinder(null, results, matcherOut, xml);
+ } else {
+ push.apply(results, matcherOut);
+ }
+ }
+ });
+ }
+
+ function matcherFromTokens(tokens) {
+ var checkContext,
+ matcher,
+ j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[tokens[0].type],
+ implicitRelative = leadingRelative || Expr.relative[' '],
+ i = leadingRelative ? 1 : 0,
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator(
+ function(elem) {
+ return elem === checkContext;
+ },
+ implicitRelative,
+ true
+ ),
+ matchAnyContext = addCombinator(
+ function(elem) {
+ return indexOf.call(checkContext, elem) > -1;
+ },
+ implicitRelative,
+ true
+ ),
+ matchers = [
+ function(elem, context, xml) {
+ return (
+ (!leadingRelative && (xml || context !== outermostContext)) ||
+ ((checkContext = context).nodeType
+ ? matchContext(elem, context, xml)
+ : matchAnyContext(elem, context, xml))
+ );
+ },
+ ];
+
+ for (; i < len; i++) {
+ if ((matcher = Expr.relative[tokens[i].type])) {
+ matchers = [addCombinator(elementMatcher(matchers), matcher)];
+ } else {
+ matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
+
+ // Return special upon seeing a positional matcher
+ if (matcher[expando]) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for (; j < len; j++) {
+ if (Expr.relative[tokens[j].type]) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher(matchers),
+ i > 1 && toSelector(tokens.slice(0, i - 1)).replace(rtrim, '$1'),
+ matcher,
+ i < j && matcherFromTokens(tokens.slice(i, j)),
+ j < len && matcherFromTokens((tokens = tokens.slice(j))),
+ j < len && toSelector(tokens)
+ );
+ }
+ matchers.push(matcher);
+ }
+ }
+
+ return elementMatcher(matchers);
+ }
+
+ function matcherFromGroupMatchers(elementMatchers, setMatchers) {
+ // A counter to specify which element is currently being matched
+ var matcherCachedRuns = 0,
+ bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function(seed, context, xml, results, expandContext) {
+ var elem,
+ j,
+ matcher,
+ setMatched = [],
+ matchedCount = 0,
+ i = '0',
+ unmatched = seed && [],
+ outermost = expandContext != null,
+ contextBackup = outermostContext,
+ // We must always have either seed elements or context
+ elems =
+ seed ||
+ (byElement &&
+ Expr.find['TAG'](
+ '*',
+ (expandContext && context.parentNode) || context
+ )),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns +=
+ contextBackup == null ? 1 : Math.random() || 0.1);
+
+ if (outermost) {
+ outermostContext = context !== document && context;
+ cachedruns = matcherCachedRuns;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ for (; (elem = elems[i]) != null; i++) {
+ if (byElement && elem) {
+ j = 0;
+ while ((matcher = elementMatchers[j++])) {
+ if (matcher(elem, context, xml)) {
+ results.push(elem);
+ break;
+ }
+ }
+ if (outermost) {
+ dirruns = dirrunsUnique;
+ cachedruns = ++matcherCachedRuns;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if (bySet) {
+ // They will have gone through all possible matchers
+ if ((elem = !matcher && elem)) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if (seed) {
+ unmatched.push(elem);
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if (bySet && i !== matchedCount) {
+ j = 0;
+ while ((matcher = setMatchers[j++])) {
+ matcher(unmatched, setMatched, context, xml);
+ }
+
+ if (seed) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if (matchedCount > 0) {
+ while (i--) {
+ if (!(unmatched[i] || setMatched[i])) {
+ setMatched[i] = pop.call(results);
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense(setMatched);
+ }
+
+ // Add matches to results
+ push.apply(results, setMatched);
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if (
+ outermost &&
+ !seed &&
+ setMatched.length > 0 &&
+ matchedCount + setMatchers.length > 1
+ ) {
+ Sizzle.uniqueSort(results);
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if (outermost) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ? markFunction(superMatcher) : superMatcher;
+ }
+
+ compile = Sizzle.compile = function(
+ selector,
+ group /* Internal Use Only */
+ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[selector + ' '];
+
+ if (!cached) {
+ // Generate a function of recursive functions that can be used to check each element
+ if (!group) {
+ group = tokenize(selector);
+ }
+ i = group.length;
+ while (i--) {
+ cached = matcherFromTokens(group[i]);
+ if (cached[expando]) {
+ setMatchers.push(cached);
+ } else {
+ elementMatchers.push(cached);
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache(
+ selector,
+ matcherFromGroupMatchers(elementMatchers, setMatchers)
+ );
+ }
+ return cached;
+ };
+
+ function multipleContexts(selector, contexts, results) {
+ var i = 0,
+ len = contexts.length;
+ for (; i < len; i++) {
+ Sizzle(selector, contexts[i], results);
+ }
+ return results;
+ }
+
+ function select(selector, context, results, seed) {
+ var i,
+ tokens,
+ token,
+ type,
+ find,
+ match = tokenize(selector);
+
+ if (!seed) {
+ // Try to minimize operations if there is only one group
+ if (match.length === 1) {
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice(0);
+ if (
+ tokens.length > 2 &&
+ (token = tokens[0]).type === 'ID' &&
+ context.nodeType === 9 &&
+ !documentIsXML &&
+ Expr.relative[tokens[1].type]
+ ) {
+ context = (Expr.find['ID'](
+ token.matches[0].replace(runescape, funescape),
+ context
+ ) || [])[0];
+ if (!context) {
+ return results;
+ }
+
+ selector = selector.slice(tokens.shift().value.length);
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr['needsContext'].test(selector) ? 0 : tokens.length;
+ while (i--) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if (Expr.relative[(type = token.type)]) {
+ break;
+ }
+ if ((find = Expr.find[type])) {
+ // Search, expanding context for leading sibling combinators
+ if (
+ (seed = find(
+ token.matches[0].replace(runescape, funescape),
+ (rsibling.test(tokens[0].type) && context.parentNode) ||
+ context
+ ))
+ ) {
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice(i, 1);
+ selector = seed.length && toSelector(tokens);
+ if (!selector) {
+ push.apply(results, seed);
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function
+ // Provide `match` to avoid retokenization if we modified the selector above
+ compile(selector, match)(
+ seed,
+ context,
+ documentIsXML,
+ results,
+ rsibling.test(selector)
+ );
+ return results;
+ }
+
+ // Deprecated
+ Expr.pseudos['nth'] = Expr.pseudos['eq'];
+
+ // Easy API for creating new setFilters
+ function setFilters() {}
+ setFilters.prototype = Expr.filters = Expr.pseudos;
+ Expr.setFilters = new setFilters();
+
+ // Check sort stability
+ support.sortStable =
+ expando
+ .split('')
+ .sort(sortOrder)
+ .join('') === expando;
+
+ // Initialize with the default document
+ setDocument();
+
+ // Always assume the presence of duplicates if sort doesn't
+ // pass them to our comparison function (as in Google Chrome).
+ [0, 0].sort(sortOrder);
+ support.detectDuplicates = hasDuplicate;
+
+ // Override sizzle attribute retrieval
+ Sizzle.attr = jQuery.attr;
+ jQuery.find = Sizzle;
+ jQuery.expr = Sizzle.selectors;
+ jQuery.expr[':'] = jQuery.expr.pseudos;
+ jQuery.unique = Sizzle.uniqueSort;
+ jQuery.text = Sizzle.getText;
+ jQuery.isXMLDoc = Sizzle.isXML;
+ jQuery.contains = Sizzle.contains;
+ })(window);
+ var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ rneedsContext = jQuery.expr.match.needsContext,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true,
+ };
+
+ jQuery.fn.extend({
+ find: function(selector) {
+ var self,
+ matched,
+ i,
+ l = this.length;
+
+ if (typeof selector !== 'string') {
+ self = this;
+ return this.pushStack(
+ jQuery(selector).filter(function() {
+ for (i = 0; i < l; i++) {
+ if (jQuery.contains(self[i], this)) {
+ return true;
+ }
+ }
+ })
+ );
+ }
+
+ matched = [];
+ for (i = 0; i < l; i++) {
+ jQuery.find(selector, this[i], matched);
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ matched = this.pushStack(l > 1 ? jQuery.unique(matched) : matched);
+ matched.selector = (this.selector ? this.selector + ' ' : '') + selector;
+ return matched;
+ },
+
+ has: function(target) {
+ var targets = jQuery(target, this),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for (; i < l; i++) {
+ if (jQuery.contains(this, targets[i])) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function(selector) {
+ return this.pushStack(winnow(this, selector, false));
+ },
+
+ filter: function(selector) {
+ return this.pushStack(winnow(this, selector, true));
+ },
+
+ is: function(selector) {
+ return (
+ !!selector &&
+ (typeof selector === 'string'
+ ? // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ rneedsContext.test(selector)
+ ? jQuery(selector, this.context).index(this[0]) >= 0
+ : jQuery.filter(selector, this).length > 0
+ : this.filter(selector).length > 0)
+ );
+ },
+
+ closest: function(selectors, context) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos =
+ rneedsContext.test(selectors) || typeof selectors !== 'string'
+ ? jQuery(selectors, context || this.context)
+ : 0;
+
+ for (; i < l; i++) {
+ for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
+ // Always skip document fragments
+ if (
+ cur.nodeType < 11 &&
+ (pos
+ ? pos.index(cur) > -1
+ : // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors))
+ ) {
+ cur = matched.push(cur);
+ break;
+ }
+ }
+ }
+
+ return this.pushStack(
+ matched.length > 1 ? jQuery.unique(matched) : matched
+ );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function(elem) {
+ // No argument, return index in parent
+ if (!elem) {
+ return this[0] && this[0].parentNode
+ ? this.first().prevAll().length
+ : -1;
+ }
+
+ // index in selector
+ if (typeof elem === 'string') {
+ return core_indexOf.call(jQuery(elem), this[0]);
+ }
+
+ // Locate the position of the desired element
+ return core_indexOf.call(
+ this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem
+ );
+ },
+
+ add: function(selector, context) {
+ var set =
+ typeof selector === 'string'
+ ? jQuery(selector, context)
+ : jQuery.makeArray(
+ selector && selector.nodeType ? [selector] : selector
+ ),
+ all = jQuery.merge(this.get(), set);
+
+ return this.pushStack(jQuery.unique(all));
+ },
+
+ addBack: function(selector) {
+ return this.add(
+ selector == null ? this.prevObject : this.prevObject.filter(selector)
+ );
+ },
+ });
+
+ function sibling(cur, dir) {
+ while ((cur = cur[dir]) && cur.nodeType !== 1) {}
+
+ return cur;
+ }
+
+ jQuery.each(
+ {
+ parent: function(elem) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function(elem) {
+ return jQuery.dir(elem, 'parentNode');
+ },
+ parentsUntil: function(elem, i, until) {
+ return jQuery.dir(elem, 'parentNode', until);
+ },
+ next: function(elem) {
+ return sibling(elem, 'nextSibling');
+ },
+ prev: function(elem) {
+ return sibling(elem, 'previousSibling');
+ },
+ nextAll: function(elem) {
+ return jQuery.dir(elem, 'nextSibling');
+ },
+ prevAll: function(elem) {
+ return jQuery.dir(elem, 'previousSibling');
+ },
+ nextUntil: function(elem, i, until) {
+ return jQuery.dir(elem, 'nextSibling', until);
+ },
+ prevUntil: function(elem, i, until) {
+ return jQuery.dir(elem, 'previousSibling', until);
+ },
+ siblings: function(elem) {
+ return jQuery.sibling((elem.parentNode || {}).firstChild, elem);
+ },
+ children: function(elem) {
+ return jQuery.sibling(elem.firstChild);
+ },
+ contents: function(elem) {
+ return jQuery.nodeName(elem, 'iframe')
+ ? elem.contentDocument || elem.contentWindow.document
+ : jQuery.merge([], elem.childNodes);
+ },
+ },
+ function(name, fn) {
+ jQuery.fn[name] = function(until, selector) {
+ var matched = jQuery.map(this, fn, until);
+
+ if (!runtil.test(name)) {
+ selector = until;
+ }
+
+ if (selector && typeof selector === 'string') {
+ matched = jQuery.filter(selector, matched);
+ }
+
+ if (this.length > 1) {
+ if (!guaranteedUnique[name]) {
+ jQuery.unique(matched);
+ }
+
+ if (rparentsprev.test(name)) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack(matched);
+ };
+ }
+ );
+
+ jQuery.extend({
+ filter: function(expr, elems, not) {
+ if (not) {
+ expr = ':not(' + expr + ')';
+ }
+
+ return elems.length === 1
+ ? jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : []
+ : jQuery.find.matches(expr, elems);
+ },
+
+ dir: function(elem, dir, until) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ((elem = elem[dir]) && elem.nodeType !== 9) {
+ if (elem.nodeType === 1) {
+ if (truncate && jQuery(elem).is(until)) {
+ break;
+ }
+ matched.push(elem);
+ }
+ }
+ return matched;
+ },
+
+ sibling: function(n, elem) {
+ var matched = [];
+
+ for (; n; n = n.nextSibling) {
+ if (n.nodeType === 1 && n !== elem) {
+ matched.push(n);
+ }
+ }
+
+ return matched;
+ },
+ });
+
+ // Implement the identical functionality for filter and not
+ function winnow(elements, qualifier, keep) {
+ // Can't pass null or undefined to indexOf in Firefox 4
+ // Set to 0 to skip string check
+ qualifier = qualifier || 0;
+
+ var filtered;
+
+ if (jQuery.isFunction(qualifier)) {
+ return jQuery.grep(elements, function(elem, i) {
+ var retVal = !!qualifier.call(elem, i, elem);
+ return retVal === keep;
+ });
+ }
+
+ if (qualifier.nodeType) {
+ return jQuery.grep(elements, function(elem) {
+ return (elem === qualifier) === keep;
+ });
+ }
+
+ if (typeof qualifier === 'string') {
+ filtered = jQuery.grep(elements, function(elem) {
+ return elem.nodeType === 1;
+ });
+
+ if (isSimple.test(qualifier)) {
+ return jQuery.filter(qualifier, filtered, !keep);
+ }
+
+ qualifier = jQuery.filter(qualifier, filtered);
+ }
+
+ return jQuery.grep(elements, function(elem) {
+ return core_indexOf.call(qualifier, elem) >= 0 === keep;
+ });
+ }
+ var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*\s*$/g,
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+ // Support: IE 9
+ option: [1, "", ' '],
+
+ thead: [1, ''],
+ tr: [2, ''],
+ td: [3, ''],
+
+ _default: [0, '', ''],
+ };
+
+ // Support: IE 9
+ wrapMap.optgroup = wrapMap.option;
+
+ wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.col =
+ wrapMap.thead;
+ wrapMap.th = wrapMap.td;
+
+ jQuery.fn.extend({
+ text: function(value) {
+ return jQuery.access(
+ this,
+ function(value) {
+ return value === undefined
+ ? jQuery.text(this)
+ : this.empty().append(
+ ((this[0] && this[0].ownerDocument) || document).createTextNode(
+ value
+ )
+ );
+ },
+ null,
+ value,
+ arguments.length
+ );
+ },
+
+ wrapAll: function(html) {
+ var wrap;
+
+ if (jQuery.isFunction(html)) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll(html.call(this, i));
+ });
+ }
+
+ if (this[0]) {
+ // The elements to wrap the target around
+ wrap = jQuery(html, this[0].ownerDocument)
+ .eq(0)
+ .clone(true);
+
+ if (this[0].parentNode) {
+ wrap.insertBefore(this[0]);
+ }
+
+ wrap
+ .map(function() {
+ var elem = this;
+
+ while (elem.firstElementChild) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ })
+ .append(this);
+ }
+
+ return this;
+ },
+
+ wrapInner: function(html) {
+ if (jQuery.isFunction(html)) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner(html.call(this, i));
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery(this),
+ contents = self.contents();
+
+ if (contents.length) {
+ contents.wrapAll(html);
+ } else {
+ self.append(html);
+ }
+ });
+ },
+
+ wrap: function(html) {
+ var isFunction = jQuery.isFunction(html);
+
+ return this.each(function(i) {
+ jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
+ });
+ },
+
+ unwrap: function() {
+ return this.parent()
+ .each(function() {
+ if (!jQuery.nodeName(this, 'body')) {
+ jQuery(this).replaceWith(this.childNodes);
+ }
+ })
+ .end();
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, function(elem) {
+ if (
+ this.nodeType === 1 ||
+ this.nodeType === 11 ||
+ this.nodeType === 9
+ ) {
+ this.appendChild(elem);
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, function(elem) {
+ if (
+ this.nodeType === 1 ||
+ this.nodeType === 11 ||
+ this.nodeType === 9
+ ) {
+ this.insertBefore(elem, this.firstChild);
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip(arguments, false, function(elem) {
+ if (this.parentNode) {
+ this.parentNode.insertBefore(elem, this);
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip(arguments, false, function(elem) {
+ if (this.parentNode) {
+ this.parentNode.insertBefore(elem, this.nextSibling);
+ }
+ });
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function(selector, keepData) {
+ var elem,
+ i = 0,
+ l = this.length;
+
+ for (; i < l; i++) {
+ elem = this[i];
+
+ if (!selector || jQuery.filter(selector, [elem]).length > 0) {
+ if (!keepData && elem.nodeType === 1) {
+ jQuery.cleanData(getAll(elem));
+ }
+
+ if (elem.parentNode) {
+ if (keepData && jQuery.contains(elem.ownerDocument, elem)) {
+ setGlobalEval(getAll(elem, 'script'));
+ }
+ elem.parentNode.removeChild(elem);
+ }
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0,
+ l = this.length;
+
+ for (; i < l; i++) {
+ elem = this[i];
+
+ if (elem.nodeType === 1) {
+ // Prevent memory leaks
+ jQuery.cleanData(getAll(elem, false));
+
+ // Remove any remaining nodes
+ elem.textContent = '';
+ }
+ }
+
+ return this;
+ },
+
+ clone: function(dataAndEvents, deepDataAndEvents) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents =
+ deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
+ });
+ },
+
+ html: function(value) {
+ return jQuery.access(
+ this,
+ function(value) {
+ var elem = this[0] || {},
+ i = 0,
+ l = this.length;
+
+ if (value === undefined && elem.nodeType === 1) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if (
+ typeof value === 'string' &&
+ !rnoInnerhtml.test(value) &&
+ !wrapMap[(rtagName.exec(value) || ['', ''])[1].toLowerCase()]
+ ) {
+ value = value.replace(rxhtmlTag, '<$1>$2>');
+
+ try {
+ for (; i < l; i++) {
+ elem = this[i] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if (elem.nodeType === 1) {
+ jQuery.cleanData(getAll(elem, false));
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch (e) {}
+ }
+
+ if (elem) {
+ this.empty().append(value);
+ }
+ },
+ null,
+ value,
+ arguments.length
+ );
+ },
+
+ replaceWith: function(value) {
+ var isFunction = jQuery.isFunction(value);
+
+ // Make sure that the elements are removed from the DOM before they are inserted
+ // this can help fix replacing a parent with child elements
+ if (!isFunction && typeof value !== 'string') {
+ value = jQuery(value)
+ .not(this)
+ .detach();
+ }
+
+ return value !== ''
+ ? this.domManip([value], true, function(elem) {
+ var next = this.nextSibling,
+ parent = this.parentNode;
+
+ if (parent) {
+ jQuery(this).remove();
+ parent.insertBefore(elem, next);
+ }
+ })
+ : this.remove();
+ },
+
+ detach: function(selector) {
+ return this.remove(selector, true);
+ },
+
+ domManip: function(args, table, callback) {
+ // Flatten any nested arrays
+ args = core_concat.apply([], args);
+
+ var fragment,
+ first,
+ scripts,
+ hasScripts,
+ node,
+ doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[0],
+ isFunction = jQuery.isFunction(value);
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if (
+ isFunction ||
+ !(
+ l <= 1 ||
+ typeof value !== 'string' ||
+ jQuery.support.checkClone ||
+ !rchecked.test(value)
+ )
+ ) {
+ return this.each(function(index) {
+ var self = set.eq(index);
+ if (isFunction) {
+ args[0] = value.call(this, index, table ? self.html() : undefined);
+ }
+ self.domManip(args, table, callback);
+ });
+ }
+
+ if (l) {
+ fragment = jQuery.buildFragment(
+ args,
+ this[0].ownerDocument,
+ false,
+ this
+ );
+ first = fragment.firstChild;
+
+ if (fragment.childNodes.length === 1) {
+ fragment = first;
+ }
+
+ if (first) {
+ table = table && jQuery.nodeName(first, 'tr');
+ scripts = jQuery.map(getAll(fragment, 'script'), disableScript);
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for (; i < l; i++) {
+ node = fragment;
+
+ if (i !== iNoClone) {
+ node = jQuery.clone(node, true, true);
+
+ // Keep references to cloned scripts for later restoration
+ if (hasScripts) {
+ // Support: QtWebKit
+ // jQuery.merge because core_push.apply(_, arraylike) throws
+ jQuery.merge(scripts, getAll(node, 'script'));
+ }
+ }
+
+ callback.call(
+ table && jQuery.nodeName(this[i], 'table')
+ ? findOrAppend(this[i], 'tbody')
+ : this[i],
+ node,
+ i
+ );
+ }
+
+ if (hasScripts) {
+ doc = scripts[scripts.length - 1].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map(scripts, restoreScript);
+
+ // Evaluate executable scripts on first document insertion
+ for (i = 0; i < hasScripts; i++) {
+ node = scripts[i];
+ if (
+ rscriptType.test(node.type || '') &&
+ !data_priv.access(node, 'globalEval') &&
+ jQuery.contains(doc, node)
+ ) {
+ if (node.src) {
+ // Hope ajax is available...
+ jQuery.ajax({
+ url: node.src,
+ type: 'GET',
+ dataType: 'script',
+ async: false,
+ global: false,
+ throws: true,
+ });
+ } else {
+ jQuery.globalEval(node.textContent.replace(rcleanScript, ''));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+ });
+
+ jQuery.each(
+ {
+ appendTo: 'append',
+ prependTo: 'prepend',
+ insertBefore: 'before',
+ insertAfter: 'after',
+ replaceAll: 'replaceWith',
+ },
+ function(name, original) {
+ jQuery.fn[name] = function(selector) {
+ var elems,
+ ret = [],
+ insert = jQuery(selector),
+ last = insert.length - 1,
+ i = 0;
+
+ for (; i <= last; i++) {
+ elems = i === last ? this : this.clone(true);
+ jQuery(insert[i])[original](elems);
+
+ // Support: QtWebKit
+ // .get() because core_push.apply(_, arraylike) throws
+ core_push.apply(ret, elems.get());
+ }
+
+ return this.pushStack(ret);
+ };
+ }
+ );
+
+ jQuery.extend({
+ clone: function(elem, dataAndEvents, deepDataAndEvents) {
+ var i,
+ l,
+ srcElements,
+ destElements,
+ clone = elem.cloneNode(true),
+ inPage = jQuery.contains(elem.ownerDocument, elem);
+
+ // Support: IE >=9
+ // Fix Cloning issues
+ if (
+ !jQuery.support.noCloneChecked &&
+ (elem.nodeType === 1 || elem.nodeType === 11) &&
+ !jQuery.isXMLDoc(elem)
+ ) {
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll(clone);
+ srcElements = getAll(elem);
+
+ for (i = 0, l = srcElements.length; i < l; i++) {
+ fixInput(srcElements[i], destElements[i]);
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if (dataAndEvents) {
+ if (deepDataAndEvents) {
+ srcElements = srcElements || getAll(elem);
+ destElements = destElements || getAll(clone);
+
+ for (i = 0, l = srcElements.length; i < l; i++) {
+ cloneCopyEvent(srcElements[i], destElements[i]);
+ }
+ } else {
+ cloneCopyEvent(elem, clone);
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll(clone, 'script');
+ if (destElements.length > 0) {
+ setGlobalEval(destElements, !inPage && getAll(elem, 'script'));
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function(elems, context, scripts, selection) {
+ var elem,
+ tmp,
+ tag,
+ wrap,
+ contains,
+ j,
+ i = 0,
+ l = elems.length,
+ fragment = context.createDocumentFragment(),
+ nodes = [];
+
+ for (; i < l; i++) {
+ elem = elems[i];
+
+ if (elem || elem === 0) {
+ // Add nodes directly
+ if (jQuery.type(elem) === 'object') {
+ // Support: QtWebKit
+ // jQuery.merge because core_push.apply(_, arraylike) throws
+ jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
+
+ // Convert non-html into a text node
+ } else if (!rhtml.test(elem)) {
+ nodes.push(context.createTextNode(elem));
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild(context.createElement('div'));
+
+ // Deserialize a standard representation
+ tag = (rtagName.exec(elem) || ['', ''])[1].toLowerCase();
+ wrap = wrapMap[tag] || wrapMap._default;
+ tmp.innerHTML =
+ wrap[1] + elem.replace(rxhtmlTag, '<$1>$2>') + wrap[2];
+
+ // Descend through wrappers to the right content
+ j = wrap[0];
+ while (j--) {
+ tmp = tmp.firstChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because core_push.apply(_, arraylike) throws
+ jQuery.merge(nodes, tmp.childNodes);
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = '';
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = '';
+
+ i = 0;
+ while ((elem = nodes[i++])) {
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if (selection && jQuery.inArray(elem, selection) !== -1) {
+ continue;
+ }
+
+ contains = jQuery.contains(elem.ownerDocument, elem);
+
+ // Append to fragment
+ tmp = getAll(fragment.appendChild(elem), 'script');
+
+ // Preserve script evaluation history
+ if (contains) {
+ setGlobalEval(tmp);
+ }
+
+ // Capture executables
+ if (scripts) {
+ j = 0;
+ while ((elem = tmp[j++])) {
+ if (rscriptType.test(elem.type || '')) {
+ scripts.push(elem);
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function(elems, /* internal */ acceptData) {
+ var data,
+ elem,
+ type,
+ l = elems.length,
+ i = 0,
+ special = jQuery.event.special;
+
+ for (; i < l; i++) {
+ elem = elems[i];
+
+ if (acceptData || jQuery.acceptData(elem)) {
+ data = data_priv.access(elem);
+
+ if (data) {
+ for (type in data.events) {
+ if (special[type]) {
+ jQuery.event.remove(elem, type);
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent(elem, type, data.handle);
+ }
+ }
+ }
+ }
+ // Discard any remaining `private` and `user` data
+ data_discard(elem);
+ }
+ },
+ });
+
+ function findOrAppend(elem, tag) {
+ return (
+ elem.getElementsByTagName(tag)[0] ||
+ elem.appendChild(elem.ownerDocument.createElement(tag))
+ );
+ }
+
+ // Replace/restore the type attribute of script elements for safe DOM manipulation
+ function disableScript(elem) {
+ var attr = elem.getAttributeNode('type');
+ elem.type = (attr && attr.specified) + '/' + elem.type;
+ return elem;
+ }
+ function restoreScript(elem) {
+ var match = rscriptTypeMasked.exec(elem.type);
+
+ if (match) {
+ elem.type = match[1];
+ } else {
+ elem.removeAttribute('type');
+ }
+
+ return elem;
+ }
+
+ // Mark scripts as having already been evaluated
+ function setGlobalEval(elems, refElements) {
+ var l = elems.length,
+ i = 0;
+
+ for (; i < l; i++) {
+ data_priv.set(
+ elems[i],
+ 'globalEval',
+ !refElements || data_priv.get(refElements[i], 'globalEval')
+ );
+ }
+ }
+
+ function cloneCopyEvent(src, dest) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if (dest.nodeType !== 1) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if (data_priv.hasData(src)) {
+ pdataOld = data_priv.access(src);
+ pdataCur = jQuery.extend({}, pdataOld);
+ events = pdataOld.events;
+
+ data_priv.set(dest, pdataCur);
+
+ if (events) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for (type in events) {
+ for (i = 0, l = events[type].length; i < l; i++) {
+ jQuery.event.add(dest, type, events[type][i]);
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if (data_user.hasData(src)) {
+ udataOld = data_user.access(src);
+ udataCur = jQuery.extend({}, udataOld);
+
+ data_user.set(dest, udataCur);
+ }
+ }
+
+ function getAll(context, tag) {
+ var ret = context.getElementsByTagName
+ ? context.getElementsByTagName(tag || '*')
+ : context.querySelectorAll ? context.querySelectorAll(tag || '*') : [];
+
+ return tag === undefined || (tag && jQuery.nodeName(context, tag))
+ ? jQuery.merge([context], ret)
+ : ret;
+ }
+
+ // Support: IE >= 9
+ function fixInput(src, dest) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if (nodeName === 'input' && manipulation_rcheckableType.test(src.type)) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if (nodeName === 'input' || nodeName === 'textarea') {
+ dest.defaultValue = src.defaultValue;
+ }
+ }
+ var curCSS,
+ iframe,
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rmargin = /^margin/,
+ rnumsplit = new RegExp('^(' + core_pnum + ')(.*)$', 'i'),
+ rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i'),
+ rrelNum = new RegExp('^([+-])=(' + core_pnum + ')', 'i'),
+ elemdisplay = { BODY: 'block' },
+ cssShow = { position: 'absolute', visibility: 'hidden', display: 'block' },
+ cssNormalTransform = {
+ letterSpacing: 0,
+ fontWeight: 400,
+ },
+ cssExpand = ['Top', 'Right', 'Bottom', 'Left'],
+ cssPrefixes = ['Webkit', 'O', 'Moz', 'ms'];
+
+ // return a css property mapped to a potentially vendor prefixed property
+ function vendorPropName(style, name) {
+ // shortcut for names that are not vendor prefixed
+ if (name in style) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name.charAt(0).toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while (i--) {
+ name = cssPrefixes[i] + capName;
+ if (name in style) {
+ return name;
+ }
+ }
+
+ return origName;
+ }
+
+ function isHidden(elem, el) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return (
+ jQuery.css(elem, 'display') === 'none' ||
+ !jQuery.contains(elem.ownerDocument, elem)
+ );
+ }
+
+ // NOTE: we've included the "window" in window.getComputedStyle
+ // because jsdom on node.js will break without it.
+ function getStyles(elem) {
+ return window.getComputedStyle(elem, null);
+ }
+
+ function showHide(elements, show) {
+ var display,
+ elem,
+ hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for (; index < length; index++) {
+ elem = elements[index];
+ if (!elem.style) {
+ continue;
+ }
+
+ values[index] = jQuery._data(elem, 'olddisplay');
+ display = elem.style.display;
+ if (show) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if (!values[index] && display === 'none') {
+ elem.style.display = '';
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if (elem.style.display === '' && isHidden(elem)) {
+ values[index] = jQuery._data(
+ elem,
+ 'olddisplay',
+ css_defaultDisplay(elem.nodeName)
+ );
+ }
+ } else {
+ if (!values[index]) {
+ hidden = isHidden(elem);
+
+ if ((display && display !== 'none') || !hidden) {
+ jQuery._data(
+ elem,
+ 'olddisplay',
+ hidden ? display : jQuery.css(elem, 'display')
+ );
+ }
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for (index = 0; index < length; index++) {
+ elem = elements[index];
+ if (!elem.style) {
+ continue;
+ }
+ if (!show || elem.style.display === 'none' || elem.style.display === '') {
+ elem.style.display = show ? values[index] || '' : 'none';
+ }
+ }
+
+ return elements;
+ }
+
+ jQuery.fn.extend({
+ css: function(name, value) {
+ return jQuery.access(
+ this,
+ function(elem, name, value) {
+ var styles,
+ len,
+ map = {},
+ i = 0;
+
+ if (jQuery.isArray(name)) {
+ styles = getStyles(elem);
+ len = name.length;
+
+ for (; i < len; i++) {
+ map[name[i]] = jQuery.css(elem, name[i], false, styles);
+ }
+
+ return map;
+ }
+
+ return value !== undefined
+ ? jQuery.style(elem, name, value)
+ : jQuery.css(elem, name);
+ },
+ name,
+ value,
+ arguments.length > 1
+ );
+ },
+ show: function() {
+ return showHide(this, true);
+ },
+ hide: function() {
+ return showHide(this);
+ },
+ toggle: function(state) {
+ var bool = typeof state === 'boolean';
+
+ return this.each(function() {
+ if (bool ? state : isHidden(this)) {
+ jQuery(this).show();
+ } else {
+ jQuery(this).hide();
+ }
+ });
+ },
+ });
+
+ jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function(elem, computed) {
+ if (computed) {
+ // We should always get a number back from opacity
+ var ret = curCSS(elem, 'opacity');
+ return ret === '' ? '1' : ret;
+ }
+ },
+ },
+ },
+
+ // Exclude the following css properties to add px
+ cssNumber: {
+ columnCount: true,
+ fillOpacity: true,
+ fontWeight: true,
+ lineHeight: true,
+ opacity: true,
+ orphans: true,
+ widows: true,
+ zIndex: true,
+ zoom: true,
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ float: 'cssFloat',
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function(elem, name, value, extra) {
+ // Don't set styles on text and comment nodes
+ if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret,
+ type,
+ hooks,
+ origName = jQuery.camelCase(name),
+ style = elem.style;
+
+ name =
+ jQuery.cssProps[origName] ||
+ (jQuery.cssProps[origName] = vendorPropName(style, origName));
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
+
+ // Check if we're setting a value
+ if (value !== undefined) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if (type === 'string' && (ret = rrelNum.exec(value))) {
+ value = (ret[1] + 1) * ret[2] + parseFloat(jQuery.css(elem, name));
+ // Fixes bug #9237
+ type = 'number';
+ }
+
+ // Make sure that NaN and null values aren't set. See: #7116
+ if (value == null || (type === 'number' && isNaN(value))) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if (type === 'number' && !jQuery.cssNumber[origName]) {
+ value += 'px';
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if (
+ !jQuery.support.clearCloneStyle &&
+ value === '' &&
+ name.indexOf('background') === 0
+ ) {
+ style[name] = 'inherit';
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if (
+ !hooks ||
+ !('set' in hooks) ||
+ (value = hooks.set(elem, value, extra)) !== undefined
+ ) {
+ style[name] = value;
+ }
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if (
+ hooks &&
+ 'get' in hooks &&
+ (ret = hooks.get(elem, false, extra)) !== undefined
+ ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[name];
+ }
+ },
+
+ css: function(elem, name, extra, styles) {
+ var val,
+ num,
+ hooks,
+ origName = jQuery.camelCase(name);
+
+ // Make sure that we're working with the right name
+ name =
+ jQuery.cssProps[origName] ||
+ (jQuery.cssProps[origName] = vendorPropName(elem.style, origName));
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
+
+ // If a hook was provided get the computed value from there
+ if (hooks && 'get' in hooks) {
+ val = hooks.get(elem, true, extra);
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if (val === undefined) {
+ val = curCSS(elem, name, styles);
+ }
+
+ //convert "normal" to computed value
+ if (val === 'normal' && name in cssNormalTransform) {
+ val = cssNormalTransform[name];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if (extra === '' || extra) {
+ num = parseFloat(val);
+ return extra === true || jQuery.isNumeric(num) ? num || 0 : val;
+ }
+ return val;
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function(elem, options, callback, args) {
+ var ret,
+ name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for (name in options) {
+ old[name] = elem.style[name];
+ elem.style[name] = options[name];
+ }
+
+ ret = callback.apply(elem, args || []);
+
+ // Revert the old values
+ for (name in options) {
+ elem.style[name] = old[name];
+ }
+
+ return ret;
+ },
+ });
+
+ curCSS = function(elem, name, _computed) {
+ var width,
+ minWidth,
+ maxWidth,
+ computed = _computed || getStyles(elem),
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ ret = computed
+ ? computed.getPropertyValue(name) || computed[name]
+ : undefined,
+ style = elem.style;
+
+ if (computed) {
+ if (ret === '' && !jQuery.contains(elem.ownerDocument, elem)) {
+ ret = jQuery.style(elem, name);
+ }
+
+ // Support: Chrome <17, Safari 5.1
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+ // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if (rnumnonpx.test(ret) && rmargin.test(name)) {
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret;
+ };
+
+ function setPositiveNumber(elem, value, subtract) {
+ var matches = rnumsplit.exec(value);
+ return matches
+ ? // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || 'px')
+ : value;
+ }
+
+ function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
+ var i =
+ extra === (isBorderBox ? 'border' : 'content')
+ ? // If we already have the right measurement, avoid augmentation
+ 4
+ : // Otherwise initialize for horizontal or vertical properties
+ name === 'width' ? 1 : 0,
+ val = 0;
+
+ for (; i < 4; i += 2) {
+ // both box models exclude margin, so add it if we want it
+ if (extra === 'margin') {
+ val += jQuery.css(elem, extra + cssExpand[i], true, styles);
+ }
+
+ if (isBorderBox) {
+ // border-box includes padding, so remove it if we want content
+ if (extra === 'content') {
+ val -= jQuery.css(elem, 'padding' + cssExpand[i], true, styles);
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if (extra !== 'margin') {
+ val -= jQuery.css(
+ elem,
+ 'border' + cssExpand[i] + 'Width',
+ true,
+ styles
+ );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css(elem, 'padding' + cssExpand[i], true, styles);
+
+ // at this point, extra isn't content nor padding, so add border
+ if (extra !== 'padding') {
+ val += jQuery.css(
+ elem,
+ 'border' + cssExpand[i] + 'Width',
+ true,
+ styles
+ );
+ }
+ }
+ }
+
+ return val;
+ }
+
+ function getWidthOrHeight(elem, name, extra) {
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === 'width' ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles(elem),
+ isBorderBox =
+ jQuery.support.boxSizing &&
+ jQuery.css(elem, 'boxSizing', false, styles) === 'border-box';
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if (val <= 0 || val == null) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS(elem, name, styles);
+ if (val < 0 || val == null) {
+ val = elem.style[name];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if (rnumnonpx.test(val)) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox =
+ isBorderBox &&
+ (jQuery.support.boxSizingReliable || val === elem.style[name]);
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat(val) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return (
+ val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || (isBorderBox ? 'border' : 'content'),
+ valueIsBorderBox,
+ styles
+ ) +
+ 'px'
+ );
+ }
+
+ // Try to determine the default display value of an element
+ function css_defaultDisplay(nodeName) {
+ var doc = document,
+ display = elemdisplay[nodeName];
+
+ if (!display) {
+ display = actualDisplay(nodeName, doc);
+
+ // If the simple way fails, read from inside an iframe
+ if (display === 'none' || !display) {
+ // Use the already-created iframe if possible
+ iframe = (
+ iframe ||
+ jQuery("").css(
+ 'cssText',
+ 'display:block !important'
+ )
+ ).appendTo(doc.documentElement);
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = (iframe[0].contentWindow || iframe[0].contentDocument).document;
+ doc.write('');
+ doc.close();
+
+ display = actualDisplay(nodeName, doc);
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[nodeName] = display;
+ }
+
+ return display;
+ }
+
+ // Called ONLY from within css_defaultDisplay
+ function actualDisplay(name, doc) {
+ var elem = jQuery(doc.createElement(name)).appendTo(doc.body),
+ display = jQuery.css(elem[0], 'display');
+ elem.remove();
+ return display;
+ }
+
+ jQuery.each(['height', 'width'], function(i, name) {
+ jQuery.cssHooks[name] = {
+ get: function(elem, computed, extra) {
+ if (computed) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return elem.offsetWidth === 0 &&
+ rdisplayswap.test(jQuery.css(elem, 'display'))
+ ? jQuery.swap(elem, cssShow, function() {
+ return getWidthOrHeight(elem, name, extra);
+ })
+ : getWidthOrHeight(elem, name, extra);
+ }
+ },
+
+ set: function(elem, value, extra) {
+ var styles = extra && getStyles(elem);
+ return setPositiveNumber(
+ elem,
+ value,
+ extra
+ ? augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.support.boxSizing &&
+ jQuery.css(elem, 'boxSizing', false, styles) === 'border-box',
+ styles
+ )
+ : 0
+ );
+ },
+ };
+ });
+
+ // These hooks cannot be added until DOM ready because the support test
+ // for it is not run until after DOM ready
+ jQuery(function() {
+ if (!jQuery.support.reliableMarginRight) {
+ jQuery.cssHooks.marginRight = {
+ get: function(elem, computed) {
+ if (computed) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap(elem, { display: 'inline-block' }, curCSS, [
+ elem,
+ 'marginRight',
+ ]);
+ }
+ },
+ };
+ }
+
+ // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+ // getComputedStyle returns percent when specified for top/left/bottom/right
+ // rather than make the css module depend on the offset module, we just check for it here
+ if (!jQuery.support.pixelPosition && jQuery.fn.position) {
+ jQuery.each(['top', 'left'], function(i, prop) {
+ jQuery.cssHooks[prop] = {
+ get: function(elem, computed) {
+ if (computed) {
+ computed = curCSS(elem, prop);
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test(computed)
+ ? jQuery(elem).position()[prop] + 'px'
+ : computed;
+ }
+ },
+ };
+ });
+ }
+ });
+
+ if (jQuery.expr && jQuery.expr.filters) {
+ jQuery.expr.filters.hidden = function(elem) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+ };
+
+ jQuery.expr.filters.visible = function(elem) {
+ return !jQuery.expr.filters.hidden(elem);
+ };
+ }
+
+ // These hooks are used by animate to expand properties
+ jQuery.each(
+ {
+ margin: '',
+ padding: '',
+ border: 'Width',
+ },
+ function(prefix, suffix) {
+ jQuery.cssHooks[prefix + suffix] = {
+ expand: function(value) {
+ var i = 0,
+ expanded = {},
+ // assumes a single number if not a string
+ parts = typeof value === 'string' ? value.split(' ') : [value];
+
+ for (; i < 4; i++) {
+ expanded[prefix + cssExpand[i] + suffix] =
+ parts[i] || parts[i - 2] || parts[0];
+ }
+
+ return expanded;
+ },
+ };
+
+ if (!rmargin.test(prefix)) {
+ jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
+ }
+ }
+ );
+ var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+ jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop(this, 'elements');
+ return elements ? jQuery.makeArray(elements) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+ // Use .is(":disabled") so that fieldset[disabled] works
+ return (
+ this.name &&
+ !jQuery(this).is(':disabled') &&
+ rsubmittable.test(this.nodeName) &&
+ !rsubmitterTypes.test(type) &&
+ (this.checked || !manipulation_rcheckableType.test(type))
+ );
+ })
+ .map(function(i, elem) {
+ var val = jQuery(this).val();
+
+ return val == null
+ ? null
+ : jQuery.isArray(val)
+ ? jQuery.map(val, function(val) {
+ return { name: elem.name, value: val.replace(rCRLF, '\r\n') };
+ })
+ : { name: elem.name, value: val.replace(rCRLF, '\r\n') };
+ })
+ .get();
+ },
+ });
+
+ //Serialize an array of form elements or a set of
+ //key/values into a query string
+ jQuery.param = function(a, traditional) {
+ var prefix,
+ s = [],
+ add = function(key, value) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction(value) ? value() : value == null ? '' : value;
+ s[s.length] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if (traditional === undefined) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if (jQuery.isArray(a) || (a.jquery && !jQuery.isPlainObject(a))) {
+ // Serialize the form elements
+ jQuery.each(a, function() {
+ add(this.name, this.value);
+ });
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for (prefix in a) {
+ buildParams(prefix, a[prefix], traditional, add);
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join('&').replace(r20, '+');
+ };
+
+ function buildParams(prefix, obj, traditional, add) {
+ var name;
+
+ if (jQuery.isArray(obj)) {
+ // Serialize array item.
+ jQuery.each(obj, function(i, v) {
+ if (traditional || rbracket.test(prefix)) {
+ // Treat each array item as a scalar.
+ add(prefix, v);
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams(
+ prefix + '[' + (typeof v === 'object' ? i : '') + ']',
+ v,
+ traditional,
+ add
+ );
+ }
+ });
+ } else if (!traditional && jQuery.type(obj) === 'object') {
+ // Serialize object item.
+ for (name in obj) {
+ buildParams(prefix + '[' + name + ']', obj[name], traditional, add);
+ }
+ } else {
+ // Serialize scalar item.
+ add(prefix, obj);
+ }
+ }
+ jQuery.each(
+ (
+ 'blur focus focusin focusout load resize scroll unload click dblclick ' +
+ 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave ' +
+ 'change select submit keydown keypress keyup error contextmenu'
+ ).split(' '),
+ function(i, name) {
+ // Handle event binding
+ jQuery.fn[name] = function(data, fn) {
+ return arguments.length > 0
+ ? this.on(name, null, data, fn)
+ : this.trigger(name);
+ };
+ }
+ );
+
+ jQuery.fn.hover = function(fnOver, fnOut) {
+ return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
+ };
+ var // Document location
+ ajaxLocParts,
+ ajaxLocation,
+ ajax_nonce = jQuery.now(),
+ ajax_rquery = /\?/,
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm, // IE leaves an \r character at EOL
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+ // Keep a copy of the old load method
+ _load = jQuery.fn.load,
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = '*/'.concat('*');
+
+ // #8138, IE may throw an exception when accessing
+ // a field from window.location if document.domain has been set
+ try {
+ ajaxLocation = location.href;
+ } catch (e) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement('a');
+ ajaxLocation.href = '';
+ ajaxLocation = ajaxLocation.href;
+ }
+
+ // Segment location into parts
+ ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || [];
+
+ // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+ function addToPrefiltersOrTransports(structure) {
+ // dataTypeExpression is optional and defaults to "*"
+ return function(dataTypeExpression, func) {
+ if (typeof dataTypeExpression !== 'string') {
+ func = dataTypeExpression;
+ dataTypeExpression = '*';
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes =
+ dataTypeExpression.toLowerCase().match(core_rnotwhite) || [];
+
+ if (jQuery.isFunction(func)) {
+ // For each dataType in the dataTypeExpression
+ while ((dataType = dataTypes[i++])) {
+ // Prepend if requested
+ if (dataType[0] === '+') {
+ dataType = dataType.slice(1) || '*';
+ (structure[dataType] = structure[dataType] || []).unshift(func);
+
+ // Otherwise append
+ } else {
+ (structure[dataType] = structure[dataType] || []).push(func);
+ }
+ }
+ }
+ };
+ }
+
+ // Base inspection function for prefilters and transports
+ function inspectPrefiltersOrTransports(
+ structure,
+ options,
+ originalOptions,
+ jqXHR
+ ) {
+ var inspected = {},
+ seekingTransport = structure === transports;
+
+ function inspect(dataType) {
+ var selected;
+ inspected[dataType] = true;
+ jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
+ var dataTypeOrTransport = prefilterOrFactory(
+ options,
+ originalOptions,
+ jqXHR
+ );
+ if (
+ typeof dataTypeOrTransport === 'string' &&
+ !seekingTransport &&
+ !inspected[dataTypeOrTransport]
+ ) {
+ options.dataTypes.unshift(dataTypeOrTransport);
+ inspect(dataTypeOrTransport);
+ return false;
+ } else if (seekingTransport) {
+ return !(selected = dataTypeOrTransport);
+ }
+ });
+ return selected;
+ }
+
+ return inspect(options.dataTypes[0]) || (!inspected['*'] && inspect('*'));
+ }
+
+ // A special extend for ajax options
+ // that takes "flat" options (not to be deep extended)
+ // Fixes #9887
+ function ajaxExtend(target, src) {
+ var key,
+ deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for (key in src) {
+ if (src[key] !== undefined) {
+ (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
+ }
+ }
+ if (deep) {
+ jQuery.extend(true, target, deep);
+ }
+
+ return target;
+ }
+
+ jQuery.fn.load = function(url, params, callback) {
+ if (typeof url !== 'string' && _load) {
+ return _load.apply(this, arguments);
+ }
+
+ var selector,
+ type,
+ response,
+ self = this,
+ off = url.indexOf(' ');
+
+ if (off >= 0) {
+ selector = url.slice(off, url.length);
+ url = url.slice(0, off);
+ }
+
+ // If it's a function
+ if (jQuery.isFunction(params)) {
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if (params && typeof params === 'object') {
+ type = 'POST';
+ }
+
+ // If we have elements to modify, make the request
+ if (self.length > 0) {
+ jQuery
+ .ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: 'html',
+ data: params,
+ })
+ .done(function(responseText) {
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html(
+ selector
+ ? // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery('
+
+
+
+
+
+
+
+
+
+
+
+
+