{"_id":"@atomist/sdm-pack-fingerprint","_rev":"108-728ef383cde11316e4cab9a89a964ba1","name":"@atomist/sdm-pack-fingerprint","dist-tags":{"branch-master":"5.0.1-master.20210108050139","latest":"5.0.0","next":"5.0.1-master.20210108050139","branch-nortissej-projectfinder":"5.0.1-nortissej.projectfinder.20190918004738","branch-policy-target":"5.0.1-policy-target.20190924164311"},"versions":{"5.0.0-master.20190903062633":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190903062633","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190901170820","@atomist/sdm":"1.6.2-master.20190831070813","@atomist/sdm-core":"1.6.2-master.20190902105458","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.3","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"gitHead":"40f3d48b2e3b15a3e98bd111513dc957a9c020e1","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190903062633","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-9upA6M3Aq692ShnSSXiYelmE2+omyA4jQMUTAVamnO8EAXabGZas12EOwtIrdo9XoAyo07qZAXMq+bu5sNXwQA==","shasum":"cfa1607653b57a6601e107b9c9411f1ad8d94136","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190903062633.tgz","fileCount":119,"unpackedSize":2143881,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbghBCRA9TVsSAnZWagAAotEP/2OcYR+qSepWPdCPssQK\nykmfFLiX5qCpWRwsV45JSB1+fgdqe6iP2KaBunRJg+1iTm6AI+mXrosHFIQK\n3XMcuGTSYJqtiPqSu7naBIxfuUwfh9UNtZ7NUjvsRGHqGnz4s+Se3ev6h0S1\nrFEarY6J8xZUTidxZqgkevtZC5H8zZxmF6M59iBFV3G1T8Hwuv4so1f/+FJN\nLTi1ifXyUcPiIptg0C+2e7HgLkUHgvYd/5wl8snRkhz7wfxtjJ9kPqLhplJE\nn2X+gb9NEz8AyP2XWQnSppX3WpSI1YCfUn0sHQqvSey/vM9dtmdoGk6dE645\nEUR7QuDrLN2fPol4l+u1Zxy7MUQMWowNHJdy4Ayn2FsKut5bdCFvGedpPC9I\n1n+VaqKsEYmCmT+o9GWBbim7linQEis6mE3xbsjX+CCb7EJrTfoO0MLUXHRm\n7hgIY3cTQ4UrI4B2h8DA6xxu7l5qH6tczHdojgV3v2WH4zqCZcowNfLEFvYE\nrSicTou1U5JY394nb7VLzaYFN2cs5VnEfMmylOZZwjxIltvVQnerk41ImYyS\n90VxFrOEpe5zbaCFMAcznZQS7aYdG5Djh5EAJB81dpGvhlrufMXWfmgxPInK\ncfstwXbQWjz2Spi9in50XTqGkfHy/FkSZRZc+i9bIP03CQJhZMj/X8agJJV1\nzHS1\r\n=MF5K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDdUx+NsDNuoRtGEyE9YOLlNQ/Ey/0m0toGNOQhTB8aAIgTd338Gp51J4KbtUVG7vCRfORYH0f4+V3XGeA8MyvDxM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190903062633_1567492161129_0.135322415345424"},"_hasShrinkwrap":false},"5.0.0-master.20190903082437":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190903082437","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190901170820","@atomist/sdm":"1.6.2-master.20190831070813","@atomist/sdm-core":"1.6.2-master.20190902105458","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.3","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6cfbdba2ec7713aa09a345f86aed7c253b16090b","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190903082437","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-CwwL5LoEmLhYfv779MB4lb5ieAH8tLP8csdey+4bnGCQ0NEC0tv3YkJCu/3/2L30ev0ZSzdfiWOSKiS/uA4P2g==","shasum":"a198e9c572ee1865b42225732cb6e64abdc2fd89","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190903082437.tgz","fileCount":119,"unpackedSize":2144413,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbiQACRA9TVsSAnZWagAAUpIP/R7QNu2qOreDzYFOWqA9\nPheMxDt04u/1Q0/UUXRyvDCZmMrqn7l4yt2s019qAoKSO4VOkBUoFWwyp1M4\nQ50SESacpQb+2quu2GECpftbd31Ki+gUa+ZPz0st/GfSZgltwhM5sjTO1c6X\nLpEfktxAd8HYPfRMKtzYpKwwN6ZOmwD43M9q1bDha1CrkVU0BPz+PQw7mC+S\nRXzNMzueOwqO4aMWzzlxB9+txQyjKhH8cG4Z8AZnAjF2kWHYFC0z2ZE3V+SU\nR2VyrVXIAZShkwr0hTyw1cBtyYxHGS8ii2LaZQbC8sLGYdfoISELdi7B35ip\n3RGl6H2c9CdBxz0HJnI55fQ5/xVLs0WUAG1m7YNjbCpdGkXROLcHzF1bbxmy\n1itDeOToHUvgFIDlEZvDCF46CnFSM+cb3Y1f+tOQQYBEYq95an1wB7AYJHWm\niHOtxpM0k6F0mQ7xb/PCaQlpqk8iWi/T0ODCFauiNwePQ98trRHHB88JrRBg\ncXwYupn+kxhVfcgFGvQoepREpa3sdUTeqEn0jhFeIUb8qeFx/ZyuSCbIL1jp\neTUXQFxkq55nQAbpTlpGV2naR8Q8Dgt/XczSSY4XxeTJSm5GGcjMmJJ3sNv+\njR/GPVfV/4tnPOk1uAcJzZlo4tq/0vto/wqez6oJvj5yoPRMRWmJO0l0A+RE\n0ic8\r\n=cImu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDebDBU7hfNF1gzx3XGnE9/WhbtO83BgXrlTRyUg0dVdwIgCa5ZH69I/TRF2JnM7lp1tRePx6rzIDFUiBu/TE3Mu0A="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190903082437_1567499263445_0.15096659091161135"},"_hasShrinkwrap":false},"5.0.0-master.20190903125334":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190903125334","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190901170820","@atomist/sdm":"1.6.2-master.20190831070813","@atomist/sdm-core":"1.6.2-master.20190902105458","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.3","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b4773e3e352b3db86ba94b8a32363401cd3b892d","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190903125334","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-SBL6eQoF6BPcKKli0fXrNioAD3iceSiH1MnQCpenr7pkNbmu6UzYXiBW/nKfAMU04mj0E02cXyFlcQaSnOxDBA==","shasum":"25752462288aec472012fed52fb67438e568ebee","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190903125334.tgz","fileCount":119,"unpackedSize":2145340,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbmLMCRA9TVsSAnZWagAAvjoP/3ytmDDJtho8gMyDCoRB\ndCxoIJtIbhJasd5K/SYR/RDaG1pAJDp33ukpAxwmZKxXn0tXyWE/CRyM7LGp\nyIjMBpSDlv0O/62DKDkaNn9TqquJXod4nRqUWl85DP5Vwy6ZM5FhQ4DVa0xG\nznnSD+eDBiuuLF1g45eycfHSLsdkQiw2wZ/K5zp4gHmnPA2Euh40xKIqAwf8\n8LETE6kCujM+xs5e2jCetcJsR1nx/ksETFifdnoat3eAJpmR6o3oEXRWDyvd\nY2QzqIIPw1onPO1W5pkoVXMykIYu04uuWODjJnr9H+vDjvKafG5aeTz5Nx9v\nIcw2GAQpmRmA1UfvD7x5aDJDlqGFPHAx4czO9zfV9iBcfe0/Ey2YMwzPJAlI\nWIAXFckm45xBLEnDulFT3eQjFjDDG5+NFM1NeD6TdzLn1yz3/+7OOqbagj+A\nWVMDax9gFe+M1DFGrLzBldZk0ELOu1ikbrZkb7AUq6POpLHc1CIBGTB5e150\n6TIA9Lg1gfj0rIRNxwyts9Pcs6ct0/ZygQOxwhWwOAndzYZKUX24iR4C+uPD\nO02BwIj4Y0a+Q6GpWeM26BcYqn0d67l/ikoQAsq4N0D5d9penELBdSw+P2rG\nBUTpjBGGANiJdcZ3RcAG8BwEQykyvfv5IchaiNCaBLs6CQb3HDJAWA+uQz2f\n7dO8\r\n=7hIX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaiMwXpKzHMK4yjNjbqwJqsmYvO92W7u1KWEZOn8te7gIhAOYPyXDRHSsIjax2PUmY1mQYy4G2uXZKByJX4YYmjdcT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190903125334_1567515339920_0.8010409881829192"},"_hasShrinkwrap":false},"5.0.0-master.20190903165024":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190903165024","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190901170820","@atomist/sdm":"1.6.2-master.20190831070813","@atomist/sdm-core":"1.6.2-master.20190902105458","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.3","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bb744b1eb455e3f98eb6d5240f44ae8c5ffeb86f","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190903165024","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-Vhvuo2JmyuEDXJt8IPy5rgBoOuXjmoyM9sse7kJKDxdbOfso51WcD1Odeq8aDgKCkQ1We6NbDyPR/Rlx9/XFCA==","shasum":"b8a30117fec3edfdced5ba7c8a54d17100327a57","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190903165024.tgz","fileCount":119,"unpackedSize":2145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbppYCRA9TVsSAnZWagAAgxgQAJfgqwAAR0DnJz39Mh54\nGFM50r3fhHvn/VSUPHg/l1WHOvuNiR1mcuPggpreeZZKzS369wlYw8YrVffR\n0j3N7AoUzzpMTIQh76OYv6aaPbhsjsBev58JXvKbLPhFGeTxcHlv234habgs\nOrelqxoI2i/eep2BC3xS4SgUCivwkIXkjpg+nMtmyRKmj2O9W0ksPDR83Dtf\nGdTbW4UAuvRscT7ZUzs3Tg8DwpIenWOzJrJOxu3aq3e4SMRKupnHkGQHJ8mR\nI3Kuhx/QJZ+0/GxDb+Tz1AqsDkpFRwL+bL5tSvaAjHPvwnO7nKH+dEXfL+8g\nM3cCeqK4EaZjOlooDDWfIw0Yn2bTQO1Xhwh6NSSGqcis9jTwePM9nIa9dd+m\n5fhxnG8JEND8xTFiXYOHoOVEwM3atzo9bDaSgEjEhl5GchJaIuaPvgbHWLaJ\nYAWGGtAjCzmBxZ3/XbPcGypEoMPsWsRlY/Ed1WA4bmlszhRf0bw6IEayc2RM\nT3N440ap2jzB0fQJWSoZTA1CsyuyxZZOgfPODW2IGudbdKnU6YHSlhZncpf8\n/DRoIV+h/oLGLVTG7JwTOxPm9g+swR8TaG0AgMTZ3Uso1wLCDLhGVrf+is4O\nz2f4nHrsO2u2TTtOPSdVYu0apeZTGNcy4MrlRipKKqAfKAdYggCOfmDiSuhi\nhLsp\r\n=1M8t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIFY/P+inEIZVWD/Gr1z9tgDddb3OJUGjiY6+ihyejxQIgU/NEGDv639T6exHslkGr7CCWhgnRy5vaKq/2837qomg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190903165024_1567529559787_0.8806035623938337"},"_hasShrinkwrap":false},"5.0.0-master.20190906102809":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190906102809","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190901170820","@atomist/sdm":"1.6.2-master.20190831070813","@atomist/sdm-core":"1.6.2-master.20190902105458","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.3","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a540ee379cd118d90f72e4dde3cd5ca6eff36f5a","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190906102809","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-URy/eWGFEkUQbiJxv2dT+GsuqR0V8mgtG0JV3ROpMjZyj5xa/v1WwlTs07cLTHY2u6LyDRYHKSnjbX6xAeUXkA==","shasum":"b11da833072da6432ce1a044c9f8737ede5ba9f7","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190906102809.tgz","fileCount":119,"unpackedSize":2145956,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcjVdCRA9TVsSAnZWagAA0ZkP/0cJANBPC9S1RiTRt9mG\nDZn/nQXjtJ5Ir6bMKDTg4sacNuh7TbY4SxlU0WW7v8/iMzWXc+zVPtSnyFhB\n/S9LqUYxOrUoV0VKyTz+tPUo84BrqAfmixl719+ZPE9vMa1nZgLv/lyvQiUw\nj6gzwyvX7LG7I3IZGOFCBXw488HMMj4FnQIswjncCfCL3FsgZ/pKd1un0WrC\nTmU08h5pATJOwz91ZQdgpjQfAjHYHZPqzPYFjmxnWEtvM2LmM9ErOCHkNPJO\nPDuXE7cgUNYUzUbswQRT0Jc+Kiq2Ogc0cZGq4B9qjz6MMbZ5CotYRXdgPdMS\nrucD2fLXRfO1y8gbm0FwUEYC466QV4tL2XK0HTY02OeTNDRXdGCHF6frz1Fl\nL8RGdx1vxWZz3+YAfewp43GabmKrhFRrbxsWA8slEONfOdSPY+Zch6Gb0fMZ\nXq5yCS+WJDVs3jz3ECYJiWrvFMwPuWQMJKHucgz047xuwvXaT3b2ZIrA74Ry\n311JorJTLJZ4yHRcveQtT2WSqxLX8v01tZvyduYGVTK5NMOUQjP9NIVS/o4i\nkbT5zjMhBvcYkSGC2mITnLv0/07p5lbvakrOyY0zu/rdhIxQuDIi/CE17c3a\nOrf22dS3KaeLv6+ncMzNXTaNFl636s9LXnzENddjFdzJx2hEFh0plnZlUM2l\nWWG3\r\n=0aEu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+BYLiQMx458xGpzJ3Ca6tufjEr56AfBccTWOjQmnzUgIgR4DdSgcL5urPePWVq5adC74InDIfgctGuW18yx9ZB0c="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190906102809_1567765852722_0.31503995796177353"},"_hasShrinkwrap":false},"5.0.0-master.20190906113948":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190906113948","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190905172037","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190905165129","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"debd2f80940758be552d775828ee8913b9646b05","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190906113948","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-JlxwEl54m/qKHBViLCMnRJ+13E3H/7tR/lkB5L4a2iVQpWm3lg/Iy2Y9YRez7bSYr7QKpTirG28GHRWWqe2PXw==","shasum":"d38016033b278ef784bec2e9e4d8be4ff77c1d08","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190906113948.tgz","fileCount":119,"unpackedSize":2409349,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdckZbCRA9TVsSAnZWagAAG4IP/2iGFEw5dRcoRM3l0/qg\nftcljPsl4GlcnAjXpGs6SgXyo9C4b1uVzlWBtjoMPJQPvnnlF/Z0MYaI3KsY\n0C8H+/yXLdicW60K2Acf3cNkCYy6Jk1X19f8JJBatU7jzD+h/bfr83MkRNdC\n4YktfeeqLSfy9E4x4trbSglmhyXgnfWiuggqpcYSOMdPdvPsYwdeALR2fSOY\nGImF7SGQSPxSm7XeY2OmpjctzQmj7JHlLURTFdPSZl8BANQF0oeOe1Dwpzkp\n/ICl4CzEUEkMqkbKN77jpNcYg5ZyXqRaTYoWuwHK2OzutUiEh/x8QKdn/3uE\nVzOMCC9oEGVDrT8FPcMqTps+SiuKnqAYfCUMsGAB+K2+TlKnuflMls0mRjsP\nmvG8QPuQjwOnP3I/iTCjN+dtRERhJ6sk4uRwy6nZagi1nj4hLd5Mp9xfkADX\n2N+vrL5Sec0Wlvnn/lxgQGjnP+R9tLvyoM5gxqjc0bK2SLb64TTBoJ5lITYI\nRrN2e7Emu+JQNqzErCzLxPonnwcmywjndeQRZbAh7DumoKtsbGABgp7kVbc+\n4TobpljFze2TcPMoMC9FmqI8+T6p/+m6SHdi0XeSGL879BMuMIJ+28k0g3Ay\neiD20Gatb5E9eONK2QpX/gJsLbBPibwn6IX5cIE9CxxiTZgzZKKT7Ma7s6Tf\n65Xy\r\n=m7Nr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSwEKmG4pz4+ScxtmFdtK5SpjxyynFO22ogC4z8z99/QIgOYUDx6d3t/RoPN6B0Cd5rAABSJ+X3DIQyzEl1ji9j0U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190906113948_1567770202978_0.8324992026933224"},"_hasShrinkwrap":false},"5.0.0-master.20190906142051":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190906142051","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190905172037","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190905165129","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ff91b2b01e8b14a68ed9a5b626306e8060986d96","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190906142051","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-AJ2vu+uJmhk1q+x4miQkzD+56F+jhYkuSMablsVBHzMwRPuSe0iQoeRFFrhMkFSypRIQpklop4xttBg02dT8zA==","shasum":"06f73c320cf86479758659caf4b7ca298b4b879a","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190906142051.tgz","fileCount":119,"unpackedSize":2409267,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcmvdCRA9TVsSAnZWagAAB74QAINSgUE3624I0IQNczAy\nR5P7INq7AR0nB0wRLpIzjl8TzmLjM7uj/vmqulQh9eA48KDl53yOIjGlrFIT\nae9YHq/vgHjTdDyyYiJzLN1sqhPfoyOLDjciVElmoIbmxxuE64BXaR+dnQH+\nsqjUtLqrW8WoAQWShxgcxeTtONtPoxIT5/NqcZmhlZ25GbPHTT2QkE8kMKEG\ncKmnc5N2XCTn+pXwLZdpCulrrDVs1BtIToi7fPQe5r5CkoOVxY7AfbCHJT/T\n9R6cbAlfR+rZsUn/wHr3iZ84P/LzcMgYAqVbWIjVn9KDf/31FsmWJpyJuK0h\ndj5cHKBbPmYhLAdXd6MfMP+/qrlGe0aWa8Bg8Y6RMslaHbWbQus6wEc92EOj\nzodP8qqqkY7Ni+L/Wld+z9pFS9H2cynSnOPeCa/D7BbvPI8eS74+xey2aeyt\nOsRxxtTksmRH09XUPI8n7FvZ9hBV4rmNOnGwRZ6ffD87t/33NP6kJi3sByDn\nmqlGzFmYmvFW7hmI7O1z571d3x9Hnq0CYdi7MLzU8w7vfkmVA51cK9DEjafE\nOs1jppP3MKJkzetYol4gdbZ+RYaugCSlRGMY5JySqWGFoIzw8GL+kJGnGvkE\nhDBqG95gKEuULwMBN+nmKuiXKMu+E5n+o97W3g7h8ao1pCTeDvyKlu8QDAT5\nk9tJ\r\n=idRQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEUs1K+iFTJL/L13uSGBfdnSLG+sI2GYcgTIQdwdep/CAiEA7gdtmgRPnK6f5MO5Uk7okFQs+Orvefz0UABjj6rOHQ8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190906142051_1567779804828_0.9079300919059683"},"_hasShrinkwrap":false},"5.0.0-master.20190907113447":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190907113447","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190905172037","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190905165129","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"05bb0d60306e553f7bc352531999ce2d2330e14c","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190907113447","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-DsSYdNtDoFO6YbjlR8abdevdEXW+ZlZhuH8clQcmaRIqcZBreUlc+u+NRvQ/7X9zMIp2W7RJDDxGcGdI6SOGmg==","shasum":"30aded5c1a9368ad2e675007e4fd17656f285f7f","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190907113447.tgz","fileCount":122,"unpackedSize":2411062,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdc5aJCRA9TVsSAnZWagAA2AUP/j9y0UjgywGOaWzWfBj4\nBjtFZ56WBPOduQ2vD57mGqRWMI/yPkz0M2c1yjOerX8Mn9o0MXYMchoMyP3k\nEKhCZlcvMdkEsR4VeLVYc4u2AlRIMOu2qu+m2rsi23C2055LnVvqXKIXpgnU\nfgxk1Elq2qPf4yd+Nr1Afb53sQmIKJtAG0aqbZSKkrgMzeiwv8UvpwN20Op3\nFdw1gFZK9+vYe0wyiAULy9exfBfSrbtxQE2o83VJJMf5mQip2/p6uOh6giqO\npUtkGYF7OlukCSPsO/SIsibB/zsml2vD3Y8xZX7QBC4gJHbm4j0KwKKCPurn\nFJvn+kKb/aqrg0W8KX0ie9cQQVEjb2G31bH2/FU3z1KXCNVjOPW0tVgMHJYh\n5hnWegoX1t/QuY394V+IcDVish91sv5Hp9SxshkfSlYxWWZBrE12OiRCG3o8\n2CFaQVYUER4sLYuTfq7QQjxx7yPAjkgVdIjrIbwT1hRcmXgsr6FlSPO5o/5a\nYEQ4BtEncki5q/FEmONHx+G48xWMXhf09GzVjdCdMpPF4vmaKAorV+oGbVZp\n6TIGL+7ISgAP7EhpfELlIwUlTfA5migsB7VGKSRdkKjnFmSejLq+1sjOx6ui\nok7HfURVZrz23L+nGCCnzCqlD4q+it+AleG4cvhPc+ORzUxwVYj29Mz5UkEJ\no+tC\r\n=NSw+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNA5YpYtYC7ayz1bRF75McfgNwE0qFx/DUJ0SvvelzPwIhAJwJJF/mef6AYuRdkNudqB1kQvFL/q0jsZAOwvTYlG8+"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190907113447_1567856264926_0.43615552838811444"},"_hasShrinkwrap":false},"5.0.0-master.20190907140257":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190907140257","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.6.3","@atomist/sdm":"^1.6.2","@atomist/sdm-core":"^1.6.2"},"devDependencies":{"@atomist/automation-client":"1.6.3-master.20190905172037","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190905165129","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9cf77d9ef9214627996d217985fd7f805e79fdb0","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190907140257","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-EdZ995q3mEXKOZ7n/EfJKTqyx38X9EWe1U5A3uCQqJwqA/7UxcwU0NbD/WnwBu6HHxIPyXVqP2kvdyXjo3OHnQ==","shasum":"ec06b863ed140699ccda64837b0cf05f2ae10ad6","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190907140257.tgz","fileCount":122,"unpackedSize":2411062,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdc7k7CRA9TVsSAnZWagAA4MQP/3NNl0d63h9JHzyix14I\nUcLArITlq10BiETIUOxO6zhGOudjUgZfctvUbSjN5dHzUCv4UwTFKuWOB3wm\ns1zzIHYxDqCTvEE8FqNKJOzrhA7qNsP2Tvw3jAkDGCNO3yAN600NMQoeRGa8\n89amJNJWsB9iKXe0ve5SyHYt9TAnsK8aO9+rY7sZwpRN4d2MAu7kHuIok0Xy\n1WloytKPejqA10CsHtKNnBfJSq7hyjSxsDiFWNCmpjTfsfEUqOFrt0YSKh2Y\nxdEY8fW97U0G4FW+CnCRWPvA68kh1ozMggmE864G7ylvBZ6obNeWrjLcSKAx\nbLvpLjJRRytnlz7kSu23beveYZ06h9jiQVF8Ou4iiTzro/8EqVPNKfXd1kAU\nDXfhU3Q2CGfdk9qVPErBS7vBrt1yXfc4V/JjyqmRlEml9RDNd9QvFNhEd8FW\n9MQfmelaP70B6QNoPuGl+KDyg/VDbcB5aQkqs7Q0JuJ5iBIHoAfg9lOobMIo\nF54y0qVjoHPlW/o0rwkbZmu0E49QPcSOd2+5qIgwXN5lCnMbrNxOgKD7MnEI\nbILyhVCwO2qDgoUAUVOpiVI1fSOSRSog+v/JGJdmlOUg6UE2zLQcHZmQuLdv\nRhrRuVffnCmiioloLL1UnHMfyjnVBQ3L0vYMjkJeGbWs5ENwVkLxHZ3ID04a\nwIaw\r\n=hNn4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgXhiP8s6A1grm8I0oFNIn4OD7qmDLFtDOBHty0e351QIgMrB6u1zGtZ7hXaC/OgJXauAuDuiWsMDOxeCnXwmX8WM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190907140257_1567865146879_0.824198073058092"},"_hasShrinkwrap":false},"5.0.0-atomist.a260p86nh.sdm-deps.master.20190909202333":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-atomist.a260p86nh.sdm-deps.master.20190909202333","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"808a531b24107baa1b34201b0cfa41e36427f474","_id":"@atomist/sdm-pack-fingerprint@5.0.0-atomist.a260p86nh.sdm-deps.master.20190909202333","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-WiUxlCVYp4JVDK+Y4nvybPpyecwIRjvu2OCVFZirx2TJATIxu4aNjB+rSm6cXPA+HgeOnGJrRvlGG1ez10CdmQ==","shasum":"58edb4eab45cf94d471ba2c9eddc2ff44600fb30","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-atomist.a260p86nh.sdm-deps.master.20190909202333.tgz","fileCount":122,"unpackedSize":2411026,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJddrYICRA9TVsSAnZWagAAjwcP/ioRl4v0b5I0kVlA01LY\nLj5zCyMIFVkU32YxnecTizic92PcEknrufunkYVHBq5AyTnZuo46FtWEBDPV\nopglYTmBUQI2rEBLzx2KQDIzgaba94VQ9pxOViVAdPyzPQKEX1r64MZIXWry\n23JS90yWIIivjiN8Hig6Zl0C6jLw78DlruZZOjmTpFNk4cBu/9Vkrrcsudyy\npT/nlEiohoJ52F84y2B/goKyWeIgOS07SC0Hpt6LbbjtllbSIRTUg8+A02pe\nBiKLOw7PArPwJzr2zQH06VLooDOREA4RnpHrOawn6A2DmVul+zTxjjWFx0PJ\nY7AYOy/0Y646QJBDv+tq7gUhiqfy0T8zjThd21R4WtXnS15m/j8KldCaMK/I\nsyZKKvlTVhTYPJ9fIBPsO4cZm/BQdnwf33NTmdAMnhr7qzFmRz3kEJj0pS8r\nhEQsve3pWU8LJZ02Dwf6E9oCclf+lmQ0NlWXEm2ZlTT8myPqbtEYiagaKBey\n+RK/ylvcXgv6fS16bfo/nWCMA5fvMxN4sOGqiyyYMb0eUYBPz2LF302MEE5Q\nWOcW4fmQeJ/Jl5IpKxZF5Z2f1AyWeJexxsTcNky5GkhwOATFMotFKCTtO1rg\n30AflBQTnKPk0gtNNbFabn4FJMGvQq5tLBiQnOdWcSVhtKL2lAUux7nugfGD\n4+XH\r\n=VpBZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDiiXgo7RLYwMIblNpZfG2lrsotBjSJZ6Extn1ha0dWjQIhAJnf/+8NwnLjjteoUiGdg1OrX5XtArvL0z+sxLJCEC2I"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-atomist.a260p86nh.sdm-deps.master.20190909202333_1568060935562_0.258964992917023"},"_hasShrinkwrap":false},"5.0.0-master.20190910075000":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190910075000","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2-master.20190816115246","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bfb33d12eee2a33116ffc149df54f3004c8bcc74","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190910075000","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-JLLtmeX83eNu9MJDB3YuH2xPal6+mY6r5W2PZuCd2XZJ04UhJa9aNlEfxwXhD5yNyDHVqHErkrqJnwVitSJu2w==","shasum":"bced0564d391abc99ec44e8f532518862f3d3908","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190910075000.tgz","fileCount":122,"unpackedSize":2411298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd1abCRA9TVsSAnZWagAAXZkQAIFj2XrJQS2cRBF3iTPt\n40M5oGzBK5DjaIcPHsz9Y3OtVZequZ/cJB8OHY0O92EVk2Ludv1XsGdLVhUf\n4NTvvgX8/ms66MKDMA5acmLg4qo7IKIUPyOI+49kTWNFH6sCr1f7D7achPar\nWzoRs6QNqtQxC1e8NWdzfnz14GxlLNNcdw7wE02hfA4gvpFzlEZDUbJh2evV\njfYrdHDCmOIkEzZw3OOVA3wPkKsUKI0+vyzMvfFtk5dW43Sw99hH3dtI2fvZ\n5h3bul/HxrQflI1fXhJLpBhSaiQEFWN8RNE1/RJZLe+WLu9CfpNRV7/UPBzc\nGIC8Q098cc23AqtYKu+Wi56QLznI/dT44g6K2SVmbgjYWUho2ssmGRRTgcck\nhIwjoe0wm04tWYt1ri86vIFhAM9Uql60F+BpX1bNubnyYNwuUX/ZKywrCTXR\nulZRCE0NyfVHdVBgYMIcc017spU6xlbiAv/0v/NZe5u+pe6Pe7Gq+QqzpDVO\nakXW5ZASpfXtnC8lD2TZqZ6eeHa85T8rbSt54g48b27YyjCpMQn3F+vQrNbd\nouAhNxC5Tqwfb9bS7BijajGw7n/ZrywQUBJ/K9y22c1t4eq8ZLl5ReLqQtMR\nhyXqsNa9wGaIGmY2ypQN6TDkAO8RcOzPiJ0RmLAWgBqLQLN+i889vZYZuzB8\n58IF\r\n=HWv1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE5+dXOriVsjr5DPIjXql6dHsM/xxjswYr9dQOzAtK+EAiBmA6X2aDZUpbShQLC2H/Zyi/3UXuidcFRqfI1A3kLAkg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190910075000_1568102043109_0.2970756291916039"},"_hasShrinkwrap":false},"5.0.0-master.20190911063809":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911063809","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"add74b84f02b623f4c36f0c1e1d72bb1101b742b","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911063809","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-6eNJaGYO6CS1ncSCKimCyGgqFaJyrGzpvT0LuxrwZz6Z9Z06nMDGn6Ck53V/sAllP9fqiXy2H5vlob7xw/+xCA==","shasum":"e816f330249fa9ac4ef15f4aaa087801179ce98d","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911063809.tgz","fileCount":122,"unpackedSize":2474842,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeJbhCRA9TVsSAnZWagAA0GsQAJ5PM5QzCbqYCu+eQrBH\nsqyAQnND4c36Qky2FOZ5+b0D1BbXCpVRm2Iv/zFa7xkGxhsZPINjKxbAQQjQ\nWY0l0GxN0vYvVEzyyQXJ++wU5kkAAibQE0T0W9WdWHFhtvjmjRQusozuly/Z\nD2iaYcz6zglKIg/cCnTUiwEPZJQt4x9Y7AAfGr6XZOkqRAJEmR69PRvnWx8Y\nrgnup36Ge81l5XvERj/bvGKW2qpfn1pi4bfplf2NbXh+XcJa+zf9rwH8sGar\n7V6kZnBXGU65sYR2POnQ+SBkBxpHZZ8Wrz+v5aNpDkSwmJovPv8WmVzE+c/x\nbpsVTKvmaXlN5x1qYWd9RNXMGKWX8F0TbuMnD1fd6EVKFOhpj7arko9vSQtj\nOMIIFNRtfoNF/qCOz5gW75jsHef7Rm+9LWifOF70XowVvawEuxMjfLxnmhD1\nR7ZXV0FPXib0gr9R3pkUIRnKxCuHLs25EHIOmpDmyVkYddSCYRojA214M8ym\nFANLeLSiT/4Dnias00JA73zwJYi5XTtrQMdh1SGVX5LvyecNTGYog9XTnUqL\nu+Sa15jK/zb0GWxExIlN8ueKxEZSu5QDzY5soORB016LtP3E6NaeUi3eLZQk\nkXdabOT7et4p7OLirZmOLAhH3eWoRPSyT/j/OTRGsb0Wja6a2BkQgz1MB9Q4\nOAQc\r\n=vX+o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA3/Ge+UW4daAcqdnS7iWAxZJp1281bxAwqm1Rr5PQiMAiEA+v6Un/U3VlZj/CIrXfXjL/pTtA43dSsIVGSToFZx+pc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911063809_1568184032642_0.389621908650599"},"_hasShrinkwrap":false},"5.0.0-master.20190911145953":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911145953","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d412ac0512ae7030fe4f562b980691ed2f3099c9","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911145953","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-qD2du8zPa7YBNv6oMdiTJFD4US4jpDEindY1nfjs8h7AOv9dH4snofSOe8s3LRY40F2yiVtMl/zz8ejxJsThOQ==","shasum":"24d7fe8e397fd0bdda829f285b0825c74ab8a847","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911145953.tgz","fileCount":122,"unpackedSize":2475615,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeQy8CRA9TVsSAnZWagAAOHwP/3VL40KmMJNbfdCLvnxX\nVmI4ng4lTvgRwCa0FxxXaNupQwRaCLWUMilHcsgUjgq9YaO5x78oDHWzD6uk\nODzVivHGJDDj7qlrrunUIfyZ0lr+Ay9/m8sp9Ab418iaWu6rk9ks7Zrn1a32\nrly22zzy2H0GA2a4Dteds4x9jLxF+X62Y80epB6wJD96yAD3RUBkzBE0HMEo\ntRrthVYcmxQ+1VIGGG7h7UITaM8ZFzrwTwv3s8uuBs+5FcVFQYizbJ/rTrwv\nCNDJRaPxZZ8xf+Caf0ff0tFDvM8QVDI4nL02RAHVF85FaGglfT+UJpwA1/ug\nq+xWHJ74kBjT/LVGoQxJiPYKtSbZB9+V2uTW6tvJA5wFnZFc7qQcqaDlrF6I\nZufrObR/LNcrTZD0MizJhRohuE7aGokgmP9hxcvEGjHlZSpmAyKDvKxuhDSi\np2fmBFtEi5rsWVvOYQ2L4jJc/d8xBP2Dl2iYlNaElMjY6La40At+ke0ZOdOT\nkZMhG6YFmzsUmmRntOGt87wMTZRDuvvqYvLk6dm3/yX8vVlT7mj1shxDMoN5\n1GC4w8VQIY4eUVuS1UjhpDRJNeS5S4z/179knYe+VclEjkFRlnjifdWPs8QP\nVxA7moleRXFp2N7nNUEzuMEDNiQy/JB8xP6BhmRl5dQbkwJ+BxrPeRSI8Qcb\nuMh0\r\n=EEqS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD53FmOzgAp7tDVCcxMEfKFW98STmttsV7H3Kws1XZsUAIgeLvbjQHMeThHsE3J25EX6r4EGB75722YfpUaSGGdTcc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911145953_1568214203767_0.31398263878789123"},"_hasShrinkwrap":false},"5.0.0-master.20190911150624":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911150624","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"eb9be60ba1ead890c8d8615f3b5a0a614058f3b0","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911150624","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-6p0zmq5rYpiDPRZRjAw1WOiZnxLi7hrJVKdw6KuhrzvG5k4oYqtNc8q7T4xV+0gOnzGqmdKg0QeOsm657/wVFA==","shasum":"4e33a7846e2cbc965a44e8f11a8cf5a4712d6adf","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911150624.tgz","fileCount":122,"unpackedSize":2475599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeQ4zCRA9TVsSAnZWagAAle0P+QFGP66ArIpN+kXVcRI/\n60MmdoFQxTSRmlob8PZ57xmozrFnxJv9bGwNsKytTfPPJ/LM2lkXgfRUuIyW\nrNZLqfQKa1MjgCSet1jzgIi2kw9FzA0WIgF3aeTy67IXgZK3PQFy5Yw6H3yn\nXCLngM+lwQc5Z8EcDT8bU5i9XAA+DwvNb9hVclm/tMuadvw5+UBRfm6/95mu\n1VDF9DOuFsBDTR2Q+Xwin18z4pMyrGOejOPhcqj2jTMrPgVjlVAawVsbThcd\nARVByFat7zrONCI8L3MF+hie5MlpzPBXL7xCATjfpmiwkmh769i6UXYBwnSS\nJGTVlFiKeb7UZME5fDRejaUk3zwWeX2jvsNNd8EY0tfcnQBAfH6magesxOeC\nq9SDpIucCb84vsviMZbYrv4Pnh9mtUKJUydZYYuGAHKRENT59ff4Ihh576Y3\nW0VywXH5AAgVEkTvAPi4QuYQ1mzZcMjckFqcGbYm81+FxndyVxj6n4e15/GB\nX6GqiIW9dn0MDGZMMwCLEnGqOFVTN4EpYZxsCHtDXvJ17x7D+aZ60cAPK+zA\ncqC1c46akku9U7tggJTGgNJL/aoTe4mW1h0nBNqWWCOHDZfzGSgHCIFKwH1x\nDSNPoBYPebt8nNLRhftgKe2iRUU2ozO9EjOGQl4X0YIHQWin+C/i21lUA/Pr\nT2Bn\r\n=NqcZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAHYk+2rtUHPoYAaTmwvup882syvvRu9Zyd2jpUlgwT4AiBVsOVZ4SJCyak3fefJECH16mGdYdQtZFlIaptyi/kcAg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911150624_1568214579097_0.07223259550563266"},"_hasShrinkwrap":false},"5.0.0-master.20190911161022":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911161022","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8f7535ea499c84f9407e5c063bc53c3f892ce30b","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911161022","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-klkypfjEqAk7F+Na1EnoiGtKeFC1rg8q2C53U9FWf+BlM1ns6uM/ZohhWRFmg8PYUhy04wV4enClDej+at5RlQ==","shasum":"e80adcff753aba8f8f4a02b1696c7eb095d79030","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911161022.tgz","fileCount":122,"unpackedSize":2475599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeR0BCRA9TVsSAnZWagAAu9sQAKE7a/I9ZTG9aVdhaUML\nP1vf9p+yHqsKzOD1cBo3j7ajziiG1/H1arKYpUdN5C6m4KAhc9MsCVub2XSC\ngeYo1ynJHXphY8DaoKaq9NAKzYt0/7n5rAaCNfNy0OlB4Zb57/0g9iAYmnYZ\nR1bE0UFhSCCtxYAextv1H/pyRZ5sTcU6cJ/CcrUEf7AoQpOPIbo5tVpRimC0\nmvB96tvRpYKrqxSVMlgl1WfhwXJMg0t7sXb0wHJ7sTWciQh49umvZ+MnfXFp\nXoW1sC4hVntkMgaIWflnlrGhnFdkN39+1tKf6T2uMSQ9wTrY9lQ/uy1d0/DI\nbBySN9px4BrjJijW2/PHJYZjURnjtEgLWnOLe3ajGPtvSEgJ1HyYn8Tgc4Yt\nOC3NnFVTEnYA6+QvF4H7NTiO2hx4/BrAQc8/Afx87VgNkrhPHOS2vQVUmKZh\nSlv857duvasToOz4JDHRANjsHHrwaoAU+zv3BYVB6eW4ql/9o4Y8xdrS5Sw4\nB7UMSSaZo8kzjHkfxYt8C+fGwl0QCRto9nwtwLWLa2Wvm3q3o5iPAgIQTjxk\nKtMnp8GS3bYW8oOPQkTE1mHGc+XLuGAFKBKqc31lYKX0O1yiK9s/Vay2DlYy\nslpmIOSL68H6mudc2fp2d5AILeoPUbM8ROD0HkVTRRwNH/l5qY4WIhdmXVo7\nBAGo\r\n=vE9T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpAX/jE3Pu7qyh15G8dGwcesyHmVjU+Lq5dOgMPsgCoQIgGo1kPOqjS5Srhp9vYxiQjJWd2eUmhikZMRc0ggjI/tQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911161022_1568218368983_0.9759723800529045"},"_hasShrinkwrap":false},"5.0.0-master.20190911201651":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911201651","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"282f4abd2d3e822bf88a26600f80c3baf24b1b17","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911201651","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-VP601+LgCDFyTGFStYw7FeT4S5FKIgSq+zdHJwGFVTLVUBOiSgG4QqJlju9ElhPIDM0jTLhUquLvrDiECRUmFQ==","shasum":"7dfda1d2b7232e1a11d3fa53c8ea0e3739ca06e7","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911201651.tgz","fileCount":122,"unpackedSize":2475599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeVcOCRA9TVsSAnZWagAA1MoQAJ/rfNFSph6bBXvcavTW\n2qAeaWpmmeo4cqnR4yyAeAbiF6w4omJgsRygHpxbMro4YDLT9Njzr1tts1VU\n5r5o3ZzL3rbCqhCiuzoyZ1Yf0bqqoRqLcdVBdv5Q376qZNaP2M7lw5Ou0wQr\nT6rwjRzIpkk1sNLQb3mLq6Dh3akHY7+wHwruyiIQs9Qlc+hsE+tCfhSNAM5W\nDkSV6eTo5nhHs8/cYutFllKHmRumixnUdawmdYTiz14/0XZIOPmzLuoz7Bwz\nx9a2vg7lnFMIhREHHNr/fPT5Lt3LGE1ehT56kkbdUKJwGu0/P5Gk5QfNo+NT\nKIGmMPXO+yD+h4i9Vhe5IAtpEEHVVjZ02SAaPsslqsRds2ZW9q0HAqzzW8bt\nm1g2pUuitnmX/9RiPm2Kjo1EfphxLupaenOprujHj8Z2LO0mJA7BOZEXa84H\nGKZ1KJWqU3bX4qOSAlLQ54i2iUCTjQuCexhy8PAKaM9peohPXSlDjYYaoTB7\nzBpCtLPein9Pk2sSgWPlccKDPT4rOWVWpE52p8U7MoV2hrr577a2uolHtxGa\nNKoF4LbGNgXJMaZL/1PhC5qhM7LGnI2cZLAHe+QA4Hj8pVPOMNcBD53bPy4L\n0TYB+sn17iSh3T+lCJTfTP20exVzW1261eBoPByDdBym+WLVIBRSR/wxppN5\nD/GM\r\n=c8t5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBhxS3nu+v1g0UQQPQfzHZ05Tjn384MYQIR0t6qruP2bAiEAlizXvR0WRCjHQjqS43Kk7wb2ZUjBy6jWwwi0YBrt7m0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911201651_1568233229986_0.9651721994454752"},"_hasShrinkwrap":false},"5.0.0-master.20190911201913":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911201913","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"282f4abd2d3e822bf88a26600f80c3baf24b1b17","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911201913","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-RffYNJVByJVdPo+UwUzy9dgErZJkBi89iYFar71UC1jFd4O47FwCPvWNTfpxxKmD++E6U3EuxEESebV4A/J73g==","shasum":"6c06504afcf196a92748bd414ec57a3dd1bc4db1","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911201913.tgz","fileCount":122,"unpackedSize":2475599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeVdpCRA9TVsSAnZWagAAsAoP/ipHKThQ/j72PCbkNq5u\nhgfH3iEEkbuO+4MZ731Mmxc2F3hNy7ZjLCxRUobSrlp6PE5v3m8rdNvE/0lA\nzZFzkcOoiCUTnO/8JlEY0b5NFjENn/AcppaEqICyLlor7sXTsKBKKlD3CnT8\nOT8XCnUUP69WJ1P/9u4I510XQ3cy1xANTfk5W8JjnlfRbc9ioC9o6SDY4BjK\nW5igmTjEbMvfhsb3SsfDtw6GkYwIPAVEl9KujIIfNaHRAI8tTd3h2cl8QcIo\nmnGpFObtfluhNf2sCG4/sJR6Bb10UI67VXu/WTatahPSMiT6CIulKLy0wwxd\nvxVNFw3BmF3cWPkNBnPgNUmOsNxZ5G7UKiAr7tISAEKnQO8UXLTpdqisclsT\nIIlxxUAUV7x95cYB1Fnr7APoKaZYbJb1s0NyqbjXAv/cna9joTllMlc5g6WI\n2F/iOZqHydtwWUN1aHIUjO1rOYZhsXIIxSQBsSoZ/4shMnyJ+qfsKWKADpyz\nhEAZ3qt8LsCq1Tnpyz7CWzS1KwgXMbk9X68mIwKl3TdMoD7N51NZKoIC6WFo\nuDW1zWYGmHMJLxM3dwp1QByCActE3aVleI+47ixTyHSNlcHLE/iZg7Dxp1V4\n3HcTV6EwMQ1q5FFtOFMZPAIws6kLMczTu9UROtejgUF+08akerlm4r3bjwnQ\nxfrr\r\n=plkI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCoNaI3h1AZY2njkzDCQd6PkYeIUCIPXbRj3ctzSb9G7AIgNcQyFMvG1NFGoarCg1njBJU5UXk2skuiOGM/qFv5tXc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911201913_1568233321041_0.9299989285430499"},"_hasShrinkwrap":false},"5.0.0-master.20190911203047":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190911203047","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"50721bd429a0b2835ecb26a901a26f965cc0b6de","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190911203047","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-HppkWf7wbBqiQI8L0ajZK0H7+4yedKYMBmyXxSftE0olM0CJQLH//EXrRl9XupYAru/5IjMooo17v0NpRSr5hQ==","shasum":"1639ffabc124f5eb478d9f99ddc218c1b10a4bab","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190911203047.tgz","fileCount":122,"unpackedSize":2480581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeVp+CRA9TVsSAnZWagAAX0cP/0GC1pgLOlB110nCKZCc\nNANoVUFtgKMjltn3hOTJpQgi8GxL62dnvANUq7becnt537jmoeCFJBxt08UY\nnZ4juMxDYAaP+kx6xgsDt72azKdnNCtPaeHucqFB7glhU+s4cLcY9mXVAegq\nhk3sIGQSUw9P5N0l5ElRcUMGxO9h+GQ1YGqzNMrqpgZiFbwFZp5KCI/vhg3h\nPwtQRpBQ4EV+KkdX3602GJFL1jSvDDhZzOodaX2Rua6F9pPvt0YY9yOEz6bQ\n0TjvHMtDmM+zuPhBqqdKpe7yChPY0Nv0M1fL5rflUQA58a+ANHwDkgsuOWc/\n1sTWbE3F0vuEwu6ob/K2FLlJlxd1VVo2/RQL4rvJ0zkB30AI6OMNgYCxX4ZT\ntDSf7sCcnxUg57Dh2F51TPNB4ESuY76k5JoGCDq5KccStJ3S6+CPLIeedt4b\nC6BfdU1I3D7iX6fw/3dmqhHncSr6XHHDAu140+6vFqyzAVaRaQEAB12HH9gj\nBxSDDF9opo6FkNDRhMcj3a1nlrONKyKfUeoEhYMZPRfgbSZC08bQaKmbpCNb\nImSW16xBJBjHxJgo4CxnvZ4mlEHq0smEpjedP32OLobwvyXYS3zo0t+vmrXW\nLKiKRWhCAoNnrM7u86bD8itThoGKZ7wwlfap1SkyhhSAcqDE4Xm5UFiC27n+\n1Hq0\r\n=ezW4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHNxH3Q5lFeaNqF/Yjvex/UYRC07M4brqBxVX0PGxPOVAiEAkY7L9JTHkcF7xnV5vs2KlQlHf87NLq7+Vt3yjcIlqTw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190911203047_1568234109644_0.7591909790592546"},"_hasShrinkwrap":false},"5.0.0-master.20190912121938":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190912121938","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d6f93614642ec6545f4acd13dd09673f9dc85465","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190912121938","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-U1gzvA48cUB6O/VA8Fol8q/DtSnOI77yPWeTSTUA5vZ3TeQpmD+NP0YbVdSX7+TQc62Lm//IEqTbOwr5oPVQdw==","shasum":"e1e4c1214d6c296ab8064ff351f8995e596a50b2","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190912121938.tgz","fileCount":122,"unpackedSize":2480736,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdejiMCRA9TVsSAnZWagAAbCgP/0s1PhO7wKpFlB9C2x3r\nxL4FiqWeTjWa2nPCziYKZ//yXQzZLYttai+BLCuZ3lZehBL2pqbsUQ7rjn6r\nyxk7hbheiLmb1fl5HGjEn03TLG36AU8pQsUHxlDdAC9KS9UuTT8seGoUUrIT\nkPVVlf/k4jHDb7OI6tQ8F+QmMxyXr6/vCPsX3Dr1YepDTSIaDWkdkh1o5vUx\nYDo2w2mw/UUYFuJ9F4SWDf7DyFjROSYR0kV2m3Fz5Lq/1rvcWLNLP8KCHMcO\nBmJU6ePT2jPEnnfm4Ak+PjYB1XOW9Dv6vFqNEMbURgEPEexo4b5VsZ3yXNsx\n66XnFb5u203X2hBxbByub8A+NzGzsRA9YHAirXZeBeX6PvnjPqtfapS0r+mm\nP6ZDL1g9FFcu2MeMaijkm9MyCRbF8bk7GR1xBFiLc1uyw3xH4HMCI7nteK6A\nn7QafgS4WvVoz4bHwnEEqt3KifVgv02pwGOjQY6vSBHBmQlj0wipKr1M9kHF\nsaU0vWKZMJCZ/2P2ryJdzN9zRb5dX/2AQsRbTNOAGFsjvLN9Vcc52R86DxHA\n1C2RPaehhJIX+GXZxhhCTAa5y2xOFjWNqPaujBach4mex3cZTHTd/cvi6Lwd\nKcAtLCCjvFuTXeA+eesKNsCb7S54kNuZO4HTFZ98nbUUrQAe9Jkr/LzmxCEr\niSVG\r\n=9S4c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjBTOAYyUz/8LD/oEriXzNflG/VaBVprjnW7BTELdSaAIhAPP2mQj3W0MV7kWC65IqxFsBv0be2H98CVdFsSWjZRBH"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190912121938_1568290955839_0.32798666477539107"},"_hasShrinkwrap":false},"5.0.0-master.20190912122833":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190912122833","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6e9712cdde0c58daf18ef354176e2674e126a549","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190912122833","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-17KJM/iQIRjXC14vOhHvSyxLS/Io9ri6ShiuQYXwDx6yz5iL0aunoZYidgo4SbynPXSMEsxwwFXyyFUb6RNoSQ==","shasum":"39326fda734138089957a3b18459878219e71c82","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190912122833.tgz","fileCount":122,"unpackedSize":2480623,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdejqnCRA9TVsSAnZWagAA4yMP/jxnpHYzZ7lY5CV7HQUq\nTzWuGY6JRJjpkJOXc6diTsILzRnm7/PN26lzXEcA3kJkdv9OASY4ZNXv2B/Q\nx8TtWx6rBLMwyj7D2w+bgjp3B3lA61gYKjvnGWBzXfAmUd3A/MzTlu072W7C\n2wSpP9CdUosS9uFfNCvAWjlqBK/4oUpWOzPk5DzH43vSHznDm+uHsy+VNsP1\nakq32zV13bNbWs1D1FGz87YLgK4TzUOSmDcXHLhqIZm9eQWuZweMUxyC+RmA\nA1lNOA88m3sZuVmmYHtKVqFFd49jspFE5uwpbiaPg1xONnwOhMQjdVoUUAY3\nUYZtKOpOjYczPUoBlzlvZ7SNJQYST8Dg99bUxbSi6u5ugIAjISt4oN+O3CLm\nmN50mvNutHtXx2SwAunZt9taTMJivnujL3ytxWErVQkAzFFFdkUAJ2MkSfIV\nfPqi2SiGesmuMVNkPTHBzM8VuJZRV/75TZfdJ9kuXPAkYEsbetSEV1dJHay7\noWeELAqUQ06TuOnkk5GSYQQROSxUsQOev/24SBbgf8tQinuar2JzMXk8e2Be\nIiO7WyUqcj/rOMMywGIXn27/oT4r1PrEbKsz1dJ/4ZdeNrw+fWFjrY2mc2AR\nBv0mrC9Uah2J89wijW3bA3z9UyKFyWSsoeXq+wNVrr1dW/sQ2EUu6Hy//90A\nVCAp\r\n=tDOR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEiLk5Bfajwfg1i+MO3H9gs+7nhuc+FeT1ZTFJkE65EaAiEA/i5nvS0THD8+kjkGgYov/Qg0Wx42O9lUAmtJTTWH3cs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190912122833_1568291494572_0.3821568935031536"},"_hasShrinkwrap":false},"5.0.0-master.20190912124729":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0-master.20190912124729","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e13b7036d572ce229562e44f0ea1f217761f3d15","_id":"@atomist/sdm-pack-fingerprint@5.0.0-master.20190912124729","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-tEol6GpvKGESnqdp9rZE935d3H5OH5koXFrqeFzP3OuloHp8mlvRIURTbOgCgc9Qo5AVWg6kzWkwJI84vQjqGg==","shasum":"c038518784ad9ad4799f61b1aac5eeddc546c78c","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0-master.20190912124729.tgz","fileCount":119,"unpackedSize":2475252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdej8jCRA9TVsSAnZWagAAK9AP/3MvpNpdNyob16xWEP9n\napxSnzAZApiVYuHUzROUygh87j1hDmj16Gjw8z8XBwF2L4dZHNgSfry3pprW\np7dj2Krlj9xIN5+c809YOXsGwnJy3//75EOdnwGeFo2HFQIPgOYZNmdVhjni\nnckIDp8/yVykSqEOlwsPyX7Ofb15NKScSdpRf5RoC4zEV8NCe+8UGg0jUatw\nZziXd1MlRMPQmGwwqSxIzfO+aRWqMQPi42UReSm71cmDrTco+kP8ZHBjEX2j\nHCKnFwsl5hougC+rx9l4s327VsMWCkbWXsxeioMKDPSKnWphJpSzWoXti+b1\nBLg4RMZRXqE9BXL/+UJvX7r3fKE8nitfnYTgU8FcJoy2QMYCEWbGcfruuJR3\n7wEEkW0+POxfBSOtxpmGj2BD1oCKClWj2VNrZ3J+yVJuspaBJO9kDDvEn7mg\nT19Os853SdppJpik/yCAx5c7mTzlDG1rqxBFczVxd58KH+30yn2MBmsni7h2\nJ1hBklN4WH4VjyU1gkHJqWwg1r4pMPExm34KjYi92NX6J4NhL0A+ywpP3HWW\n5o1PRrgoWGe3Ep9dwPEyjs68UJyMGEUz1uCE6pg9FAIxK011dugUET1J7ZQm\nlaNx1/VncLD+lyYwvawaVmxi/qAsMidtNKUoW746gl4OT8t9bSi+QmJOzdwL\n+ZmC\r\n=GePb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH19ZKkWDRT0SH7X6uHrLhBPf2VRvgdPZPnixotEGnrhAiEAhk+K/eR4qFjnqqbr3UGUPu2moI4ph6EAFrwizmSgnLI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0-master.20190912124729_1568292642871_0.1318881699748773"},"_hasShrinkwrap":false},"5.0.0":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.0","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"gitHead":"0f5de54f5eef950f5a50d58a1ed3c328bdcbd7de","_id":"@atomist/sdm-pack-fingerprint@5.0.0","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-SrLbMM0FMBFX0mpqtlBs4ArnAhGCIuRVSTf6wYJ4BnsLqIZdPbOO5StPMUI8a/GdKzG0zV3EvsimvXsLNtpgcw==","shasum":"a3c209332ec11af7dbe768928d6df3360cc5a25e","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.0.tgz","fileCount":119,"unpackedSize":2475230,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfBi6CRA9TVsSAnZWagAAfYgP/RWIAnzPCsi5HixvytXf\ninfE3bzFVZVcWBm377gF0zwS3P60vLK/L8L52E6zUiF3wtfbjaIXSI7QAfQU\nOFarvmlTVFogB6MoMbGbfwOm/Z7vnNqiUnR1JTKhcFJh5M9eu47GxRXFcCXt\ncStfTUcFxaer+aJbxeBScHUR0FPe7SgccRu68mbNEG/HtwNlgK0Y89zybzzR\nhQ3iYm67Psp2g1bbsggqJpj3NQOWh5TJq/vjkpn5zXWqcIMkZ0sRJJLClXHk\n5+5wb//LMcheW6cQ6X0moK5zs0sOOnYyumqxMLdmoLNJXPA2C1OnFe2j/ySu\nQT8tZMc2SXcsZwtV+TKmOUs9gIpd04aSY12En8GbExzo305f6zcT6QoKNZmS\n2RoVw8b4FgpymfHkuvd+7XcM1VgDGQd41LtbfVM1+0RSPmvuWw7TENWXxDdT\nF7vGLUWt2Bl4rmNoWfAOQ7Aua8/IJ41lBT1pc72F9AMqVMGVRxBRK+npeJ+p\nC6libDPkB7cCAbikl1yDIOvBhcljVNYOpa4HXqu/3aYjQkPKmoF+qFrBdT1n\nBO7knw28nkTMREDGENw4nDB5Vo12TEGQQE1XlRlw+Dy9jJo1BJJfBPctR+IE\nj9zTCL0xBeQcMSCUt4pwFFCr93JQwu3ZdEsJquBtJv1yYcO9FPaq0loCY2r+\njN5x\r\n=wcu5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBjVQKaqFnnHrM11lLxbZTfOinmzrMgFFa9EAtKSf3SjAiBKNKhZhtdrsU+Zg7XC6YkEIKtxwyxQl5csn7yVMBovJw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.0_1568413881706_0.4240075343576637"},"_hasShrinkwrap":false},"5.0.1-master.20190914002947":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190914002947","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b1a0884f260e804948f4db5d33de3a58b7f365a4","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190914002947","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-xeTjq6JVm/BUWPoGwdRJQSwrHqz1CNH3sTMyk7X13XNEQwZ8tNNZ1Jq2tZ0368VpBaiz9zSfkowa+jMtcsS9EA==","shasum":"090a3d6dc0b2548707b6437019860bdf49be1605","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190914002947.tgz","fileCount":119,"unpackedSize":2474422,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfDU+CRA9TVsSAnZWagAAlcUP/38tUGMwkAuYZ6kFfbmK\nrkZVLcPCdCku93PGEu3tXJSeXsZpC6cf95/8JGkrdwhVm83rcQvSQZxfgHoN\nchaY+z5gnHz+pzlo5Nd4bijhLRb9Y7kD3rpJuyz9TU0qA0Qut8ixcb4dCwtB\nrhZZc17cpRM2TtjmMP4q801wBmXncXq5DIG3tggH2yeWCDCxalMfQYB2mvVL\no14iFs+mafTZJpAve+J617SaZCxaJHTV6uxdCP7q3qlXH7HOGlz07c8jGM0N\nJDF1ftSeTdwa2bbEwoIUQ+tV8+U0z+MGAQ8XRvx7x3u3LnCjJnx5XD5muL6I\nij84QZg6++UWaD2MUkHcrKcB2j/XNsCPOMVQoIOUBeWiBjuuYJ3u1kT/Nt2u\nlzZO5AbB59GSB6JzFafMk7lAJzGHNU9uqYKlgC90Qu6MGbpgDcRFEM44Ct4O\ngmBhgvBRhslMscQmloh9iCK7OSyLoRtvO9iS511fLqAzRCtCi6t1qfHwIxrw\nvRcLnOOeIAsmoSZpizkZh81V14gM3oqLhynYmb32wrIvcIwCnpigDsm10cBi\nLR9kRF3LedXNQUBI0pc7YZABvTrQXAs8Sm7AAtt35Rh5cU8PookP+Mrp0AQ9\nzPePIctfWPClbiMgIy2HmMrnM/uDuF8BP2oCceuSH8AVZtfSfav+gFNInuNE\nShr7\r\n=QnR2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCIX5C+C5+TolSr+B0OA+cO9JenDyWspodtrRePCrfkAIgOVasMqzcXYphE+lduHeV0yKGsYfJtbntqMs/GTH4g5k="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190914002947_1568421182219_0.3601692050096532"},"_hasShrinkwrap":false},"5.0.1-master.20190914155819":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190914155819","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"635031ed66bf09d06194c4e74bb4d404f820cd1e","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190914155819","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-juOxnEmaOgiBep5Y/atBs8bv8d9/vcdxseQGW9oMAb5aKBYXtzuKpuTHjuLMRTRI56Bo9kKhySSG2LkeMQYM0Q==","shasum":"c83876c1f999ef8bcaa924d13f8f2cfbb923164e","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190914155819.tgz","fileCount":119,"unpackedSize":2474706,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfQ7WCRA9TVsSAnZWagAAMEsQAKEFY2aTOOPB/uK5t5Rg\nwOtRTn7RbidOqxjnJ7lA9VfLE0UvDKiWfk7VVmuB7nT624yIile3eyy1ov1D\nN9Aqd3bOqDyi64/1VEVsttwqfpoIUKiwsY1myZI+XDU0YWB7zN2ng1TNw34T\n8lj7d8tA7g+qZy04ZALfMHuGfMEwGYHANOB5SiQNDkW1jh8sdmLdyMk84eKI\nFtYVtLRRVGpj+udgtb1geYr4gZvukyeDkZnsWScENdNubYVB1rzwnOzhpq+l\nfrhVutfNgmh0WfBZLsSva2ZXGH+7wo2INFMdzPNqY+x2hOH2Mwa+R+0TIhrZ\ncB8UQ9BVfBacxz1UKaM9KH1xeDIg6/rcNWogpe22wSvvy23tgOvXzK2e+5YG\nMIIqFgOM/1LcCn6ej0S6+s1So0UA5ygTNFtwSJoML0zlC0F7F9XspinpjQ0e\nNRu+fOOGMgjpwY2VOCcZdqp8EAOaLWx07Dg3wgfsH9GzLcrxx2aOL5yeXpPt\n3UdFSkAqBjr5ax5FXhzwoGNOFCV71BlPAsRqWtNMyn6L+nv20Rfk5KgRjSV2\nArz+kcp4l/ZZQG1hF+j3EsiYSNAM4Ffs6bkKNfk9ELOquf7texyx7XupWsKx\nxKdc+TTIKvt0OttFiJe2l9I2fQRQYDdJ5GuWxPpiRx2E0c2nkysx6f/G1ce8\nqfiA\r\n=GX+E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnl0rtoYwRsyn0zpZDlW6f2aIEK0FNE0iw2LHoNGtivAIhALcbYgX/7hXrqpaCiGXaeyyvBEHrA/5vhR3dCqrLTMYZ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190914155819_1568476885721_0.6435735572841188"},"_hasShrinkwrap":false},"5.0.1-master.20190914163856":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190914163856","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a121b2ba82ba203ef22dda5fcd6a295ede27f472","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190914163856","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-csdm1MnKydmCKQg4AGYZ02RyNG5gbKDqSTsgaxGFbuy4v0BSi8kSQsTCy6fu/vV5D1mhgw6JZwFco+R9zELLWA==","shasum":"6dd2c10a49221025174bbbe0c71c6bb4ce6c5a05","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190914163856.tgz","fileCount":119,"unpackedSize":2474566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfRg1CRA9TVsSAnZWagAABocP+gPGhU+EKAU6XWtuAOVG\n+HZILvgpIXgHWWngPmwAU83gA9jTxR2fZ7z8wsDCCKy9HiIz5xDfGOK5e4qe\nnp4B+fyXl1l+IjL8MIEYeZxq+sw7XGMXMsYdc7dFvcJgEaJdXOa4uGH3BjI6\nWNHVjnfSZrHZLBQhxUwGatWx9XEtVPv1KhZRp36iK9t/bg2AYp5vCqk5X8N2\nxbs7NuymtB+oKQLQ2iXhinu8LxC54MLBpvNJqZAyrH9yVmieKa2FlFsQJxx8\nqk6QAUshJR+Zh32zER6bC7VeANVj41mpKI9rpdMPz3zYfvCSd9/6SGH//Vf8\n2krRLQMI1gj84/3BO3Win+hHY4U5wXkksE2MDOHPz23tewro4gV+JM/Ek9as\nobvydvUX7itA+fAXwHnPBxv5n7YCQnnvHkWqWwrKaMinmspK+6rXSCrVtgcH\naveJXAAN5hGbNsOJhzYqVow8dsdiR3iPXFQKx0LI3lRweLcXguUrEQgl7dqA\nfTb0dXkrU/x2GdaWiLPs3wMkOx8ZDJm5nft5oLl+XCkmLQSMmEK+S8oHrGex\nVsCi+Nh4Yj3ZhmAufYiyDo2+/gIQ2Ddc7qzPVJm3YmPdV/KORMw8EhPoPbvE\nM02SNU+5hD0v1ryQ9q0/9foB5sL/GoN24/C66cHlFQDxQAiTbmtvnrk1gnun\nKWql\r\n=j7Wx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmpSPM6Bm2DZaPzvIw/bkUfCPvcLnaZqlvCUNM96cgkgIhAP3veQOJFLpe1T7sEmUt/twF7Ujotbu89yDEp97T9+R1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190914163856_1568479284648_0.453625212055601"},"_hasShrinkwrap":false},"5.0.1-master.20190915180930":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190915180930","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bd823b171638e0fbf378a3a83728e620c3851e1d","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190915180930","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-Ddl9SPGn/AbPsPPnSZO/uQRNzJ/ZXa3ckfk6qVKDCsUCh8m5Cb031zJEArBhyOE4h/NQOOXqoHoedcTu0Pyn6w==","shasum":"259342f3945228ebc68411c8f062315e96dada9a","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190915180930.tgz","fileCount":119,"unpackedSize":2474503,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfn8cCRA9TVsSAnZWagAAkE0QAJsiYl8uIwXCd+AZCnfL\ngzXkBpwQH3lFs60SJVtV7F8vi+6bz4gf+DiqvIGpMs6zksq0mVkmwyVUJfOv\nMI8JlApiM+DvLWHmC8aQidAPMvfRCh7Q15mUuqdEY/ukQUuW9WlnGxwpjdxm\n8SAwe9KcMVvEDryIlBTWfyVEBQOUo0u7jukaP1aJlz2od4qmHST4CC0E+eki\n7huuIfEy4iiDEU1IJzga5X48Viqph/GpFqdhsyTCZxfzVpfu1uvNW7GwyA4M\nlZ3+9z1EDhsr6SeOoU5EPcSV2P9EN8KFvXb20Tsb8ydKdUjBTXaj5fuR2RAj\n61vkwwpQCa41UvcifT5PEuV95HKH7M5qvo91OxQMhjds0wfoXl0U0zWhKL69\nWvl8tc1Eilu0IDg9N5PuDWMGJnBnGQ2SSV7lM+B6N1qLgdBCvBjEtjMUBtWv\nJfAP+8INuGvxfBd6wGGQSxA+1ZoZF1slLoQHWPQ6x1bXjdF39Kk9AknAasKN\nGNyX+8J8HkT/zMhB1tFpkqEvN/urTbXd3SEBjUpGl7o3qeBuY60CY73C73yh\nHDxvlM0wlf6cVb54Ys9mRylobvScXQizJE6tGhRsCnOS1NXZfWhn2F/+TSph\n9VchsyoqW6KbpQvh6PQ3zVgrK4od83whlW178P4eF2eymza8oU/NMcRkrmLC\nqWPh\r\n=eoxD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCoS5xHS8TYqyZ0sDEBG6TLL5AdiTRlOw/xAa/loNmXywIhAPkiJlwajeJ+XN73MvcTvQURcFA0ujvPkcH9IN2MivV/"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190915180930_1568571163473_0.4808067988787905"},"_hasShrinkwrap":false},"5.0.1-atomist.t29e48p34.npm-project-deps.master.20190915181348":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-atomist.t29e48p34.npm-project-deps.master.20190915181348","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0d0d14d668c49e2374ad155de520bfcfbf5b59ab","_id":"@atomist/sdm-pack-fingerprint@5.0.1-atomist.t29e48p34.npm-project-deps.master.20190915181348","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-HmqD52xguaJWDydZxbj66KqGL2876mYABCZnWMpvLKmKVXyN94e98zW3QAoAvJfCJ0U8udmrUqf+LKoGTjH2lw==","shasum":"b44536766f9921bb74bd2d32146d7d7c01bd812b","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-atomist.t29e48p34.npm-project-deps.master.20190915181348.tgz","fileCount":119,"unpackedSize":2474538,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfoATCRA9TVsSAnZWagAAjKYP/3mMt3pLMoVrYhLqClwB\n46/LYp5ReDAZa7sP0C1Jzzw3tWBJFod6upKOURuZdQ53L1bFOCjFWGpN7PiX\nTWhRkprX7MOy305flT6YXXLpErhHB28Kk4l+zRsKDer2/cxyEwtnLO9ngJ13\nO5s/A1HkT4NKLaY7Mq7nhBqiSZSg8zmqMTa49mfZ4YT5sUiE4a2HRkIYrp/5\nfRlsJkrl9CJ0qxAswIzQCLTLKvveCUSu+1ZOeRYcN9AdOBDb8Tb9ffCglKH7\nMa2Lu6RsWVoD+kv0b9lOktIrdvG9Wej2LC5SKnBaj54u+73efyM7/kidKn56\nOyPaFoHYLbXfQ7RlUk91vofC/vq4RqyAN9swv8rhe9p8oj30+aYXt7UWDOjK\nsuTnKJ/DG43RA2ZKeC+F2C+tegllYnqN0CuGqJEN7svdx5011iykvEOOcVZ+\nqvFqjl88yf6gbKrDsd5or8zPAnhsz5/kSquxQ9yZzjx8ZmJr1TGa+Co80lsp\nARQaKOdkeKlD0A3IQHDajvr938pziSBmMcsneycryFk9piD9W7xaO2ylDKLd\n4Gmo7QgAchUXf2jXXajFEJg+PUrYn5B0aIP6BoJw1FWwqLSfhKDrFGPa2Ejv\nBakXY4h0BFzj2e7EwNO46spPNDZv+JRTPIyLHWvUJW3HoZHYyL/akyeV2R1O\n9giI\r\n=ilIX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGkiaq00O0xouvU1Vs9wWRKfK0OeG8qURLOOtMBd5uFQAiEAv4ADwhVjqoWtd7d5sG8GRo+k+dxs5y6WVAjIdrclDa8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-atomist.t29e48p34.npm-project-deps.master.20190915181348_1568571410424_0.16847865298758413"},"_hasShrinkwrap":false},"5.0.1-master.20190915182018":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190915182018","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cd9672f18b59b4f275be805e902d1158dd08e553","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190915182018","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-5rDhI90whqb8GiYVnOszbSX/y16ns5Ab26pP9TZ09X4qm7w+z5/599TtLaThFj/dDR1raYjmXzv+1BfnOWWjhg==","shasum":"2dbf2fe2dd04f5e018cd6017958e8f46b690e45e","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190915182018.tgz","fileCount":119,"unpackedSize":2474503,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfoGeCRA9TVsSAnZWagAAX5kP/R2AJFHZUrllRpuoI7Dk\nQ9cuxX10WXpJ2WBzYtLjAxVsFLXM6DMwcB63tpgWV7lei+hYpBTVFFzDDTbn\nJqmPPApjL1BCDAa/Tv+xhhh9itDPyieaFT02++tTjVSkh6fN6M5YNgybyi0y\nrzy0FPFTOl554jLXeBpK16UqBrf0G/0OBjs4MdZYdbAU57X8YQHGwFMDVIJh\nNpA0yDMGyMuMlZ+83mqDpB8lHpqmTNFsmZgM8YusEVGyzTvWLgDo9Yzurmg2\n0WHiX34G/A3XuAXmU4RahfnB155EjqcJF9WCCIOaMT9mcMfZuBgx4hzklwBx\nJWCNVLq5TX9KYB3G8ysKBZRbSfGjVw7lTxupApuR4gmA+2lm9NTDhbEoJYii\nl7UKg6IktxpOoxJrH9anjXCRxRYcqxsUjGH1uAGlHWyljNvd7KOQrCLZeZE4\nFewIvrlFtVpfWNJcQRApDvV+oVrgrGRR7IhSa0w2YDzCp2fnZY98ycxk2FNx\nSJokALeVLwfAJ+iT6ZFfFk2Zwr516x0vAYDUtoa5nNnFkR1V2xVlMFZNIg3D\n0x3O9OLZaTfUbSwaCmmF9rBVZ+iZlJuRghKAGFr3hreI6XnEHvukosfjAkvB\n8UYy4GY2aTLDYArv19IGFyo7EM0uTS3VR6xdnfgakEROEz55wA6p+YoR6p/X\nuhdU\r\n=wfiC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICwnF/5q0+ioWFph4zrfoSNvToczYWebzZuShopKSzfUAiAPUaNuYBdnXM92EPG60wtnr2DNM8RLojj1Nt5oG2/MYA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190915182018_1568571806262_0.593651816274323"},"_hasShrinkwrap":false},"5.0.1-master.20190916055503":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190916055503","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bc50c2824ccf7e7c4233b994cce533fee857b59c","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190916055503","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-3Y4T6u89FIlPP2V4SqxFvj3zhVBTzxuiweTvkAWhTrhUHhmXzJBDQfkhNsQovo70Lw8Fje1kmBuVBUCzFGoKqQ==","shasum":"79d11a9c5dd44a14b59944b3648916f8ea3ffeb4","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190916055503.tgz","fileCount":119,"unpackedSize":2474799,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfyRfCRA9TVsSAnZWagAAqA0P/35B8ZqgN3fi9xQkROX/\nmLbmA+UKAAeOrUGr9mE7zDyP+5sXZNRywySGDE487jOsc9v39c2him49uU4+\nqIsgwZXNfvch8arVIfw/MYhNlSwiVUJhRc8pMrAIwbxB7y3llybxbXfb54I8\nGxXIH0PlzGeXaqY79pmaMjitWglk+RzIEWeg+hAQfe5TIqU1STrTbeo2ai0v\nwKg2e9WhLO+CiacNE+HVs67Ax2QQdYtYsGznk2nfEUs/kMd90mCZZj19Wtxj\n7HOmnPv4mxLILUzD/VAsdFUyauh1PHkNSa6NKuTc+VwQ+PGK0/9cGuTgr6gT\npdYBKAKEIZEjwC2PFo58p+qi1E6xPegimCcfqvJd6QChbEZ/JPjA8HPYKh0k\nMUy4DP/AQG24nle+w919JpLEQBoyE5xe5POyiBPsR/M2ZrsRQQcLz+pUlWQu\nqwcTmKZ344H2WL4Wp4+t1TbYKMegG7ts63qA3HKPSlpjWSuJLI8K2LJdqYzy\nKoAOIsoyQu9Yatmpmlp9MNtX57a1yqRZsI48LwCKJ+yE6q+I2B9mEah1+uzL\neJwGsuVlSUQEN6+O8G4ugT+n3h3XOTUfiOMtw/xtn7RN4edtwoFp47OzOi5q\nrNAqMi8UEkh3jL8mCy3uz9OLeXigwPTV2INfejFAtccPVUp0LXZSOrllYqw4\npqQH\r\n=eyJU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHKCSCVCBP1R/8kTAZdLhnwmVGyixsuaAvHPTGluFtU6AiEAx1vcsigeeEMqygWgPHL1f6nVYgSdfP4Ojild49GqKyo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190916055503_1568613471156_0.44533968259925794"},"_hasShrinkwrap":false},"5.0.1-nortissej.projectfinder.20190918004738":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-nortissej.projectfinder.20190918004738","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6fb988fdf3262272697b36c0c32eaa7cefd42445","_id":"@atomist/sdm-pack-fingerprint@5.0.1-nortissej.projectfinder.20190918004738","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-aGMMD/Gv6W9cFO/yE1drocqZfxhYcJQfXq+ub6NgX43tiid7MwZfmIYcLUOl4eI6DIK1+6QTRAxvfO+AuS8t2A==","shasum":"0fad4d6d9f6de548349ad86fd978cd014d1edc2c","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-nortissej.projectfinder.20190918004738.tgz","fileCount":119,"unpackedSize":2477301,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgX9CCRA9TVsSAnZWagAANPkQAJPuAOb9HHM5dquaPgll\nuzuElMCvFpXSOCFzO0Ww/MktRx/5NoqQvcXasReHIpSy47jIGOzmyTeKeMwr\nyHk5Eh1jh0twIAAPQzK+UjHw8sbVDPdZFdl35EyXmfIAf4iWjco/QyaxVTFI\nAFr8AOt2x8pFUzMKvYPhazaspuNK+omnyoCwLnmUALJ2ibJ4u9jMS+kIzhHJ\n/bTura8LO+sqn0FCF0WF2jWt3KNiKkdC8uLGj2Z4I3SgfvP0ndMxVj6GAxtk\ny6Zwomef9Pu6wbPx+6JR4z2CKVXmS5BcZpRASwiT/Xb8vbaf8FZgDoqhHXsP\nXk+LpshBXs0sUyPb736bpwnPSpHgnkmovEMpVnP8Ii+tF8LNwragHMMYWdWC\n/60n9dTTVqsSbYQ4Gf6UHIulRZyNKIc+n+UhSO1hU3X9bPlxOnlG4oI2EGrm\ncf1xewvtraOJ+B3jYsfqe00K6FTdChsffaS+bDIm7L9Mkc+5TPhTNOlvxl2o\noAOJpXkc2E5v55bMFKX2HJR0z36Vjj2z7kkxYi8jR5+LrZgluN6CxT39ecR2\n3dn2EDv05ca8kf1iwpQn8/tdanDaA5UiVSuc0DKW2b4lMXa6aCwddyrKuBvV\nLBy090sXBga3De8ATtpZAMvwzffu9RomXvHpKk9aA7bfNETjAXFsie8IpyyC\nt06s\r\n=fKs1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG6H2djDKc+1dAwb3xZ/1eqUP8XqQKdFHqlGCsm2NhYTAiAAzWGJJcgih0lS7ATW7NyfgwVFq63Uuu/h0eq8tZdImQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-nortissej.projectfinder.20190918004738_1568767809493_0.21593846621189283"},"_hasShrinkwrap":false},"5.0.1-consolidated-fingerprints.20190919161303":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-consolidated-fingerprints.20190919161303","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"608eff35751ab2ffd5fc7514debd45ecb74833f7","_id":"@atomist/sdm-pack-fingerprint@5.0.1-consolidated-fingerprints.20190919161303","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-Y9kbz+7MWtT39FBHWgKpewnqDVGFdp5BHIjL6eYri/VF0+anQkDnBqP5M/hMOqQthKoeCvw7RTe9OEARpW/Uig==","shasum":"8ba98d404c6bdfee9102b8f0a37f9814c02790ad","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-consolidated-fingerprints.20190919161303.tgz","fileCount":119,"unpackedSize":2474657,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdg6m/CRA9TVsSAnZWagAAP/cP/1JnXEIJTb+XZga5pD5r\nhMPQW8nvOXRCbHvtQ/oJpi5r1hF3TgPBefVlHlqOnlSC8fkO/ASmJRJE+s+q\ndo1lIUbJWQ58OulSBk0ZZuvvS0CInYzn6+Fa8KpOtczroozShNwTV28SOeUC\ntyhQdxn+V7hVJS5Eef0gQBVyQ4U/kjaCHBIad7tW4yEkHMZxs1aCxEH4pFbs\n9Pcgz7h0XPghOfeDQXyOo6izYIqz/d4GL74UjHe4F96jraUP6QIauJGndcgz\nid+F8Hy45Ls1rflsVHS2lfcWsni+nQsh4acLhY4sCOHUtnsbA4IFWY1e4zC5\nw5PCksQlPU3ykAsbonWdoPi0od5tC61Xxbkiz61iuDZTizMCvn/tkMTUBdeS\nDUNWlVzU8du2n11rSRiRvuc9qSZTLZSI9ZxiYUDqRaPjoRhGGocyqxsIq5xQ\n7UZgupxlaMbK5svfJ5U5ipA3alwTALya/ORzpnpiv30b7hGJdhA6H2ROW+E/\noQm6Vs475C/vGZpjBWCyE6/3hWbnXwcK4x0ZCfB16eDRiG3nD+2gh3PZWLUd\n+bzrFu9/lkBOsbbwSSOVmAZVwMgi2NtI8hKMxM7O6S8fgG5cUQATGH9fbA1p\n3PH/FtUbR1fJsA5yBZCie2b+x8Tjy9g0ntu3dLk2qCgrOAQWJO89pHIgNwEC\n7cxt\r\n=mJuD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD5nJS3TKEAvFQq+ErTGp2F1eydK/z7Du5m44D5sX3s5AIhAIUc+PxoBTHb8ukY8WdTYz/70E04KQ4FISjra2fUcAmZ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-consolidated-fingerprints.20190919161303_1568909759069_0.7839863321431879"},"_hasShrinkwrap":false},"5.0.1-master.20190919164505":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190919164505","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9869d184e0b8c2666975ba4532c47ee9dfce25d4","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190919164505","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-iqrtcfCMsQN8jX4MEZTQ7uq7+npAHK7L7aHKVz/awTx6TgQkwRdJLDR6VubApLunVDWu+CeIi26yV3x+cAUIyQ==","shasum":"079a8e1c220f00da1ce1e7a179c3310c2aca1fc9","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190919164505.tgz","fileCount":119,"unpackedSize":2474638,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdg7E9CRA9TVsSAnZWagAAjL0P/2JuHUddc4ayGdzVHPR4\ngU6m2KQGHwcDGBh1PQi2nJyAdK8+uXOvcYEItCYuN8We+GyT2QlAPo3elHR5\niiZU1WVrU3LxtaQh6yVaWEbj5hUf9DkAKMcTT/0sZK9xQ1f5VuKenrOYibzZ\nlnkayRBUfUjmmWAutAFEY22SwD1/hAk8Z97sbv/mIHwMzqIAyhL2P7vizRfE\nXUx795Kb5AYTMsqLKE7CajqLl33j4Aei2j39Z8FxAc7BjF9gWWqZ7vWF8+a3\nrKnnjerdxVDIjoNqHYyrxmxSOJLhFsGnK5OthZm2ghgTZo/cWFm0rrLW0sYL\nD3Vz90+q/UnMmmniW2vS1jmHxMSsUyGofyxCeIziCQH40S0TYP13f/B7Tgkb\nd03CIVx/JfWxpeqHcGVX1JW3rgNrvM/o84ajbNw/4BMI/+vpxRMryl42JY4W\ncYR3w9IFXJvr61ezKYXqJApVwaFAtYt6yhGKvPzGuvOk7HvoADV31T92sc2P\nwrqZxZPny3AdoHY4xrw3k7Z3mWAaztKDWgCDPwm+lyX8ohPI4hE+gt7Qz1NC\naIfIMXp3NjbWbKsahVUuRgmrOgJi+WQunAAUolH98LDPIuoEtE23zx65JGrp\nhNNLBF2WdmhvnzemVKkYUTR+agNgysNLpxr886cmUrFxx9uxZKX5d+o9MhJh\ndCZl\r\n=kPRW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFV8u7XxnT+uzcD5t4xylsezoE7kQbQg7b8YmTWbCP8uAiAyjMhioA2UDu0fvqBNQuKYZeO4f7C8vNs3NKg6qSFhQQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190919164505_1568911676739_0.24202020139885327"},"_hasShrinkwrap":false},"5.0.1-policy-target.20190922003747":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-policy-target.20190922003747","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15","minimatch":"^3.0.4"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e8c893aa204f672819c7254f119b78980629e7a0","_id":"@atomist/sdm-pack-fingerprint@5.0.1-policy-target.20190922003747","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-OLwUWcRc3KTC8SP/IQh+/Wf5F2BS6I0/LFUoSwiUkqdGMAgrNA3jYPZpTn1tBgbLQVU69dBZLh8TjwGWrGnn3A==","shasum":"5cb259cc1bb999d156517b43e726e03d86f6083c","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-policy-target.20190922003747.tgz","fileCount":179,"unpackedSize":3277007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdhsKnCRA9TVsSAnZWagAAz64P/11sck/qH7aIYQD6Spv+\nNxQ3u8cbQVD433IKXFs4ZXVX5CHoZBUP1NseoMH1yh26YTHmxo3ohXhojaRf\n4LNT7puhCKncoOkeU3U4rVxl3mF4htx6d3guU4l+DElI6qc28tkafkjUg+cR\ndYnPJD/ciH8XAcsuFzDaycEzqzs/6lRjUBDCKG3WJbQ0I1nMIK+q3LDVtD79\n6/ZOGHrUGy0FwqUnYhwgk1Wg/eojZKClKhBGwF6Ss2T8DyHxhYJraTNLnqov\n61oLp6cYhzH0C//BLIFhmnbs0lOMlDOugm4uY2XgdUYrNQ6EG8v3XKaLbp8L\nnvSpyi0qgSgoff8ZfwiEGjm7OysYymW+TzN+guEXNSPXWJk/NNlwRyBMDa9v\nkOu6VRBiP9aK3pqswhf6Gu1KFWekBiJVSf9QTefnazDg0kPvvEHgYV0aqi8M\nPthyC9x+0jdhfx2fUg11f5P8wzR+LkoP82A4JB56ag12r6JoHwKwrn7ww/LH\nJtBroMDIHN1z5p+sc3I7l5wDmfF7NfkzjAks1MNG200W7++eaD3Yz9oIxZcb\nQsKwHN9jfR5LOP++dRmppqpcdvJqzNB1aJsmCSFr07YdCRTIj3xcY4y39iTe\np+mNivnKakP4GVyfREPcx3LdiVp/vH/ehY8gywU8PgSFTFAo2tzZ4R1C4jvb\n8Efw\r\n=vFg4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeQncmy6YDdE/L6dwcBZPEpBP49IkGYlIqe46Z+zZFVgIgJ+6komqJSRyYI31XwQXk7B8e87CvzAHdy66II8Zmuec="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-policy-target.20190922003747_1569112742763_0.8501234114303564"},"_hasShrinkwrap":false},"5.0.1-policy-target.20190922005004":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-policy-target.20190922005004","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15","minimatch":"^3.0.4"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f97378e97b4a7c25fa7b4882bc7d737356e67aca","_id":"@atomist/sdm-pack-fingerprint@5.0.1-policy-target.20190922005004","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-KWRXZizugp0i9+mtsqqNSjKxHr/EsNsYoEUMHN/57NVAMHeBRewnrLkmxvh7IFHb1FQv3Yw6H5bZfI5MQeelRA==","shasum":"af853e58da80f7660699827d08d2793cc4b135cb","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-policy-target.20190922005004.tgz","fileCount":179,"unpackedSize":3277045,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdhsWLCRA9TVsSAnZWagAAXzYP/R5gYHXVjCLWzsLPPn4s\nuTUBSMMvRl6RmGZpU3nz3klEt3EWU5gCIW7NlP6u8B635UbhmrYhDUWl1eqg\nie8wP5Dxo4qajMC0jcCp3HgDILFf/UWuQGvI4Q0CTcwn2xipuR4TEF5OZIk3\nttRYvdkF8Sx1h1i/wv9ISMv8FqQMwlPQ7RB2ZK4yKrCCjuJYHm3AMVkhlLiS\nKXvsHPQ47q0ibzdy6xn0MDzdNauG8xxkgJcENVUoGs7H0KMcz0rs+WpTvGCw\n35SmISKoxGodiVJjQGGPsXaViqHcEhH5pplzfaCbZnzPD27jeZc7G5TuL9W2\nGw0kDiHpVVf9GOTbcpaJRpyY/ISYQx78+/2hu/iUEGPj3NAcSYFV2ciNVtq9\n6e5fROpbkwPR5hjnw7eJcfgRACg9sFOUT82xIAeY1f4mlptvquJXapGUgtDh\noZtR3ZzugqmqX4bhjz3qV54af6FdGugIFTMtx8QzL3MmYVv2js56BhZ2Y/4g\nK87whs0Rs1FoRj9WhHc+GxCR12R9nBfMjPaPEzGCv6tUcmgMj6r2VYUczEWU\nbf5AQifKn8j3vf2rpzj1eUspBvUskrBt7dORUZbi3GCZ7zhozezirKeI/KnC\nJ6nFzbOVjj+phDCeNEcR2TGBK8RfNITV3MGKUy8YZMPknVCmCF8YTECf8JkS\ntvqO\r\n=Oi9u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICICS0+8WfomqN5tFDgdI+4Y8FW95N1ezpjLHr6FNFKMAiBny/J1lvZQWm716bDnbmpgUJRCVWoj6cfJ2A5INxXB9w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-policy-target.20190922005004_1569113483087_0.6423814537096533"},"_hasShrinkwrap":false},"5.0.1-policy-target.20190922021710":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-policy-target.20190922021710","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15","minimatch":"^3.0.4"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0cb180b7943cda99d358e8c8ad889e38ea8b040f","_id":"@atomist/sdm-pack-fingerprint@5.0.1-policy-target.20190922021710","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-Y2pu4d6qM6TY9Alr26LX936ChWaZInTpsLH8rkJvW/5KqUImgCR3oa3lcBnPsJCEGO2jNenHO3GzEPyXKcgUGg==","shasum":"5003ea26f75e9e6eebc429c4a0416a1b1201b844","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-policy-target.20190922021710.tgz","fileCount":179,"unpackedSize":3277185,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdhtn1CRA9TVsSAnZWagAA/rQQAIiz/RyQl/2ToT/B0OX/\nanRXGiSqHjOQEcR0pyCY3dDvrRhT6QDkN1ghtoWk6Ah/FgsZ+rj7p+WDt0J5\nYk7rOqno6bk9+CeTD5RqFId5p19IhzMOGlxYwKlTGcOOERyhwqHultDSoDq/\n8fasNxIOkDlh6ie0UJ5af6jwhlPWn23uvPeKIqqaDX294q5YOdPw5IV//ALs\n5pR9CuatVM6bCrKnIq3MZSLfUa9nOtoG+3G/wriXqvBpClfygl9aeETaWLUa\ncI5+/jEJRaGPWBPhUfgwlQZXd1qavYZ2V27JNcQfaZUm7JGklRlT5GaZ4Vbw\nIuiAnA1E05ye16N+tgsDGn5LnuIFifoGhL9J3b0OXuzVd4poJI1hqBdEKiGY\nB2EYJKZC0vFAkhIqBuY8Dz/iLAEnGh3MeTV1xY3HupytqwIVqCBpjjl9ix67\nI35zXF5cnMrjKb+adTDAiKUPEIvraPf/XDjcNoW//K6W0zSdGCeRBe4T5Ncj\nnGJv46/e9inQfrD/K7FOxHrg5ZVa6NnhxuIzqqjVfl5clOzI/FFnmZ3q1WRh\n2EwUIe8kzzVkTRAPlFKfZVEGO9qsy3dEgRi+0o5t1Anw3JzlrQ+3cRTUeY8J\nJ5sqfAK8ldACu8lRjLdZAf3SSj8DvSZxereM91ZHxXRT58WBjznEUJlvzXc7\njhnR\r\n=X5Xq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNkPrRMs5nfC+xoRvEtQHH3s+bdMUgtAGQLikZzoNd0QIgGru7y0AF/WqJo61m/i7WZqz9V+NxQGKh+zUp0SrRhyw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-policy-target.20190922021710_1569118708459_0.3971921757232697"},"_hasShrinkwrap":false},"5.0.1-policy-target.20190924164311":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-policy-target.20190924164311","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15","minimatch":"^3.0.4"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8e67de2bb049a0a7fefba6b0328dda974f7ba068","_id":"@atomist/sdm-pack-fingerprint@5.0.1-policy-target.20190924164311","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-aW81c90FLj91Y/797K+Bi/4p2FmLrwCZuxyc4w6ZiHW0h0EOJ95Ow2fS8xnqamthYEamxlUQhLTPs0gAygSxVA==","shasum":"0dd7320f93fc849c2c38ed14d6a9cbb9f8b97726","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-policy-target.20190924164311.tgz","fileCount":178,"unpackedSize":3252175,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdikf6CRA9TVsSAnZWagAApUkP/ioWjZxSBLw+GmH+jA5o\nEjc6dfxlKgzCwCd7BddJKpBbP9gm383Wb4iIjwU9YSJl0+xtJX/8KTAGEqiq\nfFg2rVppu2Zi/DY7pXk+6h90PZQbGmiO/cCF43rB/7MSy97iZu5L97SsC6zb\nfyK3ccHXzYKUuImM2xCgwIEPA1jt8EyqqGsQr+u1489XOsPDDVR5ayYUHnDh\nyNsGQHci+dmrvuDtdvxoArjnJuzias5EQKPG7tS4Rshj99KTHukLMM2V5o85\nwI9bBwp5FcH9RkcwYdZsyQ1FxexdTK8bhU6ZOgSVyyhrzZoh7uObRV9JOWew\nZp4q3vwM5KfQxwtaxFPPp5Ykjpz51U/uzxhdzxexT+7sqOJ5OOgJKFSdAQTD\nmt/rcoXxLfF6d4dD9vGpOa4SEDnLBRgujqyJ379TsAlXNbDIlH++RhRTuNV1\n3gOKauCu5sgIEhvGt8RGcxJXqtwWlDPlb19BvvppIzWJWtOqJAHmDfBe1swj\n0ZvVu4fKFRU+nfJ0qbAIUELEIhfNCfRljf4e8uHtrxRhX9xlfZvMWwFiSQY6\namkBK48ZxgYW5hYHoQ7kx/Ejp4tCDJ07qIaQHeY6SYkKP9vWqwhNbP/ZtKHk\nC3KP//Q/qVvDfJQRjLOke0upyxFiXiBP9fABs971lZGRklKiNVbOj1tP0vzq\nr4Uf\r\n=TmaL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIErMBvvj1thYbiW3Ojlz6OCg8USbhXwjCl8o901eIpKgAiBI3TwIOF/P096bW8+4MiNJl5W3I6u7xu7Qj0qeYYGzHg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-policy-target.20190924164311_1569343481519_0.6883243244590564"},"_hasShrinkwrap":false},"5.0.1-master.20190926021653":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190926021653","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e8527ea688b84efc67541e56fd3aaca33b770175","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190926021653","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-oUuo8t84cYfSDZf2/qbEBqPN8dAN8jou/dpAztYh+LUA3bjACJyTLv7wbQ89d8cRy5XVMPZRtw1Tr1ZFu7vbLQ==","shasum":"63f71bc51e0cf2e08d36f193da43b95d7e453bdf","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190926021653.tgz","fileCount":119,"unpackedSize":2478050,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdjB/lCRA9TVsSAnZWagAAgsMP/jUMgBX3wAUw9hxnhXSR\nWEIHiFJtJ+f2J/rKF89t1x3soZZ/iLP1YVRdBrm/bnOsdkw2S4NcRCSHNTb4\najtoc32yfOuX1VUSAhdeJdp8t0Qpw1OCgsVyGE16GSC604VFBml7UJxjb89I\nO7KuORU9ZY7VtG5ZTIzXhsLwxyp8OyFnjrJY8MpIVn3PMulC9F/r9zF2JVMY\nwEkfd+jEy05w7YkPBMOaUwKeoq3wTrcRhmit0FuD7szqQf+7YnaKl8vpE05L\nD/ffWEgrJt5EmqvcR5flIhZvwMUkQjavzPDEtJlpNxxB01uRZ2UGWtduPBlF\nRocxvUzFY7k3XxmBDVzu+cbwb3wbXxg4BT9tyqe0PhWg+TjvBL7T54GVHNPT\nZw4hw2KYOWLw86x3B6V7BLlKdf3mnqNl3PrD6LUd2TgdueawuhtSI2/KxcWY\nQkfq3wPYH5iSO7QH2RQg9WQbBhygeoe3R3PxyhznoZd5D7vaANcBUOmPEzgV\nHlp+3bJapUfxoi1MYhdAIM6wpeq359xoeuzHNmn/AOqyHV6LagnSvgvMFHUv\ntDUV3tDVdDyx2GNrgZPcbN5yy8f7GjfVAWfkJiI1ChAE61kweCsemLgn3G5J\nbATDFzWWhYsWus0lOpxl2FIwG/BD8xtt0jV4emjwK5Nn3EnLosRYGy6pTIOB\n/3Rx\r\n=KoNi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDux9vi5RFP2IgD7PhyJM6HYYNilj20rbmVNN4qUBPT6AIgBUBB+siW18M0/GPWjsAxREAa5gM46zFLzimL1Y1AQdc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190926021653_1569464292639_0.6928607876748611"},"_hasShrinkwrap":false},"5.0.1-master.20190929015035":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190929015035","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f061f2cefdb2f73a4c7a92af342880f481a53d62","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190929015035","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-q59JwFCixXmWw1e0sVvrHKp7+V2PUVHqlZu/9sXcGOI14CdFPTfNjxaO5vYcv8nmeD1nbjQ0fobn2Tt9jRsNZw==","shasum":"441bd935c2bca9d6d5860694fc2a8a980cc6e0d1","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190929015035.tgz","fileCount":119,"unpackedSize":2478124,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkA48CRA9TVsSAnZWagAAFBkP/R+tqJtsctiBv62qS8cB\n2e48O+aKiGG8sEZ8Vfg+vV944pEWpJldSrijimZEZeW7ELsFixU+ivPP15KX\nSXFyjNRmAKsyaKJo0NB4KRjZPtvjHLB7yMVeFjW/FWS5T4zVD4ruQKeexOH3\nSUbZYo/dQtuWgq55qMoqkqNVnvppm/FOgOloZIKrc0owbxii/LOIATiyl7Tf\nOr3pPZ3JPBCVGzG1BImirUWRDr6y5wHIsGGZIf0FIq5UXPUZM3Y/vdKkCN2R\nm3YmykyATYi9X2yg7leRHVSdhSAdEJTqHyNe5vqEdoIVeFTkv3x4eoo4T2wR\nzyalSdrLjyR3WibAtTqWXpqpVqn9UlZyBu542McjL5HIWnEQa/SAHzpWL0Bh\nnpMvU4aUfAcU/kHHxB63gaZFlgWy3VGykBaI34fvAnjfQavHGzYxSIC/awcu\noATu8gYDjbx9uqcMjr7op1eR4Qol36VJKUxtgBMKlz0QUu1H2EWym39aZCZt\nzhQfgbdlEg4WS1EhkfL7R+svbbi8O6DhQkOj6/FB2hQu6cjM08a3gDPxSisM\nAi36DR5B3pYgkPgnwsBqri5sliD40BLyB94qtBrS/ZxWYwZGqVzm8gEfd7qn\nvkkMA5ZDxC9kB2gr1x2GDZeG8wEPUeg+5+6iQmpznt1TO8ye93nYB4TVNpQv\nNTmk\r\n=TYfX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB7k+qMMTkyOGGebdZ4v5UCLnVr/CcO+iDGFOaUxnh0iAiEAukiiWyQRmVYYIi4ZmI5fg6MEQjM3OXU2N9GDnj3hNeM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190929015035_1569721915331_0.0661984924658705"},"_hasShrinkwrap":false},"5.0.1-master.20190929225757":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20190929225757","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"55de2ba7c3b5b4cd19ab6d5ae5131a3f7591ae61","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20190929225757","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-pBHg89VTVqiPls48ZXNQvlyHtAYoataks9u4dmoEXM7oIjbMFV/DJKrruS0794gIV+kyXUXGUQBI9UUNHrAzRA==","shasum":"b03295c94e4b98c98657ee45b9bd6f55c7421efd","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20190929225757.tgz","fileCount":119,"unpackedSize":2478322,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkTdFCRA9TVsSAnZWagAAqH4P+wcGHKjHWMYlSMCdSx/w\nEQGdRNd+u0oapcT8sCEdPqSCsJG4MCGXMVo50sFO9IP5uCi+EUHEUPH8wJkL\n6asFFy43ulhNOBspvSZEp4ff7ZG9GNrZc7JO0e31NOeRxC53Cde504JXpmSN\nVigzIt2IPZTdwtqgdycfyvEj08JVcpIbkdiGgOKCVAgNyR86kc9i7Ez0uYU9\nsa67UzAUaPqCoUvQ2i4vxgkWtroq3KNAT8SViB1Q4dQ+7ZMpOXA4XhwzlhlZ\n1HmoiIZdWrqN9UuaYii+6E5OnqrMxc/IPaFtafS1m53GfY8Sqr+b4gYNYxdW\njKuRBq36UZHEVuuPmi4zsByQREuYY4wKN1RjIPR2NT6hwgA1cGeDaTvF7C+h\nCXlxv3hJMtizt1p2i3ThND/DxgB48rJxlV23nz7MR0gBKsF9Igyn3ETpddsY\nJ0WjVI81hqWfUs3hXt2Cxn01osEu3TTBM8LIw/2Wq1z8q8Mj6jpghQMLhROQ\n8/S8ImLrzNZ/wIOFwwN0UJshc29dpDLerrNKwcbPsoCGMPhIYsqkQQDPvUiE\n/+kWu2fKOMNgIHujhFNTegp3jX11Bs0ZmF8rOL85v8JDU0vLHXHXlcZYlgsv\nBI9uzv0ERUKZOC72P87R2D3KKQhBhL2nwPESv+2CIl6wK7Am7KKHoQwfLXd6\npwMf\r\n=apDN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDlY/gt1SI53tC4NPnqM9hOngAklB9COtNu5Ue0zJzknAiEAyMsDpO8be1w0G42ZBFTis+rymDaIgimvDLqbhHs1R7c="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20190929225757_1569797957066_0.4899959470237101"},"_hasShrinkwrap":false},"5.0.1-master.20191001163148":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191001163148","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"866f2a89cf5eaed4b1de2c3bc7e864dc3e0c3c07","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191001163148","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-sp2tKl0DL3FYrUOSXB1L+g5PFUxNXFZV9jlDYfpgU0zbPDuKaK25zcLvFvY73wNqMG/e31SyUrWY8ibOfCrUUQ==","shasum":"9bda35f7ceb6d4076d82bd38fd98e68df78d0e20","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191001163148.tgz","fileCount":119,"unpackedSize":2477878,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdk3/aCRA9TVsSAnZWagAAwnYP/36EnjlF/vg2rzYlVgnv\nz73ITFQfLBTNRBebigG1b+YOzjLQtLug78QiHuKRT9QdPNrvLTGDR9N+ticJ\n5Mjt4b8US9CftjL2+ygcvO2qqT0P0caE8QhuhPs8/p2qouKktWW/gNHKC5pQ\nsG9XCYajFBCgg5xbLXlys5OcNvLz3TvxAQud1+c6U2DFb9WpjaBYSGXIpkvH\n9rNEEnjaAPEJy3ESxu6J8zKZyvjWAzh3DuMTzGJioXiuTaUfnwNkJaZVT9xt\nY+Wrjs2SFtpRtwpuWjtVmPploeuuvKNdqOClty4CR5BIuGPBcpsqGkFTLraC\nRg8zGoAFXRnjY092DmhXmJvia9E6SHUvhdMVvsqXt5si2mLslzj5s+YvOIFi\nbwGSEVn2mnccU86ic5G4cFFGDD/PRfsLwtpEGrdCbIlzF62HVQS3lFFzwnU6\nopS1Tyo309hrqVDu+ZL2R7FczhvXPQBLV5Q8VwDa82xsr0VNCMhDwrCUR4wq\n9wK3Ea9cwCQIh9t/YPJNggWQtLVXXyor1c+3fzln21ILYHhc9z36+cRn6x5D\n+DtP3kaeYbmSsV6d6ZDgdp6pnWz74oh1PGBm9cbdAEpVZ5Cql/wO5kUz3FJm\n4QOdI0eRhlcwdqdMoTztjZekh3krx4dJW9yVAHrUE0cw5oyn297VSGcYO4Wx\ntlmQ\r\n=aWSB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFCq1UBl0xXo58aO4eJZJyRm93sF47bbxge9X5V10iBQIhAPbN9FQuYJc3ghgNGDt0Q/sVfuQTABMXnEqedF8nKDzu"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191001163148_1569947609145_0.4923280829649679"},"_hasShrinkwrap":false},"5.0.1-master.20191001163536":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191001163536","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c6462d5b45528263b60ec8f798deb4567da26d85","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191001163536","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-qWMBJ4Sn9duIHiIZ9DPO0nDK82VxJEsxBbymDYrMRAWDPztc3/gLO6z5nRZfQj1cgRoeY0by3oQugF3bdF8UXg==","shasum":"696c64cbe7fe00605e8dc9c36e7ecbf90385a77e","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191001163536.tgz","fileCount":119,"unpackedSize":2477806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdk4DJCRA9TVsSAnZWagAAPzMP/1T1qe+yZRThB/tA6W0V\n+5N+xmBCUbd2vYGf+YATNPLvE7SJ5lhvck/1cw82cLZVG0msixVqOEp667cR\nJSYhEME0VCAxMar+A1tH4wUjhYt2+gnGhFFMyhx3BwSoLYl+lS9ZQ7eOhJTq\nNi2rcunfJBlfiXYRCR80+2f2xGX3wd9I2FJNR/7PyXY/9zHiPoDkmDm3EmNg\nfCRC5PGZw/Ds9kxME1DMm/iY3kQomp2vdMhM7E6i+GcA9n7JqBKz+FQG3SXC\n5uT6yz+b6i8qcITKD3YJDdZi8rmVDg534YaWRf54gFiqLw6T4ermqUjDKnHO\neHZqB9eQtl7ZurXAHGVyJwf1bgqYKjAL0g9/mPc6WzDEErVXr5E4tCml3nfE\nIIs7TyslPjMhQOGCPO/bEWXOC4ANvQ78hCVaXFVtwydzD8k+ty0h3nLjYQW9\ngcUFnv0RGhXN4pcZe93MXN/11iQ5AJjGswJfmouLRPuTNEXIEHyHdEQV/Wy/\neNnJNwAV5WzEMHqKUcXi44xwpIogpIaG55++4KarzlFRcTP8tPLRUAF0//9V\nuS/4ToL/J/HxdCh1mUCcU3zOMsR6gAQVcVjAGNz2GGPqOWoGO98XIaxURWP2\n1ReDQClUqYwCe0EA8t0vvA6xAsvMVgvxAF7vEtG5DIbF9YlV11uP9DkfdlhB\nAtqj\r\n=Uz2p\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDJy/8VBxYjFa1v0tSRFNt2i+rQkcnWN1a3kv74TeFq1AiEApXbLn5clfDWXwXPvcvf9TE75PPbLomDBVQrU3WmOE0E="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191001163536_1569947848725_0.3125056127152075"},"_hasShrinkwrap":false},"5.0.1-master.20191001165520":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191001165520","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"14737b5edb578c91e7cbd608641c39b8f4af1144","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191001165520","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-f68bGzqe8naRV7yS2GiVIclBrCXbADCHwFIrMHNT75Vp+FofGQvQhqPtUO6ppP7M17b1YzVbwmtooeR+SUsc0A==","shasum":"c686b6c24d374c6bc994326e2aa6e9b08ad37dd3","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191001165520.tgz","fileCount":119,"unpackedSize":2477791,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdk4VVCRA9TVsSAnZWagAAM9IP/AvvhxZUv9GKYzfkxPIl\nOvTIZAJ42N7f+L7zdLBvb8BJbuS3UmXg7X/u5/vGUeGtqOFQgNmeav/ORBjI\noimnsHJ1SOwpbo3PFx0KJ9m8+aeVG10w2ah605KuaJhcGqzM3AodnBHoT0Jk\nc1dsMzkUEluBmrE2h8TyoCZX5JLDvK0a0DSOX+ESJmO3fWRQQOaEplRKGdGV\nfemt/tmnDhFnIYjCpanyGJEQHKN+BwFJttKJ0a4b4J3ZB+fpk27/rLbW7FsM\nVELDA8CJZ2kt5Ls+r2TL6KKH5hu9H2E/OEGrKt5e2ze14BvNL9HxZm/dBfo0\naI5L5OWwbAyhtgjFa1jig9g0TuiDLhbFKWiJ+g9zz8/oh2Vyig+0NBhEf33G\nC7wQmcFMhakkAfXRi8o+watH2ucAhPx1GgVbDj7BtUKByVFS//chIkItgZRt\nOJCGm0PrUfEy9uM1Lvf95v84QcWsOU+CtqfBF6wzTUCdzBcrcbDNVFMlCiSl\nOSXw0yFCpXfC9QgpvedYq6kvH9mkN4h4w9H5CyuGhB28KM28SnzERChOg9BB\nEw7Wk3ZuT4AjsiDOtkP1bfnvmgULwiaytww+9UOO/iaIrRMd4V4jFgCiEt0o\nIUsvwqNFnUAeJcFAY+If01zyqxmJhELP8c68iTbVMpbYBrQt2+CiiZb9jdhd\numO/\r\n=BWAg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDY6nByXQz+c4g9n9bih1q8Co9PyowkaHXlIwu4d20yhwIgdgc3D4eJ78q8wpKQdELcJwdMfkbwKNfRC1nK5olo7SM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191001165520_1569949012435_0.6619957893349886"},"_hasShrinkwrap":false},"5.0.1-master.20191002000453":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191002000453","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"496541398e2a59a742dd3a7bfc6896aed58a2bcb","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191002000453","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-I3kIYqPuXYoXSU9F/ejAiobDSHNbmjAGdHjFU8qGZ5QqGLn5HBGMpxAii78o6mTsaWGg/bqYg9U0ae4GAVeudw==","shasum":"a16123df89470c7c1b4957a4ed97de7ad8591d21","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191002000453.tgz","fileCount":122,"unpackedSize":2478689,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdk+pSCRA9TVsSAnZWagAAAK0QAJ/rulFkAUcy2IbtZJC9\nWV46kSKDt0Oy6e1uX2LFMOG/MjyFCqz9s8uHsZ9Ii57zQwfXpr3Fjzm07mz1\nX2tMZ0fyp59zdqzNbR+yELi0nOgR3AJfcx9sK4UjaS3paB/EiWdc/1wGPwh+\nIeWkr3NJd89pt1C/9MCGn4D7TC5cTFWb24doSbqvqmw2RSxAWhC8Rl6zN2HW\npjUpWQmwsFNWpNXb+F+CK1PnqbSjRIiMuHmZlqdehtIMvREXt/IZj9qpzopl\nt5uMvDU1HHISyDeGMkvGXRL5lY+jidJ9dDkubRJBpzULZgMDCqRvzKVkeHkH\nbxoNdamvAzADPJBbY3LJnmmcKvS2WzdXAZ0iYFxK+faS4JyT2PwKytfFw3h0\n8lpvvWEoXNCG1tVV2s4lU92bVpyf5WhojAaUvw+l1++s+PkpWABkrSVFIygr\nKxcdTy7p1DB18H7fhacp1984OKGTia04iFOL2pGYw6PIUExNAsui5pVCKrcg\nAxseiH1G7Qg+OqA4OxN51sw2fU8U+YY9Z06tWebAVwjW0WgqKg7XdIu+D0+6\n26MehJXqm3K/lMvmdVTVOZdT6IWoV/gkh6pRvPUNThX7CJ0Of2I0M2tZUfqo\nCHUsBTOtAUz5BM9ZAo4gEimqlyY6qIBbdYc31GCwif/wCfJOswG69lI5xv9X\nQnwV\r\n=m4rx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDir+iWHv2z/SPFX9uqvOGaY0q9FnD64Erp8uqtUoN5BAiAcHrhn5KNHj6v4U8SOSJQJYdBPJ4abfARfpQs8hjcyMA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191002000453_1569974865709_0.47840728128638355"},"_hasShrinkwrap":false},"5.0.1-master.20191002100330":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191002100330","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f58c3092a8a27bb52e5d14ac002a23d44c70d87c","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191002100330","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-cqOvm0DYtSxAPhBi7wjLXhfjZBdD1M9zujDVnkqBIUcaJullvrCFXoV2T6XZNEb2arAKgk/J5Hr8PDw0INfK5w==","shasum":"daf313ffe283eaa2f9cd9d83d0c3e2c717b502fa","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191002100330.tgz","fileCount":122,"unpackedSize":2699717,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlHZhCRA9TVsSAnZWagAAqbwP/RUzorwtJqvg+8Do0kOG\nEIpkkGvHGjHtJlefPTqFYiTAGg07b8CTi9GJHsEYLEoHLBcwWlqpT6gEWcGU\nf3FSaF8RyKUXiGzP/Ihy0ORqM4QtouQ92hj7NZ+nbxOC+yBID8aQf3I/4CjE\nAfY12dovsz23bvGgtld3gJZBCTwDrY4WDdtTtJyMuim/q/By9IkSlp2XVR1h\nowakaS/XauzeFBig7tQ4uJhNlEWciFhwiFgFCw/7PsMoHuPC7GPJWzBXr8j2\nJFmljFX3pT+aEiVG3WaHa+TTNs9x9m9Gjh1s2lB5BiaJdEHG6XDivIlF/RsK\nelYXxJfvtwddt52A0x1GAUj7wvOFNUwleGFvaE3X59U/Sev7jE+6fpS/6OvT\nWjmjffUNwfeE9KgnLWjd9EhwqdkTXUH8x63jVKrVqdZp6SFw0WOepDDjEZUF\nhwxE74WY52bMMJ4QRIeBSZOz7Kz26VqzQdWxBfHmQZqpxZjCtpjA28010ddV\n6chaHyR/rim2qYXyHm00pm/6AIabjfuZmAUbgEM3zWrfSRJb7wqjoYhRWl1X\nSBMeZvGovnykUoO2K+3gye6ZlsMjBsQNdxBuWmCJ9sh6k64VDga1l/BktD+b\nP7/MAr5V/sJgrDlDIEhs6ABaeVrDVsvfhIQLhGXPplINBdbgTk3/uxXmDtkV\nnMeG\r\n=m/it\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDweLoA5nQbYoHjoT3llA54BqH1yoDjea47aTn18Z++iAiEA89OOnKGyqIw1DPKGhrFiAqjDGBRa59QnrW1G59UwbPM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191002100330_1570010720391_0.483428742841316"},"_hasShrinkwrap":false},"5.0.1-master.20191002105041":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191002105041","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"144962ccdf4fe3261dc574bf7f2fb7a63fb321b3","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191002105041","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-9eHegNF0ARPdtSu1gIqZ3GPyXktcX7i9Kpx2SRH7w/P3ACOILDdG43EgHtmOLod7kbZm5b/IlHPGLvo+7RmA5A==","shasum":"db71a45fe38db00c29d407563f68cccf5aeef8e1","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191002105041.tgz","fileCount":122,"unpackedSize":2699801,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlIFtCRA9TVsSAnZWagAAvXQP/j6wY5ReUuVdQNicJMM9\nR5CACQbyAZ1V45U0DQ75v23TQbWxml9F1Y0FTwY7Q7G2EUHaSt8yDD9HdDxc\ni3yZg+scK6x+4m33qZqTIuK2WvCiwi3Q3VDhl338W1K4xNgIwDnuflYPtnKN\nXqLOCZbUm6RVzklQogbz4yCt4UMTxVULvyx1bQxWFPu1WqKI3W0anuJq8Joo\nuCs6JAk4STmNTNeqtQ6gjbpfOagpoLF6JTCzz4qqTB5HPZLYQcnUX+yGPyvX\nnGrJaIGq51Go32F0Fb/cqXa34mb6SG9XpB9o3p+5+9QPaXiJ3ouVgGwKrfqc\nM/AIxz3ZoCHshiCvGG5LApsYhUzgtV2DDF553hw1WQ3RoLC2e1i+sr2NvYmG\nD/x63v5I3sgCahBJcCaVuQnSeO3kB90AUcKdiaJ23bcik9sh6Tes3747+oRO\njRHGwoIp6Nb21M57uci+7nz8CwrDRzTqmynJUJnfhnq85V36QceY85hGaA3G\nI0kdoxtX7g+aXge+Kg+80HM41cSfjDjd8XgcHnjpx6gyGLqJ3U8yvpDz+uxQ\nsbnQweqrOwwM/w89Ycyp80APajfW6+GwLev2strcHqJKflGUJnvqdLqVWmOY\nrblLXEpd1AfHrE45J6HgvBh+LJT3QLyCsfgC/TdrXLxON9BWDtHX/bGnJPR+\n/ZX2\r\n=wh7r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGjKzFADNabNkw0wTVZ/zbxB2WCPLC8JkXBJmo8ox234AiAUU8gIDXlOUGTHzuyDrbOulFtHSgcPyEJ6x+gzAUygqQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191002105041_1570013548816_0.5664916413086036"},"_hasShrinkwrap":false},"5.0.1-master.20191002161339":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191002161339","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"48a6600ae273d8b64fcec25ace4c81761d50ca35","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191002161339","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-czzZKV0cZ8ZM8D9UQnOm4mDZ5YbKBTu1lVONhyTb+I1e4Tc9iGRQveyIT+6FSZciMoo2teIFz1nZX2Razz92vA==","shasum":"3407aad2cce167df51d3df7043f1b92e8274aa8c","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191002161339.tgz","fileCount":190,"unpackedSize":3571628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlM0RCRA9TVsSAnZWagAAH9AQAJXJke5jUeYnmnKap2Qx\nG5brezKaTjWQsg5dpgnSRtfX0g3R1JsJC1U/xkans7O5BMjX7R5Jn/mQ8R2s\nZRVILGx32bVy5YQ4xh1pxaGPzDvn7vEEqX6tVKuuSAGMjCg136GubY5ZSmPr\n8BNhd6lQjGk+wAKvkNGju4HAO73wfvjfrW5zjXXibWkDU71oF1PVqparfFxm\nmAGIQUrZcmAqZDzAHnRhZVEVrf15S5Bv9jS8PnvAEPHKoehP350VKjJrxzIv\nuSptm7b4z5E62s2uL0IVDkjGFqIqB8A5au/al1fYA6jc+BVVc69k7Mhh74Xf\n87amO7opn65qZ5L5DOCEWrhud1YdcFZ4+x7cNCDW4Acu7aeBI31Rxm1rcWcg\nyJoabbMpeHpkXW3gj3OSaoRPCJaI0Y9WovH+GQo1H3c9wJMK42REMclVxkk9\nPpk0FmCthweln6tfYojK9z9dRfgzkRUiNJ74cZB5sXMPRfXZOxyi4KStL5TC\n4BzqJP1WJ9LJtWVZ+8Fp59b28ZBeZT8yQi83WXgPZxe6n9LC0xlw/tVEwcbv\nsLUujQc9dBpzAfMG9FkQ1wDHA129U7Z5X4pwB/qvQcDrlaEz5f1l81Hu1Lhj\nwKYS73SXX39EjwWLHML4Xkxw479TeJS/hX0clZ/7tqqWZWMELWWWRtLCXiKg\nPQj7\r\n=vF9i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBq6rMQGF4bsJ/JVwL8WTbESRBLrhxqVNTIR1h4gp26JAiAaNOEaCZtsR0d+yCRm1TNf8wWmCuwE4rsrNR/RSZ8Abw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191002161339_1570032913046_0.8480516451318854"},"_hasShrinkwrap":false},"5.0.1-master.20191003022719":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191003022719","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"74e1da60caf1a4c1dfc26ceb0e06ee415626739d","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191003022719","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-xaiiTR9+4M0pKQbjgc5FeLQSS8YBjYZBXe0CPVt5WatGvLOJcBK5mIY7sq/lT3WAlDiYAPmDSXu5H7ITLlzcDA==","shasum":"693758e7be4ea85e939159abc9188e98ec38fafa","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191003022719.tgz","fileCount":190,"unpackedSize":3576670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlVziCRA9TVsSAnZWagAAiUUP/0HNyYRH/jyCvDLP31P1\nlb0YHeSTc8v5fVwOWB42lxdcd+/JFm/PFc/UnZpI/1bTvPgNE2OdFhL43Puy\nQ1BQJ0Jx+bKIhVwhXZBh1wa0sHcoOLxzJBvl7EqK1wEZbl6HKWz9c8lc1gw3\n4jJ0XlhP31lz36efBhoPjeOpRP0gtcXwxnkQqJ5fQHqDrUM8et5RyFL1DsiG\nZwtR1WmmbNQoNylTi/HvUxKT1Lqrdc/47BSB88pnPA2ojiITeUCPZy0soXcf\nRPX9+AvkyA6lIcTwcT/uycMGaPpPEsmyzN8Le/MjnsUJGPrOAusU4h2/j5F7\nQVb0fbci/Ga/s+MNXJIjoECyh++lgK5ok/r3u4DMlMXHUfDRzPXe4EKLGU50\n7omQV8eINxrYxbtbhJmYeaBYFjaK2YqsUU/7Jz2xq2UxF4X2uTgJrKA7O+7e\nJfFzV9AuTilzp9KXuB+cKTw+lFh+3lOV/070zw6r0g/z1n9bC06CtDbD9gPd\nEbAPWgrGc09xaa+jLl8bOtCbO5fTiSBA6C3pUUzTk04L5OkA1COQ9lOjaGos\nSl8zT1J+ACgp71YmOGi9cQL0sTmdKCKEJkChUbJStg4Nz0EjwzdFXv+ZytYC\nCPqbkbtJu/HydddlMdBE1xFzRGOMVVh3PCK0+RLX0Mm4Ao9+xvADEClsr7oo\ndgMw\r\n=0w8S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZpZxdOOhq4G4plQB5ctR2gbG3dcJJ3W7x+/WwD1XcYgIhAO9RjvxMkHj0Hu5e/1o4J6kwVmVCOwmUuQb3o8nbYXrs"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191003022719_1570069730013_0.541313889557161"},"_hasShrinkwrap":false},"5.0.1-master.20191003024407":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191003024407","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"83e536c8d17107037a114ca3aadfb445a398e860","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191003024407","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-ueX+j3kjr+cS4mW97EHhXsQ0RtRJwE+AiOkZDnl3mBThgfQIoaz44lLintZhdv7+pWCp2rKBEfTdAYY3rXpk3g==","shasum":"efc7c1a37a5012ff6b579d1120fd64cfeca43ebc","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191003024407.tgz","fileCount":190,"unpackedSize":3578869,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlWDICRA9TVsSAnZWagAAIk8QAJoFONLb0b1R9jsAr4iZ\nqmyKGwYCHATs+unuBLzk8Shxyx8hdGve3SR/eD0pub8wo8X4wHdNFt5WILxg\nczI3k2ml0ZkcGMbQPGjaaEGikSjHWIZInNnDTz3rmuvmW1AlObNV2o99/Y/e\nlP32OitHHh7sqE+cvud+Uuh13QOY2L8Pclh+hpDGGjqqQSVTSFYk+T3f4fcf\nZs9L3yhgz8lOr+JcJEJ8nKz/zSZJWsZMzeRPIQQEIj4TWH+QZVxFL/GOssRY\nGLthehFbCD9w7WCyCkmr77Wcx1ePOk7s9XEwpo94XAgDpiOQ0rffiVULHX9S\nfqeVxNLBcAZjrVNPXtHnF+F/FW6/+Dh0/7S0PyXI/3WuPa/QvMrU2rY17oZp\nZyXWrKEceuN8BNT/Ti4oNe8qBrt8AckUenFXvBlfS8EPipqhHb/3Gt07NjFe\nonRNsjWSuGqgbtVRXod07s1YrvznmELS3kqnJkZClUTqs86r/Qw8LzX2kEB0\ncOqdZpZdz/lgTs13/8ubKImvl3bv/FiWOdwU9rT+vwecrjplXF2YEiclspJ7\nQP5euVAHFSgN/woM2zNgQRi5xDgMBSzh3sMLSQXAoAyQMfZKZ+LbfL9I8X2Q\nujOpEl/5WX61YFmYU54EuMyg66RDJTrhiDXPVcZVppuDFCFr6Qw+EU6mZWiK\n1dDN\r\n=vDBJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGXmHvKZerg0yQXpkwPESxGOW3DdaOlH7ZdnmYgX8bVuAiBIONwyeJ4QjNvfP7d/YlxLq2Kh/OvH/JHAlvhIMY3qOg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191003024407_1570070727311_0.025331486670174375"},"_hasShrinkwrap":false},"5.0.1-master.20191003102343":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191003102343","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cb646187ab42fc42db571c5cbd9cfc55dc9c729e","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191003102343","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-izE52sKXZ/LHgQzVwKqjT6gRaztFk9kajVoDICfKgVRCUIZnFCNxGT+jN+RXpikztmWcV35auqqNGbexMN7AnQ==","shasum":"1e352d8cdad4e4fb0970884d08fd84ac26a81e99","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191003102343.tgz","fileCount":190,"unpackedSize":3579449,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlcyJCRA9TVsSAnZWagAATToP/jZ0opBLH/fPqaymEJWi\njeFAGi7rx5RDv/JmtTpLmGUrk+PI9JTZsYIjmPldjZUmLHY+wL/0qEYsU0Kc\n1+G5ziQz4xl0XQXRSlqWHUg5s+1am8kmeWDGtuebeyYTzw0bAk1KB85apJIh\nKICvbuCyNyCuu2UXHRiXNe9ir+w6rcAs8ba7+ivJF59k92OAt2iVRHBnViAe\nwh908b+LjBr2gJb4Q6tb5ztY9ck//WbQz0hbaIWG2Au47x7SIIO4Xq3I9iva\nOn1YTy5x9b889RnfgYUUdpCBophaEDmxAxBD7iauyc9rU+hPKB6meEaJhMst\nZU8F+HzRf6NBbAQWmvkOHk7YVg0yxNbFWs/G08XhAcrUnBP77ozMVvte9s3N\ncunwh+65+OnewBgN5foo9Y7PuEWjuih7VtPavD3KU6RGyjakxKeI+4SZSSpq\n6qs6BLcvxAVRg+QiD+bHjbFIJ0SI4bEB39IEe3cVepg2TBNgh82YyZcOPRg3\n2X88K9nnERQqV/r082vFSZ71pqEtuTcASj/rGqhxaQuYzRel/DVZM2/2BzUk\nKUnEJSuFUci11oiPU4Dxao6eBJrOwVWck5kpgakEhOF0JK4OeTiU5iqW7gb7\ndFty3YRRlPVTsDpjAQNHeqemXmY04g7A5I1gAtxseufqlCJymm2JCr+Sgh71\nPFpY\r\n=3ElY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHaLoVBSsy0foyMxmLChMsck8QGppvz0M6cKZ3sSyaJsAiB+kEocqijJy+o22eZ74hbC6TWeav6rJaUsTUC86fC20w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191003102343_1570098312601_0.6129920066151107"},"_hasShrinkwrap":false},"5.0.1-master.20191003103359":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191003103359","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fbcbfe36e80951a6f050c883596e69846e5813a5","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191003103359","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-PGAZdpf0O8eayD1TjCk5S4Vznv5dIydoiJc9u9Vda08+r9Y56Eq0Q0gp/84OuFqx40jYvsm2ozZq1ntHUJjV6w==","shasum":"4cb91add0e395f5ba83c41c80b0233d425b9e46c","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191003103359.tgz","fileCount":190,"unpackedSize":3579601,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlc8NCRA9TVsSAnZWagAA1ZcP/R+XuKprJyflkqfsjo4z\nlai5Qki8RrlWYidavKPoECwcWEd5gZ6qTpBBjmyXoXXUV3D04gWnIlJxrsuR\nm2JaVB68F92QwsIOEW75J3IBtfnO5mxhCTrvoQRZMzU8GsRhJz/gwQtuFeHK\nQeKRS8GCFQEI/tzEkjdsNwQg8SNyxIwOwriqvB/OIlALwVol4OxekFcBcyU9\nAwWH7AkE/JWVPkbmSuCXvUGAjFMDua3VWUQE13TCbdx68ENZCO+pR21ZdQKw\nXdniizIaNDi9qCcYQrvGjWT39aMgz/K8ZoLUUEe2zizff+i2ORiTpqFgrq+U\ngheVCj4lbbCK0YGRqHtHdw6t3nz4+EYvMly3uXZk/R0YLBsL1H8aGXe9t9hI\nxgMXQSt9yxsPNoMO5+bLJwk4PyzpZKk28PaZyzSZyh7ECBS1BYUI2ebyKuey\n8e6p6Nhs8ymymfjmit9SOCFAwSUVy+I1rlJJ+6tRjd3uiaMhcQn4oibOCsYn\nhMLQYYM8g4o5ykDwPwFPuwpQMqYcMo01JHXJdl/iIhItKqLqCupPfZVFS/dd\nAf5klTy7JF7xq2nyaB8cS3qa0KCKguTF/OZfrvO1u8QEZgSTcjj0M+DnLwfw\n7nGR5pOFrYUDvtf5NLFKCabbmEJ3jWpcnqMH1To1HlPhrcC/HAmTvApThAaX\n58It\r\n=IIix\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1PtacMf11kkZ+as2+tT84Qy8Rel9A/omENK9Dr4jEJAIhAKm++R6i1+An2vNVUATxXzIq/6a4UrPEICVcBBkbFrcN"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191003103359_1570098957188_0.18985680291567286"},"_hasShrinkwrap":false},"5.0.1-master.20191006120505":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20191006120505","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d9b64abf7e9fa9da30d0db970083bb20db260b09","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20191006120505","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-cxuOWJONt4JtvoFxXxjTpkIpGWmcQ0GDPDlvfxRnhRc8Eo/jdeDNNBpwIKpfg/aGwDcBpmroo5nXJVfoYEr0mA==","shasum":"8e464c6f5fa22926e293461829c1edb852abebfb","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20191006120505.tgz","fileCount":190,"unpackedSize":3580851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdmdi3CRA9TVsSAnZWagAAvfEP/1SrGvjl/4je91KfMB7+\ni8gPTTfB4twsxDRju4l4ZcTrMzpjXhbPO3r1QllD2XAQgtDgKzRXAA570J9Y\nD/FO8L46sdSknAlCHoZcsOJqFATD8WoiDQwdQzEbSBjJ56lpyi4+SPEIEEac\ntm5LnnIertVlcQxBasvPNT318NVD0FupCxlxb6X7PHywvjZT9r/jQo1Gr31z\nc5Rynj1SsppGxYUOjthNsW+xVtB//f0fR31d4lMiZWGLP29Ya9P+GlDKHNtt\nQFfRMt+iH1oesCGwXOQUDOm8KOIkj0yT020XPGiRbMLlrpRmap1BUg4CQbxE\nVyLLPLbzHnrwb5uonRZtu1kqW2e5Rt9l/IfUsUWvpNFLjnMujpQYzygIWrUt\n2sys7gJvjdr/d1wsmznpqmowb0sds5Yn3j+vTfBNkLiGGJAq0i+/MuklbKUg\nlpA8Hkm/oJS/ulWhGR1Ql5XPGb+DhMw+ETna9+qvbnpVUnn+Dw5buKafI3l8\nB1tI/wjUbdXV2MbKYhwDsLZ7+yivTPG6LD8SbHulEkV/pV4hBzdO7JT08Ww7\ngGMiU7d7KP0N0dBks3XJSyg6Ib7gv2wnFseZrTWexZY7oq4SgrloCuVdo0SR\ntp2wFnUKNXhtMhcYJTYORgcdGX27/RpNU8KNHmgyiS4fDxfQXWwp7HJH3AW7\nGboh\r\n=BjkW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQnJ2Dasqk08ghRDDzi4xNJKCI2IUtFZr/XSMHvE5xvwIgfHKZTA9OTopN1GU13O0L6ONH3lcNL8YJuiwFABHVQI4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20191006120505_1570363574813_0.8560480117454301"},"_hasShrinkwrap":false},"5.0.1-ipcrm-npm-coords.20200206162818":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-ipcrm-npm-coords.20200206162818","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c8e8cdcdeb7e8cda12f59f4e4c4751b4c53ca658","_id":"@atomist/sdm-pack-fingerprint@5.0.1-ipcrm-npm-coords.20200206162818","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-/aPUbhOw9bbXrD2FtxJw2fjimMGWft0GOSG5JW1Jad4mnE4Hf/19KOLdQvJ+SorUSGi6eN0jUKEbpwj3DB21Hw==","shasum":"877e3aa51d6f8491aa04bcb00b17c8717a058eae","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-ipcrm-npm-coords.20200206162818.tgz","fileCount":190,"unpackedSize":3580881,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJePD7nCRA9TVsSAnZWagAAZ1kP/j4D/YXPTT9gAZuIHsAz\n6PDQ1OEz6u6tgr+DO5xkoSs1dk08VE5hU3HkpFvsnkXswAzSsJj2NQmGUbmM\nzECKYHiR8YaCctoJKw/opvUJIufjvqfcB0ThT5E/9H+mWnHVtlskc6Qp4P07\nMPWePL/go0XOm6gzrNlNa5cNPGVWATdvv2Ow/5A6Y/So1X7vJ543ex7GUPL5\nxeRAzdxy2VeU2oRyj9ZLhSwWH4Ir+28TVbvqpAw48YrA9yEjECoe8TP3AvLN\ndszDrAo+C8bcvSAzrljrw28PEX1wK0YWNkusAnYSHZz5/9KhPoMKWqUXIXIz\nuxuq7a1o/PXcJLbka6zb43V5Sp7AUdW03YRKVQXnzOZy/SOgR07KNBBhRbdP\nNhuHNu9xQQzgbu+dZDFx6tR4/krTH4LTA/r7Vk+DqZV96AhAOTRYWJLabHVY\nqFu4g2URgPUMVqijTECznRm87GW5NXXUdJJJ21NlsTvwAtqciepS6FyA40+y\n/u7pXQyh2LjLUun39e16UDAioDiTj8aRQ5musvV+5Dyw0UIqJL5zKdk1In2v\nn1ZmXqpTE3rxjGsyNPzPY2tocla0f+64QpivAv7/ibZhEMhC11SC1izQbiqC\nDhi1FCZJffxNkgkxmqgYVnnicmw9LLAUAaFeEBu2xnRJbXKUJXaNqcShDd3p\nhPKC\r\n=nsG5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFVxUZt2tU6s/arDGHQKEl4mEqbEPldjTYdW7nSdTtkAIhANKBfzh4mypINkJj7honXPXGRwAqFJUdiUGMlkcKakrh"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-ipcrm-npm-coords.20200206162818_1581006566554_0.730778151279188"},"_hasShrinkwrap":false},"5.0.1-master.20200408160357":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20200408160357","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#support`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8c92587a44b9f1d6cdf9ce91a5cb16c19f821ff3","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20200408160357","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-ITtL0JvwuWlVDzYC/n69V75+khXohYcigu1YgDSYQAYcFd6ET2xDIAMrJ9UJwEiUYzbWQ6EGzI+ZJ0X3caJjkQ==","shasum":"bfc8d05a41883f048480e68948db78cc534c237b","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20200408160357.tgz","fileCount":190,"unpackedSize":3580871,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejfY4CRA9TVsSAnZWagAAGlMP/i4SeMvKMEYx8BfidOCT\nHnouAjqfEo3t5s3jJ576GhkfqZ0RszyPZq+VW8iuCkAQROxaZcgWmz1PQ+Md\nZaCgu/bOuHjlpAceuvyI0a1r4Bphfg2y6VJIJBcjPptKCkhTOwKzYQtkfISU\nwEsKJtxBgvkybTz1JAom8qeJ4qJGKJeFM6j3BQW0AFEQ1kC45Gc1blyeOJrk\nBJ9wAHgzF6Fk7/8TTb2sJRZhcAal1dQjNtapWqqCyVI+tgjrpahvUAee6KG8\nFkVXY/lciRHPRKigxHlMqihvRYUymLz50HOXjGNYlnU90YcMPS3W6mPt9gmi\nD4k8k0WMsWjs5KxCVmzUb/rSMpBeKR0JDcM7+fqTM076MVG9Lo3jTeBmTnU3\nbfpb3gRcebHtVsGZVfr4dmlcXbElBpwRkFBCMjQyjgeNAWW94Kw/BojJDXSF\na1KpQufAUdXO7nPHu9iI01l0bk2l1td1BYOJZTl07A/i4r9dARY3PZK9Rdbj\nOxEMr1TSC50x8uRPKyW/UmFJJOv0pftS80ERRisn2cKyslH4D5OQCt4VFrWI\n56+WvD7hVPUgxEjPMioUxOkvXgDIXmIgu3qnySYvZLuR/XdQ+cuHI8fbobxh\nKU5zzVBxGB8znvVlcFT5vZwgsdLzNOWx80pnQ2cB7qNL6pLwowbLWKqxklmq\nwsAw\r\n=6dmN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGBAwXEGC0W5c69XMxihdj0VNK8sc4MtZT9gXxi8Ol9gIhAP1JsoJJSEYkE11T92Ff6XMhvHU71Yz7KfK0wBAGdnXR"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20200408160357_1586361911364_0.8911093147283702"},"_hasShrinkwrap":false},"5.0.1-master.20210108050139":{"name":"@atomist/sdm-pack-fingerprint","version":"5.0.1-master.20210108050139","description":"an Atomist SDM Extension Pack for fingerprinting code","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"keywords":["atomist","automation","sdm","fingerprint"],"homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"dependencies":{"@atomist/clj-editors":"0.8.2","@atomist/slack-messages":"^1.1.1","@cljs-oss/module-deps":"^1.1.1","lodash":"^4.17.15"},"peerDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0"},"devDependencies":{"@atomist/automation-client":"^1.7.0","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@types/lodash":"^4.14.138","@types/mocha":"^5.2.7","@types/node":"^12.7.4","@types/power-assert":"^1.5.0","@types/tmp":"^0.1.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","prettier":"^1.18.2","rimraf":"^3.0.0","supervisor":"^0.12.0","tmp-promise":"^2.0.2","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all gql:gen compile:ts test lint doc","clean":"npm-run-all clean:compile clean:doc clean:run","compile":"npm-run-all gql:gen compile:ts","clean:compile":"rimraf git-info.json build \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"npm-run-all clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","compile:ts":"tsc --project .","fmt":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","doc":"typedoc --mode modules --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","lint":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" --exclude \"**/*.d.ts\" \"**/*.ts\"","lint:fix":"npm run lint -- --fix","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":"9.x.x","npm":"5.x.x"},"readme":"# @atomist/sdm-pack-fingerprints\n\n[![atomist sdm goals](http://badge.atomist.com/T29E48P34/atomist/sdm-pack-fingerprints/04e080df-3333-4783-82d3-a4c76637827b)](https://app.atomist.com/workspace/T29E48P34)\n[![npm version](https://img.shields.io/npm/v/@atomist/sdm-pack-fingerprints.svg)](https://www.npmjs.com/package/@atomist/sdm-pack-fingerprints)\n\n[Atomist][atomist] software delivery machine (SDM) extension pack\nproviding fingerprinting support.\n\nSee the [Atomist documentation][atomist-doc] for more information on\nwhat SDMs are and what they can do for you using the Atomist API for\nsoftware.\n\n[atomist-doc]: https://docs.atomist.com/ (Atomist Documentation)\n\n## Features\n\nThis pack sets a goal to monitor all git pushes and trackes the following aspects:\n\n* leiningen `project.clj` files are monitored for updates to library dependencies and project version.\n* maven `pom.xml` files are monitored for updates to maven library dependencies and version coordinates.\n* npm `package.json` files are monitored for updates to module dependencies and package version changes.\n\nThis monitoring happens computing a set of fingerprints on every commit.  The fingerprints that are computed\ndepend on the type of project.  We currently compute fingerprints for maven, clojure, and npm projects.\n\n* npm-project-deps, clojure-project-deps, and maven-project-deps\n* npm-project-coordinates, clojure-project-coordinates, maven-project-coordinates\n\nWhen a new fingerprint is computed, we can drive interesting behaviors such as:\n\n* check whether a library is up to date with a set of team-wide goals and offer to push a PR if not\n* check whether a new version of a library is available and check whether consumers need to update to this new version\n\n## Usage\n\nMake the following updates to your machine:\n\n1. Add the imports and create a Goal to represent dependency fingerprinting\n\n```\nimport { fingerprintSupport } from \"@atomist/sdm-pack-fingerprints\";\nimport { Fingerprint } from \"@atomist/sdm\";\n\n// create a goal to fingerprint all new Pushes\nexport FingerprintGoal = new Fingerprint();\n```\n\n2. Enable the `FingerprintGoal` for some push rules.  Normally, this is done as part of creating your machine:\n\n```ts\n    // there will usually be more than one Push rule here\n    const sdm = createSoftwareDeliveryMachine({\n            ...config\n        },\n        whenPushSatisfies(IsLein)\n            .itMeans(\"fingerprint a clojure project\")\n            .setGoals(FingerprintGoal));\n\n```\n\n3.  Add the pack to your new `sdm` definition:\n\nThere'll be some new imports:\n\n```ts\nimport {\n    fingerprintSupport,\n    forFingerprints,\n    renderDiffSnippet,\n    depsFingerprints,\n    logbackFingerprints,\n    renderData,\n    applyFingerprint,\n    FP,\n} from \"@atomist/sdm-pack-fingerprints\";\n\n```\n\nand then you'll have to add the extension pack to your machine definition:\n\n```ts\n    // add this pack to your SDM\n    sdm.addExtensionPacks(\n        fingerprintSupport(\n            FingerprintGoal,\n            async (p: GitProject) => {\n                // COMPUTE fingerprints: called on every Push\n                return depsFingerprints(p.baseDir);\n            },\n            async (p: GitProject, fp: FP) => {\n                // APPLY fingerprint to Project (currently only through user actions in chat)\n                return applyFingerprint(p.baseDir, fp);\n            },\n            {\n                selector: forFingerprints(\"backpack-react-scripts\"),\n                handler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (even if it hasn't changed in this push)\n                    return checkFingerprintTargets(ctx, diff);\n                },\n                diffHandler: async (ctx, diff) => {\n                    // HANDLE new fingerprint (only when the fingerprint sha is updated)\n                    return renderDiffSnippet(ctx, diff);\n                },\n            },\n        ),\n    )\n```\n\nIn the example above, we have a module which computes a set of fingerprints on every `Push` (one of them is named `backpack-react-scripts`).  The pack also notices if a newly\ncomputed fingerprint has either changed, or is different from a `goal` state.  It will then present the user with options to do things like:\n\n* set new targets \n* update a project to be in sync with a target fingerprint\n* apply a fingerprint to a project for the first time\n* broadcast a message to all projects out of sync with the fingerprint\n\n## Support\n\nGeneral support questions should be discussed in the `#help`\nchannel in the [Atomist community Slack workspace][slack].\n\nIf you find a problem, please create an [issue][].\n\n[issue]: https://github.com/atomist/sdm-pack-fingerprints/issues\n\n## Development\n\nYou will need to install [node][] to build and test this project.\n\n[node]: https://nodejs.org/ (Node.js)\n\n### Build and test\n\nUse the following package scripts to build, test, and perform other\ndevelopment tasks.\n\nCommand | Reason\n------- | ------\n`npm install` | install project dependencies\n`npm run build` | compile, test, lint, and generate docs\n`npm run lint` | run TSLint against the TypeScript\n`npm run compile` | generate types from GraphQL and compile TypeScript\n`npm test` | run tests\n`npm run autotest` | run tests every time a file changes\n`npm run clean` | remove files generated during build\n\n### Release\n\nReleases are handled via the [Atomist SDM][atomist-sdm].  Just press\nthe 'Approve' button in the Atomist dashboard or Slack.\n\n[atomist-sdm]: https://github.com/atomist/atomist-sdm (Atomist Software Delivery Machine)\n\n---\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d153c19940c5ea0e73d2370ec13360b947bfffbb","_id":"@atomist/sdm-pack-fingerprint@5.0.1-master.20210108050139","_nodeVersion":"13.7.0","_npmVersion":"6.13.6","dist":{"integrity":"sha512-ijFNSKfy3qq9PKg/474Cb53UYPiFtqowDPaJhKftGsjLxterQH7slnNj2yzQF2EBxU6HTCoPK8MnpV8IbCsT6A==","shasum":"5317732d286ae73f2021ffff0aab2b20a97a1b2a","tarball":"https://registry.npmjs.org/@atomist/sdm-pack-fingerprint/-/sdm-pack-fingerprint-5.0.1-master.20210108050139.tgz","fileCount":190,"unpackedSize":3580870,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf9+fcCRA9TVsSAnZWagAApLEP/RxkIhHamhaANVHy/8HV\naI4FUFOwN8uyV7nUcrRqEc/TjWLnzoblod6p5FAdGeDH4+/0ktb/YyBd35p8\nTMmW7AKvCqket2uaHXIqHaApjyQoOld7KJMbGtqg6q2Tfb3NI6B6FwNe17Bb\njB3S0Hx1zFVBSoWQPcG1lBVJZrJku+VVuoNYSPiDxa9/dG3Txjtjsw4V9db1\nY3/EmJWkx7uXOdOgtYcixjquAyzpp4cN48kiPaCqJ59qV9N73KeuxFZMDo8Y\nUu6vj5VDsBKbHbjnKPNkQKJKO9ymyK7VsNOOmTDgKk7q/kt3MMz+znX2J5G9\nPM98znc9WGDSWbk8g9FplEIVMbo6WX9tKc2pNSbNPeLyHAzdUOg2AH65wrsJ\nGfEWWsvy1K8FTyoxPxz5jOjoH8u34rCEbZ/birwNNnfk/4x5bV8s4kVd2s6Q\nJ1Wln3fpuQXXWrb1eukMio5dq5AP91NKi1ntbULmjJjn+GF5g7kk34ILLevl\nbMME6+qo8NSvhUS+/rjKlNp2fZMlyfpNfFo6RwxYP3LseTiUOhS8KnBii/yg\nR80pijFA7ME23CaVVXZxmr92dgj0BdKzDlsj+t58c0aXel8N3GkKwjySwk1W\nL5blB9RJVaGoPvuWognJ+pRUcjI6HYiRyOkxLdH3cvgUNdTYdjTtA13LTJYT\n1hXn\r\n=O5rY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHB9r4zZqWMXnOcHmK9qrPoxRupXR0mZF6RkXZI4Kv1fAiAnWhOyvlQZlPmOwv+AEZ913OdSm/ain5QRg4vWCFkMjQ=="}]},"_npmUser":{"name":"atomist-bot","email":"npm@atomist.com"},"maintainers":[{"name":"atomist-bot","email":"npm@atomist.com"},{"name":"ddatomist","email":"david@atomist.com"},{"name":"cdupuis","email":"cd@atomist.com"},{"name":"slimslenderslacks","email":"slimslenderslacks@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sdm-pack-fingerprint_5.0.1-master.20210108050139_1610082267777_0.9709390539300755"},"_hasShrinkwrap":false}},"time":{"created":"2019-09-03T06:29:20.912Z","5.0.0-master.20190903062633":"2019-09-03T06:29:21.314Z","modified":"2023-02-23T17:59:37.967Z","5.0.0-master.20190903082437":"2019-09-03T08:27:43.741Z","5.0.0-master.20190903125334":"2019-09-03T12:55:40.108Z","5.0.0-master.20190903165024":"2019-09-03T16:52:39.951Z","5.0.0-master.20190906102809":"2019-09-06T10:30:52.912Z","5.0.0-master.20190906113948":"2019-09-06T11:43:23.175Z","5.0.0-master.20190906142051":"2019-09-06T14:23:25.055Z","5.0.0-master.20190907113447":"2019-09-07T11:37:45.232Z","5.0.0-master.20190907140257":"2019-09-07T14:05:47.040Z","5.0.0-atomist.a260p86nh.sdm-deps.master.20190909202333":"2019-09-09T20:28:55.731Z","5.0.0-master.20190910075000":"2019-09-10T07:54:03.307Z","5.0.0-master.20190911063809":"2019-09-11T06:40:32.782Z","5.0.0-master.20190911145953":"2019-09-11T15:03:24.024Z","5.0.0-master.20190911150624":"2019-09-11T15:09:39.243Z","5.0.0-master.20190911161022":"2019-09-11T16:12:49.207Z","5.0.0-master.20190911201651":"2019-09-11T20:20:30.195Z","5.0.0-master.20190911201913":"2019-09-11T20:22:01.305Z","5.0.0-master.20190911203047":"2019-09-11T20:35:09.816Z","5.0.0-master.20190912121938":"2019-09-12T12:22:35.982Z","5.0.0-master.20190912122833":"2019-09-12T12:31:34.793Z","5.0.0-master.20190912124729":"2019-09-12T12:50:43.071Z","5.0.0":"2019-09-13T22:31:21.937Z","5.0.1-master.20190914002947":"2019-09-14T00:33:02.388Z","5.0.1-master.20190914155819":"2019-09-14T16:01:25.856Z","5.0.1-master.20190914163856":"2019-09-14T16:41:24.849Z","5.0.1-master.20190915180930":"2019-09-15T18:12:43.613Z","5.0.1-atomist.t29e48p34.npm-project-deps.master.20190915181348":"2019-09-15T18:16:50.622Z","5.0.1-master.20190915182018":"2019-09-15T18:23:26.433Z","5.0.1-master.20190916055503":"2019-09-16T05:57:51.367Z","5.0.1-nortissej.projectfinder.20190918004738":"2019-09-18T00:50:09.623Z","5.0.1-consolidated-fingerprints.20190919161303":"2019-09-19T16:15:59.280Z","5.0.1-master.20190919164505":"2019-09-19T16:47:56.908Z","5.0.1-policy-target.20190922003747":"2019-09-22T00:39:02.982Z","5.0.1-policy-target.20190922005004":"2019-09-22T00:51:23.262Z","5.0.1-policy-target.20190922021710":"2019-09-22T02:18:28.689Z","5.0.1-policy-target.20190924164311":"2019-09-24T16:44:41.796Z","5.0.1-master.20190926021653":"2019-09-26T02:18:12.825Z","5.0.1-master.20190929015035":"2019-09-29T01:51:55.523Z","5.0.1-master.20190929225757":"2019-09-29T22:59:17.269Z","5.0.1-master.20191001163148":"2019-10-01T16:33:29.377Z","5.0.1-master.20191001163536":"2019-10-01T16:37:28.936Z","5.0.1-master.20191001165520":"2019-10-01T16:56:52.648Z","5.0.1-master.20191002000453":"2019-10-02T00:07:45.890Z","5.0.1-master.20191002100330":"2019-10-02T10:05:20.565Z","5.0.1-master.20191002105041":"2019-10-02T10:52:28.977Z","5.0.1-master.20191002161339":"2019-10-02T16:15:13.289Z","5.0.1-master.20191003022719":"2019-10-03T02:28:50.228Z","5.0.1-master.20191003024407":"2019-10-03T02:45:27.554Z","5.0.1-master.20191003102343":"2019-10-03T10:25:12.770Z","5.0.1-master.20191003103359":"2019-10-03T10:35:57.419Z","5.0.1-master.20191006120505":"2019-10-06T12:06:15.039Z","5.0.1-ipcrm-npm-coords.20200206162818":"2020-02-06T16:29:26.781Z","5.0.1-master.20200408160357":"2020-04-08T16:05:11.633Z","5.0.1-master.20210108050139":"2021-01-08T05:04:28.000Z"},"maintainers":[{"email":"neil.prosser+npmjs@gmail.com","name":"neilprosser"},{"email":"npm@atomist.com","name":"atomist-bot"},{"email":"cd@atomist.com","name":"cdupuis"},{"email":"slimslenderslacks@gmail.com","name":"slimslenderslacks"}],"description":"an Atomist SDM Extension Pack for fingerprinting code","homepage":"https://github.com/atomist/sdm-pack-fingerprints#readme","keywords":["atomist","automation","sdm","fingerprint"],"repository":{"type":"git","url":"git+https://github.com/atomist/sdm-pack-fingerprints.git"},"author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"bugs":{"url":"https://github.com/atomist/sdm-pack-fingerprints/issues"},"license":"Apache-2.0","readme":"","readmeFilename":""}