{"_id":"@bdking71/spsignature","_rev":"20-892d62da47d60ce9585f16d6f53d6187","name":"@bdking71/spsignature","dist-tags":{"latest":"1.3.8"},"versions":{"1.0.5":{"name":"@bdking71/spsignature","version":"1.0.5","keywords":["spfx","sharepoint","pnp","digital-signature","audit"],"author":{"name":"Your Organization Name"},"license":"MIT","_id":"@bdking71/spsignature@1.0.5","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"8baab05f6f977305d9b1096fa246cfd23cb91395","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.0.5.tgz","fileCount":10,"integrity":"sha512-W0wqMyAiIsQbYT/yy6rEJ/2Cezt3wLOdfp6MPWaPnQGR7Co3XP3UKZ4v2mPn58a9IAvYn3TP2ZJbjf6HW1RzDQ==","signatures":[{"sig":"MEYCIQCBbkwD3HklDIyUuDxdIA7UGcZ035wVQHuNz3fwnvTd/AIhAPwDl2lLI+TCzd5InrnZ066f8WbD2RzF0JWaScHJ1ky/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55614},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"cc52b8621544740c2ccc705aa4d6306f64a4ceab","scripts":{"build":"tsc --build","clean":"rimraf lib","prepare":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework WebPart isolated digital signing and provisioning engine.","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.18.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.0.5_1788379935711_0.4073988604779666","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bdking71/spsignature","version":"1.1.0","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.1.0","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"2027ef86cc307adb1b0db144ccf86cd2736039b9","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.1.0.tgz","fileCount":10,"integrity":"sha512-2MxNo+z/Q98gWtPI2DV41j/WM0qGqgnwi5CuU+LkqRksPkJCc7jM07z9J5nBRpmUS4NaOgpWrmORYamHz1B+TQ==","signatures":[{"sig":"MEYCIQCyd1GKMXwQ7Sq+9pdymYTuE16B2Kjzx15RYPybBidckAIhANnNESJwApU7+TNLJ6KeqOlmfauvkf8zIZSWm6Tzf725","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89548},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"9e13bca757a089b434725c758ea44b4e35e3f965","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.1.0_1788445704640_0.8652807930809234","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bdking71/spsignature","version":"1.2.0","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.2.0","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"18b27cd504c05bdf2d594d931520493bf594b2b7","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.2.0.tgz","fileCount":10,"integrity":"sha512-5KQXQjb0yCHUJYcQHX92SzncYkckMS6Lplb5bGE9MNCgql/VoTek89y8D/eFCsQsRfUfcncizJJCV4zUPbt92Q==","signatures":[{"sig":"MEYCIQC0u70UwOIqmOMSE0fF8Ie7NAeaetSvAMClLWKB0tLT9wIhAKIBUNCBHbOkKUKilbqpxysZdqfvPIWOKv/9O6xHOkar","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91513},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"082cd07f761d9eb79fd9c5eed2d304b25e30c19b","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"11.12.1","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.2.0_1788449878133_0.08755412049113764","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bdking71/spsignature","version":"1.3.0","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.3.0","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"8dadba90ccea8bfae5f9aed81fd586b536f67f49","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.0.tgz","fileCount":10,"integrity":"sha512-nUfi4+UAr8tFsILCBhD0Hc8KAxPVlN7RzFY0B2ITI2q5Vmi7HSdbH7vda1hLs4TVX7hiSxZqkbmBSkUPSkCBzA==","signatures":[{"sig":"MEQCICE6BYJea6j0dCQlMN4Dzqyc/Gw899yCJfMwER53sXEvAiBf/d6letMZ5uHQsyEHB5dAzhQeNZziZ798OEdCYrc6LA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93392},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"0951b88e23b95d7c6d7fa16520322705628ffeab","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.3.0_1788451765060_0.00006932574464224572","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@bdking71/spsignature","version":"1.3.3","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.3.3","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"19bc72ef85fbd19383c8547deed2a6aecdb6b18b","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.3.tgz","fileCount":10,"integrity":"sha512-Ea0dTFyuXwEXujYAdSSlmAn0BnP5tDEAnX9aUQHPn1/pX0MFNbCN/tf7k74cNAmNjRaoylmkiIS6JsZPSB0Idg==","signatures":[{"sig":"MEUCIGRG3qlD20xwHOrct7JEsdbBHVv8gpzRrJ+kc0WWjxEaAiEA1pRR81f/Jab4XTVE0ambpGiahusglVHUlSSg9IIihYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94150},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"6eda12bc1be57f21575e0ba12add464fc6ec5284","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.3.3_1788458602894_0.09292722558729172","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@bdking71/spsignature","version":"1.3.4","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.3.4","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"5f7bc05bb2e8182f33d1db9691e7c96ba7bbde36","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.4.tgz","fileCount":10,"integrity":"sha512-0VJHZ56axH2YmiOgZ0ytuWfApQYeacV/ubEwXPg6W8gjMCWYi528ec331+s0LTY0DWQPezTSqa7O5DS0tkm6ug==","signatures":[{"sig":"MEUCIHauK2KO6pfFmZkJZ1KCeApJSTx9ZwnZIKeAIXuxPPGAAiEAjhUsaOWE5ywMhhflMGFVcTp8VFyE4bLqEjKI8QnyTYQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94150},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"d5f0d7b5e6fa1b4158d2560a2334a30289375c03","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.3.4_1788458900925_0.5039157581147948","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@bdking71/spsignature","version":"1.3.5","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.3.5","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"650e4df5c2c678d51e1e4dc9fc26f0244baf4cd5","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.5.tgz","fileCount":10,"integrity":"sha512-FC6S6p2QT3TQ7Z+YMe/3GeESEQWLojFjfjs9yWAX57RZlQ3M6X2DvkhpzYSPey7G/rrmpOjNFzyyldMYTgvWlQ==","signatures":[{"sig":"MEUCIQCQ8UOX6D5DTkciQp8lDNRtNWWPxqxvWTw4c0hYfrQuMAIgdP9wNh8pU2FrMgfyMz9sKhby3lRbEfkFKDFZMCLRI8k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94298},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"0c7be4d4883fe26a0a0e6f071e822c38889baf8b","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.3.5_1788459804579_0.687716857398327","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@bdking71/spsignature","version":"1.3.6","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365","react"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.3.6","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"2c637a0e11740949918bec949d812ac04bc9faa3","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.6.tgz","fileCount":12,"integrity":"sha512-I6GTww0PUz3vUaT0Hu9bzDdjDqDdjXewvcIS7A8HNQRzraY6qCB3HGU0DVgZFun6jzzEAcV6dRSr3XvcHSx7ZQ==","signatures":[{"sig":"MEUCIQCiSuoYrzY7oebMse8UlpGGR8LypRqT3Zg3EK0zI325qgIgaOingcxLbVSodTqEPVLCAXKenV+GWwAtnUn6Soc0AvA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102634},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"8f839405b630ba11787c532237b21fa25ab2866d","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^17.0.1","rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@types/react":"^17.0.0","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"react":">=16.8.0","@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.3.6_1788460940221_0.2904576595456181","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@bdking71/spsignature","version":"1.3.7","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365","react"],"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","_id":"@bdking71/spsignature@1.3.7","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"homepage":"https://github.com/bdking71/spsignature#readme","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"fb2b7f1580bd2b314292b81b2fed99e8c6e92bae","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.7.tgz","fileCount":12,"integrity":"sha512-WQAiNEnN+vLh1nFUhSETEmIoFWHy1UN10am2jN3N6+mhkeyFiTuDkoankm974Stf5vRdKEsCr9a+tcsbmn+rZQ==","signatures":[{"sig":"MEUCIQDnYl4BLupEMs5vjdRanaboUwBcrNQXZ0rs2Dtr7SuZYgIgA1dBG+l7B/CTuXjPwmbH90L+QaoVziSKj/d8L0HivI0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111468},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"e063c8a1b8bbba3e8f8a85b5e41e77021e424585","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^17.0.1","rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@types/react":"^17.0.0","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"react":">=16.8.0","@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spsignature_1.3.7_1789057173644_0.7180692646442997","host":"s3://npm-registry-packages-npm-production"}},"1.3.8":{"_id":"@bdking71/spsignature@1.3.8","bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"dist":{"shasum":"3ae52c07cddb018290ef0d06520ac21d9e663ade","tarball":"https://registry.npmjs.org/@bdking71/spsignature/-/spsignature-1.3.8.tgz","fileCount":12,"integrity":"sha512-Aj9FYR/drgugt2blpIHkLhh3V8hzUh/SNgmi6CNIpggJyfliQtWvDPXSCX4besfa54jPkMQ8M5YBbAmvrUM2jg==","signatures":[{"sig":"MEUCIADPntrvTMji2Npu9UJahBhCTOs6tlmvUm0ibO5DVLPIAiEA42yCCG6MijLfW/C1Bbf5YfVGshVtgHI3onzodVZ+2tI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCTWRSdmY72jauHablDkTBqMpsi8CgmOKcZT+fEwc83dQIhAKtuKMk1I4iSg7fsqTLScXAel4mqqmLm5eKdOiwfRM+n"}],"unpackedSize":111559},"main":"lib/index.js","name":"@bdking71/spsignature","types":"lib/index.d.ts","author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"0650ed4496b37894a88acbffc3458adbe22889c2","license":"MIT","scripts":{"build":"npm run clean && tsc","clean":"rimraf lib","prepare":"npm run build","prepublishOnly":"npm run build"},"version":"1.3.8","_npmUser":{"name":"bdking71","email":"bdking71+npm@gmail.com"},"homepage":"https://github.com/bdking71/spsignature#readme","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365","react"],"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"_npmVersion":"9.9.4","description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","directories":{},"maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^17.0.1","rimraf":"^5.0.0","@pnp/sp":"^3.0.0","typescript":"~5.3.3","@types/react":"^17.0.0","@microsoft/sp-webpart-base":"^1.18.0"},"peerDependencies":{"react":">=16.8.0","@pnp/sp":">=3.0.0","@microsoft/sp-webpart-base":">=1.15.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spsignature_1.3.8_1789067923524_0.796032107865815"}}},"time":{"created":"2026-09-02T19:05:44.029Z","modified":"2026-09-10T19:18:43.780Z","1.0.0":"2026-09-02T19:05:44.439Z","1.0.1":"2026-09-02T19:48:36.530Z","1.0.2":"2026-09-02T19:51:49.778Z","1.0.3":"2026-09-02T19:55:43.014Z","1.0.4":"2026-09-02T19:58:15.307Z","1.0.5":"2026-09-02T20:12:15.868Z","1.1.0":"2026-09-03T14:28:24.778Z","1.2.0":"2026-09-03T15:37:58.306Z","1.3.0":"2026-09-03T16:09:25.202Z","1.3.3":"2026-09-03T18:03:23.079Z","1.3.4":"2026-09-03T18:08:21.083Z","1.3.5":"2026-09-03T18:23:24.703Z","1.3.6":"2026-09-03T18:42:20.374Z","1.3.7":"2026-09-10T16:19:33.803Z","1.3.8":"2026-09-10T19:18:43.611Z"},"bugs":{"url":"https://github.com/bdking71/spsignature/issues"},"author":{"url":"https://bdking71.wordpress.com","name":"Bryan King"},"license":"MIT","homepage":"https://github.com/bdking71/spsignature#readme","keywords":["spfx","sharepoint","sharepoint-online","pnp","digital-signature","2fa","otp","audit","m365","react"],"repository":{"url":"git+https://github.com/bdking71/spsignature.git","type":"git"},"description":"SharePoint Framework isolated digital signing, LZW compression, and OTP audit engine.","maintainers":[{"name":"bdking71","email":"bdking71+npm@gmail.com"}],"readme":"# @bdking71/spsignature\r\n\r\n[![GitHub Repository](https://img.shields.io/badge/GitHub-Repository-blue?logo=github)](https://github.com/bdking71/spsignature)\r\n[![npm version](https://img.shields.io/npm/v/@bdking71/spsignature.svg)](https://www.npmjs.com/package/@bdking71/spsignature)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\n> ⚠️ **NOT READY FOR PRODUCTION USE!** This module is currently under active development. Please do not use it in production environments at this time.\r\n\r\n![Signature Screen Screenshot](/img/SignatureScreen.png)\r\n\r\n`@bdking71/spsignature` provides a secure, lightweight, and framework-agnostic digital signature module engineered specifically for Microsoft 365 environments. Built to run inside custom SPFx Web Parts and Extension Application Customizers, it delivers tamper-evident signature collection, automated base64 image encoding, and structured payload generation directly integrated with SharePoint Online list infrastructure.\r\n\r\n---\r\n\r\n## Source Code & Repository\r\n\r\n* **GitHub Repository:** https://github.com/bdking71/spsignature\r\n* **Issues & Feedback:** https://github.com/bdking71/spsignature/issues\r\n* **NPM Package:** https://www.npmjs.com/package/@bdking71/spsignature\r\n\r\n---\r\n\r\n## Key Capabilities & Business Value\r\n\r\n- **Zero Infrastructure Overhead**: Operates entirely within client-side M365 contexts — no external APIs, Azure Functions, or third-party storage backends required.\r\n- **Cross-Platform M365 Integration**: Designed for seamless deployment across SharePoint Online, Microsoft Teams, and Viva Connections desktop/mobile experiences.\r\n- **Integrity & Non-Repudiation**: Generates cryptographic SHA-256 hashes bound to user identities, timestamps, and target record IDs to prevent signature tampering.\r\n- **Standardized JSON Payload**: Encapsulates complete signing metadata inside standard SharePoint Multiline Text columns for effortless integration with Power Automate and Power BI.\r\n- **LZW Compression**: Automatically compresses signature image payloads to minimize SharePoint storage footprint.\r\n- **Signature Caching**: Optional local device caching so users don't have to re-draw their signature on every transaction.\r\n- **React Component Display**: Built-in `SignatureDisplay` React component for displaying verified signatures with full styling control.\r\n\r\n---\r\n\r\n## Two-Factor Authentication (2FA) Architecture\r\n\r\nTo enforce non-repudiation and meet compliance standards, `@bdking71/spsignature` includes a flexible Two-Factor Authentication engine. Rather than relying on rigid third-party SMS gateways, it delegates code delivery to **Power Automate**, allowing organizations to route standard **5-digit** verification codes via Microsoft Teams, Outlook Email, or both.\r\n\r\n### How the 2FA Workflow Operates\r\n![Diagram illustrating the 2FA workflow between SPFx, SharePoint, and Power Automate](/img/TFA.jpg)\r\n\r\n1. **Code Generation**: When a user initiates a signing transaction, the component generates a cryptographically secure 5-digit verification code (e.g., `84920`) using the Web Crypto API.\r\n2. **SharePoint Queue**: The component writes a record to the dedicated `PendingVerifications` SharePoint list, secured with item-level permissions so users can only see their own codes.\r\n3. **Power Automate Trigger**: A Power Automate flow monitors the list and instantly dispatches the code to the signer via:\r\n   - **Microsoft Teams**: Direct Adaptive Card or Activity Feed notification.\r\n   - **Outlook Email**: High-priority internal notification.\r\n4. **Validation & Signing**: The signer enters the 5-digit code into the `@bdking71/spsignature` UI component. Upon successful validation, the final signed JSON payload is generated and stored in the target record.\r\n\r\n---\r\n\r\n## Signature Data Schema\r\n\r\nThe module returns a single, structured JSON object designed to be stored directly inside a SharePoint **Multiple lines of text** field:\r\n\r\n```\r\n{\r\n  \"signatureHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\r\n  \"signatureData\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...\",\r\n  \"signatureTimestamp\": \"2026-08-31T19:55:06.121Z\",\r\n  \"verificationItemId\": 42\r\n}\r\n```\r\n\r\n| Field | Type | Description |\r\n| :--- | :--- | :--- |\r\n| `signatureHash` | `string` | SHA-256 hex digest of the canonical audit envelope (payload + signer + timestamp). |\r\n| `signatureData` | `string` | LZW-compressed data-URI of the signature image (PNG). |\r\n| `signatureTimestamp` | `string` | ISO-8601 timestamp captured at the moment of signing. |\r\n| `verificationItemId` | `number` | ID of the corresponding record in the `PendingVerifications` list. |\r\n\r\n---\r\n\r\n## Toolchain & Compatibility Matrix\r\n\r\nThis project requires a precise local environment build. Strict adherence to the versioning matrix is mandatory to prevent toolchain compilation errors.\r\n\r\n| Component | Version |\r\n| :--- | :--- |\r\n| **SPFx** | `v1.22.1` |\r\n| **Node.js** | `v18.17.1` (Recommended use of `nvm` or `nvs`) |\r\n| **Gulp CLI** | `v4.x` |\r\n| **React** | `v17.0.1` |\r\n| **Fluent UI** | `v8.x` |\r\n| **TypeScript** | `v4.7+` |\r\n\r\n---\r\n\r\n## Installation\r\n\r\nInstall the package into your SPFx solution:\r\n\r\n```\r\nnpm install @bdking71/spsignature --save\r\n```\r\n\r\n### Peer Dependencies\r\n\r\nEnsure the following peer dependencies are installed in your SPFx project:\r\n\r\n```\r\nnpm install @pnp/sp @microsoft/sp-webpart-base react --save\r\n```\r\n\r\n---\r\n\r\n## Integration & Usage Guide\r\n\r\n### Step 1: Provision SharePoint Infrastructure\r\n\r\nCall `ensurePendingVerificationsList` during the web part lifecycle (inside `onInit()`) to automatically ensure the `PendingVerifications` SharePoint list, columns, and item-level security settings exist on the current site collection.\r\n\r\nNote: This method is fully **idempotent**—it can be safely called on every web part load without failing or duplicating columns.\r\n\r\n```\r\nimport { ensurePendingVerificationsList } from \"@bdking71/spsignature\";\r\n\r\nexport default class MySignatureWebPart extends BaseClientSideWebPart<IMySignatureWebPartProps> {\r\n\r\n  public async onInit(): Promise<void> {\r\n    await super.onInit();\r\n\r\n    // Provisions the 'PendingVerifications' list with 'Passcode' and 'Channel' columns\r\n    await ensurePendingVerificationsList({ context: this.context });\r\n  }\r\n}\r\n```\r\n\r\n### Step 2: Configure Your Power Automate Flow\r\n\r\nCreate a Power Automate flow that triggers on **\"When an item is created\"** for the `PendingVerifications` list. The flow should:\r\n\r\n1. Read the `Title` (signer email), `Passcode`, and `Channel` columns.\r\n2. Route notification based on the `Channel` value:\r\n   - `\"email\"` → Send an Outlook email with the passcode.\r\n   - `\"teams\"` → Post an Adaptive Card to the user in Microsoft Teams.\r\n   - `\"both\"` → Dispatch through both channels simultaneously.\r\n3. Optionally delete the item after dispatch (or use a scheduled cleanup flow to purge expired codes).\r\n\r\n### Step 3: Launch Signature Modal & Capture Audit\r\n\r\nExecute `promptAndGenerateSecureAudit` within your component or event handler. This renders an enterprise modal overlay that:\r\n- Handles drawn, uploaded, or cached signature selection.\r\n- Triggers 2FA code delivery through the configured channel (when enabled).\r\n- Validates the 5-digit passcode (if TFA is required).\r\n- Outputs a cryptographic audit payload.\r\n\r\n```\r\nimport {\r\n  promptAndGenerateSecureAudit,\r\n  SharePointAuditRecord\r\n} from \"@bdking71/spsignature\";\r\n\r\nprivate handleSignAction = async (): Promise<void> => {\r\n  const auditRecord: SharePointAuditRecord | undefined = await promptAndGenerateSecureAudit(\r\n    {\r\n      itemID: 1042,\r\n      signer: this.context.pageContext.user.email,\r\n      spContext: this.context,\r\n      channel: \"teams\",\r\n      requireTFA: true,\r\n      payload: {\r\n        DocumentTitle: \"Purchase Requisition #4402\",\r\n        TotalCost: \"$12,450.00\",\r\n        ApprovedBy: this.context.pageContext.user.displayName\r\n      }\r\n    },\r\n    \"Approve Purchase Requisition\",\r\n    \"Please review your entry and apply your signature to finalize this record.\"\r\n  );\r\n\r\n  if (auditRecord) {\r\n    console.log(\"Signature Hash:\", auditRecord.signatureHash);\r\n    console.log(\"Compressed Image Data:\", auditRecord.signatureData);\r\n    console.log(\"Timestamp:\", auditRecord.signatureTimestamp);\r\n    console.log(\"Verification Log ID:\", auditRecord.verificationItemId);\r\n\r\n    await sp.web.lists.getByTitle(\"Requisitions\").items.getById(1042).update({\r\n      SignatureAudit: JSON.stringify(auditRecord)\r\n    });\r\n  }\r\n};\r\n```\r\n\r\n### Step 4: Verification & Image Reconstruction\r\n\r\nTo verify non-repudiation or render the stored signature back into a view or report, use the built-in helper utilities.\r\n\r\n```\r\nimport {\r\n  verifySecureAuditRecord,\r\n  getReportableSignature\r\n} from \"@bdking71/spsignature\";\r\n\r\n// 1. Re-calculate SHA-256 hash to verify record integrity\r\nconst isValid: boolean = await verifySecureAuditRecord(\r\n  auditRecord,\r\n  signerEmail,\r\n  payload\r\n);\r\n\r\nif (isValid) {\r\n  console.log(\"✓ Signature is authentic and untampered.\");\r\n} else {\r\n  console.warn(\"✗ Signature verification failed - record may be tampered.\");\r\n}\r\n\r\n// 2. Decompress LZW signature string into a viewable PNG Data-URI\r\nconst renderableImageSrc: string = getReportableSignature(auditRecord.signatureData);\r\n```\r\n\r\n### Step 5: Display Signature with React Component\r\n\r\nUse the built-in `SignatureDisplay` React component to render a verified signature with customizable styling:\r\n\r\n```\r\nimport React from \"react\";\r\nimport {\r\n  SignatureDisplay,\r\n  SharePointAuditRecord,\r\n  verifySecureAuditRecord\r\n} from \"@bdking71/spsignature\";\r\n\r\nexport const MySignatureViewer: React.FC = () => {\r\n  const [auditRecord, setAuditRecord] = React.useState<SharePointAuditRecord | null>(null);\r\n  const [isValid, setIsValid] = React.useState(false);\r\n\r\n  React.useEffect(() => {\r\n    const verifySignature = async () => {\r\n      if (!auditRecord) return;\r\n\r\n      const valid = await verifySecureAuditRecord(\r\n        auditRecord,\r\n        \"user@example.com\",\r\n        { amount: 1500, vendor: \"Contoso\" }\r\n      );\r\n      setIsValid(valid);\r\n    };\r\n\r\n    verifySignature();\r\n  }, [auditRecord]);\r\n\r\n  if (!auditRecord) {\r\n    return <div>No signature to display.</div>;\r\n  }\r\n\r\n  return (\r\n    <div>\r\n      <h1>Purchase Requisition #4402</h1>\r\n\r\n      <SignatureDisplay\r\n        auditRecord={auditRecord}\r\n        isValid={isValid}\r\n        style={{\r\n          padding: \"24px\",\r\n          border: \"2px solid #0078d4\",\r\n          backgroundColor: \"#f0f7ff\",\r\n          marginTop: \"20px\",\r\n          borderRadius: \"12px\",\r\n        }}\r\n      />\r\n\r\n      <SignatureDisplay\r\n        auditRecord={auditRecord}\r\n        isValid={isValid}\r\n        className=\"my-signature-card\"\r\n      />\r\n    </div>\r\n  );\r\n};\r\n```\r\n\r\n#### SignatureDisplay Component Props\r\n\r\n| Prop | Type | Required | Description |\r\n| :--- | :--- | :--- | :--- |\r\n| `auditRecord` | `SharePointAuditRecord` | Yes | The signature audit record returned from `promptAndGenerateSecureAudit()` |\r\n| `isValid` | `boolean` | Yes | Result from `verifySecureAuditRecord()` — displayed in green or red |\r\n| `className` | `string` | No | CSS class name for custom styling |\r\n| `style` | `React.CSSProperties` | No | Inline CSS styles for the root container |\r\n\r\nThe SignatureDisplay component renders:\r\n- Signature image preview\r\n- Signer name/email\r\n- Validation status (green for valid, red for invalid)\r\n- ISO-8601 timestamp converted to local timezone\r\n- SHA-256 hash digest (truncated, light gray font)\r\n\r\n---\r\n\r\n## API Reference\r\n\r\n### Exported Functions\r\n\r\n| Function | Purpose |\r\n| :--- | :--- |\r\n| `ensurePendingVerificationsList(props)` | Idempotently provisions the `PendingVerifications` SharePoint list, columns, and item-level security. |\r\n| `promptAndGenerateSecureAudit(context, title?, msg?)` | Launches the signature modal, dispatches the OTP, validates entry, and returns a `SharePointAuditRecord`. |\r\n| `verifySecureAuditRecord(auditRecord, signer, payload)` | Re-computes the SHA-256 hash to verify audit-record integrity. |\r\n| `getReportableSignature(compressedSignatureData)` | Decompresses an LZW-compressed signature back into a viewable `data:image/png` URI. |\r\n\r\n### Exported Types\r\n\r\n| Type | Description |\r\n| :--- | :--- |\r\n| `SharePointAuditRecord` | Structured JSON audit payload returned after successful signing. |\r\n| `SignerContext` | Input parameters for the signature workflow. |\r\n| `AuditEnvelopeRecord` | Canonical envelope structure used for hashing (payload + signer + timestamp). |\r\n| `DeliveryChannel` | `\"email\" \\| \"teams\" \\| \"both\"` — Supported OTP delivery channels. |\r\n| `ISignatureDisplayProps` | Props interface for the `SignatureDisplay` React component. |\r\n\r\n### Exported React Components\r\n\r\n| Component | Purpose |\r\n| :--- | :--- |\r\n| `SignatureDisplay` | Renders a verified signature with signer info, validation status, timestamp, and hash digest. Fully customizable via props. |\r\n\r\n---\r\n\r\n## Security Considerations\r\n\r\n- **Client-Side Passcode Generation**: The 5-digit OTP is generated and validated in the browser using the Web Crypto API. This is well-suited for **enterprise workflow enforcement** (approvals, sign-offs, SOP compliance) but is not intended to replace hardened server-side MFA solutions for high-risk financial transactions.\r\n- **Item-Level Security**: The `PendingVerifications` list is automatically configured with `ReadSecurity = 2` and `WriteSecurity = 2`, meaning users can only view and edit records they created. This prevents users from inspecting other users' active passcodes.\r\n- **SHA-256 Non-Repudiation**: The signature hash binds the payload, signer identity, and timestamp together. Any modification to the stored record can be detected through `verifySecureAuditRecord()`.\r\n- **Signature Caching**: Cached signatures are stored in browser `localStorage` after LZW compression. Consumers should clearly communicate this caching behavior to end users to meet compliance and privacy requirements (GDPR, CCPA, etc.).\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n| Issue | Resolution |\r\n| :--- | :--- |\r\n| Modal never appears | Ensure `spContext` is a valid `WebPartContext` and the DOM is fully loaded. |\r\n| OTP never arrives | Verify the Power Automate flow is active and listening on the correct list. Check the flow run history. |\r\n| SHA-256 verification fails on nested objects | Note: Only top-level payload keys are sorted. Deeply nested objects should have consistent key ordering. |\r\n| Signature not caching | Verify browser `localStorage` isn't in private/incognito mode or blocked by browser policy. |\r\n| SignatureDisplay not rendering | Ensure React is installed and `auditRecord` is properly populated with valid audit data. |\r\n\r\n---\r\n\r\n## Contributing\r\n\r\nContributions, issues, and feature requests are welcome!\r\n\r\n1. Fork the Project: https://github.com/bdking71/spsignature\r\n2. Create your Feature Branch (git checkout -b feature/AmazingFeature)\r\n3. Commit your Changes (git commit -m 'Add some AmazingFeature')\r\n4. Push to the Branch (git push origin feature/AmazingFeature)\r\n5. Open a Pull Request\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT License\r\n\r\nCopyright (c) 2025 bdking71\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","readmeFilename":"README.md"}