webui-vue: Add a task to find node licences

Many open source licenses require the module and license to be
identified in the image.  Yocto provides this capability for the
modules that it includes; however, this doesn't cover the modules
that npm includes during the build of webui-vue.

This change adds a new module named 'nlf' to find and create a summary
of the nodes and their licenses.  The nlf recipe file was generated
automatically with:
devtool add 'npm://registry.npmjs.org;package=nlf;version=latest'

Then a new 'find_node_licenses' task in the webui-vue recipe uses
'nlf-native' to create a summary and save it to the webui-vue license
directory where Yocto stores its license info.

Tested:
Confirmed that the nlf recipe builds.

Confirmed that the 'find_node_licenses' task runs and that the
license summary is available under
'build/tmp/deploy/licenses/webui-vue/node-licenses'

Change-Id: Ia53f6e463db6966f450be2a37dc82a3c5e3f76c1
Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com>
diff --git a/meta-phosphor/recipes-phosphor/webui/nlf/npm-shrinkwrap.json b/meta-phosphor/recipes-phosphor/webui/nlf/npm-shrinkwrap.json
new file mode 100644
index 0000000..ded34f9
--- /dev/null
+++ b/meta-phosphor/recipes-phosphor/webui/nlf/npm-shrinkwrap.json
@@ -0,0 +1,312 @@
+{
+  "name": "nlf",
+  "version": "2.1.1",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@octetstream/promisify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@octetstream/promisify/-/promisify-2.0.2.tgz",
+      "integrity": "sha512-7XHoRB61hxsz8lBQrjC1tq/3OEIgpvGWg6DKAdwi7WRzruwkmsdwmOoUXbU4Dtd4RSOMDwed0SkP3y8UlMt1Bg=="
+    },
+    "ansicolors": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+      "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk="
+    },
+    "archy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
+    },
+    "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.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "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"
+      }
+    },
+    "commander": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+      "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+    },
+    "compare-versions": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz",
+      "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg=="
+    },
+    "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.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "requires": {
+        "ms": "^2.1.1"
+      }
+    },
+    "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.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-all": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz",
+      "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=",
+      "requires": {
+        "glob": "^7.0.5",
+        "yargs": "~1.2.6"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "lodash.assign": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
+    },
+    "lodash.assignin": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
+      "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI="
+    },
+    "lodash.clone": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+      "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+    },
+    "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.get": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
+    },
+    "lodash.set": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
+      "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
+    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.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.7"
+      }
+    },
+    "minimist": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz",
+      "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4="
+    },
+    "ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "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="
+    },
+    "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.3"
+      }
+    },
+    "promise-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/promise-fs/-/promise-fs-2.1.1.tgz",
+      "integrity": "sha512-43p7e4QzAQ3w6eyN0+gbBL7jXiZFWLWYITg9wIObqkBySu/a5K1EDcQ/S6UyB/bmiZWDA4NjTbcopKLTaKcGSw==",
+      "requires": {
+        "@octetstream/promisify": "2.0.2"
+      }
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+    },
+    "snyk-module": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz",
+      "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==",
+      "requires": {
+        "debug": "^3.1.0",
+        "hosted-git-info": "^2.7.1"
+      }
+    },
+    "snyk-resolve": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.1.0.tgz",
+      "integrity": "sha512-OZMF8I8TOu0S58Z/OS9mr8jkEzGAPByCsAkrWlcmZgPaE0RsxVKVIFPhbMNy/JlYswgGDYYIEsNw+e0j1FnTrw==",
+      "requires": {
+        "debug": "^4.1.1",
+        "promise-fs": "^2.1.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "snyk-resolve-deps": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.0.2.tgz",
+      "integrity": "sha512-nlw62wiWhGOTw3BD3jVIwrUkRR4iNxEkkO4Y/PWs8BsUWseGu1H6QgLesFXJb3qx7ANJ5UbUCJMgV+eL0Lf9cA==",
+      "requires": {
+        "ansicolors": "^0.3.2",
+        "debug": "^3.2.5",
+        "lodash.assign": "^4.2.0",
+        "lodash.assignin": "^4.2.0",
+        "lodash.clone": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.get": "^4.4.2",
+        "lodash.set": "^4.3.2",
+        "lru-cache": "^4.0.0",
+        "semver": "^5.5.1",
+        "snyk-module": "^1.6.0",
+        "snyk-resolve": "^1.0.0",
+        "snyk-tree": "^1.0.0",
+        "snyk-try-require": "^1.1.1",
+        "then-fs": "^2.0.0"
+      }
+    },
+    "snyk-tree": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz",
+      "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=",
+      "requires": {
+        "archy": "^1.0.0"
+      }
+    },
+    "snyk-try-require": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz",
+      "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=",
+      "requires": {
+        "debug": "^3.1.0",
+        "lodash.clonedeep": "^4.3.0",
+        "lru-cache": "^4.0.0",
+        "then-fs": "^2.0.0"
+      }
+    },
+    "then-fs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz",
+      "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=",
+      "requires": {
+        "promise": ">=3.2 <8"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+    },
+    "yargs": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz",
+      "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=",
+      "requires": {
+        "minimist": "^0.1.0"
+      }
+    }
+  }
+}
diff --git a/meta-phosphor/recipes-phosphor/webui/nlf_2.1.1.bb b/meta-phosphor/recipes-phosphor/webui/nlf_2.1.1.bb
new file mode 100644
index 0000000..b43ed8e
--- /dev/null
+++ b/meta-phosphor/recipes-phosphor/webui/nlf_2.1.1.bb
@@ -0,0 +1,154 @@
+SUMMARY = "Find licenses for a node application and its node_module dependencies"
+HOMEPAGE = "https://github.com/iandotkelly/nlf"
+
+BBCLASSEXTEND = "native"
+
+LICENSE = "MIT & ISC & Apache-2.0"
+LIC_FILES_CHKSUM = " \
+    file://LICENSE.md;md5=6528c431b19e9400237f5dfb20285279 \
+    file://node_modules/lodash.flatten/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://node_modules/commander/LICENSE;md5=25851d4d10d6611a12d5571dab945a00 \
+    file://node_modules/lodash.clone/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://node_modules/wrappy/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/semver/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/snyk-try-require/LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e \
+    file://node_modules/lodash.assignin/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://node_modules/brace-expansion/LICENSE;md5=a5df515ef062cc3affd8c0ae59c059ec \
+    file://node_modules/lodash.clonedeep/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://node_modules/inherits/LICENSE;md5=5b2ef2247af6d355ae9d9f988092d470 \
+    file://node_modules/@octetstream/promisify/LICENSE;md5=7e5b988479dc39ec6b617fa47c33d6ab \
+    file://node_modules/concat-map/LICENSE;md5=aea1cde69645f4b99be4ff7ca9abcce1 \
+    file://node_modules/archy/LICENSE;md5=aea1cde69645f4b99be4ff7ca9abcce1 \
+    file://node_modules/snyk-resolve/LICENSE;md5=d0a3091b11042bec7302076f57a2af63 \
+    file://node_modules/snyk-resolve/node_modules/debug/LICENSE;md5=ddd815a475e7338b0be7a14d8ee35a99 \
+    file://node_modules/snyk-resolve/node_modules/ms/license.md;md5=fd56fd5f1860961dfa92d313167c37a6 \
+    file://node_modules/snyk-tree/LICENSE;md5=9c39dfa5945450431edcfc7d52251aba \
+    file://node_modules/debug/LICENSE;md5=ddd815a475e7338b0be7a14d8ee35a99 \
+    file://node_modules/promise-fs/LICENSE;md5=03b23ecbb99ee45b22f8dedf2d789676 \
+    file://node_modules/glob/LICENSE;md5=c727d36f28f2762b1011dd483aa1a191 \
+    file://node_modules/lodash.set/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://node_modules/promise/LICENSE;md5=f908224ab18e60b4c2428c7ef33361e7 \
+    file://node_modules/ms/license.md;md5=2b8bc52ae6b7ba58e1629deabd53986f \
+    file://node_modules/path-is-absolute/license;md5=a12ebca0510a773644101a99a867d210 \
+    file://node_modules/yallist/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/inflight/LICENSE;md5=90a3ca01a5efed8b813a81c6c8fa2e63 \
+    file://node_modules/asap/LICENSE.md;md5=6ef000dc4ca2360ae9216d401862c653 \
+    file://node_modules/minimist/LICENSE;md5=aea1cde69645f4b99be4ff7ca9abcce1 \
+    file://node_modules/snyk-resolve-deps/LICENSE;md5=9c39dfa5945450431edcfc7d52251aba \
+    file://node_modules/compare-versions/LICENSE;md5=971bd7e5da79aead411b89e5187a055e \
+    file://node_modules/fs.realpath/LICENSE;md5=062470525c8e380f8567f665ef554d11 \
+    file://node_modules/pseudomap/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/minimatch/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/once/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/yargs/LICENSE;md5=b2d989bc186e7f6b418a5fdd5cc0b56b \
+    file://node_modules/snyk-module/LICENSE;md5=9c39dfa5945450431edcfc7d52251aba \
+    file://node_modules/lru-cache/LICENSE;md5=82703a69f6d7411dde679954c2fd9dca \
+    file://node_modules/then-fs/LICENSE;md5=d426de0e01e68475b6483705f840e37a \
+    file://node_modules/balanced-match/LICENSE.md;md5=7fa99ddc3424107350ca6e9a24552085 \
+    file://node_modules/lodash.get/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://node_modules/ansicolors/LICENSE;md5=bf595075ff556bc46c43e08f142fa4f5 \
+    file://node_modules/hosted-git-info/LICENSE;md5=a01f10cd299d5727263720d47cc2c908 \
+    file://node_modules/lodash.assign/LICENSE;md5=a3b2b7770df62392c164de4001b59f8f \
+    file://lib/license-find.js;md5=842bef111c87f33d70587288cb096184 \
+    file://lib/license-collection.js;md5=9764b6cc0b8baa2bdce065fbc31137ca \
+    file://package.json;md5=35243428b498fc654315179dc8422d31 \
+    file://node_modules/@octetstream/promisify/package.json;md5=1fa18a4bdf2ed0999644f69db230b2a9 \
+    file://node_modules/ansicolors/package.json;md5=62c557890a3c2b6d72c4824129c7eb43 \
+    file://node_modules/archy/package.json;md5=eab72a1e199e2ec3f194afb9d33c4b07 \
+    file://node_modules/asap/package.json;md5=4c974dfa11d66358b3f8610ffcad5478 \
+    file://node_modules/balanced-match/package.json;md5=fa13802cf9109f23db7cc107f33cbf0a \
+    file://node_modules/brace-expansion/package.json;md5=effd91994b1b7ddb8a33060ad4541e6a \
+    file://node_modules/commander/package.json;md5=b35727756a7cd730832ad87704f8c7f4 \
+    file://node_modules/compare-versions/package.json;md5=62c1d0ab0bf5b50f52b82e3456e07129 \
+    file://node_modules/concat-map/package.json;md5=85d8a674998927862b17adef4aa6a7b1 \
+    file://node_modules/debug/package.json;md5=428aa7fa2bd4f273e5226f0c3c6ab6de \
+    file://node_modules/fs.realpath/package.json;md5=3aa3d67ce378e330e293496dd3b9a506 \
+    file://node_modules/glob/package.json;md5=7d0807efb6353ee0196cabbacbf210d7 \
+    file://node_modules/glob-all/package.json;md5=7cafc9e19951572ed5ce6381266405ac \
+    file://node_modules/hosted-git-info/package.json;md5=2a8c73592cbe4265502d43c27a631010 \
+    file://node_modules/inflight/package.json;md5=85ba25624378c23e1ee9b33d3d103bf0 \
+    file://node_modules/inherits/package.json;md5=f73908dab55d4259f3ed052ce9fb2fbb \
+    file://node_modules/lodash.assign/package.json;md5=652d946aaad24923310a26b4c34bbe95 \
+    file://node_modules/lodash.assignin/package.json;md5=e0f2f49ffa0f40aad8ee8ab6d95f4eb2 \
+    file://node_modules/lodash.clone/package.json;md5=247b6edb259f1e3ad88b561923f38e2e \
+    file://node_modules/lodash.clonedeep/package.json;md5=c530122d432c91361df957d8f881f3e7 \
+    file://node_modules/lodash.flatten/package.json;md5=1bd34f9aca4227c756da839b676a4c45 \
+    file://node_modules/lodash.get/package.json;md5=18eb5e88a33ab2e94f075f86869ba359 \
+    file://node_modules/lodash.set/package.json;md5=cd1e57468bf33aed79a76aaaf154a3f9 \
+    file://node_modules/lru-cache/package.json;md5=4d588d28a52a177c16510f7ec66b22d0 \
+    file://node_modules/minimatch/package.json;md5=b763d93b18d070a6449399d2e92d8c32 \
+    file://node_modules/minimist/package.json;md5=a8a81a7666d523f55e92062d6d667958 \
+    file://node_modules/ms/package.json;md5=a682078f64a677ddad1f50307a14b678 \
+    file://node_modules/once/package.json;md5=afb6ea3bdcad6397e11a71615bd06e3b \
+    file://node_modules/path-is-absolute/package.json;md5=ef6e018bdf67b82ab1285bc799b5367b \
+    file://node_modules/promise/package.json;md5=7975da9da536961f7510cdae6f0e97b8 \
+    file://node_modules/promise-fs/package.json;md5=20926dacee51735bd8c0a924652cacee \
+    file://node_modules/pseudomap/package.json;md5=2126b7cc5be08ab6d1489f20c3e677b8 \
+    file://node_modules/semver/package.json;md5=735f6ede2a644d292066a9813d8b9da6 \
+    file://node_modules/snyk-module/package.json;md5=8161d4586e6daee1839cae9e94b86fb3 \
+    file://node_modules/snyk-resolve/node_modules/debug/package.json;md5=d084346a689161b3c5a11df81c28acc4 \
+    file://node_modules/snyk-resolve/node_modules/ms/package.json;md5=b3ea7267a23f72028e774742792b114a \
+    file://node_modules/snyk-resolve/package.json;md5=ea3a04226c876e68f4aafe1ff359a233 \
+    file://node_modules/snyk-resolve-deps/package.json;md5=58b2a1dd733438f59814ff4a035ed082 \
+    file://node_modules/snyk-tree/package.json;md5=e194dd23ca7a9a0a8059f2edd302819a \
+    file://node_modules/snyk-try-require/package.json;md5=f15efeb6e9de2631a4ee7cca03a3b2f7 \
+    file://node_modules/then-fs/package.json;md5=290ddf535372df5478be21b691fb50d9 \
+    file://node_modules/wrappy/package.json;md5=788804d507f3ed479ea7614fa7d3f1a5 \
+    file://node_modules/yallist/package.json;md5=67355d84a038118afcde93417b9327dd \
+    file://node_modules/yargs/package.json;md5=286e4e3b3374bb62c5dbf8aba821bba7 \
+    "
+
+SRC_URI = " \
+    npm://registry.npmjs.org/;package=nlf;version=${PV} \
+    npmsw://${THISDIR}/${BPN}/npm-shrinkwrap.json \
+    "
+
+S = "${WORKDIR}/npm"
+
+inherit npm
+
+LICENSE_${PN} = "MIT"
+LICENSE_${PN}-octetstream-promisify = "MIT"
+LICENSE_${PN}-ansicolors = "MIT"
+LICENSE_${PN}-archy = "MIT"
+LICENSE_${PN}-asap = "MIT"
+LICENSE_${PN}-balanced-match = "MIT"
+LICENSE_${PN}-brace-expansion = "MIT"
+LICENSE_${PN}-commander = "MIT"
+LICENSE_${PN}-compare-versions = "MIT"
+LICENSE_${PN}-concat-map = "MIT"
+LICENSE_${PN}-debug = "MIT"
+LICENSE_${PN}-fsrealpath = "ISC"
+LICENSE_${PN}-glob = "ISC"
+LICENSE_${PN}-glob-all = "MIT"
+LICENSE_${PN}-hosted-git-info = "ISC"
+LICENSE_${PN}-inflight = "ISC"
+LICENSE_${PN}-inherits = "ISC"
+LICENSE_${PN}-lodashassign = "MIT"
+LICENSE_${PN}-lodashassignin = "MIT"
+LICENSE_${PN}-lodashclone = "MIT"
+LICENSE_${PN}-lodashclonedeep = "MIT"
+LICENSE_${PN}-lodashflatten = "MIT"
+LICENSE_${PN}-lodashget = "MIT"
+LICENSE_${PN}-lodashset = "MIT"
+LICENSE_${PN}-lru-cache = "ISC"
+LICENSE_${PN}-minimatch = "ISC"
+LICENSE_${PN}-minimist = "MIT"
+LICENSE_${PN}-ms = "MIT"
+LICENSE_${PN}-once = "ISC"
+LICENSE_${PN}-path-is-absolute = "MIT"
+LICENSE_${PN}-promise = "MIT"
+LICENSE_${PN}-promise-fs = "MIT"
+LICENSE_${PN}-pseudomap = "ISC"
+LICENSE_${PN}-semver = "ISC"
+LICENSE_${PN}-snyk-module = "Apache-2.0"
+LICENSE_${PN}-snyk-resolve-debug = "MIT"
+LICENSE_${PN}-snyk-resolve-ms = "MIT"
+LICENSE_${PN}-snyk-resolve = "Apache-2.0"
+LICENSE_${PN}-snyk-resolve-deps = "Apache-2.0"
+LICENSE_${PN}-snyk-tree = "Apache-2.0"
+LICENSE_${PN}-snyk-try-require = "Apache-2.0"
+LICENSE_${PN}-then-fs = "MIT"
+LICENSE_${PN}-wrappy = "ISC"
+LICENSE_${PN}-yallist = "ISC"
+LICENSE_${PN}-yargs = "MIT"
diff --git a/meta-phosphor/recipes-phosphor/webui/webui-vue_git.bb b/meta-phosphor/recipes-phosphor/webui/webui-vue_git.bb
index 5b8dec5..546c39a 100644
--- a/meta-phosphor/recipes-phosphor/webui/webui-vue_git.bb
+++ b/meta-phosphor/recipes-phosphor/webui/webui-vue_git.bb
@@ -9,7 +9,7 @@
 SRCREV = "3f9cfa2c2491cc060ea57787660e918e4a7ee7e5"
 S = "${WORKDIR}/git"
 
-DEPENDS_prepend = "nodejs-native "
+DEPENDS_prepend = "nodejs-native nlf-native "
 
 # allarch is required because the files this recipe produces (html and
 # javascript) are valid for any target, regardless of architecture.  The allarch
@@ -45,3 +45,9 @@
    find ${D}${datadir}/www -type d -exec chmod a=rx,u+w '{}' +
 }
 
+do_find_node_licenses() {
+    cd ${S}
+    nlf -s detail > ${LICENSE_DIRECTORY}/${PN}/node-licenses
+}
+
+addtask find_node_licenses after do_compile before do_build