{"_id":"@fluidframework/dds-interceptions","_rev":"498-eace2d73bc5fab7ee74e05f159612f74","name":"@fluidframework/dds-interceptions","dist-tags":{"next":"2.0.0-dev-rc.1.0.0.225277","dev":"2.0.0-dev-rc.1.0.0.232845","canary":"2.0.0-internal.8.0.8","latest":"1.4.0","rc":"2.0.0-rc.1.0.9"},"versions":{"0.26.0-3177":{"name":"@fluidframework/dds-interceptions","version":"0.26.0-3177","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.0-3177","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"709203d39e1f1e15433f951439765c3e39badbf9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.0-3177.tgz","fileCount":97,"integrity":"sha512-UYlsd3zdwKsHGGIrA02MxrPwETgnvHctMPIUo7eercU7IXXslQLJV8SGIUkfzfIJQhPAhv12KV2hKhCs8OrEYg==","signatures":[{"sig":"MEUCIQDiv8z9LVAVXwedtZxVj7AgyIpsnUcf8HgUZxDin2aTIAIgKxPqpnsXbvdtHKxfTzzTqShyEq0qSZfLh0xh61wX4mQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":337014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTc2PCRA9TVsSAnZWagAASEsP/A/8HNCFLs3E8upW8+W8\nFE6uedIoFcI/UOq+OZX+WGaBdXZ05Ch9oafiApUE+alctUsMoXCdW+60xnZK\nWk2u19WyW+JxDfoyde8lySofvCjO4DjH0kZrNhGLPZymNLQDZTqr9vwqoyHX\nPRUEN3ZZis7W2AESKAsBovZo7VfBVjmG3bpuwFMdrOkf99MNL6L6fYKEjhYi\n/T9gjQKS1S8qIKU9DWZJaU1EzR16SG1cdZvQp9eUELdq8tL3eUunkuMAgv0o\nlPBWpTAQ+OEYCYisv4HRzv0FjgA+hrkf/vNkxgAV866DtgRLmMmLk8Vhrju2\nsmkmVL+2BqhZCoS065HJ01ividcifGM3m10vUDrvttV4ER8VDtHlqeDI0nOW\nWJ7JffwyHi84ur/5ZJ3pye6y4udUcgMB5VGgGdOGHxGDsPPZxphBBTGN6Wkn\nuCaAXvmQvsnyeDBYMKEEyKbyzaDXPASSLEc+Y+dtgDFGd2X+FXTXnfShT0RY\ndWRnUY/ivHZfJcSYjXu+FJaP9W/ZIumH3R5KI6L4D6BmxelNWfx3Wst0tCzK\n2LwGw1jdSq0xkkFRoU3MGsJexD9DXIyt1INVwW+P6jTkvRrnz8Rt0OU3HikK\nCyvLS8ioduFKbEq4XGUVX9k8Xd0+CUkO4c23vO5/R0jTqVxZuIYIcqgLcmxP\ncWFd\r\n=wZhz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.0-3177.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.6","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.18.3","dependencies":{"@fluidframework/map":"^0.26.0-3177","@fluidframework/sequence":"^0.26.0-3177","@fluidframework/merge-tree":"^0.26.0-3177","@fluidframework/runtime-definitions":"^0.26.0-3177"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2-0","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.0-3177","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.0-3177","@fluidframework/eslint-config-fluid":"^0.19.1-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.0-3177_1598934414655_0.5433433661297602","host":"s3://npm-registry-packages"}},"0.26.0":{"name":"@fluidframework/dds-interceptions","version":"0.26.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.0","maintainers":[{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4b765949c3c75db21f06830e2c0c13e7defb9b42","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.0.tgz","fileCount":97,"integrity":"sha512-Rn+PUU5C3yDc5PlAPTBn04EZEWXz+0CFYzu40uvlK3eUB/+Dbt61NEz7vsJIgs+xrihEj8ZO01a4ygyj0OaYsg==","signatures":[{"sig":"MEQCIBhmFNBOP0DL2ZcFxgxvDXUpT7AS4YRCmhhKkwpaz0wOAiAhQye6oI2amWoqzikoU0FJ1f23o55YOZ1ojkRP+x7M8w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUXYkCRA9TVsSAnZWagAAJSAP/1NwkKZh9ybnRLBEJPlp\nM5zcUCQmPCZgfycsTTudEQ3Uv6rSo99hjwMp3oQkBC39wkGWsmgyubDOjfOj\nZdFpP9iBT+u1TsquoRod42FhKmTJ0w+SEYN8hxS9cmQ23++05t+kfuTbYaRY\ngGp/AZOPSq6er/ZcdsHErNEtqJ2TMBlPhBoQPSykARETUkRCZiyG9waDtN9g\ncur+aKtk/Ef9Wn+TGmX+DORV4IxnJt7ABzpq7tsMQD4x5cORI5WRaW5u2TXt\nqbDWAhypt+KvkXTc0evC6htruV4nK0wcWBGK271gcpQxMZ736EsmiyTbAlPx\n6xhlRNb3Ci7TO/GNXrz0GxGmbmBimEZiP/5Qsbpg9Xd4tXkwjqujFeBEhI9x\nV9w/hbqr2q0f4WdYE2ZpZaGoUDTM8wqgtLjQHxAC2GfrH/y5Vh6uatlIAqhZ\nbDtxCFxcD6YlBwZlqxGMqHXYXEEGkwkDUI4bAFkeHLgxr37LX0tl9FuABpQ1\nsE9hHwZLYmOUhSX83iSyhMDzsb3vna6oj7IXX52mK9EWHVimdfG3PAXDFDM1\n7mlq4/u35/BVKuvlBIZyFH2LaY+INgvG3oSUURFBa+4rPPIcVoQHZKGsSLLz\naKDrEBsgmF0CRA2ACMdWieDCm6wR4y6D0btH1V2BhA8Rh6oKroVr2HM3Vsgc\nC+H9\r\n=FNgi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.6","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.18.3","dependencies":{"@fluidframework/map":"^0.26.0","@fluidframework/sequence":"^0.26.0","@fluidframework/merge-tree":"^0.26.0","@fluidframework/runtime-definitions":"^0.26.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.0","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.0","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.0_1599174179807_0.0493457586745194","host":"s3://npm-registry-packages"}},"0.26.1":{"name":"@fluidframework/dds-interceptions","version":"0.26.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.1","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"91748fd1479b97646619df68e684f571fd259aea","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.1.tgz","fileCount":97,"integrity":"sha512-xfU13TUYhGE1Z1LUoZMvLTeqHFw5jkVjxaVPr2lAM77THcGefIvTZWsrllxO2fJqa8rHw989LMXK7jtUiDlvvw==","signatures":[{"sig":"MEYCIQCoRg6oOwaG8a1DBwyCvfHAAq1Iepl98dkv4VgRfTEz7wIhANmVVU4dfm7fglTSmetw24f6FQzzWh1jpqvxJrxBAkEX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfZoPcCRA9TVsSAnZWagAAhy8P/jKhGwM7A2+SAI2jsfKl\ng/z4J48Xd7WsL4olkzNGHAmMoHIEaF8BXUSRDrjP9257O2qryIIU006/Hl1K\nrFFOpEyC1GT+GLDSZ0Tb0qyBlixFxLK5c8/PtFeAsnYr17C/f1rPHzFyCcOV\nIcdEmUt5eqDNBdkOsmBjO3P99xVBHOyYEofgQxAkKTaCBNqU2OxSad1XAI6B\nX5EQOSCOTWtrOYQN2Iw/kOBdRMrceOpvCLyP2XDcn/dWzfwi2pUYxGJ88dl/\ncL/EtbZ3H5nLaIB9oXjay0UryZC3BTfCXwN7zzIkpEOvQWB+xCVUQdqpdJJh\n10yO5myqdtAYTvPMdnctiXcs8KPCoYxRHu7Hhn4/VBTm0Gyi+Vlk0pwRpw3p\nQIhwHheRubA57hppbX4HIf5bZVbbuABwM6Ha290WXgsCp07RpjvW8TWoToh1\ngtlDAvUftkWVMotk0dI5SNMH0zi+dj/p6bBvPWE7MQAI9o8OZPIgpLcVqofJ\nj+QIaHkf51BEJw3q8xubGNsdh7tF4ppbxmbSlPpDtt/QYsQ3sfEZE5dVEAWW\nXnAOpPlnmxguGl54YFYNxxNQg3yLYbi/wTmqrOBCsCS9Vt2jX4o1vpvuBqCW\n8BFVYIop+90xL/2C73IfSrEclRT1hx/BlvARKm2szIrmsOxqYngV/17XySJB\ndn/W\r\n=Ul4A\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.6","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.18.4","dependencies":{"@fluidframework/map":"^0.26.1","@fluidframework/sequence":"^0.26.1","@fluidframework/merge-tree":"^0.26.1","@fluidframework/runtime-definitions":"^0.26.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.1","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.1","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.1_1600553947991_0.2767522399606166","host":"s3://npm-registry-packages"}},"0.27.0":{"name":"@fluidframework/dds-interceptions","version":"0.27.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.0","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"38c6ccfaac3d475d35149fb31fcf3b1f54c1f02b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.0.tgz","fileCount":97,"integrity":"sha512-EdSAzsivXr+SUVnhP2SBQrTWv6Uckjck5o3R0De7+nepFFWstAuJ7leBFxDvTSUVbLfVKG/8erRWTJgTnndIYw==","signatures":[{"sig":"MEYCIQCcG9MkZWgAioM6lUhQ14h1s2Cu1rG0IyNp/QVmaPPjygIhAPIo0dVMtdreoUXGYInCKv8AXgcQL7dmGRrdGB/OkP7o","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfa82zCRA9TVsSAnZWagAAGfoP/joTdfkGxLW7V0+pj05J\n7Cdhuni+9anKnKzyBoRIniHLv3+C544M6AjufRcoizk2RFB2GAZ03zgCrfp9\n6Snk1eRorAcK6y7oTVIHtZNEpn0nw8hT0PNNYhnOmeSDDsP15ff45elAubC2\nqdILvvy2kFcMMbq96RFL2euft8o2e2KBikLsTv7ck57ckih+OpHPs9uMLs9t\nyUI7oS4vyvcTmUwgYtsjTrGrRAX29LdhTvtYPr5wARuDdvZN7a3ZSjmyuaaA\nBpwvQxewoe7xhh/0i1HcvYDLhDpOTkro+Fm2xQDaRW7FpLIrt0IlON4yCYSv\n6Ea3ZycfV74ufHnagv7g5wsYcplpYgviwBxPMveRols6csit0OLCeaqC2Nzl\n9FajxRXVuIqTxIGiT3Num7QOZMiGAzhw61lu61+q5dUPw12wXCZ23Uba+11u\n4E1QBNNZUt80vo2Q867l5uNtucdAH67IZXqJSyPAgniJabrTe9kFe7v/nBZi\n1jRh4MLScK8AWH/7DoP6iIZmwJgWiTdZMor4eeQS/Yn56/3vVmIIbs1UBgcD\n1yr20UAcm7dwTrt4lPRhE3oOnbOGZWe7GLVA2CpIIb6jGE/Wqfh0fymRMLrL\nI49sUnnUp6TXi8CDjamyW+J1Vns7F7YyZZlIZ3t17fgS5dLF65W9vcB6BZ8a\nS7GR\r\n=vTNE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.6","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.18.4","dependencies":{"@fluidframework/map":"^0.27.0","@fluidframework/sequence":"^0.27.0","@fluidframework/merge-tree":"^0.27.0","@fluidframework/runtime-definitions":"^0.27.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.0","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.0","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.0_1600900530678_0.6611063255215381","host":"s3://npm-registry-packages"}},"0.26.2":{"name":"@fluidframework/dds-interceptions","version":"0.26.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.2","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4db641d8f9e9a009b2c4a6cfaa92da1f56d528f2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.2.tgz","fileCount":97,"integrity":"sha512-MWVc6UHcE4rMUhsSCjmi0ghIb9CM6oZoglsAc+4RRUl9z7ztPGcYhSBgYNju/903n1SwzivCgelKgIkBZRMpjw==","signatures":[{"sig":"MEUCIQDm5Nwq0WyGCxcfA1owPaGmQAPlbx2wtqrXHKnJs9fBeQIgJl2wuUiEMVEqQoDKJOFHjommqxDA5XMAmPPH73XrxPk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfc6mACRA9TVsSAnZWagAABAgP/A2GqjYr2YjZLLcCQykD\nBiNZ2Un4or/gXRsvn6mHGtpXQ4PO5wqY4riocLznKI3tpGspZaabqG2ymN2H\n4fEBIhdD0BqnLjkJVsr1VH9u62MMWB9oLgZ/PvoFqCrLHsvkip3ixu4vtgDe\ngxJ+q6uAsNmd28O0JO6rzOLaO1Qi8+yREm1uJSgTay1qrVh8mkt1jfQcYEgH\nauESJJXUex1fnJITC+KxhtCKjA9gXnuQTJlO5IvRbv0nojeZSeCbPPNEvLSj\nno2P6mz2xFMy6sfoIXHJ1d8WyCmtVYvHI3zGsw2JAqMzydkr8maJZxu07JHH\nbBZnzCadu1ZiDG+arVt7icWK8k2INoA+m1lfnEuHFpT3K07pLHzJ0c4OYQwf\nOQYuphrlFhq5mB3BHiHP/O5xdtiLxrVjfa5OMkgrAlSUktMKJbwjjoG36azy\nhPRALqyqeHNOr3wf/UB9qbH261L/1yne/FjuSDJzF4/fct74fT/35rF0wMcT\nZjTWURdB01jX/v623WF2pbLrD1Gn72coUetpGGG5o6dPKec/Q4fbylGp+D2l\nLA8CAS6WTPMEes5sTsz424YxIdhGrtMM5l46AWXxGZXiJSFsdGjb2fnGFtj9\nahS4EYXiKwJapHT08f/Gn6PUYwNmuO0St+l3oI61u8fXJFHT7z+jqdYI+Pq2\nNMBz\r\n=gv+o\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.6","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.18.4","dependencies":{"@fluidframework/map":"^0.26.2","@fluidframework/sequence":"^0.26.2","@fluidframework/merge-tree":"^0.26.2","@fluidframework/runtime-definitions":"^0.26.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.2","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.2","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.2_1601415551548_0.46477137550591596","host":"s3://npm-registry-packages"}},"0.26.3":{"name":"@fluidframework/dds-interceptions","version":"0.26.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.3","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ede5b57875f0665692885844ae9f34275e8cb9a8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.3.tgz","fileCount":97,"integrity":"sha512-5xEWOcCaTWYBUCepQiSWnd2LxPsobd/ljfxrhOJIOyibtiS/ebCULVeOqgnc9EoSSV4bogoorFoEtJU6+Hdn4g==","signatures":[{"sig":"MEQCIEFyStzzHSalNy3SzB+35fPep3wzUjgyEDnuAwc2apkLAiBrNjxlupJWMDrUpcKhI5FrrzU7OnnYGcuw7kB04mlYLQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJffKYiCRA9TVsSAnZWagAA1gsQAIjsB9NI3jMCF5TrXv9V\nuWHsen6268yLZzbndj1OY34+ah91bp7ObKSQpptDssutXdS5PmWyC2XhL76J\nLfG5F3d3rLkAIiE6UhpB6sKxeEVshT4BYqKkO0NiguBifByUPln6BBabHQzh\npKqZjhJaTznNvwfJKFJ1tV92uzpoRCgH+O8immIZ2R/mHWfIdVPSLZZsT+Vg\n1zjSW1vsSEDU05IxAC4p1ezabr49cfGCjVpUfcLGgcHovk/Vps+pN++BkW6j\nFZea8siFch6uJBj5jebUtVCH7pFtSYSc5Prlp3hTLJ3Y4MHBus+BcLaLQAFC\nJgSKmkvnLOJjsJINIl7nujd4RCeIpONu8dDrZfu3NXWaM0VHWaBAmc6UMs3J\niClwm+ttKLYthzokeuC6JC/lvCfjsxSqlCAVsRf2XCoNIfvyOF9VsaW+tenf\n1+BO0lMUkX/2p05Jgu+Lc0jOexUxYmlZKSyALkiClFYx7y3vnfosCcXsdern\nXDA8RPeHyXYy0oFFTjw6Zoza+taK5v9jGu9kRNgZJoLoopkNHmWOrhK8cBL8\nzJOaNh8tEuAv7wF50zTIC4vyE2IhvsRfHZqCB6daVVMoIMZrffVSqGrltufP\npSDdQSqkY1tvSqK7SlTHzyy6UZpFR/BuCc2HoUk4GmxqTLkWki4CJ+717Pzq\ncmP2\r\n=fG1R\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.6","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.18.4","dependencies":{"@fluidframework/map":"^0.26.3","@fluidframework/sequence":"^0.26.3","@fluidframework/merge-tree":"^0.26.3","@fluidframework/runtime-definitions":"^0.26.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.3","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.3","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.3_1602004514056_0.4655197544339529","host":"s3://npm-registry-packages"}},"0.27.1":{"name":"@fluidframework/dds-interceptions","version":"0.27.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.1","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3ebdc6a87aea431b4fbe432ae950b5b734d293c1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.1.tgz","fileCount":97,"integrity":"sha512-HzHr9go0gUmQ49lFduyrzGXNxIhftPGX0g8U7Ye5zegXw6OzQRhclfDYhkCKBjx5CoQm0mzABsh50iBC4yeujQ==","signatures":[{"sig":"MEUCIE7N0vftboMk10SArkb2rVrtHVpjpfUeI0yERJsAJgQAAiEApzlb8PsPIHvrn7mVF5RY4Pea56RQ2GUj7Vd6gATkXUw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfic0ECRA9TVsSAnZWagAAkW4QAIl5nX9qYXPpK4tqrf0w\ncpCwCMgBHcOwG7PtZfhIV6c2ONh1TG0n6v9Eioc9sAwgblrxJ9y6HQEOWD78\nnevsjlQAGKY6gaAo2Wi41cTjBgN9VB/ifcQzoMbyQjIW9rcrOFLqMSXvPtJt\nR92d4EYwc4Xbb8tUUSq9sUveQVA32LItqvx1+Zj6rUjlGVF/3TH2mkao1jm5\nnz2SGoipaTa8EPvvuPS3dvV4isdGVjzpeL6+wgLDycIUf2ddBpVU/X8kLArT\n3t1bUsy5L5MdU7zsvY5IN92pKU5wnpFBzkLpB+ZIU1X3401xBo32LbHwAYgG\nvG6S+B+ebVYGICCR2q9E9A4r4H5LpCfgBtIffC+Iygog7szYzqIwNlhr/yAg\n/DVxCpIUXArj/Wff0zuvowDMddf9opwSkSUw2ulWfYl+K3m1vmR6dxl6Wsow\n02SRaMjz0Yt+FV3m58InxnkfgFuZkrq6OF0mIBjFjQ8BPNV1W1u2Qd8oc31g\nQslVW2F3HUexa4N+0WWnwVb4TfEItZrC7b/c108DwVAN/+CrrBtd69Nmsf5/\nhMNV4I3Pg0mR4YzQ5b4lFo8t+5kLoF0dSQ9BTfBPfkZTaqcDrvrSw2C0X1e2\nIbAZagxpWlp56TD+t/RrU6bTeqW0pKAgA/Ys/YV8iW3AYCBNTcwYD68aXIZ3\nwfm6\r\n=/19R\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.1","@fluidframework/sequence":"^0.27.1","@fluidframework/merge-tree":"^0.27.1","@fluidframework/runtime-definitions":"^0.27.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.1","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.1","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.1_1602866435968_0.050265783776331396","host":"s3://npm-registry-packages"}},"0.27.2":{"name":"@fluidframework/dds-interceptions","version":"0.27.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.2","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"adc04d5549b2058384cd76de9c8e0cc7be58c2ca","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.2.tgz","fileCount":97,"integrity":"sha512-DnErQu4Jl3LOQ+kYxlCOmUCx5CZ3Ot+jiEH1xWKeo9n9mG/Elq75sXyPK4lSeCc2CWb9gtVNwvVmhSC0G7WymQ==","signatures":[{"sig":"MEUCIQCPvzk0my7MW8SMjBRNkwjCm0nhEvaCgedzg6iGP+NLFgIgXH7U3eyeYwPthVykZ6jHx+h/IstTVkDjZ696Oh+LbFk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfjiVLCRA9TVsSAnZWagAAD1QP/An1EyrAbJWItJse1RIr\njhmlysUj3GV5w7gcgRM7IzfSa4SQR2mBZNW/KUEtYGLFPxL5DOWrdMzkgpsP\nIEv1u7itwGG2qF+wIkt1prdjQnfEJAIn2R6ePUXO29TJlRhK41Kq0oqdtdmL\n64jZEs0O3QAEv8oFS43OtzD2JwXZZidUyUGglzwUd/HQOAzTP+XFbWKjwtbZ\ndaeK3Q2M7KXIX84+k3q1hjTFR/nSNbe/YMfyFBZoyhWUHniCI86TLmZw2s80\nkrC2w44HAa9EC3bdqUnXCj00D4pm3XTGv9HvUHz0pn0XYaEiySV3WmJWtknp\nWrLLU3koJkrFEceG+NzbLIzYQoisB+Oxx6yiDJuBhwt62BIz/J5gz8bnItNj\nMBhaQMJNt1dXv/uwpPjejotnZHQ9a2v9BFQdn149FGbZ8dXpWSZD5G79H74h\newfdbLcHlmtbr02L6tzY8Wpl/WGwnzgCCG5cMQcDx0GQEXEVmKvwQhgWVneT\niKDZsgyrPaPMeJZ9IW+/ptLatFIUQ7C9YyckO8KuUmJqpF/7p3BEsChTiJKv\nMe/v4DoN3Gg4gyRBqSdCfbHv+k5GqN2UdlAn2uy3SqTNcRv5evBlsSlL5N3B\n4qnb0Kut7KAyRwCF9myBDpWSZp6JUIJYQdIn5HNPV2rBtf3SH4GgssLeQ7Rg\nfbPI\r\n=Yy+q\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.2","@fluidframework/sequence":"^0.27.2","@fluidframework/merge-tree":"^0.27.2","@fluidframework/runtime-definitions":"^0.27.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.2","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.2","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.2_1603151179265_0.9747854042983775","host":"s3://npm-registry-packages"}},"0.26.4":{"name":"@fluidframework/dds-interceptions","version":"0.26.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.4","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"601f858c38a05ae1118ff5309efa5bd4c5e592df","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.4.tgz","fileCount":97,"integrity":"sha512-2IdX6BFaYPuHyu0op+2iIxrHDjDGfdTb6De8pDTyUUpXo0iET3QTLyRXGtwWjPr5rbhgbF8lDT+TtnSoC1lOeg==","signatures":[{"sig":"MEUCIQCJQNjPnm09Pl37IfIKKfz3/LFtb4K0ZEg2vwfQwv8D/wIgY1dpyLWtfH6mxnH048O2ZwSSGCBnI+Hf04nDLH/n/+Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkIbFCRA9TVsSAnZWagAAl64P/1M6nScYHRgYW1JHxbUq\nrfTk92dmqU6JP8NlicK53it+pvrScDo9Md8VTc8K4ShX0Ssvu0nHAbXc23CF\nSqIKgb2qEfr7jimqNPKYv5ylTF8J4K1bci51WdlqF6v39ct3/+TtyWwHxpg9\nQpgpPRoEkuLfQ8uvKJmjVgCRLPEZZBtFIqIiHx6tfF/kluHJAEVTt6ndbHnh\nlZOvw1yUqdmVn64UmFbFg74RonfJmw4cG8sJQyaYeh4wIPZPF4aRHpX12MqT\nxyQnm0cGs5u1Z6sNc+i43llkBvOosn3pzo4alon0YrDX1E3WXi120bIqUhJ8\nUymq6Txw+E4MGfRKWLjYPqwnAftGXFfGKD2Iu1Lr0AsgTHne8RctoKv05pmM\nyB1oQqHrsfAiNnqR92JMmsQ2R85TP16s9E0lrFG7SNIT7HNwppVd83s2N8Dx\n+tf2T5nWbL1RR3DZMYiE8E277+UzguGXFCZ5Z5OWyAI+KQLqQMAOTdWyWTWm\n6Of0zCZY52mc/jiqWqPfNgwMCN5z+8tGXCkL52HqwORfXvo/ZYTGlmC62KDv\nUEN2tlDAOzuIdzPmKPa6xgCfE3/4BWD6wQakTKDYEMKZSgEvkWUIynGwrHbV\n69f9OFTbzLjWRzi5f7Icf6NI1zY9hW7f1ukiJh4uRZhmq9xkuI1VC54Jj71l\nYzjt\r\n=sE5C\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.4","@fluidframework/sequence":"^0.26.4","@fluidframework/merge-tree":"^0.26.4","@fluidframework/runtime-definitions":"^0.26.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.4","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.4","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.4_1603307204386_0.471479554197781","host":"s3://npm-registry-packages"}},"0.26.5":{"name":"@fluidframework/dds-interceptions","version":"0.26.5","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.5","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6106ef53690284f893ed44c2a453cb92b5b3c0e1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.5.tgz","fileCount":97,"integrity":"sha512-pUN2kH6X4MI1gZZg3smbvLoelRRtDXi7WYq7xsTGripnGwepoWlN8bed+mlUP3KbdpGGBHSzgA7JvyQfz9ftfQ==","signatures":[{"sig":"MEQCIHHaMUFDnbRK8nNJW+oHOwsR0UKxZ/bs1qm8oY9EdvgqAiAegVcCVDit0uJcpeueWvZBaJhCq7WYaP1Wk1kRE7OCxQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkNxlCRA9TVsSAnZWagAAKdwP/0lHB1XxaoQmf94v8OBV\nbqigieKg23n5YA42FaOOnLQ+GTohsN2JDTPsFvkrapR0j+UDZiSaoxgOsnMA\nW4jaYhgjBGEQn2dUau0pZwbYIb+VgWx35YKtdoY8vVrTj/HSSGL6WSMEGpwq\n1+UqtiPlP6bndbNM40/YEbMXtjvTr7jPz4VyGZaSNMS5OvSOqYN+NLkMeBut\nq7WSd34SJMQ7HpadDKwlIiC3opeqCH7s8NtzVZXzEkkj0GlxvLA3rawdNZHs\nfBRbaOM3RZui82SX1VGDjVe4TNvMg60glsWbxPrCe/NBYF9vRyFdj8vRBKE1\neoXAp3yqwCutg4kLXRNBJAh+LhhVIYMlkRmHKvIXzanfbjjsU2LxXhUtd1Wr\nuRCvphgveVQXeA90QpcBCtBovj0rN+TJaeND9X+Twf/vXBx4RaUMUSBHkVlG\nf3YGJrYkemhwapJJiyDtpwjBOmlnhac5xf2Fgr115tD56ba4hNY1O9IBM7IX\n4AP3iQKqVFQtHJRf7p4RW9U1CZulhFB+vkJgWwjdctkMa1vIcPsbW4TAF/yg\nffSunsdRgw24DgMNYcNbEy7Ll3zVb/1RtPbgc66c/Lhh0tjzipHHicSu0V8F\nJdJzg79q/y6GwE7ezlaMDiDpm0wXd5gHkgfgSVy3qv6xGQfiwunMLC1fjCka\nxjaB\r\n=R38P\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.5","@fluidframework/sequence":"^0.26.5","@fluidframework/merge-tree":"^0.26.5","@fluidframework/runtime-definitions":"^0.26.5"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.5","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.5","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.5_1603329124702_0.6692837223425265","host":"s3://npm-registry-packages"}},"0.27.3":{"name":"@fluidframework/dds-interceptions","version":"0.27.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.3","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6323b9fa4e006a9f18beb7e0481ecffa675c062a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.3.tgz","fileCount":97,"integrity":"sha512-3XdcpMAfAI0HvhBlDU1mG8RhFVrc5o5/r/5BQLzXD090b+vUjOgPULfaIXU047K2qPUcHa1yxsmVo/IIaJSUDQ==","signatures":[{"sig":"MEQCIA/XX54lAkfsCHR/hbszNwhdbk7EUFAmhh/K7qooyseaAiAbN8i3Zi9WbglIo3vtBaYswaL3C+ugNrygz33KKpgrdA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkNyrCRA9TVsSAnZWagAAnSgQAKNxydJg56gd1m8cAXhQ\nUOdZWeq39fPgJ/EO0HN8yaKgvfsDFZHxJCiMcLk+KwgXQuTo9bE44JLFh4Sl\nhZF5oiIvxsVKCkxt+3raOEcKJDKUM4SUf90PQtyRvIAq4taNQ1CwmGDXtaVw\nCTqaXpCy67Pjp1vilCsZTDn9LU+aDMGfr3MEc8v9fg1uA+UwRwGEByghf4Pu\nQbPcZNWdTZG08/CFPVrt+XYqmyZNhe0nD+Mkptw0Sl1wpQ9+PuT3k9XY4G/0\nUtGcqBk0AJcfmKr4hbLoxZcx/ocZl7nCjFzicGvYmyjV3zcd+zwPl3OiQ4vI\n2KPhBaK/V/8lOhq2/uqSbHkqzFBp2tTwwuy4KStRSCBInjFXhLZj6R4OPCa6\nslEvmJ0OrmD2RlLDkcU5IvOZKEdOSs04fhRwMoTmC7lqmd/WmC4ZGxyktU0Q\n80WhEIu9I+Btkcuxp/35NWJ6gR0yRXEHC+Mulq7rDOONO3rZiU9i+YAYt3xX\nBM8OHpWIKcmn1NwL5LSTqWvNdpPelOerDPp3avpMI5PG+C1Pyx0GXCEvifwp\n0Wc48ZY9V0WmmRimmFxvuPE3JPCLRCe9Ut70Ieu0ltQ/q9n+k9/lfzidXV2+\nFBmWgViGG8RHV7OnhAKY/FDnVyuioHmCVa3l2D4RPtKV9huQbuaNnqDRhI+J\ni8B6\r\n=m2H6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.3","@fluidframework/sequence":"^0.27.3","@fluidframework/merge-tree":"^0.27.3","@fluidframework/runtime-definitions":"^0.27.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.3","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.3","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.3_1603329194561_0.13544023508675096","host":"s3://npm-registry-packages"}},"0.26.6":{"name":"@fluidframework/dds-interceptions","version":"0.26.6","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.6","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6d78b89470a323fe2fa772c950bc249709c41611","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.6.tgz","fileCount":97,"integrity":"sha512-z+6PXbkGHDDpOSaEXSpf4/fEZOKZ7UGXcTBQ2lwqN3+tIoHuDG1BgMiEn+EDWtb3mQWYhc3KvYqgVB56SoSJ0A==","signatures":[{"sig":"MEYCIQDAvYRiNwrk6S2NF0CpXfu80Vxdc83vF141wikjQmA5pgIhAJWZ5I6fcXPr4FDdJ9TPrQq4WORRvsZg7Of7OIp4N9vv","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkY37CRA9TVsSAnZWagAAWOgQAIA7cuIHoXlFsEXJi0m5\nX7/L6/QP8J7T8kvEsp8uFJDW8bwOMro7njxPlVJZNgowXEsmT7LJXOtOKjXA\nsNkFZyGd3KZZsecoXshEr3WyFESnzVEf15Beve/8N3e05ZqTs19J8eAzUYMD\n0U66IFdl+SaLjF4CdZ1umrOJYzZ57Rifyffe3J+4feZFQkMyKFaTa0/sRK32\nsg7oxsJIbVajwIOlX3vZP9sCqvynVMaf1of9G6yfVcWhHB+iVQg1y9Ii5SR/\n6m7W6aWBZ8wsc0tvTymTxqS9zrYaTqI3cb8lyJGb1ZeWFOR+UuZrhzVJZejF\ncQ+AHfAJZ7KuR36gNWiznW9D8JmvwDif393np3e3RfAqb6P2JfT7qTNpO8B9\nhS+J5aD2Q+hRiFjbJd1yIJHNikZXyTPeDpAwM0biFOMpdv7dRHMGf+65ThYf\nwwXUuJthezOHqYrEow4VmMLzZQCaY7vFPFAJRH7VOqiFxEQMsRIT87YyIndW\n5NNRUpMKt9AY3FECU7615cA05Vg3gWp/l9zTf5INp/LQt0bNz8SMHvRStOvc\nwABQekKtHDnatAyl1K21ZDA/YLBmBDeOVHK/FGlizgiTPhg9zC423XJlZOMi\nlW6dL3hGlmxFTZ4y5TtVgxLJiKRIypW1ndkZQGWS5tqguJdZs4pgxEcBR9Yt\ntThA\r\n=tA5W\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.6","@fluidframework/sequence":"^0.26.6","@fluidframework/merge-tree":"^0.26.6","@fluidframework/runtime-definitions":"^0.26.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.6","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.6","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.6_1603374586668_0.4331388101064182","host":"s3://npm-registry-packages"}},"0.27.4":{"name":"@fluidframework/dds-interceptions","version":"0.27.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.4","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"55610f4d923410dfe843d39546456d679a74012a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.4.tgz","fileCount":97,"integrity":"sha512-e75kTPEymYPWopyWtytF3JIv757tlm/RI330jsOHMYxl3NtaewhZCSygkZa56CDb5Rh0xuR+aPbkaK0q9j/pgQ==","signatures":[{"sig":"MEUCIACNcOY8vxjrpKxipXeNGMy2ABZM67jT5a6xyaNERJUbAiEAykMuDZFDehF8QO3xXCf1Dao0IsSyVtB4OGYSTsO7dLQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkY4ZCRA9TVsSAnZWagAAsLkP/33MMU34g7Sc6s0VW6gd\nmOk/Il8hBSEvxzBilysHrORgPHPkyjTjHmWefw9phxOGrS8g/YfNwZ93FGfm\ncbGrzTFAfSc3j1+e/1eQmGfWpqIjbWLW91baTqqmyraTPRG9XVHhQdAvh3LS\n1XBr6fWzRQxaDo3iU/nlmxcOOf/pS7z2ePr6vnrZsYtfUdIsFiEDFD4bRI7W\n6X1zP521SPvsJQlLsGZkl3QlibqInM9uafFD86FnkMhsKsUC26JY1QaG/nV8\n0fGYIqcsX71TXDPFVc3vaI1detwidTutbwU3NM7/iWASzZlZH+9mwWoh6soI\nsrpeVLHcFGRRS9IeBCHCY7bHr91Gpi1cAvX3DtY8otsZJBuCEgMaUJN9Tgrm\ngxidb3JlFzFWck8xlmwP5xrQWvcLs6KEuTebddQP2i5e/CzgSj64+Z2UDuH/\nhB6TZnIZXkyyLXdmRdDFz6yGe3L7upaSIw8gPRarH8OKbYbGiO6A5MUo0Wfk\nbicVosWAJFJXsHi1tP7h/WY9EgqDSdXpSyGgIiq7fDjbJqmkyTN30CI0Im3v\nN6esCwisAhdWR0PnWb8qTqgDGfwygELdbM8GQEzbuwQ87F/JVhBzKHX7oNz7\nlV+zSAR3RRmK7YCmKyv+LlMR9c4rNBGGjvB8MJJiGYcMRoOCbkbeuW3K9d4K\neQx0\r\n=qC3/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.4","@fluidframework/sequence":"^0.27.4","@fluidframework/merge-tree":"^0.27.4","@fluidframework/runtime-definitions":"^0.27.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.4","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.4","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.4_1603374616644_0.07287616394556795","host":"s3://npm-registry-packages"}},"0.26.7":{"name":"@fluidframework/dds-interceptions","version":"0.26.7","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.7","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6cc69817912e087a585f039ff48614c52f11d3e6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.7.tgz","fileCount":97,"integrity":"sha512-K6f97+0LQ0SC85ROsgap3t7cbscxM3aZxFVVlSIZ+r+8hRYkujyqvr/NfYbDLoAaV+vogqdpUId7Ky7Tlh918Q==","signatures":[{"sig":"MEQCIDXqHYUHXmr1mlObz1ACmTR9duspGvb4OU0s5jT7HftAAiAn6YKSqJwRnwGUZ7XWJMRxVyCPLmGO6XTPt9BXqyGr8g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkdMuCRA9TVsSAnZWagAAmX4P/1kpkDo2TX5ZDeYVJoi9\nOpUCldwdBRynLm7qvJ4F10RT/sOk+yABh1I/v3yMYMMMTl0F3+8PNP9/Uyh7\nh/LnvceLOkvDJWjSCnZi0UdE/6xvbLyQ3Y4X8swDPK3BIX4Bklh0JJiMVI9i\nqepvNuPrIkseRkYeUr+ApEAVyKKIieNtKh/LrrJb9kzuwKYGYUnBduaLP2Ld\nypHh15b2uhWxWMyl8/919236ei0w77jpCTYtpDoKxNzqxV1yPdgO+jatAP2G\nDiSTodc13mDGV8otUE2/Y6btWebFtXqla3X/70YW8LBRlPt6ABGLftCHa3k7\nzmP25xpXQDJsKMNyuxghESAVBSjz/yA8PHZ28VE0UcoaNF5VctrM6uh5uLXs\nzAiUvl3VVzwLTVnfX800H4HilE4nga2BU7t+b0yicfONJdBi7A8/ftAwMgS3\nanKZy+S8QVsYqxhcyv649lZEAhufnnpWIsIOvyVIrA0KDW5QKta6lI6tJLEi\nYvG3RbXW76sAV6X6ZdKklXSKvjAymtaix9q0EpmmekVXBruB9jnqkbElLdcJ\nkzqq7pKPoSRxOfwnadZ0zYj/ArySzj68lJYNVK+Zc+zMlYg9kO2GfGjGeuEs\nlCuIDcjBtfO2u/cJKF0zDB5l7CGk0RM8hFqESRaTAWtPPWpO1wJYJ2I9vx2X\nk1i3\r\n=QyJJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.7","@fluidframework/sequence":"^0.26.7","@fluidframework/merge-tree":"^0.26.7","@fluidframework/runtime-definitions":"^0.26.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.7","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.7","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.7_1603392302422_0.5201222207637342","host":"s3://npm-registry-packages"}},"0.27.5":{"name":"@fluidframework/dds-interceptions","version":"0.27.5","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.5","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"989e349596a1bf2726bfe65b6dc1dfb42eef305d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.5.tgz","fileCount":97,"integrity":"sha512-HNkUdlPtRu/uQIzZi0aObpyy2xKCDxlxlejS3MgshpfQvlEnrX6GvkmfB4/n5GgaspBZmYVSHY6R/aom0/9vMA==","signatures":[{"sig":"MEYCIQDxFiW/rF/2kh05kqxCwi8/4RGwwF69NYkoQsMJJ2Cg7gIhAM8MmEyMcwykKHSsfvn/wQAG69Hx2DZ9whcv/1XMjCHS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkdNHCRA9TVsSAnZWagAAjb8QAKTZTDUlm7K1wVUzaYH2\nx8q5PueEAaVMNhwUyCDf1ovG29KwS6MLCep+x5y8B/PD6Hc0sIbk9Xqj1Bzq\naxm/jEhl8hTCIVwttXqTVnHSFJWibjHbPHank4tlcxcUpbnJ9VuruYuxNsEJ\nwZY1qoRbxT7kJrX6BD97H4XgA+x2lSvmL/v8B5VsPr3dQiD1yCqczLf1Wxc7\n4u+PaJ76Xa7bsZ/Dy+a1DUwaMKUuEpBQ/U+Zk+gUcQR8DqmX6eaITJHSIndT\nJ4rFFPf3HLqI47ypBr63ldbXqsepi6omvIKR5QjqhGpHssP8jHec8cl8jCn4\nPEkpohHSDi66mKwmijAeVAVSrIfgNSl1vy8DUnr99D1XpP4PxgwxcvPVFPnR\nPikB1R53LZjv+ydkgHeP5ZKZcRpHZUP4ntC7rbmLMSVLC42tstQ2qeigtAlZ\nNV8JnSbVD7xEPTGe3eVx3pAE88l0qYJgFgJUIOvVh3CeMYf207HLwKvAva1e\nnnT7Pmg/hUArO505woVxui5lqXhtS7gn7Ud84xC2TYTGjrr8sAdwM0+VNnSR\noWVPiPonpxJG7naQHuhDG1CExPU9VSgpVdWvyyuZ807CHQ4GBMZBO54c52rX\nAFyAtB16sy8zIi22bd5xRgH9pfEy8MXQuht60qT6IQ66It+baSJkv4ynIcRn\nthX8\r\n=RZV9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.5","@fluidframework/sequence":"^0.27.5","@fluidframework/merge-tree":"^0.27.5","@fluidframework/runtime-definitions":"^0.27.5"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.5","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.5","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.5_1603392326897_0.47449985842017073","host":"s3://npm-registry-packages"}},"0.26.8":{"name":"@fluidframework/dds-interceptions","version":"0.26.8","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.8","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"29a2b3033e2ca651ed2ca00093a26fa2dc446fa3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.8.tgz","fileCount":97,"integrity":"sha512-vSAIMWRtITBZ+DrZsxmtRR8Z54uuL4DdtvfqOsJJaeNf73dETlkaB5x2FAwbeIvot5evraqToNBG1LFC3W6Jnw==","signatures":[{"sig":"MEQCIBY6j3o8biqg3T63AYwJXYGfev+NrEbjLI08e4BQTnKqAiBrdriFKPlth517brnOoUvWHUz91jOGG4iowgi30plZfA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkiIdCRA9TVsSAnZWagAA1coQAI7uhS/TjOg49Fpo/wxX\nRH8NN1RPXKD1rBtFLH13oX4KAQ2CYrIUQhHXygJX8EPokVYlKzayFviOKiMg\n6KZRtDNiB6r2C+1XD1cFGniGID7+jzsAYiZJ93IyqkBEzeQvJNoYsHhzPrbs\nT7mM7W7QXoHxT9cpIhO4yiQHjzymJg5N1Zcarh7G7rqMvBNeaLdiR2J649BN\nTH5n+XQdoiSgdWNyBCnoVZnTDzHI+wwGiowhQpA7/yM1QKHO4YIXjSehOAqT\njr4B40LK6QWLY/6WE2Nu6fks4tBmctTdVLl6hSLrGY0UT3cFRKfysOWLFUwa\n7tmiP3AJY/4OnG3fB44cDt63tCEP9k/RihbUrh+XcI/pxDQNEVwyEG4MHhu2\n4YklBnyELYgeU2n5h1OftA8WyhRfqWkPjxRTu+3jEHzZFo44iQ416y+dFcOA\nF9J/UOU3JaW87YmB1g/6g5s8RshEAXgSjV41gAGaUZJa7nGB36PXEqaShfod\nZcgkRYzB49dRaqDG68JzSNwbkRcbqQ4G/kZF7z1zNumi/go2q9KDq1oabKlb\nWKujAdh+9IUCL745acO9dtFboNOio3pJwXGPujg6q5BmtD72XgMn2zxl7XNb\nKCb+GV7G/VvQl4BQjUCMmflk9hqSOHfHg/8bPLibhn+eBZeOlXR3CrDRl1Ql\nSrw3\r\n=Ovu+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.8","@fluidframework/sequence":"^0.26.8","@fluidframework/merge-tree":"^0.26.8","@fluidframework/runtime-definitions":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.8","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.8","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.8_1603412508886_0.5586744820223357","host":"s3://npm-registry-packages"}},"0.27.6":{"name":"@fluidframework/dds-interceptions","version":"0.27.6","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.6","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c9bda483d0e35a77ebcdf1dcb26c3ebd8a3d42aa","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.6.tgz","fileCount":97,"integrity":"sha512-SwsbLFxEaHPkXwxIhl34k+FQngbhPpOEQBP7uRPvI8oB96Ttg0/7Wjj/0/ScwwwyWtwaszhtpbf2dPZexlTl3w==","signatures":[{"sig":"MEYCIQDPV01eYXHn4iRu56oVndVRO6Ftq2cn7GKeD7Q3fxBk5AIhAPcSbijjhOeasNSdql/DIyJDj+czE/lzWJlBTHjsItOz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkxxNCRA9TVsSAnZWagAAx5MP/RBA0+vhGz6c5nA72tKP\nRwMVq8hnZdZzCtpHuBh7FMHBErUb7vUsWU8CGdJ7+jLzuTb1K5CFOE/P2Oc4\nmIYUrfATrrIe3esQ0gZE4Re/O/3Q9JrxutBiI9wZokknlUtkL91mplh0RzDa\nnxri5aDOGuTu0XbI884v3CCYStvrfqoUa6zCHKyDdslYEmJ838wyBxVpdzUF\niHqEh7W3jPls7g0CthDr7YCGjnx1hCNJgpp95MwXKhjZbN0b1N8xgN410DYc\nY4cRRD5uPBymH92zyFhGs6ytomtqkDd5EAhCuDq3qBCVjmCJq+vqXvJ4VsPh\nA0VWKkOpjtAAjf5x/uln72xuroZLSczavzmx56Lk3UxjA8pzC6B9xAZkzWbY\nqYPq5GD1kt2h/T2slqj5RgoDAN5prOdfCsNFqTzeM50hKUUokrHTucAKXCeb\nfhI+BnrujgxORVhEw1pQhMDxiRIgs2gVrCiEwIXvLyFdKK4RCVCpW7SD6TYv\nLYGcog/Rwb9SqHTkh58TD+45KxXNxXQoQHiUNjeQHJcHhsybJaWxwr97SO7V\njG+JjHzq+xnYelmLtbAjuk1CYc5jebd/P7GgmkNiGeBgj1tTMeTo18YPjNhP\neLdTz5X2RVFRlB/EnEWGgrwSklXShNrnRIaq7i/KSnKNFvt0ID2xOl/1CoRX\nopbn\r\n=rq48\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.6","@fluidframework/sequence":"^0.27.6","@fluidframework/merge-tree":"^0.27.6","@fluidframework/runtime-definitions":"^0.27.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.6","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.6","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.6_1603476556778_0.9450501609068085","host":"s3://npm-registry-packages"}},"0.26.9":{"name":"@fluidframework/dds-interceptions","version":"0.26.9","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.9","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6f1b37fbfcb2215e29f695ca3a3c1f28b3c3a82e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.9.tgz","fileCount":97,"integrity":"sha512-/93OZ+ibolRgUCZaR136N4LKThJnsQ8ICGA1m6iOw5Rl6mHSHz1mgOMBc3SHQyqJsOMEuUEop7ZRUeA1D/Ev7w==","signatures":[{"sig":"MEUCIG3l23l8LpFTV6/z6aUbv/9KBpYKe64XG7pUHLgcn4dtAiEAq7bRO2tqPknSdepmqwMQm9EkKB8djXC4LH2+2Qv8J1A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfk19pCRA9TVsSAnZWagAAeRAP/jynj1+pP60t+tjY1369\nYp/eIDXn52zT0Xx3ZvZGKAndYAOmBTdN5zZUJJGldbk5qTJwjvAjlOeCBcsz\npiY+3g7KlbQmHl8qWTvhaOHDEwkN0daSNkAszNA4p2X4/AYea57ejTYDm+79\nFLCRkgfC2S4twFACBOiztVt98O89JlqWPLUjbGvbFp8hUVODn7DlPUwQyHcp\nA/iaLStGjxs063s6s1b8uFg7Az4q0yIB/fRcG95uHK34/UVEgfWI674UgDpq\nrOk2eMGSGtdOHU8jG0T8ym7+QgUKRPi98DpfLJLfvWkKM2BdKQeVPC/J7E3D\nULl0Lk3rdVzvC8lGtduxgoOkNycUc7cm2lpSG4qDhVJSUdUX580CVs+vFB98\nyiyo7yo+tQGGM2GWgUgS3Xh9nl1/uJKtJ9KvKbN+L/lmobHn6+o0S18hOEGQ\nqX/TNmgwFT+qFNPP3jQlXeg3+XMRebK85cZvyfora2ydP9QPpxcnTrNahsrN\njGuvV1CdE826Vv1LcCUdYWgnaX/3coyOtBIAFu0jurAK9FxfBs4bFJg+Pz6Y\nOUxZVAAqYDD7W7tXHIHZMBqgsQoJbxfZMdQmL/tczofvQjDnmlB+ViDcU+An\nlRG+oQe9Hr6wdPlBkaIdKt14nkDHu3hEF+dO0E2J7kp1bNokPWDDi5X210Ef\nhzpZ\r\n=pGSt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.9.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.9","@fluidframework/sequence":"^0.26.9","@fluidframework/merge-tree":"^0.26.9","@fluidframework/runtime-definitions":"^0.26.9"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.9","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.9","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.9_1603493737434_0.3404531915174498","host":"s3://npm-registry-packages"}},"0.27.7":{"name":"@fluidframework/dds-interceptions","version":"0.27.7","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.7","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8405804471eba7458025f26cb26595ef1ded7172","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.7.tgz","fileCount":97,"integrity":"sha512-5rFpF1/9a39eHp/8vURh5lDr2eXQdrbLJjoQWa8fo+V6gdekrtejzUSduyz8X6APTjAsrRvh9aXR+CKilGFGGA==","signatures":[{"sig":"MEUCIQDIu3BZpe9nZZIuDqQaAnvYSYifQjavl4Y1+uNojHw1ZwIgG6+yQMxBKtUZLUpL01aAvw7lmvFDbba/ExtdLagQP+w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfly5oCRA9TVsSAnZWagAAhyYQAJX4l0u08hg5QRVccS9b\n/7IHBVZoXNSyiFZxAzJkm6AiUdUTsjY3g5j8/odqFsOQy3gIWAJmZszB9785\nUWEd/9ZBAKvip1ZalHtMkKPSIK7kMlIOIh42wrzr1HfBfKr3PBCr85tHqrXv\n0PmTqiBuvqejuWvrczLGziDPI5uIM8Db2Y/Y+eG9B4FhEEPu6/ntwBoBMmUq\nN0qYv3R6KRYRZSDkiCvISND/EY30a/2ARaW+tVqBXT3hOb4CTzhM7t/i/rp2\nOq5ILZO0SD4EHa7IfPclL23EZeKxGAfshul14wIW8JRTvxwPlZPPPV92EZtx\nXU/QELR4A/NvZ789RVko6nvixCyWrQNRDtdMvgouiDHqWSy8n+icntHGT5oc\njYGHRnSUkDYr0ZaYU45/RDufUD7W7jlsMb5wYMRg9gcDJHf3v/sF8sTtsAtX\nQqZoUgjSEmgaPTyR0UcpKqya1YoxgAwstj71yIxL5gpHi4bl0GEWy9qPCxMB\nYw5NwtvpfUi1o7T0P7C0UzaF56dA8n0e+Kyohlowjci83Tlg6ovpvT30duoP\nfrZbd6ZeGtqVpL7xo2RDRZeT8SIYZjVfIsgYG8AsP0FIcLXh8GictRT4sSG8\n4Dfz0XyOLe2yHkMeW7vCcD5Xi+3q/Z3qKD9RotknfElJrcBo9tOCFWQP+p7x\nHSeW\r\n=yZRw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.7","@fluidframework/sequence":"^0.27.7","@fluidframework/merge-tree":"^0.27.7","@fluidframework/runtime-definitions":"^0.27.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.7","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.7","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.7_1603743336379_0.7018340248114188","host":"s3://npm-registry-packages"}},"0.27.8":{"name":"@fluidframework/dds-interceptions","version":"0.27.8","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.8","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"89a6610a0f7d60c93fc8bc937b9a47ac6cf81290","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.8.tgz","fileCount":97,"integrity":"sha512-OtS+Fcz+eRDfJUQuO1TBvJa56UhjNmMOIya/PWdhSJ0qnWeb+eg223xHVa+lpQbCAnNjiVvvwyBu0taLe/bDhA==","signatures":[{"sig":"MEUCIQD+6r8Bw5x7Fn7tmnP4N/5sd2JQFO1HW71nSe098x/7LwIgN6lUmu+OvoNwpxb6UfbvCxip7o84u9mrz1sTb6U3tpo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmJsDCRA9TVsSAnZWagAA1v4QAIV4zJEK74anst5M4D2p\ncqeFyF2oC+cbiDVBGdp1/LEa+RXiUo9RUiddSu29t9zA7iWb99+6xwe7Sac9\nKKKRA9nBoHPD6TGli1bOHfu352OmTy4FWLWSMb6ao66KWH+GtSupu2xb8hsE\nDj+nLx38uhKsUarqyHOCHgN3HYqGnTkp4ZMY+N7yYT6yr+hgj6jrECdwo6z/\nnKn0iacEbWEpwPiZmGOGJWeLNYMm5hzKw0FE8qZwR47UoQKymK/hXSXa8WN2\nzelIqYXzFuRXSZzZsIsK+w2TgAfKKoiYT/q3kgMk1NYfFu/cME0Gsa9ADW5D\n3mNIDVWP1Fqu88vRb9A2ruILLwcasjZlrJniOZ/fAaYzTqOvvL87hL6sGT2h\nsH6lQO8dtCQhi7B4R77GXWwWDX+iYJICujp+lRPu3EsYm9cYiTbpOsl3by2f\nhTnqrb+MR+7sYvIzQkSdTBFm+yeQSnHQo6Ug+xwLbfDSzL/QA5c0DBwOR1TU\nIrfCOAUnT6vcE2BHHGYeTj+Hp6+5X0bLh/dGOU2W1Oh7PXnQUOFQ8OzsclNa\nLTB1S+XH38claOcPVqroD2G+MFvRoGpiNoPDkBEV6tknB/z5fZ4RWbdYXknL\nguPPCsn/mCmh8DZ58LVx2p/24qdfB3PWX4heP5A2IEvCvG4UzYfDobkilSyk\nSGQu\r\n=D4bO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.8","@fluidframework/sequence":"^0.27.8","@fluidframework/merge-tree":"^0.27.8","@fluidframework/runtime-definitions":"^0.27.8"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.8","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.8","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.8_1603836674915_0.6330199105233971","host":"s3://npm-registry-packages"}},"0.26.10":{"name":"@fluidframework/dds-interceptions","version":"0.26.10","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.26.10","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9919c0c3f9c5de6209cb5a945586f283e838179c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.26.10.tgz","fileCount":97,"integrity":"sha512-9bMQ5qnmD2uPaLuP8Wc0MNuSZZyllbRLk4IQuWmBgC/2L7L5EQ1LLUit1m4i8vAURcN+ZJ+Ic019XFokxK0Pwg==","signatures":[{"sig":"MEYCIQCI1MH5ZEuj9Mm0DSDWJvyp1UGNCYpeQcO7kx+X64oPjAIhAO8m8i7LnYB6sBMs33tKYhREILLYasejluxDikqu5R/b","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmM0sCRA9TVsSAnZWagAA6DMQAKI1Oh2wZHl82od3Tgxc\noicvQp1cyTYgZOKXRgfkWhdFgH1kVNtlzb/HVkTpeATIN/ejnfmNe1kulvQk\n+HMDxvltYHjHlipJbaq6ucUqgDotUWm+6tA3Q5I5vrOSh5p3AY9OxrKsdSZ4\n9ingu5Mut4ZXlNCk+ck66zXXxT+ofwss0eVqKU5nJ1HGx4bzvhP+ArNo+UGa\nqlWPUeb7H+ChfT40AxsoMg83u8P4zMFQkoUfa1uDd9sPLYQYGvawW/BNFEme\n9OPrGHY21ECXezI/lBc114+zTejBject/Ye0qWZ1L0NsBvpd7VqPVdvUnZFE\ndT9h6RMSU9lwMaV9mmPYWDVXe91K+dU7hysURlMRkwcOShjWkBVeGu4B41tN\nHhhmXkllJJ2HSvg/Xi5l8K8J9rdDboMdPI2evkavTYf3VdxTVOkXQUCmvUYd\nS1c1f7clj3Kz2OOJFdf14W/JgEbqpFTKj47kusLS5dNvgft2OlMFL7NZzMAK\nf9P8Wx5LxWFpFzcHi2/lGwjhwvSn0fxYQuTZaI9grC5fLu34fJqvhWkOdUtS\nVBD8j547nhKi9E28SLxmuJhvaGkmCfqLZlkjF0uBIMeJOpdAsYrGjuwzPP5A\nIYF2l1tryJDNYcj31RTzRiewk57W5n93asNRzy2FoDzhpKzh9wuy+lNXLtc5\nHQM0\r\n=ayFH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.26.10.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.26.10","@fluidframework/sequence":"^0.26.10","@fluidframework/merge-tree":"^0.26.10","@fluidframework/runtime-definitions":"^0.26.10"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.26.10","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.26.10","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.26.10_1603849515771_0.9070642570085234","host":"s3://npm-registry-packages"}},"0.27.9":{"name":"@fluidframework/dds-interceptions","version":"0.27.9","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.9","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"50396237736a84753d1431a3e3902c69959f6b5e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.9.tgz","fileCount":97,"integrity":"sha512-kkchj6UeOT+l5IXxa/U0rfpJVWXtIIQEn5xT6W/ZpsBKWpiknVJidMSfz4MgK89fqH83O6SA/YKMvn1y4es67w==","signatures":[{"sig":"MEQCIHr59Qfz1upMCxutiKPhuqvGb2rCHVGNTgMOK5osOp1yAiAznDczHIkUo84/uNGyfYga2Cztk8TF/Xo1mhET7z4hSg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmyxaCRA9TVsSAnZWagAAoqUP/3LJeitQ+QI6B+XnwBl2\nQVZCsgaI3QHr1vhItQlQeYYccl9MEoQi7X+2QHnH/vB8f01nRfcRjkHRV2X7\n2vy+N2rrAzzOm5Qd/ZsbNu8IF2yF5KKOFWUhqSANA3YP4opSHVnau7naZ30Q\nTESsYcnhGib5DHAFjEK8eibPAOspfe88lFe8UoJUDvWgl/xOAG2aAQ4QrRuN\nMQD0n5SrDVrNQAKeI66+ZAkIv98hehnoWWoYxN6NeHS9MBnK8khW5h8sZSsd\nTi2i0RM+voOVwyZ1E3iTEZbYIDuiUviLw0q4ZkxsuWWvWItEBLeuwdtzhbBT\n8MMEY9NiUC4rfoQqCYVzuVPwcUR3H0TssVvgBXFAbdByghtts5zEBsD+CT8j\nMp2bW4RB8llY6lWOLirEQIAeGulFWu5o0sclw1sOG2Vj4LMNHXvx3IfYhwOe\ntMvy6jgrZYSr/UtpcuZgRr545VEk94c+jMB+RkmSEwfsAZJNgVIM6Gpl1/mN\nZEMyXRy5IuSY63uT+HiCJb5v/KlZd6ExuiJpw8yRJK+yRNN4IpSFze6EpmBh\n66NfdA1Y5Pmd3CnKXWbynPJgZ+mNR6sYM+OtAr18KWSubIE7CxlebC8kjSKO\nIkM47Ni6O1cthr75bLgoOR6UlTtLfhyLOHyXxak/LSI1w/X0fhn141h2dTYn\nJ2+k\r\n=jUHw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.9.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.9","@fluidframework/sequence":"^0.27.9","@fluidframework/merge-tree":"^0.27.9","@fluidframework/runtime-definitions":"^0.27.9"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.9","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.9","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.9_1604004954044_0.5340398055302851","host":"s3://npm-registry-packages"}},"0.28.0":{"name":"@fluidframework/dds-interceptions","version":"0.28.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.0","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a1785281c6e398e6ea94c4c49ea917fc29ede77f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.0.tgz","fileCount":97,"integrity":"sha512-hWzWdMZQn4MkUreErY5en0RMlxB6q4q3WxnB9sEVVDv6j3bFI+A0qa1m7Z9JVyZJND4YBd69Wluoh24h+i4u3g==","signatures":[{"sig":"MEUCIBGvBTj7+OapzAoRAa5moGoPVJGSbRkz2VEB1GlP7semAiEA7KLHrXfnApZEhPb6cOApzZw0Gb0geEO/tv+7IijH8Oc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfnDc1CRA9TVsSAnZWagAAwmEP/2+Fq2oWP2KSWjKBgWnD\n4Xe2E8QVbf/Pey9KLMFQ4KHTuoXpbWAn7pEhhVtb97I9bY4/23HH2/gHiibt\np5FjGtEbmyPeK+6Z1RM2l8z6O5A7QUhsImi0GMiAlIBza3Qz4BB469/pOlm8\n6jhVmrWlklWRqfPahiuS47yxBlY1iIngF4HRLznq5HFaWW6RK6qfXDNY4DOh\niif7RzNcRQK2qgSOsNE2wZs+lQtSBCtu+ru4lPOUbhz3USNKin0PDd1JB3GP\n906rC2NdAup/NyfNl5qroQL75jdHPPX+D2z2rfPXBfRsaP330pZWsCpoafbr\njKFuIfVUxLr8QtIpWevOB/ABnZ0sd/bw3hb16NtAjzxTmF9PuHHv5Kz12dlU\nB+bhMDjYMdW4M9Bus6tQxdJC/1peHZYFHEa90kkKsbEriFIMORvHUuE/6snd\nzZMpz5dnZSa3TDpR7NAKhsVRspsBlpivPholL+lJcbAJIsQfRBKfAoEunmhp\n+b4duXi85aoYl+1KQdcNqny9rLvtulG5bzuYS5hVJi8bMsncByfEd/UMazzR\nIHt7/PR61TiqLYmmsFZRXyTSo09ecHlitrilRH9Jvct4H9bvWtx0pnP8rdlT\nNcIF0izviATAx8c7Pv+akvXhtx829+YAXPxdUG7dd1Jfy5gjKRDkbGeeUEcf\nJ0yz\r\n=DTZ0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.0","@fluidframework/sequence":"^0.28.0","@fluidframework/merge-tree":"^0.28.0","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.0","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.0","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.0_1604073269124_0.9479388195844745","host":"s3://npm-registry-packages"}},"0.27.10":{"name":"@fluidframework/dds-interceptions","version":"0.27.10","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.10","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ad5427de3072ad703d05cc2bb0dd67fd10844537","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.10.tgz","fileCount":97,"integrity":"sha512-O0AU6Ax23mHECD1h/QDb+RXV4BwsjdvasLjy0euswokt2Gbg2Z+gekYtblw+NaubqOe5n+rGfc769uU8XCqQRg==","signatures":[{"sig":"MEUCIGPZL+UarKEmDFoS7IdEGGRwODzVWizCPcxkJIuvGrxgAiEA+FBFs2OMY5Lyb/yYugKZ2f6aI8gvI4LspxoRNzGb7pw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfnE2+CRA9TVsSAnZWagAApwsP/1DH6x22uGy6HSrmXJ18\nRS7bVzplMOKMkfIHYMzHuekYrW8/t6BPWXUXaLKBBj+YPYcMKoPjFqcEkGrC\noKMNQ12TQx2D3l/rUzTNUZ7EyMviZ75CMZQQiBWXQ5jUp9EE8hv0y+Z7wqS7\nShz0KJOKDHofnh7RMR+/EoHBl5dGWrc5v65mXVkR3qhVxcnUwXUR80dRX9Ca\naRiONycKHePyV69LG/iXJ6QCVG8jhvxSja9HamsWRcHvFufx0mtuOieisngr\nXR5X6DEQiAQ2ccA7NSQtEbHwiVhsT4BvvVHuqesMnUh88Nqo5YwBZI7ywsYg\nQP4kQgrRMCOlka2cTwvS4FhTmdhAjfUjLYqHai4LdxmLxe7uqQUlG3tzfAR1\nztIi0ZOiygCXIi9GQ+/izia5opqLk8MobPRMgw1u504OUZJT3ahzrnUAkGcq\nqoIEsCtgXRxlUl7wcTWSGpVainhRtn6T0A3HDT+LWmUzw0V1TgeywmxNFSAX\nlcedxLktk7ymEhixauFZfhbq9zOHc4W0SwvYKDh9Yj4tIwIvwar7PKeTVPWL\nQFSfbuKuM1FKfngEv9xwln5/R52udUg3PgUrIrPbKcvspD0KT5uPgqceyGEE\nXz9vVmQWDJJJ6mt8dFXu9JIdgleb012f16qdvJdnvHsUCwPugJK/fnnAgsF6\nqtRh\r\n=yh1G\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.10.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.10","@fluidframework/sequence":"^0.27.10","@fluidframework/merge-tree":"^0.27.10","@fluidframework/runtime-definitions":"^0.27.10"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.10","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.10","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.10_1604079038433_0.37695796266514225","host":"s3://npm-registry-packages"}},"0.28.1":{"name":"@fluidframework/dds-interceptions","version":"0.28.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.1","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c1a7e8709006a3a6e85bc04453e617cde536556b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.1.tgz","fileCount":97,"integrity":"sha512-btkNBD4fuiGGcSWKE+aDBTqcwovJMQAMPkjBfkEksse5xMOxCh8BeI5JjAVIyylLGghvfrzVWxc7fDFUdtY8sA==","signatures":[{"sig":"MEUCIDzHWc3RcVDiHdjUgaw6dJ6mhfwMJRDBAfIFALWGiNKlAiEA/HfYmihjtAbf2vSdhFCxnnzAow780Pm9lND6R5EFSzU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfnJVZCRA9TVsSAnZWagAA/awP/1J8q6q97SPtIySDhiWR\nGL5aOEw1Q9KmpA5QY/uv7Fk0G8TyIthP9Ap4RoRmTvlVXB8qiXKAq0Bo0ChN\njE0EYjLR8feryawAn2R6Fa4ynasAFKQ3Nfmhf2xvFJ4KNJGIMQg4R7anhVoY\ntVAYrfuItwBnW39GVM0jJf/ERozbqjGFzmxvsqpReiQEiMDkt2ZQkEu1nlsR\niK5SRvtLPxxvDiahpy1oq0YtQITnttpC03G4uKFRCAMKQO8rC3dipStmwJt+\n9AMhxosuwpfgVaIhN+qA4zhFpAiEPOyK4CjHK4VBfalEQghDMyEc/rKV/EGM\nMR6mdAa1DinTq8yjKch9iKB7FtL/A++9Pur8tWQvI6TLs9+wqZuL+QpZSLeY\nxiRIPmhqwWElECrrNNZVdsha+rpOzKr0rAhy/TInw+Yi5Cc33Ste2z+9NSyU\nx6Mf2OH9rewzC/cLIVHPQhyd99hSYWlelvcQ8AhQXOqNSTaEyjc8OepqIJ5r\nHBm2JkDV+q1llb3ulJxPzpblb/u7jvfQbPGxby1tDRhSw9S9INWk59uGbmnb\na2D5iG7gEXjFco/ldqQxh8tXmvSmiSpvitytAcWGsqQbRd+UF550TKCLssJJ\naCfKR1lOohkXjr0PKOinopC/ijl3jp39A2JVdyhqfVNh2mkqGskHJ81WE461\nBAZx\r\n=9VPF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.1","@fluidframework/sequence":"^0.28.1","@fluidframework/merge-tree":"^0.28.1","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.1","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.1","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.1_1604097369198_0.16475135592451773","host":"s3://npm-registry-packages"}},"0.28.2":{"name":"@fluidframework/dds-interceptions","version":"0.28.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.2","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c5d3f7bef9edb0ec3ff0609c6ceb4f4cec3db062","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.2.tgz","fileCount":97,"integrity":"sha512-SK4c3IfrhbVh4AhnEKZjaUdz1KSyXd2JDahYsqmY6IBAJ46gbWRfjRhqCKezJUPsUK22s8emlO+1yS6nOdeh9w==","signatures":[{"sig":"MEYCIQCrleHvaldgDjeWYPNzvNmaLCsAhf3CEsvjmT2mjj5MGQIhAKZvbDYMUgDP039YnKOH77AeIIRC6MSUB4sEUylIUF8F","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfnLPOCRA9TVsSAnZWagAAoKIQAJqPyihoFUYmSo/8JXQK\n589WBc5yUUpaOlQWwhOcIEUaG3FE3oXN3d/fG3l/Xk//DUASWEH1X6g6XMyi\nX3YGcqOjVuLtkS3DitdbFmHz6RqHkoq9oXFsQZqXU4L2Hiuqm+FjL9yBIk/Y\n0EUls7+2N8Gb9euS5LtqImCv+FQ11KcnBVfbSvGVAU350oABp+YxyNuuAkST\nKMqEiOuf5ohDRTrDc9g0ZH7LXACjinFjlQ6RDW/dsiJBibhuyb2woGYp8s9Q\nVjYCd8Lrs/FB1ZTYLkrMklo+V9QRNNT11y4BvD2/CpeDNNMkCm22U4Ip/CD7\nBMDiHQ/pmIk3DW++XjlgiqLflFaJMAeCl5xkBytEAWBhFRue2PhVZHpn12yf\n/Kz9CNNmY87s3e5fANJtdEujhcUHQdBh2ao2fxaQLrat+irhWBeMGPYn1K4T\n77zEThDBuQBGqsC5AIpMcOszJmQRz3UquR3y2mGeAaK9em9gjGrxqXpSoRNI\niEaP172XHfYByNNTLeHh1UxzUGTrFaJ5ViIwEHSauzb1xQfll+iSexx7JoDm\n5QljBJosoY3WqvZYEocvuwsZ6KML95ypWNBOPIROQLu4NglPDWGy0F3kJHMt\nyjxfbcTV5bnxds3in6EGeF9A+iq0AZak5vB9n2AxxDqvaBxKgeLtXu8IbPgV\nDdsM\r\n=yju3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.2","@fluidframework/sequence":"^0.28.2","@fluidframework/merge-tree":"^0.28.2","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.2","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.2","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.2_1604105165954_0.8119029270900713","host":"s3://npm-registry-packages"}},"0.27.11":{"name":"@fluidframework/dds-interceptions","version":"0.27.11","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.11","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2d62d766de34848048a6edbcaa17181d194ba632","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.11.tgz","fileCount":97,"integrity":"sha512-JEWXcMGaARk9h/UGhJZi/rMZRxlLjduIpld6ZLGrNjPyi1xB9uMAOKCb/LMly5ti9dsBUt9zahgjwwL+7DH4rw==","signatures":[{"sig":"MEYCIQDrhqBtCihvFCHf8jWWdlPQ+dV6e6AuAR/eXmrlfWykAQIhALiUDS/J2+K7x+CZKrJCo+AFlZXKy3g+YcdPHFMjjmGU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfoIP5CRA9TVsSAnZWagAAUxsP/3Tt8WFCvKW+mzJBzqEl\nubKGlA9mkU82CEbqDoI4+C3GbkL+x3DVixB1RdKVu1wlcOGWOf+eL6XnxFfU\nyFDWLY6+Fhw4Pp92lTHwitqAVjmv35NzlMfl28f4FllcLVXw/3WwYqX6HRmd\nNAD3i5Sz56oTnqXGlcwDTUXvBQhcfmkn9uvi7BDRFunjh7/4QW1YHgWzzunn\n9UY9I7D7EODjBsmLGMUTaz6BRtlO4TOPPLIWim4g+SAlhhYQsTO5QSHsqs19\n2tOUKgsFFHyI6Ewli/bgTXMUI4d4mv4z+jcSUqrqRhwYGskt7d8xL4MOe2LU\n9DMe2gZhsgf3cfT3S41WjkD8L+716zjeh/WVULg9BLjzP6PFeD1OpAAnlKrS\n8d7Z/lmA5JFCWUGjF10EaWw4qhKsVQbp2b/Zc17AL5z0PlVCUYiknSp5/eJe\nc1RLQTRieqlEJf+w3Viqqezyafg0UoPBKvtodQHmxD5rMrS1daDuh8MwnGlq\n9cmhdR/36GiKsHtx3EoeBR6wpHee2MwLTDlib6COscRx2CRDIg0MY0PDNTT0\n1U2YWbdpB26/E3M0z5rZFxNWC5IWjfiU49zWRXsNZFjQw0rhoBYCGRyAvZTs\n1rln2P+Dm9fCEx9JYid/J/onL6NTbrfsXq2I3W85uKjTK/NZwoE7fgrhqi/n\n/XTF\r\n=A8fN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.11.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.11","@fluidframework/sequence":"^0.27.11","@fluidframework/merge-tree":"^0.27.11","@fluidframework/runtime-definitions":"^0.27.11"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.11","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.11","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.11_1604355064983_0.9707686463258263","host":"s3://npm-registry-packages"}},"0.28.3":{"name":"@fluidframework/dds-interceptions","version":"0.28.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.3","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2fb9043ef631f29d4887d5b7b1af62eaaf9ae352","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.3.tgz","fileCount":97,"integrity":"sha512-ajEiSFP3OaMWraPJPJaQieDgJdcz1iMRPoJB4IbhrfFBb23L/MkvK3IHzj/y4bE3O0zohpsHoLcefIGBJTGbmw==","signatures":[{"sig":"MEYCIQCLepM7bHtCgnSE/vhK0issrw0JvAZLA2fpRDmT2K2MzAIhAP9v+XPI8oITXS395eHGIz1FN8lzcDG7APtfSaZbZSnz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfotFJCRA9TVsSAnZWagAAJVoP/2eSPOEUxxKUn1Mc/h3F\nfMHj7JblRTYMDcdYgEiqcAioHqoI/a49QzYztkt/FEbs5ovB9+Hkyyq8wSoY\n9Th0wPnSbP/eFdVRdK+BoPOED6/d10Rsl+4DHjv3uyHqh60R4pWOS/O+ImrQ\nxCNZ4Abf1NGILqt18dJR7DWdql1gF0j+nw/uglhXHImy5g2bfH8wEwf3lLj8\nsA5RJ53kIuAsjKoV+k6cYX/H4d+mJFEv4JRMslWOwSW1NL+vbQjtMiT1qV+H\nmJbcra1rV05CRGq2cjflSOqFwvkCbzHdYWa/U6QzFSVCL3VCVpdX3tx4R7HR\nI98ek+3FWkKp56QuytSPGnlhVP0lWg34AObuqkrCIDOejhxbH3ocYSIJo5mk\n/aLPziJ74idV8lClSemJkkyxiP8uLS07sr0AxFANGdDe983A8Q9rQje98EvN\nqmYf9VQLUIxSEghsdfNcALugA/WTQlVWTcqveEFMhP5K9+rSRci3KA+XfPR6\nGYpVMoOZadViesPnQOtHFjFzX6awXwfu0XNbvzwoX/DjoSQ97Y8+ks8XchoH\n9kdKTA7lYpJ1ZEBuSzHAIDfKOx86G/BLOBF5KrZ/h5178NVicQ6RmZzm7xYg\nsJF4uxf3FDbs8KytpGVZPVW+mY1uPsfSCKTB/5R4Yvukv1JNB0NOSuPB63QG\nWJyN\r\n=79eM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.3","@fluidframework/sequence":"^0.28.3","@fluidframework/merge-tree":"^0.28.3","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.3","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.3","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.3_1604505929219_0.24532460568293546","host":"s3://npm-registry-packages"}},"0.28.4":{"name":"@fluidframework/dds-interceptions","version":"0.28.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.4","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"47ed1d96c42671ec44c9a8fa0321e847bcb3ac99","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.4.tgz","fileCount":97,"integrity":"sha512-fiE/aaf9RgGoM6c4lgq0w6OPO03lCcYZbkUUgk6OBZX3RioZ1VxmfHa7VgMfrJ6JVav6I6tPJweGiR1gXXMMCw==","signatures":[{"sig":"MEUCIQD8t1rtGgOl2/rQXLq1++FuYMQv1dSX6YJxHh6dm2rqpwIgBRFT/as4WJXyqmP29aMj3wk+UalWVFSAL1b+lFuuIso=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfozY5CRA9TVsSAnZWagAAR80P+QGQRIR0TPT7EMVgAQLA\nPn/p9bjds5ZKLXJJAjjjAFDeV839xvlGFIfYtrk2l0YKLSgrVjpayhqUFanb\nx+3/WprYhBmGPwEjxVQCsMCooBeXy+Trfg3XJFGYxxDX+NyC06uHPzqmdrnx\nMf4KJvEmW9j0iWj3AxhgvTkDpAuRVFcrrb/QGKGvqGkJrvgxMTOYj4/RztKn\nAyyZFCGv34VdrbhqqyM+tiMNNliDHzJFEQf4hxmpSsWOQtE7c5dz1JIRX/Zq\nvEJ79xf9GXkx70WzS9b8yISLLDJIvzYJUe+jPqnbxApmKzvbicwSjfcb2d+M\nvQ/nSQ8r2sPvqo1YBwleJL650Fwj6kx3ZEpG1XPMOfQtH/4dEanWlJFNJnqR\nwCOWcLI6a+MhVZX3SFz4D5LhoAIEaYqtEcFVxkV1y1qdI8mx7kDdsUDpWv8O\nkGGvfBTeQpuuEFGWkEJoJzKvITC/RgWP/V9J1rMmhW5w+tamjf3u7Vj+9K4M\nzNrNIhC/7ir1L33MNiYszQbvoPyCAkOSLKd3Pr45pwFsNCx86VARw/ohXXnK\nUumMFZQb7/9f24IbcS/QhNNaNbADMlXteLF4Mm0hKFQyYfu7zMa5D4JpTBjO\nj4q039HmEMRHFK9Sqx6KA7l2Bk4bxC+gtd7vQ56LXbbICMheSivc24u2FVNd\nszz1\r\n=tRV9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.4","@fluidframework/sequence":"^0.28.4","@fluidframework/merge-tree":"^0.28.4","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.4","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.4","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.4_1604531768647_0.9306596091183694","host":"s3://npm-registry-packages"}},"0.27.12":{"name":"@fluidframework/dds-interceptions","version":"0.27.12","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.12","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9e43103367ecc4597863a53e8df9de9df4027dfe","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.12.tgz","fileCount":97,"integrity":"sha512-qi3PijBYBTTdwt65ssACzMA3N2K4mX7KltjT01JA4JLiEi6uWM0KbTEmQPL9CPUmtF7hHBWs8mgYWld5eskt2Q==","signatures":[{"sig":"MEYCIQCz/qr1Ld/+wEIHBO0+MMThd+Q2WpFZ8rqpxU55ZJ8x8gIhAPHcV8BXirFSEpzKcMx7pEiWrge9hlRgtkKIjyfYjxHo","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfozcqCRA9TVsSAnZWagAAqdYP/1M3dAvL3P4mISECRgtg\nw+5ZXHZ9Fea4IHNsPD4G8V9cMkKV338njGfVcow0B+0I1n6FhyaHv50gZ+U6\nUORFBYgHisPrnvwe8HKa/n09CJ0uLE2LbWQxf3dgfA1Z+XP4bviL/GGfEfP+\ntTWBUUCsJ7jz1tzSbDRFjfTaUQSDa4T4EpV4NvMaMMXiYZavR1XZ6BZFUilG\nlBjj9tM3GLha7YDr9a61Ea8TxYwLq2p9XVyyEW7kU2Bk0C+3lT0rjSPDQrU7\n4xyDjjzWm5/r6Gl/hl9UElEiJtwlkEJjPpPOb11YTXCHd1N8UjJ5Aax2zdgt\nFmsAzk3sHtaxKA7GP6Bgn2QjErlzIrd2fawMwabshKA0zG21LMsNlnYSH49V\n1fIQNa3dlHMkXDNRedVzmb8+7/l5gTMhUC+2QSaDv5E6q2uf9xxLJ6AW9vmU\nJBjxyW4DkMvu9dgh2Mkwp6L7BvtCSop4/q3jf9eekqs24UB6AedetPT1NSGX\nxjB1KG6ybRBDXfHi1DYatgkZwVOlTokm8ZAByrNkmEz0RODj8uYc+/8tDWav\njZAYspa/wOmFQlOZ1nEPDPYdyRx4PwKLKHfQx5SkWERob9Mx1CwJt5K2YSSP\n0o8/9kboHtzeUiHm1WMCpP5k+qNePAwNHKOnqtUfS0MHYSkU4GiEA2N7+b+J\nnJm4\r\n=Mufr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.12.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.12","@fluidframework/sequence":"^0.27.12","@fluidframework/merge-tree":"^0.27.12","@fluidframework/runtime-definitions":"^0.27.12"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.12","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.12","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.12_1604532009815_0.39409494174512516","host":"s3://npm-registry-packages"}},"0.28.5":{"name":"@fluidframework/dds-interceptions","version":"0.28.5","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.5","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e6c6633114c106a97baef24f5334ae1a834383b2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.5.tgz","fileCount":97,"integrity":"sha512-BCfQifyXe1jWxRGn4tHsrQF87huTUxtL8ST6K+YbKZNilWD3PIh7/65lLJcjMd0/rIVWr0hFjoQNsDV9R+2aYQ==","signatures":[{"sig":"MEYCIQDRCphDHAOT4KMdM6gY9F72XllobZNKQEwOw0vcbWE57gIhANni4H99OWZ8aVrMvabuvw6vuIkQGUbObmteYPquaUj8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpH2nCRA9TVsSAnZWagAAuOAQAJSv3rfYbYiNzFWse8ZG\n1KliU7YS0kl7bbugMmtc4A3DgXfZFx7W2kAtbYhj2JVUyFcGCooS4KwETw/W\nuddmcSmtj/1kgXxCIgALBzmy2L9WsbNm6lmC8B/TUFTWXuRc5Ek6OOvzSOwT\nDOjjigpmXWL8IdUKPct5K38u0b8Te2HDg6IGG3ctz9GXq75uNT3zMYZvu5ov\nKPGeo3aucbm9OV2mhA/uWORmcLgOi/JYfWKvCSfVpILFlR+DDGG99CAuCJ1t\nqeDb9dbVvTURG30xZlRU9U90juhJGMTTarN78Uk8u6p0m2w2YPTDrFN5suxo\nSeXxSlQRYlPwbbrJJ1d6XvrER8Pq9OITQ6aY25zBm4GNtytlPmij99mZaJKz\nSaSR/W1iSNO55fubR9NPAugy1rc0hlstOFOwKBhR0tvXBM3G99c7F26mMI7K\nZP4um1f/cRE04Zw5X3DnZ37xop4nStGjVvdn8pfzJMqqZlwoCa/TbySoekOE\nRX6WA62FQi9md8UC2EBzVm44Tfg1MvqWc7NaEsiSYtMpxyoP2P5JX9oTecbH\nua+UTmN4WqexnGYEt8z55MclVxTA8xUpzCeVwIq3puIQDdYLFC/EGT+GDgHR\nSB8YIDR+iuTgMrtXkbppoF4isVs+eDRlmG7LZ+1PjrlshuvtpgemMPrlKOl4\n30bJ\r\n=0LeS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.5","@fluidframework/sequence":"^0.28.5","@fluidframework/merge-tree":"^0.28.5","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.5"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.5","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.5","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.5_1604615591143_0.43419969163207717","host":"s3://npm-registry-packages"}},"0.27.13":{"name":"@fluidframework/dds-interceptions","version":"0.27.13","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.13","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"95482b3283bdf92713a27883a3359454ccd88246","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.13.tgz","fileCount":97,"integrity":"sha512-+yqyxGzxigdeV/v+W7ZIAbaqyxKSBZu76gJmxHf7HSwatJU7+UiFd+csAzAGwuLROhOCGTknr/Zsy9uGeuRXlg==","signatures":[{"sig":"MEQCIAVBEPJhQidR5lonIGrxKkVQkxCNvQDWkA15yuP6eWGyAiAH8B7PoIqc6pV7PpUyEfBJxtqFsJL7NmqaXkx4GtSK+g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpH23CRA9TVsSAnZWagAACQYP/17HlcCAXd2urTtxNZU5\n4gAEpHkvmYSxoBoMZpmtH9VCiXbaE/OLAjpGuGH2T7OdT0E+sFFju72nKfOQ\nSPYGHXqeYhYB668juC3SpbpwwMJKsnLghZat607Xo4OL9qF+Ijj0m3x4bGoa\ncusIusmH9vFTIodo7BRSif+Rv4Ehj4qSjF+Z3xDNDUwmRHwJpeh563hulj2w\nat8tuREAs1zSj3KrvyfLn+VxOPtwziT+gw061Cszu+uB5hHnIbVrkP5AXjd4\nsImItDqI0Gt0Bt6TZPJkNJ4cgs4E1qREsLbrdOYHegjTqlzCZmPatPdH/7yc\nK8Rk9BQrh/RUVp160tCXSmslCvS0atAcPe/yqb4aImmcFdwk1PzXrBnwH99k\nn12kaevPLckV1h1Ydr73gOiiHsSdsWLt8aNs4/cyvU1fr/iSbwd7BGsYWGCE\nvk0VHFeXvjse40gpBasvunRIoKf/lV6zTk4S0BD60Yxfuv2wP1LWVuCt3q+m\nK7WAwJ8uLi62V/1DGmf4yYnIc24lKv2H0kdF6HJB7Xdu/nQ9hG/y2QEVhemz\ndkzVrzuVv/zuZd4z/64FgzXZu40e56tZYN3qTBbH5H74P4+bQcg+fUBZNzOY\nSXvA8WOe3PyjeUptTT16KPh9cT1iYiAZw06T3B/SyhPizYy25udrXMZ3icGM\nTGOR\r\n=KgdQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.13.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.13","@fluidframework/sequence":"^0.27.13","@fluidframework/merge-tree":"^0.27.13","@fluidframework/runtime-definitions":"^0.27.13"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.13","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.13","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.13_1604615607494_0.8045666329086045","host":"s3://npm-registry-packages"}},"0.28.6":{"name":"@fluidframework/dds-interceptions","version":"0.28.6","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.6","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4c6827e40d37353ea40936fa23b16e15fbd986e3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.6.tgz","fileCount":97,"integrity":"sha512-i9xQr85rH0+XEaHTzTbqkT+ZUvt52SNqfXks62ePTXYX37YCYMNd2kTfHSS0/RRTGxkOxgV0aT113gY4XEPM1w==","signatures":[{"sig":"MEUCIFwJHlp1k3msGuqJkEsMnF5gn0zNmdKdMQckZapZb3ykAiEA8JZ31iDSI6IJavyLIuPscMaHr/2+fVCaPMvXDBhDje4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqsntCRA9TVsSAnZWagAAh4AP/iTR5xt5pLjHDsY95S1j\nrTT9AxieWSMaSI5B72KBlchx+bQR4ikAV0PsTjG03JXdM2XvinXbgzm3Qkk2\nxuIIjjyHfxoPDrrapF1GNjNtJU7W9HFCsZaR1Ly/Fab2k8rPIgzv4u4qTcmB\nNfxC9RAa1pC7DLcr6J2BqthCjmGSCxSOpJMEZyCi8BsJcm5lnzZMNfzqLutM\nwZwxZAJPZwN/HmTU3tfrORz0v3X4REwaSLn4WZmsPhTyVcMeKMvsqMpZdJZN\niZyEZQ71jeruQV70nV+2Z76FNuaRu1JorVLbEdBacm303EkSi+1Nj2hGQwp0\nEIYZRchEj9aSZSE/ophjvWILA8eh/mzj7MXGvirNIz/v/XzOWFip6XYkkx6r\nwzo+NjsVScJkBMBxiE5WpgNTbousAingJ45Od5SNuZKo3hzqbT/upzYpop75\nRyw/m5KdJnySa1QWyilWArCwNtJK+ePfDIJUB8EyiPjvRNtep1+qsFj275vM\nkgoAZO6ekQxm4XWdw2RY4tXlix9u38duSx8ps6Uz0CnW90GwIoN8rlUSeWlZ\n2j7AWggJMQmYm3Bb5s5ZhWZibmxRLzLPZxC4JcAPWTE4fYkT74Yalhxe9Z5E\n+uTS4X6wf3a43Si1hwlVNVbgsTSoWvODs2iXNrPHhiyxUsNTH5MCGiZvS+uG\nu4ex\r\n=XHqf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.6","@fluidframework/sequence":"^0.28.6","@fluidframework/merge-tree":"^0.28.6","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.6","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.6","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.6_1605028333405_0.23769070042557217","host":"s3://npm-registry-packages"}},"0.27.14":{"name":"@fluidframework/dds-interceptions","version":"0.27.14","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.14","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"35ebd7446f986aedbe692655eb17a7950959d1d1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.14.tgz","fileCount":97,"integrity":"sha512-Ep6wHTFjoMaku1Ja3ObtO1I7dmtSlBROIhJgmmlJj3qN40tx6iI6dc61o7KIAcuvvGEN6Rk8VZ2EoPSfaD4OOg==","signatures":[{"sig":"MEUCIAxk7pE7J0cNWE6kQ29LR6rFgakHllRiBS4TLvGRVIiYAiEAz04sZzjKKIaShX15NH6iO2IIVY0dQmrJhBuextXyfbQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqt+5CRA9TVsSAnZWagAAxdoP/39ney93v4+deMkr/CLh\nN44RTO27aw62P58cBQtN8cKvdwZJApsCSGG4gm4IyqxDnmtM5F8qvnV+cxtu\nt1g9G1a17l+J8ClJm91T1CUG1yqtXcSb05W9gci3xZKNUVYxO+Zv3sPbHxMd\nmKt3HuTIZNgAlUjcXLt9/flkZZ+uiBsWyvKIdWLGBsv936AHs4R1Tcrh6avN\n1U2TEB7yBqQ58avpswDnt74HBY4clpS6mRlmVnoI79Zwqt1SwXuZwLLW59a3\nRHYGgku+UwkAMFEH9rV34QogEOIYUo6TpIw6ZctaEbxwiyEWeVYFOlQYHLZJ\neXsTBZXCVzsoH2p/Ifbe7aCo4AvozQil5YdKH88UT2Gg6yAlNBRrCPtIrP8q\ngXqdPo5sD/Xn+uBo+H6XldqunyckOo/hQjfSAxQ4PaupaWOJgxMrs1Zhtq2U\n6urxWA8YzoOgzC9yCeyA5lnaUEN2wGR0zdu03PUQxuxvDF+C3NxcuwLxAmXU\nFqZU9Ue62gkOJMDRpRF4fCnO8NcbUbuLFjQbRG2cgSJJIZx9YjI3wLTuf5oY\nuj12f/wCdJMMvil4Pw9O8CDQByvnVzluRyHIQTPJ9Ne/9XxQ0KItqxG2h0BL\nYRnb+rypI2Jy4PcZJnJYkP+kKEq82HgH42Rk+131Vs5shWDNphtxaeOG+qZP\nvzXv\r\n=dCmA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.14.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.14","@fluidframework/sequence":"^0.27.14","@fluidframework/merge-tree":"^0.27.14","@fluidframework/runtime-definitions":"^0.27.14"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.14","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.14","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.14_1605033913239_0.890259929325484","host":"s3://npm-registry-packages"}},"0.27.15":{"name":"@fluidframework/dds-interceptions","version":"0.27.15","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.27.15","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"be8f798f2799204cca7d27c7155e34360f123901","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.27.15.tgz","fileCount":97,"integrity":"sha512-NjKZfUtkIQ+ukVFVyXImG6rfyXZUl/xZH+vH+cWJI59aMI8MkkjetvrKl/HTM2QBIeTkBbCVTkKKwBnqL2+H8Q==","signatures":[{"sig":"MEYCIQDXxV7VuWjS36a6qyMZnvA9DtFbZWlee7TmzbUmrgWgrwIhAI2jKgm1iWNAodH5YAgPaDztXAmNSB/BOUw6Msjse/4y","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":336771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrHJhCRA9TVsSAnZWagAAQMYP/R7YlD9nKY5imn2nVbZs\nGQstN5pzHK54adbyRvHi7TT04KUUC30qalynyEJ3f9Cx7CNyhJ21qeHcTTUm\n44jmW+OOrLSOSq0ZKb2/yFD9IyAPA9dFOzW1cz846B6IYuvje16bV2HtI/cy\n+iwFHMi6Js4RTlnxFOZ73gOqMz6GOLkzhKg6LINgjEdQavJpKIoNdlwH/yqy\nxlRmbl0dIWRrvXJRehTjZG3ajAvRP4aTUSEo3nvw0ccN+QVY5rQoiDGONW4y\n0ZCL73Txsv0Y7fj8+NgYRB7T8dNojv0fXZ1ThC+NTIz3QcQ0y+kl1ZiommrQ\nfQhbGRXtyPESD/uvAAgoAPdrOTlxirIsU9Mnyv7JHYClEZ00vUl388nrfq6X\nrBncqJyovoPPk9Tco+S+6CuUqPMB15uu4QZyXMM4Co4W4aUo1ggn6XytSRJU\nYnqhxbwE71ePYkVRSwkzwkBwBU/a7SeFdbfR3ueJP3e3r7yVMgtfQVBw9C5y\n6I4u1HTMiN7DIGvAhDei9J4EvX7ZUWfh/jI7FbIqHpAr5lDEGUod7Pkd9e6M\nfKCYiBC1/ht7DWopuPmllZsoUw/SMKlGpi8yKTC0moxku2o9PtBvuzZ42YNx\ngbsMGLbzC5YHNxYqe2hNNugojL7EE+29VOsSUJ8uC1/l9AIp7RvK4d3iI+HW\nU8u4\r\n=XpPD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.27.15.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --ext=ts,tsx --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"@fluidframework/map":"^0.27.15","@fluidframework/sequence":"^0.27.15","@fluidframework/merge-tree":"^0.27.15","@fluidframework/runtime-definitions":"^0.27.15"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~6.8.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.18.0","eslint-plugin-import":"2.20.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~15.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~2.17.0","eslint-plugin-prefer-arrow":"~1.1.7","@fluidframework/build-common":"^0.19.2","eslint-plugin-optimize-regex":"~1.1.7","eslint-plugin-eslint-comments":"~3.1.2","@fluidframework/mocha-test-setup":"^0.27.15","@typescript-eslint/eslint-plugin":"~2.17.0","@fluidframework/test-runtime-utils":"^0.27.15","@fluidframework/eslint-config-fluid":"^0.19.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.27.15_1605136992600_0.998262661006345","host":"s3://npm-registry-packages"}},"0.28.7":{"name":"@fluidframework/dds-interceptions","version":"0.28.7","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.7","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"44decd361fb02d640454b0fb159922bd4039a253","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.7.tgz","fileCount":97,"integrity":"sha512-rmMTPdefc7Mh/UrnoPlu6hOweWc8ErQVZKGpR+1OsmiDQOuyNEJ32zAfvve6j7WnrLLC+WnedyX09zjrTHPwDw==","signatures":[{"sig":"MEUCIQCF1/1NDFO18IEE5D7w6KuBtn0He34yKlnUS7dqHFlZ8AIgOGdHiRZpYv2pjOhVU2iPn34HnmR+9YN5og1NSNo9Lq8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrH5UCRA9TVsSAnZWagAANOwQAJSzVwHyh1n+J2+iCT/F\ns9xGmO2wiKCRAtnynX/9y8puV5PnIY+bmFQaBkh/xmpinCK+DH5w02UyZmKh\nZSdGKtO7yWOEqw0XF2JcXKJA1/J5vmHny+/02zaX6Xo9Y2jMv71ktqddbUZ+\nDGBnUBOliCsRkhwIZIDTqOvIZRdbg+QN3SCLUvZRjl+5x8VGceDaYEUmkE3v\nYVhhvTkUvlcjidd4YCwz8YTiLNf9kei3wgU1Udpvp9oH4I0CJkUwnQ/Ys1kh\n5cE+kKLK2ZADBxsfBqgqOABNVGpJ+SHGZ+Leu6rVFZ90nkuKgk4/YagTM5Xt\nOTB30O4odC2IdoII8RHUHCOegZC9TrBwQTWWzZiDwrQp391E8lwZ6UkkXfMC\n2yTFtqghD7qrbi4r9hYgOOUB9HagMixb0nx0k8J0ojG0EnTHEOW9/DKaiMQU\n4+GNyoTslSFMN1cAx/3xOowF4JkklZQaIssycw+p7Z4wgU8INxPJSqecaaLN\nY48Yhs4q9Q6/PDnvcPmSvddqvvd2jZeEuIwQLEifk9mn6JxLGgHrBI7TAyB8\neH/sQ0xq0oeSbhRp4MoE/vTNMS94Up+9stI0utbT/wpV6+QyVkuW9Uh0SF7C\n8VL6SoPGzbt0IXA5gutsEQSLdyR/t8i8/i/Sr71odJRIUisNbYOfo/kMKM5i\ncJ9t\r\n=T5Fe\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.7","@fluidframework/sequence":"^0.28.7","@fluidframework/merge-tree":"^0.28.7","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.7","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.7","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.7_1605140051545_0.714655871262466","host":"s3://npm-registry-packages"}},"0.29.0":{"name":"@fluidframework/dds-interceptions","version":"0.29.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.29.0","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"768ffe9333cef309bd0d9da796f338b4c43347a7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.29.0.tgz","fileCount":97,"integrity":"sha512-UuJ+JqBvprOdMQn/edNVPRHNQrHnbbRE7OYYcN3eMjKj5U8bt+PZITkrHZ2o1XZZkL+CEIpWEfM15cPXoDwrfw==","signatures":[{"sig":"MEUCIDqPzcDQ0NGYlGyf+12hkFzrHmA9QxHKVqRyg0H6kqZYAiEAluUs9kKZ7ws7Z3/7qPc8OIf7ld26MeLJR4n9Hp4fjW0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfswZVCRA9TVsSAnZWagAAvJAP/21N4vBkSiJVwqQc36Xt\nS3A+G4gQy05gLxwqhXE4bAlAH8FKxMajQXQJHKyoIfok1DxaiTcpcK71OBUF\nwdpyROrIhtCaYLBNgpMnO+yggiDNCsIbccpgrRfNMU8ZCnrbC5o/3yA49FG4\nGAHwnFs3m5IPqgNVBvZJndeHPV0Ek9Y/17SNUVtb7dYPayFnIJIQo/7tcCf2\nTTC4z0qJagL6S5FQMvjbbaWXhIwm+30XLcB2ushlYjLcVCJwIeynB7Oga3bJ\n1s9wibPN+Wx7EoQKjAhs29dI8Mk0NBAD8md4CF56QkSaAbmwz0I2I0ZX6PHb\nop0acvZteSzSidd/VZcrNIG4K+43GxnvzHZ67+HGM4V2B4vdcEOh9WPU+kfd\na2kyRUwDup13KjbbB0n6ex9SIsdlBLBno+oEeEN+atLNK1VTTYuZlWZzDG2J\n2THQtaFdwQmRZqOCHjbOvFQQ1AIW8A2noVcWpqL72aCsyCFpLWob016lvVbz\n1pr/9+890mxXbTYgr8yC46B4zvSpvjEPT6j4XfhO3mkRWZPa9fENBeRNEoDX\nP/xNCjnQ4eNgt+JdIcexa63XPn9L4gbHpMbeREEEEcufc4Yx2l8BDREYX4od\nrKddHn1WuwfSCA/bGS1gEGk9PzY+Iz/IRpsWqH093Iw6VsCR2NEM7pzNp0Su\nbQKj\r\n=qGDG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.29.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.29.0","@fluidframework/sequence":"^0.29.0","@fluidframework/merge-tree":"^0.29.0","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.29.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.29.0","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.29.0","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.29.0_1605568085321_0.6445203807671209","host":"s3://npm-registry-packages"}},"0.28.8":{"name":"@fluidframework/dds-interceptions","version":"0.28.8","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.8","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6fe8a542faa523fb662b6b49aa81d8ba237cceb4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.8.tgz","fileCount":97,"integrity":"sha512-QZC/KL4RNYXxxLI28L5zwE/LzrcAM00wo/610ULbY3BXwlRC/90eTWsNAaF6zlwFKmopuaLC9DwhNFltTN9kNg==","signatures":[{"sig":"MEQCIGpGD4g2wPn0M4EbsSIPqouXdKmos7NjlNw+bXEbwx8HAiASTHXvCDdSsJnynu4lJdJIofIU5W5Z7hCnh5D57qyWMg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftHNDCRA9TVsSAnZWagAAttgQAJV6YsGFwTro+ceKIEEG\nOCBfNUN5F20QJGcUb+MUkjJHbSMgTnPgN5iaN/n/mMuDqMMtlmRJGRB5EffA\nkpbwSBDxtAkOQE1g8oyiAA9FKtm1AVAT5dFdYMwlzaC/Bz95dbBkdOPmxoI1\nSYiCPmipDn5F6fwYdbLKumCN3327JCe9jpxroo+sMiwhpL7+BtOVtdPb/jq1\nmMdgZNUGJD13FHSrjiMPioMqB5bisuhYCySWN71+FAPN4T3+9nKC1vrogl/Q\nrIRap/wEkNsD05Nkg+JgPLPlS0Gs61U2l0PIHhf/G//agkGT4vCYQYH3l0vq\n3BTqmlFZAC9/SEvEmwyDAYDkMoh9gS/gbuXDVMR+PHAzjqNMZKuTmXKAGK5V\nhfPkVcWj0ku11qpS45Z/WN2U3xbYPzN0A+IyyoAb/uG1BlpKiYKXTjY92d6p\nO+SwwZ6DZA8ec4EFDu3TrGAw5lltFyuQi4ktDPP5hOVcCKBPkBW4Qh2Fjqbs\n1aHpqfiRJN3baCHW25aoVZw5In2agAMNHNzIZLRbyM3QDxLXlmAfuwJund5O\nATdjc/jJfs4B3677zvYc0NmAwYCP3lMlq34qqzR28dZdMiN9W0CYROr79Mu6\nUXdnZrm3RtFk9Y6zgy2bccyh49VyONy2LGRvbCn1fcPP/reRCMEpFMsnXooK\nlgoq\r\n=pCYt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.8","@fluidframework/sequence":"^0.28.8","@fluidframework/merge-tree":"^0.28.8","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.8"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.8","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.8","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.8_1605661507414_0.5109447497524942","host":"s3://npm-registry-packages"}},"0.29.1":{"name":"@fluidframework/dds-interceptions","version":"0.29.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.29.1","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"38ef16d7f9a338993b3002b5f701c4b39296d0dc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.29.1.tgz","fileCount":97,"integrity":"sha512-e5FfAPLvOP5z+CAe716R+fqE/fDrEieIsVGqjZoLSpzEgPtrFCG2ywNpQanwzaPlgcjiJ8toGLvXIk6XYCY7TA==","signatures":[{"sig":"MEUCIGT+GSxjX/7/mDEY7hlTKf2oe9EihwneCdE8rQK224FmAiEAlg+5K+RVb4ftaURxUFX/HBzyORgPZ6UwGKm45fb/sIc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftHlBCRA9TVsSAnZWagAApMsP/1LpohfogHX6DpAQEFfH\nvQFVVRnETYXy2AfD9vf21hv0wurqwVPhkWmBfu+aLIzW3LV60VXS8tm296/E\noxNYA4G4v07KBMOxNYwji3bpJOCnpSEtiEjHpwBpwmNMiSUPN84L6Qn7XAPH\n50ohxmZxp6Ah48iFi+zHt5c7kSo0k+4YuOZeCNujXnRwRAq39/MmJDRW3mEU\njgo2r7J7zetWE3RtcdzLyblap+zwuwJ8IEHYrjQ7yckgA3O0QG8TdtT2MRRv\nI0pDXzlt/Scye9E67PeB6kZVi6767REiU3zOfsSpSaI3aIO0iDYAwsebXvWN\nDfpW79O7VpJm5yrfdz2uE88jtYa6ak+K6J+eIf3dSveZ9VcGPh4jsavXmEpp\nOhDRnevvXNfOYATRKzu/gCBN1pmbS1JYmkiw7fGrhzImgyCqe32vlQhPP+eG\n+SpoLljO/dq8eSlRcgIyq8nfmK/urepWu1TG3OcZfOGdK2xR3xbINE+uLvo/\nGy0hqYu4Se+SyH5BG7YpTbEyNfQo4Nj9DmAq0Fe11hZQ0pJUxYdxSYAFfSzq\nuelLrZYxvX/1sPvKPsFCDmDLh7YTDwAh17UynV/nR4ZrgkeMIXOGYMt8vPfr\nU9p8Cqu4VwVcUJSt/U0WXpCJUKR0CgzpogNxHoWPgGjbh/NZkmbVmf3yUPmS\ngXAZ\r\n=x0h3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.29.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.29.1","@fluidframework/sequence":"^0.29.1","@fluidframework/merge-tree":"^0.29.1","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.29.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.29.1","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.29.1","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.29.1_1605663041084_0.877445013740427","host":"s3://npm-registry-packages"}},"0.29.2":{"name":"@fluidframework/dds-interceptions","version":"0.29.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.29.2","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"69b91405f4a8ec7a689d0cb94e72b84aa27dd92e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.29.2.tgz","fileCount":97,"integrity":"sha512-4eRgZpR603USfPpxxzXi87ZfWpT1/dTF2aPb0aumYIVoTsLA19iVa0Xi0Cf6GR8QK7W3jMwOtowv5nXzLawQHA==","signatures":[{"sig":"MEYCIQDlaFa2plxWc9JA5/RgWG0AuYOJgLmOfADzzCusGppXtAIhAKDgIkkPaot8FiaPfHy4kLk+2WY/rWt9B5b+7GLaSMuP","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftLkwCRA9TVsSAnZWagAA+8kQAIiJ8zIzaLKYVWcJGQfm\ns+P9yYeb39HXZ90XvlvK3EkoGTkBLgqvaC2KW6StHVvRclmeevQ+Y+ipyUQU\nVuIX28C7ekjjz42rdzid6bkMnOUWpf7Hfbld/lzAwsQlLKa54hhJkZpI2/KV\nYgjt2AICLbN76nP5iyIykOZDm+spNdQA4ck/9/EI/hIgzK0A0oawwIdfWfAN\nKOcGQPcKPM/4GJGZPScbOAcwqnuyPleOROocvY1XfuXP+PeDJyRXblW+9jLL\nj9njlO8Q1wH3e0EMdPy1nxQLw+j9AqnR3254HZEOgxdNqpaKwVLk5vdPP1wH\n5oWsf738/khQtcdXVErKZzXGhHa+Ttua57sesvfvmG7s3xf8NwiuLiJAAxUx\nXtQgSaY4AfnZcdCfyP+aeGujkL+xcLXK0NOg+8BTsA2yV1xRCc5GA2yhEEY8\nGWZ0Zo0YFn5JJb+qgOZlchHE5C5qHWlxsp2ILcuVHrGGVq87lM41KpK8A0mu\nBU2zj9Wfzha7nYTcmtcc+EOSYE9J/cU6d27nYNKbTfQzoBVk/Zou2wDrHk8p\nEbq5vLL8B+vUmBIHcs2l5yU53u0LZtwICM7NVFy50IINTkMaZByrCvZU6Ce/\nVVZSdAFfJVlDMTCsDgvlnBFKRSLxOHc6QofuY3txNKs0dAJfda/MTO0CQsHx\nKJd3\r\n=pBdp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.29.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.29.2","@fluidframework/sequence":"^0.29.2","@fluidframework/merge-tree":"^0.29.2","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.29.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.29.2","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.29.2","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.29.2_1605679407484_0.2854891218271567","host":"s3://npm-registry-packages"}},"0.28.9":{"name":"@fluidframework/dds-interceptions","version":"0.28.9","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.28.9","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"98d383e3f6b82e628578d79f2032c7203cb9a213","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.28.9.tgz","fileCount":97,"integrity":"sha512-3nzcOUAN+v6d9fubFGFSaVnftqrdwGEWbg76fRk4P2obnJ1P8Th7lvSLUg+JrZc/UyjbNcjHGd4W9CAc0ynNbg==","signatures":[{"sig":"MEYCIQCjmSpU+IjtpfI28/WHPOHrGJ7rM6EPsD8FvP6jBY7C4QIhAIFOcyNxjn6PEIAGScAy4a1ygEhnMv1TdL2BMMigHFNL","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":339834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftLy7CRA9TVsSAnZWagAAhfUP/1lar/TYHILkck0fgGkN\n812kpMd4o+CuMFv0JTGhfDfgQyulf6ZPQLovRmHSnA/feY1lWTiVrL0d8ukY\nrNQNDRECZldcXTBMkVEjNaegThShG503kAOJdJIcEXecdteU3ebXrm1baioM\nyQnW+XzbzEYr/01Uy6JIerUOOl0y1Lqt/NbjrRxkSwDo9X4mrDxVviIqLLlo\nHcSU/uMdYqOd9RHujhFZmfAlAoX+zxgZF1HxQCyAW1AqST85Nd5Wvr9+x3AJ\nijUkibQznI9RxkGLvhAw8ZyKe8wfZrTcAT8fNkJlL8HNNlFKvh3EHBiVjNg5\nItQp1dVoyNOgeP2lf2Ee18l1rn4EKl3UFomrZh4jzsQ4x+wB/mXPAyoEJrD8\nJJs+294mdzZhOeGs+cO4R8rrjH5UusQepLwbrSIFuD1qtDa66R9E5wgdnoKN\nM2ZVrvBVW2QiPIzmnJQOGgFVYA76teB2yH7wNtNewla8QPjbHeCddcW5nag6\ny93iGoPkxg55Ew/7z9gw6omoTqwOX8LpvQWDWzmQHamjhpdybGUyDpZYpvRn\nCrQ+sXOQlqr4JtqYhwCJCOkW0ymcAlXdhqwL1hhqs0LTo6D2ZtjK4OA4OOag\n5G1f60du7KgJthqqvPmDhf/yy+9o42hULhaj6xVC/JiOBbPaHI+WWYlRL/rr\n5Jkv\r\n=6JIH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.28.9.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":"false","_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.28.9","@fluidframework/sequence":"^0.28.9","@fluidframework/merge-tree":"^0.28.9","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.28.9"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.28.9","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.28.9","@fluidframework/eslint-config-fluid":"^0.20.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.28.9_1605680314972_0.22753485452227817","host":"s3://npm-registry-packages"}},"0.29.3":{"name":"@fluidframework/dds-interceptions","version":"0.29.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.29.3","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"def324c6d85f21e36cf135b5937a166326a3204e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.29.3.tgz","fileCount":97,"integrity":"sha512-dZcR9pNVa9TIQu01eX7UvtglcMG7diEheRlDrhwUZgwye9xSSxxrXEdZFaPlY+vXEESW4c1RF6mn/NBPoj1iUA==","signatures":[{"sig":"MEUCIQC8pUPKqsL5FTZnKRvW+E77AodqAf4E1yospw84pdq+HwIgP1GrT9G4jNn9XPN5Vu5m8wdH1Id85+oSA/jsNBOyWgg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftuyeCRA9TVsSAnZWagAAREEP/0Di7rZ/FHhWYmHvkdJ9\n8/bM/PTp2hJe9zH6CLTqvqetAlrht98eSdyJ+0hDzNUnvMYKT7Rib5HX3Ks3\nxG/1d31M8IrTDjOlVKG8kP/C2TNbe+Zs+vNkFkXYTRb44atQfFH+KiBESc8C\nXZGeNF4Gd9x4AwyviCuh7ZXR0UZhD/Dbai7yTpWOpUj2qk0O0ZqiTQfgZZuB\nneHh3N5YpjHKMLgwTJfxisy1OQKp67559x8+E3OBkJPGd0UGP4sCxrR9GN5b\nva5xI+fvdzKCASkbQ0QtYV4yFj/+2Y0+O1qitBPd8H8V3AiTmJcJhOelSK97\nspfY44T15nHcwykiWyQY5yHHL541+NBd4yry6GZM5zhDBxvrijmlst+eUVJx\nFR8zzWgpAPKgZzr/BYYiwRR2MC1/byH96BbqAONYCwfAQ5rwYJb6xwHt2mql\ngsaIj1DlQ45cU/IYjwVRvpyXL7PfhZVBPtrr1AppeTs8uEVUVkgBL3n2iih7\n2rPmXt8ndY6POs4jxIkFJCzsk5G/4bvvIB/hGLaLOFhOY9syYjZPxk63YZgw\nbdKNV6XlXDU7G/1rVJeXNtxjVcDUdxPCdNjvknmNlVT0FhhGSctVHMpr28Fa\nCATySxWkRBRHAcFf1Ts3dMFbjhGQfoEE4ejs9R6oGZx8YPgTvzs8NjOeSyLf\neLq7\r\n=d7i5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.29.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.29.3","@fluidframework/sequence":"^0.29.3","@fluidframework/merge-tree":"^0.29.3","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.29.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.29.3","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.29.3","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.29.3_1605823645632_0.6421912297572352","host":"s3://npm-registry-packages"}},"0.29.4":{"name":"@fluidframework/dds-interceptions","version":"0.29.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.29.4","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5061ae5ab8460e6e87a80bcb682171feaa3b9a81","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.29.4.tgz","fileCount":97,"integrity":"sha512-+hyL8dTUrTqbT7u9ACw8HOQy/2RMcUzvXF2AogRpHX7a/7xka65ZMUx55M1/89zWnIGt8KhkME1miol929cN2Q==","signatures":[{"sig":"MEUCIBn0zecoOPGqSdsn9t32S2AV0yezTQK6o68sT4e2aPpYAiEAoUZFRxpGMzTnwLrdFWGUs8FTmX8qFRa9hDuAqJm1HnA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvBA1CRA9TVsSAnZWagAAVfIQAIUYPs4PXUGjCQA/H0mf\nUUFEoFAuSK2I3fPKpzoYL/5t5GiYRhKeNnPdmkAJrt58mGIbwn9QgCWcTSsk\nrLuY+8hx/LF4VU90ibsH+Ne44EE9V36+Ap56b54BBJFOm9TtfqC3KvhK4GUe\n/Tr1/p1rbvzL7UMeC6B+imXe4+TEljSk2gAQ9SzlDfxA+OXLOeVPAZfS7lz+\nhqrzdGc1o92MFSlwQhLl5vURIotvP2/RlOJQJe6R9Q2fpHFm5YkKAWwNt35S\ndWphaqT0qG/WIt7ul9XcWayK+/PQWgL01GLWl34UodIggrG2YAm7/0uoPmHy\nXbMHBgiPDddYUfJfWUL7e1TCAmgX+84vOLi/u4JdH6WYpT9bE2D4//i8qFG1\nTyKVxIyFVj3w5lATrVru2GGTdwE7h0C9Fcgf7S1r40yD0uKfM2d+a7mtLlkg\nEDi3WCltz6ozw/LBVzPI+N60k6lx7ub2eL+IbaRfX2msXZ3uXFvuRMSnOuCg\nLAbqg7mpB+3U30yXcLl+tGHM1AuG3tfk/REHKYIkgxBUwuG7O5pzBTjyBGWL\nBw6FAQ+Vw+u1WwqMVoTw+7djQkzwVf9r0+PzIcaNN4nNzro68srThHGizvjt\nIlyL4egF+psCx6dmOR3Tztn0J5sDH3vlvmgDqpIQd0adyxQRaznpEgXb756B\nojNF\r\n=VNAS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.29.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.19.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.29.4","@fluidframework/sequence":"^0.29.4","@fluidframework/merge-tree":"^0.29.4","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.29.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.29.4","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.29.4","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.29.4_1606160437573_0.7037534854924696","host":"s3://npm-registry-packages"}},"0.30.0":{"name":"@fluidframework/dds-interceptions","version":"0.30.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.30.0","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"716b44f02f25ddd472d1f9fa9250c61f2b693422","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.30.0.tgz","fileCount":97,"integrity":"sha512-ZmlhWsRRU8P2SFGOwOJF4/v3F65Ixr1BbpWmwdRvgLuuo28R1LktF+Ysfi7cz+aZPcuW2X3Dq5Xqi27cCdgMXA==","signatures":[{"sig":"MEQCIH3JpuzZBEXcLKyTt+qfJHFW4U8BNYlwCQSSK7x6p3SzAiBu2S0Vsbe62Qjwnzsv6Mmcafwkp8IRbIoM7j26QnSB8w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfxvE8CRA9TVsSAnZWagAATmcP+QBarbyShBpXYLnwrWXj\nAhGecSf2HNMGThVsHqZ4tYuwpYTsXbihFQYmHKMfQci9RuDJyL0FLre9kyL9\nUUnL0xON4/EmzhH5QpHX4vW1imf2dmM6R+PyzRHRBiQAUwD8UVvjR1xmjQEs\n03O/zCucCB6RpkbRp17YqpnYrMFmj7trz2zGkGhTikrJ/RCD+hXerSAbYvmM\nADUCqYipEFQj76MUnwe6PF8SC0tMv3RCpAkaVxfCLKeljTp8FIkfzMA+Bjf0\n4Y6KFVoUVXnauN5whPE46L0Qb+VCYzyh5oMqWCpXHG2ziuZHZvUF+BYHCURG\nMsar6EQcuXFgH5L/QqHGfv/gIFIDATmYFdlE4tklQpAvIfSM1H1D56v3dH0v\n6yj61tM1fucdi1kk99O+ERRahFZtf2aeARBxWABmMdml1v6lCs+YtQIMQV+N\n4okmTjUs7GbSp/Q51WAjTxcSX1Y/mw2IlTGHu4iSxBtxhvzuhGkOcrQ8inM2\nc5pGf5rPtJtebNtFnq5+Qq5OvHWXgs+y5JVyRcRt08cLoCrQS5LriWk6zAtj\nWl1WKVp/xVDnszzE2jNCB+j7KH5/+qIlOTLg1zmxOYh/tz5Xm1aqXaWiWnTR\nYrcK758UPN6VFyhOrnQQxeZaiv2BKwOK5XzBUsLekJ++rf2aZwJ2jCqfHIhZ\np4Y9\r\n=mhxy\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.30.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.30.0","@fluidframework/sequence":"^0.30.0","@fluidframework/merge-tree":"^0.30.0","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.30.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.30.0","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.30.0","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.30.0_1606873403877_0.923096234607709","host":"s3://npm-registry-packages"}},"0.30.1":{"name":"@fluidframework/dds-interceptions","version":"0.30.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.30.1","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bd247f68ba49732690ae03f0242c420c4f2d511e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.30.1.tgz","fileCount":97,"integrity":"sha512-F07aBoNvSIKG3zX5scx93xKFHYdJ+wyhtJBt3NcotB6hbcU3YWoW22+a1krnAWG4hwOtWaywbORXxuzRiqO/7w==","signatures":[{"sig":"MEYCIQDBh7iMYxdTqiZbErnpVrM8NulkGd34nBWRbf3q9sUjvgIhAIl6JsLMHi0tb46LIocYP5tf0tk/c6b2PhKpFDkoukA2","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyrT/CRA9TVsSAnZWagAAdzIQAKNLupB7oUvpIQxjKODI\n5Y4uKv2J4R/D7KmGcielRrAbt9DMiJLbGMDmNltoenbBMiBBLw8kgm0i2Wsv\n3oq+zR9eqLmpqVa7ExsKtV4jpCbLXWEBS+oBuX2o5x9jxqcv1ltmtrhEOm2d\ndJvgvesIROASJYNphR1WwOlTA1BAsqP32opAANPXFyXUeJcdgm6m/v3bBbpY\n7X/u7XBLu36+B+ah6hxrcFGv1b2A9IXZVD8zot7DCpIk66NUqg1HpNdmU7kM\nffa6H/C7lemKcWTHoss5CMzwuoam7B7pD73/J+aqZpZtZu8pBqr79gfvBEPN\n4+zutJqp1QoWxEKvntaouwzsHyOdRzShZ86HturufXHx1AelXvBv4W478A7L\njtaZsObcawuV8eWZoKjXc+ZFkk3/aRChEDZn9VNAmFVkT3yO6K0HUoV4VF72\nSPAcnWSbpV5RM4arKE7CTXq0I2TaehTinEy6trzK5wqNe0Ut8derpzg/GB46\nCcH5pzFCCz500LSQF4Aydgh/+H+DWaZ3IECWgK68Bn02Duor+BvORqvSJASi\nMIpLU6DqHnxGE6X0/VIV4AHkxIMtkNDJoXv2yjlw15pCCjJ05QLXQXIqHen1\nrQtDeeFuKALRmvkGgFfhtbYACyD/6a88Sly/NFFVS21xZIKro0BQpRG4g1zX\nWiQL\r\n=NjkZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.30.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.30.1","@fluidframework/sequence":"^0.30.1","@fluidframework/merge-tree":"^0.30.1","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.30.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.30.1","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.30.1","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.30.1_1607120127181_0.7516312429378278","host":"s3://npm-registry-packages"}},"0.30.2":{"name":"@fluidframework/dds-interceptions","version":"0.30.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.30.2","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"25995741505a4f85ecea498e7692af0a284745d4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.30.2.tgz","fileCount":97,"integrity":"sha512-qR/7s/iHaOWael7aScWq4YZWv92WswGvkCDCVtsvIt8h0BXNeVwrrycQzoae88bki8o99oVDRTz00b0DDAKcyw==","signatures":[{"sig":"MEYCIQDHAlYAoGmvmTj/Gsr500CogmCWnZGQ/X8RuWXWolvxYgIhAKYO96MU3zhh2/cbE9oLQfST7WU+2lNH2swY3fpXiR62","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf0l+ZCRA9TVsSAnZWagAAZe0P/1KUNfBcdJT3iylyIj00\nCaISkLJpgQ4HDF7z9rYdkBrl62X5Rqgzp0tAZXS+BkVJZr7EYxcm9USn1pKZ\npxbrW+f2tKeMAC1rB8dvGTNJw6sgwKeyFbrblXF+PMo6uil82+fj5s2GhYjM\nRXwivqAbAZDmMUfMwOUgjAAmded3KvjXMn4LFhrnYpFGYofr0Q8TMltrHfhw\nhuFquV5BvJJPr3KR/ck1jPhkbk2+l6gmex0uM+Fw4LUfUOi/rMVn+RRqcUMz\ndeVFNWLHumR41h6yy89DF7DRIzV/0GsDedP7WfRUcO152Nfw9AH3F5NhffWr\npYAUnYSWn+3hHIQEdH+RyZsKuCqZwThpFpS6DfBYNpJLQ1B/8XeTF1Vz2q1U\nayMkcojMJfP3RY6NCqdQnbbgYhjB2nGcvLrA96ybMqwj5Y8wK2MMVN0Cikvy\nGa/Jo1h6ezkW+gsRJF9u8Pl6fnbmiWE2aWzPggytsTeKimCBjeZMcH9pVkZG\n5KxAQHFlYgANvxmYV8rLF3bddhUyCxnwtel04f29nm+HO5J72KrktYOH9OY8\nMmALQwghaLdj0VviDMVXKXfrsGITDXv2nwd4PLqn7pY84eD29E1ZhB9hP2zq\np81CmI7IjAqxZ86QJTk7QWLHvhwk7LfLiDQfRTjV60cG4Ck7TCcFjQZ45c4v\nHvMX\r\n=hAeV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.30.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.30.2","@fluidframework/sequence":"^0.30.2","@fluidframework/merge-tree":"^0.30.2","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.30.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.30.2","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.30.2","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.30.2_1607622553269_0.8414695502903491","host":"s3://npm-registry-packages"}},"0.30.3":{"name":"@fluidframework/dds-interceptions","version":"0.30.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.30.3","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2b945ad8f828d1dedb8b4d051155baaa1732c05d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.30.3.tgz","fileCount":97,"integrity":"sha512-jdCgxPZSsBg+jkRhafLcm4+vakxliQbGKITQTbtvwFKY0nvsHiiieJDlFO/uHjViFuiuIjvJUhFN6mWLKUuEyg==","signatures":[{"sig":"MEUCIQCohh1SxSbLiOrMGHahFPlqeWGub79RulX04AEv6g5x4gIgSQbqYGZ4exjxGp39fgfV1rJ3HzWW8mpkRYv4btxbUuM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf0ru/CRA9TVsSAnZWagAAOhcP/09cP9F9jU1V+Jp4aiZS\nSbRG0NSIPOH3nN7TcTLwdvx+XL81waflutm3w41I3GDbx1jtoMuEYb5xr2CX\nqwS2PQZSM49EHNcQ2kDi1sZNXyxRwJOCY9Tkr05XPmNsLNT0L1n3DkTArJ6i\n0EIItzMYot03GqQ4FCD86U8Tg+sI4WoVUN7iVYFsRz2L8YEmJN1mC+T0V8P+\ns4zW+kGsP3Ngg6T94Jwl7OEaASNdYxu/qKfEGJRTOZmU0fnUG+z7RM+k9nKW\nSExY357Jy1vibU3/UjtzVAmpnxJIZ03+Hq0mfNzgZqmpoIPZG2L9yJcb+DJi\nvadABB5HPYI0nMqt2ScyKwBawhefEz0bK5TKkzhxQdTtH6x42FGRt7Iabbgg\nOslsuBfKwi6BIplvgieJ+lKOkmQnmaZWxF/U88Rl+DXbTL3OKADIL6KBRksI\n1Z/cMZBnVAW/u56mmt9mQEzW3C4TTHpclcvUty1WPatHNev3N3wcd0D4cRxr\n4dveI8jTlQMrWI5uNa2eSmGj3rAVrd7ZGw6FtbtRYno80D6VpuVP9SSlAIjq\nNj7TvqVZgmpdsbTIRyk+BiWvaW10vQhPd4H7aIkMAqPxASf1SQNxA6HZw7Y4\nLhoRK/pJq+x+HVbNfnmHY1FdHCpNTekZQPyjxYzQ3l0qPynfaixSS4kqFD0C\nFZTu\r\n=r/oG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.30.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.30.3","@fluidframework/sequence":"^0.30.3","@fluidframework/merge-tree":"^0.30.3","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.30.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.30.3","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.30.3","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.30.3_1607646143306_0.02279866673124209","host":"s3://npm-registry-packages"}},"0.30.4":{"name":"@fluidframework/dds-interceptions","version":"0.30.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.30.4","maintainers":[{"name":"danroney","email":"daroney@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e9938ef8626f8ac328e3c2e4cda3aa5005fdfedc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.30.4.tgz","fileCount":97,"integrity":"sha512-Vs5qPFb+8tKVRosUUd/fdRq2YvAEc8Jb6io2qmwgUjZZ2tDGktEd6AICv6YZxBze5pgB7s40W0m0X822+lNXHQ==","signatures":[{"sig":"MEUCIEVzMZs4jV1Pd74KozGRcoFqQBEH4I6gvQfeHksvxeADAiEA0i8rHVxCG7Z2FuTk5K91F3yJv1RUxeQBWcVzpRYZE18=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1Bz/CRA9TVsSAnZWagAAmZkP/icgrH8GtwRbR66YL5co\n5f+u+7rqJvL1JTX26ZdqZqqj2bNWs9Sf0lwu+4iciRK96lbx3OKIe0apfkTB\n4nnFfsUhkQlwIQ1as3dzy7OzqxWw7XU3+m473U5GoBq+9ty2Myy3O5cjZO00\n4wf3Z7hkCXYmgNmL41WGguuTsOsC4BVxiH6TiuECQXUzhK4/Vv2uL4/T0Ejl\nNzm5FxQev060Bk/YIt9CGdHLqwUPqoIfQ/BXQ6jNeocGylYuyxm9ZfmhCXxU\nR52ZgJl+zQHCPgdmJESMJ1PyUwyUEEP6AE3LDR9VimYIX0VeBL3NWrVVzrRw\n9005deAvONbsx+tv/5RFNeF1GLQyOan6MGf7Tj/oqDKcUPlttmS3WGEriV4R\nk3x5HQYTHPMrummoCQ35nJzhCefPl6vQ4eitAOr4+UKtc4G3afiFlcrMRM66\nEuf4y3iHAXKjMmVkZYh+cFBD5uPetP50Cy5TTnT5dvuh77+1LBQZXHcrIGEH\nwHaEJ5CILshPCrPMm6icoMVnJe196M1Bj4V/fxiphdj8a5AKI58xJeKG2EVb\niCBqw/wIZQDHugZQmUFbzz381QdZinZ1PGB/EW9gYovCwq5fWT4gMqA2TT0G\n8YU22xytEZ2wYMJvrcKwUIIOwmiivM47rYES2wsWpzj1IzSuxtthty33roMp\na7ur\r\n=Aw9V\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.30.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --ext=ts,tsx --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.30.4","@fluidframework/sequence":"^0.30.4","@fluidframework/merge-tree":"^0.30.4","@fluidframework/common-utils":"^0.25.0","@fluidframework/runtime-definitions":"^0.30.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.30.4","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.30.4","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.30.4_1607736575040_0.6270771767626406","host":"s3://npm-registry-packages"}},"0.31.0":{"name":"@fluidframework/dds-interceptions","version":"0.31.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.31.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2dfa7501a6caf2f36334866d3f35f6d23b957d6d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.31.0.tgz","fileCount":97,"integrity":"sha512-27YwAtXv9Vn2/sSSxZKu9NhHijLNug/j7UlG5+Shw3lWvHXn33GPyw+bkUWBxl0cOl8kVVEx0w1X1oE0b9QOcQ==","signatures":[{"sig":"MEUCIF7nD5VWbqX6LWG7uEPduFUwMBgiVy60MSs29VE9mUU8AiEAoOiDe84I0CClRaFMgZ99AhezCOoJCqEGFMxKWjb6cuM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338944,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf20D+CRA9TVsSAnZWagAAme0P/A2x9KOus3eXhh/wOUOq\nUXLfTBFYp5Ivq7ZxAJASexjAOn6MyMYhnMkZYSvHzi81qPGIHNhbNjNZJmJw\nJILIYuV+15jPzCPLo/enjknqXsSrv5HkVFs8OvycENgsLghapqSkRHeH4NbL\n2aWtNhA68I/xVX9rlp7NBJxUdPoIXmUSPXOyL55qLOqBEdbkHnE2eIk4LX2z\n9G5lpyZGRZ5SpzAoCjV+5ktuQSGGULvB3RCtf/C5S2bXD6ZSl7Qpsin1joRe\nMF9OgJJofWSdpLTwfna99FWYDd3LIZSTNVtVxknrpKSTQ2tlDPfdQ8bmHhkd\nWw45F8ZfTnSsCcKdOnnKExx301P+0jb+Ff9+zhupsUVp1vY3K+oE99Jsmsbc\nKl8SwopPy4rkjLv4zUiX5d1re2vHdWUtYhmdIKYhnJrKIn/Yt+DUi/ZLln81\nEMemXISt1CR1Fxb0Ws5efk6xUTMuINWFmxdm+mRHdrtgc9fM8oQBB+fu5ZMK\nb5GhQrxtkjWznRLuVEDIvCDOi+kVNNYKBep62sM1yLJR4vjWWI9xHLz/2IR7\nXiHo0Ae/R7AHkTMKGfXnZJsJzyf7z9kCtgHSDSoFGrKj1E+ZVDMeBPdPYknD\nEfdztxFUg8pv/sz8FNkm+FQS2ZLIjRRwhlEMkO5YH3/J+06cMI1TNfDPLkAU\nB+B7\r\n=Rtf+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.31.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.31.0","@fluidframework/sequence":"^0.31.0","@fluidframework/merge-tree":"^0.31.0","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.31.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.31.0","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.31.0","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.31.0_1608204542031_0.049669177975921075","host":"s3://npm-registry-packages"}},"0.31.1":{"name":"@fluidframework/dds-interceptions","version":"0.31.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.31.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4b5c2fa4f1809a47adba2d41d3da46fdbae778dd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.31.1.tgz","fileCount":97,"integrity":"sha512-m9Wr3NVJycRO9anah5QHdX+1CWJgeRv5iujpW6J3ac942ClVtRnQ+cayjfBu9QvnM00sHI7wRtIz5QtIzdRj5A==","signatures":[{"sig":"MEYCIQDOB8PoAmTYjqTNTAaQrqR6WL7BfaQY4eeB/boKc2OIEgIhAKTuihO7W5YZohIyAooAYcXYrkpCXB62MN6cESbctzJS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338944,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf4oi6CRA9TVsSAnZWagAAuLoP/RL6flZDeNsdkn96W0EH\nHFdyCycvDFshQvrM0J3cE4CDXWQ23rJvhm7LtdnorVYw/1IExun0tx8+vsEM\n8gZzLMBxg+ot6ap8cpP8a9QOL0UhsYj3/21jae2GNTjuwnDifRqwgiZp33Cy\nlFVKZuwddZGYqgXlXLkzJQEsMz7VwOGCkkcagBHMX4Ag8W+l8xGqBSgn6Ubw\n6kBCtaGduP+Gr6Op+C0X6B3VhFbVp2j3tA5LtJVbVFhfRRi4lilYIoaHwOEv\nMKvAFcy9UiHP+KQjvTP6F0CCJ70Db1dlK4slPO7YlOnSjhGTas1ebfXKhEVg\nWQJwqy1C0HF75kz1z6OdgHAoyBXZcd0BExH7QiPTdrSMqYMnuynCzw4FZD9U\nAb0dpjEABDCRoT3dHR/BhaDYr56wZ0y/2X0a0pHj6nCkMNbS+f8udmYxdE9U\nDovkRwTdAFkHiTMA2liPxSpn+4cJQ65o+LJCuuybW12pXVwTAeRc/lPHqaYm\n+Uff7wyhgokcsfdCRb24ABmalSz4eoIbq9c2AvD1dlTtcqnvHj8B8IkOIabi\n57PRRhlYVXwuxxkjSbBPrgQbR+RqHS1CDAuAxME4uqG5sOQxWqVMgDzGI+LS\nBtdgL3vRYtpFGDQMgsAar7VtuULkJoPcPhro5KkzoUAhXfMYdu5rkQY+RGnx\nsfBs\r\n=cBCv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.31.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.8","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.31.1","@fluidframework/sequence":"^0.31.1","@fluidframework/merge-tree":"^0.31.1","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.31.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.31.1","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.31.1","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.31.1_1608681657366_0.7728123594497205","host":"s3://npm-registry-packages"}},"0.32.0":{"name":"@fluidframework/dds-interceptions","version":"0.32.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.32.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6058db89572f2f8535c730dfcad6bfb594a64439","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.32.0.tgz","fileCount":80,"integrity":"sha512-FPhz7cnrHTb3GasaKF/Bt4r9/OxZJELcw6Dh/moVvzeK/QXNVvojlHf/f4CB111x9gb41sHmiyZ9UKOcf0rWfA==","signatures":[{"sig":"MEQCIBPuisvkxx/U5E1CoXfFpZ/iieekQ9SyTiN2GIQFi+E9AiArMiBeejwg6XETBRD6brpGc4MBgczVRhBSleSSfOS/Cg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":256064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf9lTQCRA9TVsSAnZWagAAW3MQAJmVpDFjfAcAE/kVSRZs\n7iwoolX3m3MfwpdBya4fVa4BlmtJAwM5ucyQXuykjGJr2ZZ4B1nlBGRR+H2d\ncTL4ggz3gZeK/Sjh2AC+BD7kql1n0OOGVwBZsylquNnbPaW7PD5I1D/ds6YI\nctaFzQIel61TX3NpfXUtk7weB28vr2+IFGBBMotzZGMcZ2eIjfHZdvl2YlSa\n2MD6uekIn0z1iQRtUn2Mugqd7GYwr9nvu2bABsuCdWSLRVKaTiAGG0pkHOeJ\nUQ2nVps8eYfLvwuonzL6rVIsdGxBZWBG/pC0vPlimV1XUGjCZL7pf8rBh/tj\nKyAaFKUcSAW78b41r7A3KeC0k/TNO5IZuEQbTbQgKhcUoYtpYiq8KACBLDTz\nv7gARfceiyLoz0VV4S2ps7V+rPOso6dwY09KaaqhARuHKbRE9a5MntYbQcZy\nFB2r0Uvt9x7h3tlUmyGRIu6GI4Uhck5bsQnzHSRdgOuY+LeG6mrzkTfQd8n4\ngWE+xWXBRWv9SM2GEAquhK9n8r2p6f3fx0zQLKlhN7tBPx/jGZOhPRfRPypN\nqkAti2ENVXynhnP6EGbQkeRHsFCHJh8PyZEZYTlpATe9XmkiRrNDL2NhnUMh\ngqOnYilW4fT/7+z/QPiHhi+rdK1k4+DxJkPiQThyGWg1Yb9GswzdMLSrH1ZZ\nTNZd\r\n=ZsC7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.32.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.32.0","@fluidframework/sequence":"^0.32.0","@fluidframework/merge-tree":"^0.32.0","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.32.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.32.0","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.32.0","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.32.0_1609979088168_0.19523835160584158","host":"s3://npm-registry-packages"}},"0.32.1":{"name":"@fluidframework/dds-interceptions","version":"0.32.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.32.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c5bf1115196ecbb32997f4ad32e9fe5c73e5fd16","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.32.1.tgz","fileCount":80,"integrity":"sha512-a7bTHGjubTeH3LUqVDPvlEhtaCSMSHNsPKn9ZIcHSKiPfEvlO3xoXHqzWy4wjfdkIjaoVO90WC5n88KaSz5k3g==","signatures":[{"sig":"MEUCIQCEJ4b/pje776eACi6SnSHYSHbRWfMM5SOYsTWLfgiFRwIgEOjuRiPB485eseSnmjJ8vNhmbeJipbDIAvywAFHqiXg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":256064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf9n50CRA9TVsSAnZWagAA9tQP/RTIFzFNAzfQenpgW79H\nsELm5e+Xe7N4BKYNPq69cWWtIJSnP3sfjlD5rccPyN+dbM3oCMLG7iALVbwU\nEsCIjyene+qVeloqJlX5/im7QWCtaE+MyqYLV3l+DDBLIlReUGiB4lyi1lmq\nbQK7PiQBHgjK6palRPiV742/5JC1D3b8FEWDtDnHIcdDPSzVwjyvmPX7sGX6\n2C2q3z1PQzCURvgAh8zSmpLZJaGEBoC8fzBchEIF6dAshYQgb5rNMXhcKw19\nVgN/e9YfWx7BcTwOe7Il7TnMxeHhhl4x2te44w2Gi1E07Bgm8zf/b8llEji4\nqMdVXgFKIPtmoKqOkQAWIbjrUhFEzQ4EiWb8bqGKXhhuRn+CybYkwRNVaC0u\n0aQEh74hkGIRS7WX9UWkLLEa3eQtw7R+IKawYLcpkRtCxaxAs3ebkdTYgEfi\neMY5E54c6euXwpDe5ajLo15SXPnbNrQkcxG4zYpQZipkPGSO4kXLcfVfTBdt\nGH2SjNtuwxIBC35QddtRpPCRoaiRjIcdUFeu8IbgoTYsQF+2RvkU0OQDwJZJ\n9OeCExgiBjsomcUE7mEE+Xu5ZNhtJFfZswayfQnqywk2wk8qtxWOj/FX6hXk\nxkDq7TzdK4oTTEXibzbUXVtuhSBdTLLdBKvMfONA8Oqq/m7nFHtYj3WJeeSn\nypOF\r\n=Yjlz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.32.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.32.1","@fluidframework/sequence":"^0.32.1","@fluidframework/merge-tree":"^0.32.1","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.32.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.32.1","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.32.1","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.32.1_1609989747985_0.13762190329494217","host":"s3://npm-registry-packages"}},"0.32.2":{"name":"@fluidframework/dds-interceptions","version":"0.32.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.32.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"298f1d289e5877b7b39389ec70f6d1bc7d83d76b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.32.2.tgz","fileCount":80,"integrity":"sha512-D905LuG+4f90mmdevt+V6LRafNYHmFYl6uo0OmAODarvXZP16dZ6ukf2kp+10FYhbfrP1USWwT5T3tmHfHiMaw==","signatures":[{"sig":"MEUCIBij6uLPm4WSjY9OGhAcCqY1QuOVUDzGJ7JwcmBwcCb4AiEAwaOVoKQaTB7xZ5tDaR6ifWS3pxZwXRez0BvpQ7Xs3eg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":256064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCOrACRA9TVsSAnZWagAAAb4QAJ8okAr+9UGVtopIycNB\nexKash4R+1j4WCsA5Wqkowewalr7wIF2qYXoOm1Laff7fykbzJhQmBwXNcot\nldq7dPfFNO5AT60XcNQI8g98RkPYC/yikXhmqAbUZqFECEw4F6lrU9aSZPqg\n/kAvrDvX1EWOTJ6oyytSigNLelmugmEoy42oQsXx7Y987rdGeFYg1Eox/g95\ngIaHajMHdrRX4If7rKIe/o+i1z5TQSnR9F3jPy8Wfol0da4k6ZJyta3N78Fw\nE+b/aPaMbEmXB3FAgW+HeqvPHzpeHVNe3j8HS0r/h5cyhSCvJBseP/lqFMWd\ncJOk6Vp/PDlZFKFScHN7hWOqaISkInNRy2fU8fviozfrWoMmSyvXjVC+qCb8\n0warVe7gXAXWw3ghj82JogVQrdSuh6+vsJEt/vMy6DPTjGjh9fv4KM3o4Hyj\n+uMsH4tdlkJTdoxYXC9jiLA1a8HmExuEN4quMe3B4Gzw7sR78TumKVR+V0G5\n0BCiHgR5y9IS25jdYnvpelCbHCQnKUBsWdvsBA9Of8T/XxdMbOYC5lX8TKls\nUGsTN6gssPfd20FqI7v6D6SpjIyCI2sWOiPz724LL6K9W5HUxmsScVV9J9go\ndHkiKe8N4/QkLrZzFPWl4sREFNpdXJXIuyyd4ctQexHbC/oh9NIvFKV4XXVy\nN3iJ\r\n=iapv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.32.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.32.2","@fluidframework/sequence":"^0.32.2","@fluidframework/merge-tree":"^0.32.2","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.32.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.32.2","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.32.2","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.32.2_1611197120436_0.031214440703382973","host":"s3://npm-registry-packages"}},"0.32.3":{"name":"@fluidframework/dds-interceptions","version":"0.32.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.32.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6881e95e2f260d03989ae2b9945995e3b8ac81d4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.32.3.tgz","fileCount":80,"integrity":"sha512-J57PeIA7N1Dnonr231D3bLX6O1SoRW+jpLG1f8K/0XPLw3W1H+mCg57IQR9vWXAmkssURXtlBerUyhVLvl9hBw==","signatures":[{"sig":"MEUCIQCfE2XIGLa1T46zadATV1HoX2ZgxrThjiHlMFCpXwkliwIgbPLL0HaF1S0xIjRBrMx+r7VTkhKn3j8ehhWT2htIpOU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":256064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCgikCRA9TVsSAnZWagAA0BIP/iUdCJfLRZfs0yFOxoXG\n1oSIXEZCpK71nT6ofZCKzp5dGCUJKzWUeqHNbMggHraWXckN+V+xpNk8BeOi\nrqoMmxgxFpTDkZ6aNcR53SjOKO3Y+Nu40O+8uqxk/M8uAzO3Wia4xM2sYEwK\nDepGwSJBLS19UQU/dwLDnpHfwtxUvg2vqSkymz7g7c4Fg3rUBo2otkjwejaE\nzwslozyzPZc+W0S+CaOJi9JKEOIc3UaBc9kNv529nPT4RNz7T7PevFJUfXfz\nV99yDZPrSrUlr3UiJdXIuWwqfWhe+5itBCxiOqAt/UpP0fGtwVGEKVFSPxpe\nuKaGhNZ+GSUcYTlW/M9l7fWJRWFkSFog5inxBG52bMEnoY9jT/50WPvx+w3Z\niv94Jqlcjg6lQUB2RJv9JNZcBUIIfHUDDSgfXidKhvwcchEZQmMrsKLlLgKG\nj/7FkvKQfDoKRYxFpe2ozh/wDv+LNVYGG92r7onMVKQj988nOzrtNoXn4T0A\nFFMwzemMoixzyUbXv2O86rKgFg9qv+6cWE/kUVRZ0/knxx1SrYW6LMv3aA2h\nGOjO9oppe5Q5dxg8l7lEf5WrhoSdgQPsEcrW+ndHs80EtWUnHfFQx5apZ8qa\n1IsZwMfVS/XG3aFEz1d46+Wk2n4uLUKm3iXbNIuuUyZ1DF8qkCWnODWnvx5p\nTFlN\r\n=el37\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.32.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.32.3","@fluidframework/sequence":"^0.32.3","@fluidframework/merge-tree":"^0.32.3","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.32.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.32.3","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.32.3","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.32.3_1611270308414_0.4825596537814265","host":"s3://npm-registry-packages"}},"0.31.2":{"name":"@fluidframework/dds-interceptions","version":"0.31.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.31.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d301106c27e703a0c514f6dadcdd50cc43533f1d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.31.2.tgz","fileCount":97,"integrity":"sha512-7C6QvMkVZ7pJe3reGnrturFe2YL+xT+8RMPHYUHP5lD6zTUY/oGpXcHJKcJ0+bS/n1b7nGHXRJgkYmBLG4BVng==","signatures":[{"sig":"MEQCIFs/qVmYnzmx3migw0lLXvmgr71ETrvdbv/3zj97jrOmAiBbpj2AvzWmW94azFawp+LrwNk/sEaos7cfLhdVHC1Lng==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":338944,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCiy3CRA9TVsSAnZWagAAUiEQAIkH7BUI1qhkFQZFr6Es\nOJNQip1yz47VxE5VVhvkTkBynpsBFtrsPVzv9xnblpPXlnSPftROnl3O1Pxw\nqBCPV2e+j2E+jbFtdVRKfsPbQzYG7g87qrlQsQC3rL4Ok1GtOmSgWuLlN5eT\n47FmfIUJFrUpXGtwoy7rSXaV+2OEzGVIHjGn0tICRFphKHF1O7lg/P2DC8aJ\n68MuaYF+ZcLsaobw+Yd4VDKlOUZkANwz9CQAIeQChamYP5Z76iMy2awRbo8o\nWQqUpoG1kLLoOwz+1+O/E1Y5Vjva6j54sYSJ1vIfGQINaqj6q81YtJud2FNn\nbih0Lqdfne9RUUCCKYhLxGn7MDzdQk4YNL0K+nVKCGdnpSaMHmOVU88mSepC\nW85P1RCdCW8PMa6tTDZ81vwBOJhZWsPrMgEMWePDfZ/p4dorwBmN8uiOuSQU\ntzkKEzUe5kzN7Nx0vcrGaO5S324ap9URetfBSUqQH7NcoBIJtWTtzhDJpVTx\nyFmuLhVceq2JyyJPzS9hs1gsXfusCEnU9mVfvkEgVSdYN/fvWwsP8C2PtTbQ\nHG+JSDfVA3BFt5UMwpzU31iB56vlwUwM9CWTfTGNImcqneF5LKyuOpXeDS/1\nSSO+m6bTNng65UPztyYnMp+ZPdaUyKQKeUFM9mAz3GUXkHvdQp1aXazdfRQu\nXOxk\r\n=fED4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.31.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:tsc npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.31.2","@fluidframework/sequence":"^0.31.2","@fluidframework/merge-tree":"^0.31.2","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.31.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.31.2","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.31.2","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.31.2_1611279543428_0.8381272378885833","host":"s3://npm-registry-packages"}},"0.33.0-13708":{"name":"@fluidframework/dds-interceptions","version":"0.33.0-13708","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.0-13708","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"55bb2fbd08a06b00037e185760803dbda6118783","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.0-13708.tgz","fileCount":80,"integrity":"sha512-EwSCfpkdpehqGmVSW55D/tdkpSh4rW9nDX5ML3BzeguqkGbpHAa9pdfzx8VclkvZkN9xSej2eLAW7TmflQfzlw==","signatures":[{"sig":"MEYCIQDaNHkz5QE2nsaRExNTUNmkzbekSk8JoP9KcrIPEXywpQIhAJHyRl8btcqN7CyBud6363UmAjcg+FwoztmfQTn7fd/m","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259529,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCzOfCRA9TVsSAnZWagAA/CwP/124qEjb8ctcKFKB1GeI\nkmJxNTAM0gxXtfCuVPWvm+OYn8Y6enh4F4ZA8MIAcc1nm/58k62wVjHUzc7v\nBuIkJPmB/LKN4/6djIR9vJ888oaJ67qvuvMO0wTIFTKUSEysYbybwIhwExFr\nFYv7VWgBlGi3wetCKPdrri5d/rWmbo/6AOLBVa/dzFrzIDIcJBIhLWv/GyT5\n7phac+p3Y4EUEjd2KfPIVyAPXGa+fiChTT+qczEKb5O5LQWpoUz3hBTHNOHM\nR1q0KBCRuwaEg0ufKqLzKEOjPL2hAWSeGiNjpPzAgpbiZwfABfuOr6+RvbAa\nNpXHTd/sWFRLbWD0IANNXERXcTFtcRXTLR1mi8ysirVk2CfxyXeogaFGIpUI\nH6YMUC3e2sJ1hOFg6W6557g9mgAvAtm8U/F4SK6LkadtmO4UHjtboUExBfuN\nSUPdxwBXj8AJJrU1VdPErcOggFEGOsq80PVxgoVYm58Hlbmi3SB3dSBmVzJc\nUdZ3/TTbR1n/UCb7Dpgqhv9qBfWaPyhLNX9qgTE9SXRBSjf+2LXm9EO3nUkY\nyWGSxpk/rcxcYpc3RWvFcZ1afJmq7owWsMsi+Bqp/0u76m/D667ubN/VyoiR\nNdCPKIamuwSOVLFFId41sdfwyiTzNl/9oAeuDJFREx57rYhg+KcFzCbUC13O\nOm8C\r\n=7trf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.0-13708.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.33.0-13708","@fluidframework/sequence":"0.33.0-13708","@fluidframework/merge-tree":"0.33.0-13708","@fluidframework/common-utils":"^0.27.0-0","@fluidframework/runtime-definitions":"0.33.0-13708"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.33.0-13708","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"0.33.0-13708","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.0-13708_1611346847273_0.41444484029685014","host":"s3://npm-registry-packages"}},"0.33.0":{"name":"@fluidframework/dds-interceptions","version":"0.33.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9b20fa1657800891d75815b88563415f40c6bbdf","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.0.tgz","fileCount":80,"integrity":"sha512-7DdCI2xZ67js+6PXZfcYOO+ZACTkIfECU7sjz0UQW2dhgbMxhcXPRvRAvLohYV+qprogHNULYso0gPOmDOVHIg==","signatures":[{"sig":"MEYCIQD48BXE1j1a4q+p+cC0JXNTof8KAFK6o3S6cqm916oL6wIhAOxH0h2P68+fv8X3nmzBGu7ldJb94y6bj3tAOg+GHJTE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgC3e+CRA9TVsSAnZWagAASgEQAJ+XFyy/vjw7AHj58Wuy\nUNifP1dj7Wdh6Z4s3o7c2IyUI+iG+Bq7odqnZds5QKUmmub+nhl3IuKatvka\nhC5har6TfEtjZmAsvhBUQisb+ViwI4Cs/TjaAj5LL/nWpCCrjNZFqOi+NkgC\nN63oF5qKcjl3Ka/dGifI/T5LDrLUMGcc0kBsdej2j4meuiM09NJhHaaz7ZyD\nSE0RwlE8hfCCNfOaYnLJVfFOB9fx/nH92pw/xj8NtNFmMO1g1sZHf/GPntCR\n8pmhFIszY92+BMrnlpiy2xug5xE4dOJVGw+7pX0sNaUNLbyVxP7UrbyFpHOw\nCB0828yoqof9pZrxp2adUXotHPN/KYocTKBiWHiFRKTTiRO/LFNjZpluKBAH\nWib3FSuXiIOZuPiGLO6n0hQ/g3YLmYMFZhJ62qrhbCjRYrrUD1urNCUbB5WZ\nBNCl1SthJYl2m3Y1pqoV82NxP2QpIaigFLXCDzSJtRmfIP3fIn1EaP5aoz16\nSpBwc2MT+WHvjKW6jxEjhDiNgzX1OE8bk8PUDev0It9fWeT9zre+ygAr2dyM\nwoMj2QoX0ptxb88JimpzDWNAtgVwtMCoeHzl55kRl/2oypSBYbyqTqVk0A9V\nxBnonT1Mpx9M+3g5bCEhjRTsAf7ztOA3Lryzfg+g5i9g6MGpW9Vw3lZkYDEn\nIVG1\r\n=Vcpc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.33.0","@fluidframework/sequence":"^0.33.0","@fluidframework/merge-tree":"^0.33.0","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.33.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.33.0","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.33.0","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.0_1611364285656_0.1473348050942589","host":"s3://npm-registry-packages"}},"0.33.1":{"name":"@fluidframework/dds-interceptions","version":"0.33.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d8155e034576f0f7102184a53c47a1cbc89b19bf","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.1.tgz","fileCount":80,"integrity":"sha512-b3pvhODxjL8FwkGCT3tsQyBLSuJpsk35J96d7Ljsk22p4hfn0LnttfbJ2cyAE/EYHVxd2mylXVzADGWTmHRSYQ==","signatures":[{"sig":"MEUCIQCnIrosDp1MI35QCB1yITGwM4TeE/qy182gLdgAI9WuWgIgU9oC70H4aM9TQAO5Jb2O2gN74PVRII0cwxSrUG+sXX0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgEdqCCRA9TVsSAnZWagAAdZ8P/3o2GKdJM2ndwsw1PqA/\nW7/MTJs7je9WdCmRgwBbmUg1YsScIcPK8SjXhyqLvtZCcfQoeHHdls3oOYRG\nj+huttQ4b+/PuhQJzHGAoLmjKf3kUjLu9Hkqz4pH/jQmv+qnELGvBN47/zOo\n08M2VJJT6UHbxvqzrSa/sqZ4nkuGn5YYFETjYtnWzmtyeMKlQsQuh96/uWBN\nv6wUAwxrBezN9q9uH/jZC5jMBP3G7pWn27+SXFvTCct3/g5k4AoEKsVu2VEH\nLxuCkghW88WOiOxVQU2SH2M0+1BuBy+i4ILfw5F7nfhboc8vINfTxQBEPUln\n5jkpLHsTtlur9DVEIMIcgVE9ET/tNUIiWbv+1XSgzkDfJ8S8BV2xFf86kOCU\nK7rFvGPNQGjRfFox02neKU939RWOZLmb8OWGhEv0LNbhf943VxE3L7z66Fz5\n1AZLNUvZZblozTJPrmD00KRH1Nafu91VElY+d2AE4cZYGFXuKehgZz7bnLzz\nN8GCQ9HJl8e09iXKhAMVCIFxV67e2LouVGMKQ0OG53++p7qtjWJQuyQGty1o\nvkPEM/RYsmhG5LeEo166qthvdcLLPKvP/qg0MQoyVBqvz4YHel3qpEH8nBSb\nH4tFCLLTcEwmVOZBQFIIqmEfPmO+zoaLGaA4O/iWnC6v89I9T4maXGEI0x4N\njJJc\r\n=LmY3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.33.1","@fluidframework/sequence":"^0.33.1","@fluidframework/merge-tree":"^0.33.1","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.33.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.33.1","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.33.1","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.1_1611782786146_0.9633147595989437","host":"s3://npm-registry-packages"}},"0.33.2":{"name":"@fluidframework/dds-interceptions","version":"0.33.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ecf370ca301187aac91e15aaf6580c76977c3fe5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.2.tgz","fileCount":80,"integrity":"sha512-cIjawlrEEt/Yp5Rk2m8yUrbXGPnlMJg4BVWhGr8skbKaHA9Cpqwj/bbn0alDb4MYtc89hvoYy19lBdYkxfstHg==","signatures":[{"sig":"MEQCIETkDn+A3MOWkS6Y0JhH4YcJpvD5GQUpIaYeH2/iFkZMAiBfBJbSYNxUOdB8Efn97PsqJZ8Kw6ED8TL7akW5x4l29A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgEvkaCRA9TVsSAnZWagAAoBoP/Rxp/p0H6ysn014yhY8w\nVlva5/HewPukH7ZyGDnFpqTtUV4EEWt34Dgs4WgucR2aWcbkEtOruUmsi39T\np9nQDU2cn+xSX8llKdKMpGGLAk2dC5ebGUJjO7Z6fx93mXC/KMfUl6Iz8qka\n/TkRNewIO8pAGUGCeuKiqhlRj+q6YRfnlxfKHM8F7NfOi4KqV2SIt/QT7fCU\nQdvLRAX0+K3skr/MR64fX/e8PBg56bgYYYEyYP9acQhGuQgQcPAE+D1aG3OD\nIjEO/Lla+gZe+Yegz4zPTCrjbE2jj1/xG8YlU7JoV+kBDuCD6rpbhmzjiJNm\nWpQNRZGhbCCTYHoTo7Zwh548A5WMMUFqMcN4gSG0KKnWtDq6BHgRmRroGlMA\nZvoGLc0OrGapYSPWFsHO4ngDgQrc8XwSw7pnVpYFXzDBF/93oiVmscFLff5q\nUCpVh6//Wtl0/zAzuPP7Wa3e0Rtiys/WdzJW+hQEC0CpdLsuYdgUUAtEOCY7\n6N96VarfUmJQctIpEh304M15XKpD+/5UJX/FClGE+nkfGZdo/cjN2S2ZF+ZW\nDVYj4hhjtRdtbG3abiCeju/ASQcgfuCHHwMRQO950YVoOhibW0mOBbQrctvl\nLMP6BOXwegycxQV4OcGBWaPSBKVENx6I9A4o6Wd5EmfgxKO/q3gvtDgq7QsH\nax0A\r\n=tU72\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.33.2","@fluidframework/sequence":"^0.33.2","@fluidframework/merge-tree":"^0.33.2","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.33.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.33.2","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.33.2","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.2_1611856154275_0.6197649612237888","host":"s3://npm-registry-packages"}},"0.32.4":{"name":"@fluidframework/dds-interceptions","version":"0.32.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.32.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d3f1a65fc45389fdbde30291194dcd1934c2bfff","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.32.4.tgz","fileCount":80,"integrity":"sha512-fEV0aYuOPatd6yJKwjxffGWUUoedb0aK6VZ6eDTX/mw4UPAKz7M/vf3kIC0/5VjweH6oNK3q/Cj5xHksCW9rsA==","signatures":[{"sig":"MEUCIQCnU9qCF53qO/e+F+R8oBUiIFZnjv2aOb6dIm/W+gY0LQIgLLysx3Ccqk9zaBo88ADHfx9zYJ/REK3hPDFBAwKsQWQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":256064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgEv4lCRA9TVsSAnZWagAAqTYP/3XWfM09s4Edc3JOVNsJ\nSnQ/J2UlNkuzJmqiagQPw/SNb/xwHdWxcg2WKln0XJsdu1XqAvqm7xD0rtq4\nUZrlFI/XruH1yz0TwEA7iDYcCjnstEguTOZWnhVBQgOD7WnLceb9sgywSp76\nyBIMjXXkdy1b32QekLDmC9jjyVptZJUckkokIHNyDWPGQ+3LNDgdYBhvLX0Y\ndBGVdJp422gwgxZ2cnao1pVjyxQH8cpfJXcLHPfSdbCUIGZawiTi4UCNbi4q\nDaaDoOBji/7TP+DdoYbJoGt0xbaow+9/CwN+wDSPwKDhcHRtDn1PiDU9QRt+\nluGDrDPApNROkRECiS3tUKMdbERI2XIGPhz1stc93kYi8CW5Q16JFhYz/qTM\n8yIeeXq+XEdMNHk6a89OxPqdZk/KYfSnIMxlDiM514yzZim6k5Ly+hU0usCf\nfOBoSF/2O6pLoZgXmCDSE+hgsSlvzFsiIZd+AofL0M86RlXslwHqmx0RK3iy\nO4O3PRFLOKmrWCBdSKd0E1ggNv4n+F87eBmRKaiMN2GOn7FyLLEzS1afINbd\nb2n+SMNIISweHwBsDWrfPjai4SWD7KW6V/LbLnVRWXlsAczaUxpzB8j6ScCc\nR9ERL67/4RAcU8P9bqNzvPeci64+Goqh/cAwEYxR+Y4jejqMSw0E2SNjmMez\nNOhM\r\n=f3wX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.32.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.32.4","@fluidframework/sequence":"^0.32.4","@fluidframework/merge-tree":"^0.32.4","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.32.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.32.4","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.32.4","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.32.4_1611857445176_0.5831523751240191","host":"s3://npm-registry-packages"}},"0.32.5":{"name":"@fluidframework/dds-interceptions","version":"0.32.5","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.32.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"815a909bc092bcceafc7d5a6e6246626b5927ff3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.32.5.tgz","fileCount":80,"integrity":"sha512-HBXqOYXHJpgB6yrsY7w198WQFriBntX3Y2ad8WdSHlSNjOZgrQiyt+2rG7ecSx7PiCDtfVzsM/0ylMPUP6YEGA==","signatures":[{"sig":"MEYCIQDhrYzOAJRNeKPQ7372SjXAB2jtKJpJ5X7aiD0VVvphnwIhAOuSDr7VHYDLNqi6NXjaj9EU8BFTnG6/e26Hc1Jb/OQJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":256064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgE2Q5CRA9TVsSAnZWagAAeeMP/RRHdZ2omyK+QbqMKPs+\nZqdMDrv0QSaogXlZn+WUDAZceT+EHhchXXUpDJsjOEJkn/Bjd1M6GIZUarYK\nK1la3aPYcbFUePpXksijB+Ggd2ZiquKCERhd5GdcgEuDkL4vTTcDEpgcCXuF\nmTCu1JsUzF2Z0b98IG1VVQeJCU93M/u9qiM/1ErXEt4pYZUqT+KiwCsUvkpA\nAarXx0Z7pAId4Z5eTdq4GaY1hcImoO5TwPU6hcn0SkePOhyvE1CthGEHc3Mm\nSNqVYqy+NU08HC0RNziHDJSEsK7LrxgiluvQahpYtmx5J/hHJyoDWhR/KU61\nswUb5MZb5kwYF9689AWtRNr4CVftF+LGrDBa1Oir/wsIdo4rzspZHWhZYcFp\ny90QnfhghwPypwEWkQiID36FdrU2+wMFPZ+oW1I0ai+2r9gQ6O2FH/wF/iFB\nGek70HjPeKlpNEWfQlVAyKBpfiyCSHPM2SK1vZf4qOd1FSskHQh7slUeAliR\nrjjY6uPqTO9pDs496nU1U3JrQn4DtvRYvGhsVzNVOhoVP12j400sv4vGmrcK\nPO5cUzAASn8e+//pmJdGjOQkNUquuwwYvgwg5XtlVV2eqP++Y3Nkj62UHYyi\nFtmhhDGZot+hwQ0xbKTW2Y20FZCItEf42QraKZP7DyfKwJ7N1ojlaWBMhG1u\nFAjx\r\n=Cbmc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.32.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.32.5","@fluidframework/sequence":"^0.32.5","@fluidframework/merge-tree":"^0.32.5","@fluidframework/common-utils":"^0.26.0","@fluidframework/runtime-definitions":"^0.32.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","xmldoc":"^1.1.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/xmldoc":"^1.1.3","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.32.5","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.32.5","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.32.5_1611883576400_0.39769738085802375","host":"s3://npm-registry-packages"}},"0.33.3":{"name":"@fluidframework/dds-interceptions","version":"0.33.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"74c11491da8fc9baaa6c652e8b2485f6e1b5f1b4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.3.tgz","fileCount":80,"integrity":"sha512-Xh1pb2xJRGwHkLKFQO6aV9AE5RlrB+W/rifKSPmdLaxqfhsd8zNSOUjRshzG4ZLxqqFynzsSAq08A5VdJs3w/Q==","signatures":[{"sig":"MEUCIErTRAbZ9C1C31ahqZ35EoScoMuOc3qxnRlvfB9iVZSOAiEAkdhbsZgYrZhfOW+HlwM6uw8LQJu4LFHG79nnFAZn4PE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgE2fnCRA9TVsSAnZWagAA1X8P/3+JWs/1Z4xPvDW92v7U\nicpnjEePJuuk82Dw0y4OJK6DJKiTYTHtsAYVmGEu4Rte0gU4guvqs1s3ka8D\nzIo7OZBbDwbGxwmuAl3+UtIei1iHgm34O0XMzmRhGswWocgswOvMlRX4v0AX\n600RQRhUBfmVpJ+s8TXAwHyIk7G7uBTV/r+7PiAGimnJwgaDp+CFrEptgz6R\n9eNSZJGqbuXgntETlTzle9ehA+m58xlzzb41c9NMViJcsbzIn2qIV+4BFx7l\nKNIrVwDyQ+oyCPlRhh8lCgfCwSkAM04+1AdI2fmkq1P6mHXDw830q2F7nlQU\nH48pYhHofFtAJ3e3FISpPhETwK7Ia1rR7M7naUCCjPDcJQf3UW/QpFGNQ84O\nQ52OAP9bnOnm4iQrFdG7JnlpWt6rpJGZRGAweAyqAr70hU/U5m5WVQk5ueUG\np0lHovyz1YnQjIknh3t/3ER3nDfUrBrzGsci0K0Bo7idv5MgVXfFg1W+mXDC\nVi3TbRN5b8xmdz29B07X4woJqdZBYDKqli1qlL2M/E+KB/7M6EnAf4yIFjH1\nauoaCVpVzljE9t7ebo/Xc8XBp4lw6tsT6CKb5AIaNTnGIJxNsqN9wU+pB4Rj\nz4d77N/2EwZNmfv4xKtpP2I5ttfbXWwJoPVSY4Ahjbvm7lOXrCUCmXiVzxXt\n8jgw\r\n=ChcG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.33.3","@fluidframework/sequence":"^0.33.3","@fluidframework/merge-tree":"^0.33.3","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.33.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.33.3","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.33.3","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.3_1611884518842_0.46097186564634507","host":"s3://npm-registry-packages"}},"0.34.0-14942":{"name":"@fluidframework/dds-interceptions","version":"0.34.0-14942","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.34.0-14942","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e34f6fcffcdb5f856fb551c835d60907b306280e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.34.0-14942.tgz","fileCount":70,"integrity":"sha512-j5A4hhz87UxVVUxuTPKUPyCAUGw3A32Wh/HPyAXbGYh/GIUZ1yHAFo+qhE3SU70ddIorIDPjeGsO15R3hk0uvg==","signatures":[{"sig":"MEQCIDlVdj6qAovFGzNlBjVDJQV8asL6F8a+3fVpv2mrxODnAiBX7Mg7yBo3bEsYS0HJgB9wu3+gcz/QlNoMmX82JIv5rw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGZH9CRA9TVsSAnZWagAAkZMP+wQecq7d8gE3LNg/KxEI\n7SpAbaen3oHYJkP8z2Q9sSMS/bE6xpmnkGqUR+OXpt6ggNjNSHN+N6NDhuOl\nsvzClOQPBHk6+YkvefjkJe2gh3aKNXC4mP06VRqunrGZSiOJP6QXn8hhg9Rq\n9+FDX+6GbJi2h+9DPdpA/vGtLQ8lgRMwCKOKnnzGXQivcf7IuNdLLPP+SQ2B\neX1OymuE2DnbGR80SUByzQ4jdtaT5wA9guAvLfRsoDXt+SBilXfuNdXmeqmy\nka3iKiq3ZFODOCeHOGz5emFumL9hdR1ND/wX6jHMNBxM2sf42XBMeRHrjWNP\nO7Nhk10gHtrJrxsD8UinMxbkgho4YOfY0CfyJ78MxEbRTBKISjsWKoms6mfP\nB21QvVMGvL5ha0RieP8uDcp5pvPqZKhDC6WQP8yVqfjesgQvwo6k/vaCYnbJ\nEfmRMBNIBOFIqtZnQ/KhbOlVL18TUluqAsP/CxZpTorEoFTMEWMe/Ie6hC96\ngrT/c0dDUdQGnemXqPfuDULnd+4CuTAgKLTuoEaml8/alBofbFeqsq40mKZ7\nzu9ZIMepK7LvcZMwRUbyLosiGkXP7zuAod/NVpWeMv6WbUhQyEo6U2OVzwpM\nSIa++FnMmGZrZ6zbENzYiunDZl5qKu1kPLnm4LtJzvNoprdl0qxwF898PdI+\nBj32\r\n=tZGv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.34.0-14942.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.34.0-14942","@fluidframework/sequence":"0.34.0-14942","@fluidframework/merge-tree":"0.34.0-14942","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"0.34.0-14942"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.34.0-14942","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.34.0-14942","@fluidframework/eslint-config-fluid":"^0.22.1-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.34.0-14942_1612288508645_0.2877981832358296","host":"s3://npm-registry-packages"}},"0.34.0":{"name":"@fluidframework/dds-interceptions","version":"0.34.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.34.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c314e9e5e126331d0865d362365f02238d426b78","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.34.0.tgz","fileCount":70,"integrity":"sha512-oSfKVR401WPul86IkrjjKewEhNLfcT5cgCfAMSRCu2Yo8gEPt9eC/kTNrD3DPqtsySkCJjHkHTReFPHhhYPhvQ==","signatures":[{"sig":"MEQCIHGaHIKtNCzRFm2i5tozqH9Nc1vU8tSuWuWWoFbP3VjeAiAcwYPnfXGMBGez3rF6Fg6A6/9QXiyB5R3sA6RfmoKbDg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGxUlCRA9TVsSAnZWagAAI6oP/jNijFQTmf1qsHfLg4NX\nK1uJDKnFmGfq7YVjeX/vBmkb2rYN5PaKlsPTgOmeUfrKoFbFjL7gYhtt4ypy\nrTCKDz+aPCLdn3s9xj6EhcWrxsGroxM3H0DvtDv13LgohijFIG4Kzp9dZ+E1\nvQIDK1sVBVw2oV5SXbi9jCqjyFxNlqB9ZD6F82BoSohzmXVeSpQ+csROCHQf\nHnzWL4GV8hsxNqbaWQVmX/a2fcXjDOdXex2N2TXIhXAHbLvC5ZbFf1kpCOSD\nHUNjxLxJpwoGWHKdRBKn/t1UP6Fhm8Zx8R1Y9uL/qtYTSrd45Re5OwpJtPwc\nsiwBqOPB1Tfy8rs4H3vg77QHRji8zwTw7r16fPlsJm24IAzahJfQG1sDwDD3\nZLZ96GtF0gVcpjcAURIYoRDKXuM9Dlyq9veLFqB07Rb8gYdksVijWwIUni3l\nWLo9rKPSMFxmz0gOqkwuMqvQfIYvA/x/l9gO3txR1xYT3VYcUTPts2Hkgqhx\ny3T/qUafGa3oYTl+BnNNiovUU9BIQVdfjxSzRYnWBC545cmkk9lxd2WMt0tW\nbbAVgm8l6lDB1J45JJvYjqxIrC/wQVruaazW9/LffRj0zFi8+BPQbVswkJXr\nq+StaKR4YzdUAv6N1b7Sx0Rbi4ZjhCWsWX4BMX3hzJ70Gap0QAltSDXb4rUX\n78xg\r\n=I+zj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.34.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.34.0","@fluidframework/sequence":"^0.34.0","@fluidframework/merge-tree":"^0.34.0","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.34.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.34.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.34.0","@fluidframework/eslint-config-fluid":"^0.22.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.34.0_1612387620820_0.2224173271323917","host":"s3://npm-registry-packages"}},"0.34.1":{"name":"@fluidframework/dds-interceptions","version":"0.34.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.34.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"aa16f664ee9d36b2758c6df05d215ef73287f6cb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.34.1.tgz","fileCount":70,"integrity":"sha512-A/cj7yFsomVniCqxurWR3cMzfVx6J6YV9rOywtQpcyYR72AfRO9DJzngJMiYhdAIvrA3MJrBcMsjtp9ZCy39OQ==","signatures":[{"sig":"MEQCIH8Fhnl0Yenx0NrU6o+6p/4FNUw4n77eSRKqvW3GNwePAiAECBqu000y8Ji3V1D9hhYIi9uDMIDkHz7Mp+SeNF8Mvg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIaf8CRA9TVsSAnZWagAAaIAP/jtP2u+yU550X5XEu7Kf\nA48GXMzEjKUxCB01JuPhQW+4QOOsyUPkcJnnwxHJ8/RjoXuCqViCKEti5vKp\ndGan0dT9lmj/2WkpLmVbcqGe9Y8qTakK8DOunosxJR9AU9ZZTdcMvaySj7TX\nEZhsg7sY7MbzG3rYy4prLRWMsN4PSpm3SPqBNTyNPJalSCNM8qJCVd7rQNfX\nogp7jbOAePX5tP11wuy8ZRfpJh6207hKMySKMFbcnkDDL9ZrR4W+CRcwStrE\nZvyYSIpmtFAj98XP+nDczoTWrx0y5giR3cX6kABSyXpy/JGgZxkdmX3WbNki\nTkNUyDGLDy0wTaESyMGiJaNr6pY383y4Qq30q98qIVVXyH5U1cUpN0FNPD/B\n1lXYNq5SuM1sW26YicxXU98KZFEX1nzH4i3+QIQY8qtgue9cb1ZTG4Lm1Hi+\n5sQ2qarhohPRuJpfgyA6/UtFa0G6PLjSNzmVVvNNlz1L5Q4pjxAXN+ljz0HR\ncnz+QoetuAxV7IRQIMgDmokmNUP/HvxPzbOftQ79nhGzcDj5OVEeQ07l5gYz\nlA4JL1velfTXlodGBFQvgQsUF/qwfYcHjqffaMTNLeuNbnQ/DcE7/ezQAxTu\nRoInC4lyTq50bzaSanUT4rKBmdqqnC7tm8YJDLGHH1v05MYNmh01UpU0NNiP\nB/MR\r\n=G6Z4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.34.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.10","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.34.1","@fluidframework/sequence":"^0.34.1","@fluidframework/merge-tree":"^0.34.1","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.34.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.34.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.34.1","@fluidframework/eslint-config-fluid":"^0.22.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.34.1_1612818427509_0.9549580520724257","host":"s3://npm-registry-packages"}},"0.35.0-16170":{"name":"@fluidframework/dds-interceptions","version":"0.35.0-16170","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.0-16170","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a873d9c229d124318185cae88509cb1fad196a1c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.0-16170.tgz","fileCount":70,"integrity":"sha512-0AVNY+ar/v9wvjnIIZo8qETnf7q3PKugVL5+QfYK8YP/gDufXSVgylLhoVVFTOhCGRT+BtriKgntY5uQafjJkg==","signatures":[{"sig":"MEQCHyehJwbCqRwfHVQ3jrVql3y7wzHc7fn9gMikWZQYvNcCIQDmrc7AV5pnBVIumZeplJqhDXHk+6nGRv0SIu8s0Rnm9A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgLBULCRA9TVsSAnZWagAAecIP/jcGSmxLzyPq796Z54+e\nEq5AHYvIcSJ/B4HgvqGHw8UPd2e6E+vZuIvOMpQGsQOXdGvie3e5VNx7abkR\nXQ4leZYacAIsj6+XKOrUx8betbYKhg8GSxkl7JRh66k9BAScl34lz7TQzfUc\noxiwxXlaZnB2ka/kp0nxPMDBXUcPpf6EGnewRIN3mN4srmMRL5Jsgc6AG7m7\nyQQG2FvtpiqQSuImZlK3X4Vab8SGNiNY7hhP4fQoTsD0hOKv8Kr8vtttlQ0l\niIxHNK238D12kBfXQ5cgYN9pgxOPWVhirrD59N+Y0Lsk04tUaEubSzSviVbR\nOe7w7asijO0lWsIWBdTX1YdXEZ4Kg8Z3pMt2q2S5miz0cdjfRCCPwuiKROkJ\nDWXHA74gv4/AeeLpR7D26dCnNVSeCskNHeY0CM3VgHbJ+D4a6w1k1iwPBm7e\n2UN4ID1dL/gjKMP63xSRceNpqzADtqwGs7I2pPmUL/ZGrJR5pYY2zHZIL4Fj\nrwKmiIBQuh0vt7Z7qT5yxEajJrnGGdhO1VaTmjBT7ZlEfjDGfxF52XtX2hqI\npgA+K0OYiUPUeAqa3Th+aw/48kpQnSXreSzAp+j0tcpN4r8lcoZpffV1TFRl\nlIChpcT7ThKL5zBaQ57nC9zi80ch/ZtVg2ao+b1p+cBsmr6fNk7opnKeh+H8\nEjqg\r\n=ae03\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.0-16170.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.2","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.35.0-16170","@fluidframework/sequence":"0.35.0-16170","@fluidframework/merge-tree":"0.35.0-16170","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"0.35.0-16170"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.35.0-16170","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.35.0-16170","@fluidframework/eslint-config-fluid":"^0.22.1-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.0-16170_1613501707136_0.7435795814899242","host":"s3://npm-registry-packages"}},"0.35.0-16887":{"name":"@fluidframework/dds-interceptions","version":"0.35.0-16887","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.0-16887","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0dff58104811c52226c383086f5766a976074468","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.0-16887.tgz","fileCount":70,"integrity":"sha512-mKmZa3HrwiaCL5EAFSAaXwGusMhApIWHFCo9ecP5k3yx8p+tu6QpvSnwAoajLkJ6odhAVrTn38xClgzutrbBzg==","signatures":[{"sig":"MEUCIQCi6uBcxNplWKe1/g6GThqfTU26v0vWEs4e05vKvsNLUQIgMTELT2QZeG5Dqq9RQWRQEv2LT7G0uExv7QIgC6Chmz8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNARHCRA9TVsSAnZWagAAQvgP/3CvBOz3uQJG+8ti57W5\nxVEGcYbSZHWQvftOsQiY6uiPPXzuPqfej91d4tZpv501b/uYMyQ+vraaorQg\njlI6uTWRnv3o+znQfujzzRUz9IGZ1nVYI8U34tEkWeSogz1PWBKJP0t3yg8u\niVj2M2GEElWEpKhA0EYETz5OUXtqvnyFzd/CjkTXxuN/uv9KWDoqZgqcHnUe\ng/LIvjCOOhe6IRWswU9Bhgz5E8bb8UAqjhx/e66UlHT5QO6jv9f2R0Nrtqx3\nK8Mr93tzyemHVr7W4xNl+tygscxKyno7CXRlU31PfmhjVwb+L/DIKSCDWjeA\nrMZsfn2RrN78n16OpzxBd1/Xhk6NzmrI2OCM+FhqrZlhibiIbpXHmNS0fYjK\nqnoGGaljT3zq/M3hOT883Rahh7cJX5pnNcRhjkqqDRS/XpYLi+8flQy7aLHy\nwtir2nJg4XuQH1CnYeUY4uHBpJMRjqcSi63D3lv+8BIWGi/U2y5Cdle4fL+4\niuEqusxie1/iBw0ZpFZ9B+AsIvydgJrJj2ma/m7oFJXDVMloqs0ddRgU/1qk\nD20gaFQaKpXxm7CCwz1mEDmK2vd/gjP1D9zMqSrOIFI6Ro1R378Ie/2RbYeU\nXdSuMd7uFA9ZaPkVrGnGsi8cPU8pPiOANQz7iqpWYmEnd466jqsksNfD+uoJ\nFJcH\r\n=Ey0u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.0-16887.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.2","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.35.0-16887","@fluidframework/sequence":"0.35.0-16887","@fluidframework/merge-tree":"0.35.0-16887","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"0.35.0-16887"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.35.0-16887","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.35.0-16887","@fluidframework/eslint-config-fluid":"^0.23.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.0-16887_1614021703314_0.22972779330465398","host":"s3://npm-registry-packages"}},"0.35.0":{"name":"@fluidframework/dds-interceptions","version":"0.35.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"988cce50ac954ec23df602b827d97cdc7580337d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.0.tgz","fileCount":70,"integrity":"sha512-/W3ZLzDp20J/rOn84E+qQXySFlIiWacwGXvq7MZx/6QxzHUGgCyxXF4o4pzmizq5ATwsgXq/euP5wKntMycaRA==","signatures":[{"sig":"MEUCIQDkteaVXp7tVrx2ECNDA1A1CxhCSa2eQayisdH31Q6QfgIgZC0T02NNQbSNOah4vyDeBzqtJGGYd9pZ/Jl2akPj7pA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNIBtCRA9TVsSAnZWagAAxOIP/jQobM3qVGUJsCnhev2X\ntR3Mv5KyjJdEv0vJgk9G6cdPJUrwnf7niNeJR2N4XRxDI9TKNoG1PgXbY/jE\nA25KYQZDDgEuEK3+d7WE4ORDUzMWOjRuXKZWqvoZR54QZelM1ItF/6iuxrT9\nmObUSTC7o0Qt472aLT+XpF7UnrmI9rsI7TbxbmKcSOWmSXvhDTVpPwV6fq7c\nSnxyd0ZJ8qZ+9HFebaf4NIXs0wLk5IbW1F5DO+7oh6HsXY10+VFxefzokqWL\nMDENRDnsJTB2pGjUUdRHzUjkCRd9RrGzlP/0RLIxqzvAIB7ASw0+BjkGb/n3\nY/QYsjnH9vp0YvsgSyUlGjn8NE1OQ5RYECJmz6hgFpeHqIngBfcHC6SegteB\nmRWPpXUDnXzRYuyY6f8vEffiZWUOZVwIJ5xYwq7TAPHkGRx2zDp+TGXkEg/Y\nBDd7JjhQ3bH4/w5mpfkdoIIVHM/uEUBvdil7KjC5U+B2uLQJhjdbqFTn8WEm\nuupa8fTaIlmqmXUvpnN5vBD+3rMddpO/jc6yoI7O0zdznnbmgDxIZGUUXCXv\nHznCFy7yO+owjlTOuf/zttp+B66t/G6wRewchUHMqqk2NFQ8MYXLw3NBc4WO\nryUUQMys5ShVi1GLm01qaCqkSeqdmhseS1epHAeT7tp2DZmn/hM3UvIiPRPv\nX8Gc\r\n=sXZM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.20.2","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.0","@fluidframework/sequence":"^0.35.0","@fluidframework/merge-tree":"^0.35.0","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.35.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.0_1614053485520_0.5454125579576459","host":"s3://npm-registry-packages"}},"0.35.1":{"name":"@fluidframework/dds-interceptions","version":"0.35.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5bf6cf0c0ceffa96b5d69370002610613d354c81","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.1.tgz","fileCount":70,"integrity":"sha512-jo4ozPyJCMUjdbXtKLL4Y1lME34Skrv4spbnnzYnBCMkdRSCaWa5tbxmgT5XE9rtGgDGBnHuDarXjN32S4WUcg==","signatures":[{"sig":"MEQCICpcqHgxLhD9jtzQxnEpcxhupzfBvmSMwjp5cyJIXYNmAiBAaMpA4gOmUodgd9xHKGdoV5Dv3eZo0W58Q9XICtqpRA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNtVnCRA9TVsSAnZWagAAoLQP/2onA+mQ4rzElMZHkyCr\nOXCIXVYC5iUm23esIJT6hqCAWny+QFZv2nsQQpb+Gfrab0LduYckMxrLlhaj\nVJ9sK/cztDd0kLnYWbKEUkgSqUFs8fGJlWalhcTdy8F2+EA4+Zei1yGv4arZ\ncL3qzVmu48sssB2GGLTM+tpm/HOArVSdzHKnum9nFOCrSKRRZ5nGD7G7Erf0\noFOzkIQC9LSgtr7glUQUO6lFfGChV26eg2vnXPrTwT0HUV6TTDCkc0jYy9PL\nRaLrCDYT9MkDXewtXO8pqPiQn0FNAvCvjWG7j9OZYD/7knI54FpnshY9zhCV\nBR4w11R7s0eWKpihFMyUHoUSvQH4rpIh76nvYyzRfKQtXEi/1DTO40u5FM+a\nPeIKW07NkS993mMVRDFLtNovzVWneNCqURPWVFeqZoW+K1/9a9B/nnIaJEXS\n1XlckUDhgonQr/gE29JJY1Sw9Y6fM1ua0HjVOyZEsNJswXFXZNPnfe4xjOSM\nZ0m4j2nJ9J/75xOhS5xALM6Dyhdwo5hWBzQcD6+bvBFW0x6hTvdPvO6YnZDH\n3GJNOx4SN+2blcnaqMSy6vAuxgct38fYzN7FBa9zR7CAC+pAmYg3TuOVraLW\n25Sx/IE/THBiysM7stXNIYRgwJttrsgv4TRbkEMYwOXBa67ne+/w0uf1tWbM\nsS/B\r\n=XXX/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.1","@fluidframework/sequence":"^0.35.1","@fluidframework/merge-tree":"^0.35.1","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.35.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.1_1614206311080_0.44217297917795406","host":"s3://npm-registry-packages"}},"0.35.2":{"name":"@fluidframework/dds-interceptions","version":"0.35.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5c36aedcf46a3a2ba7174006356b76d16d3cfddf","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.2.tgz","fileCount":70,"integrity":"sha512-/EQrdlsgkO32h9TcTWqLLWCkIkEz4mxrQSsLXxtjsbloAEf57htUDeyV/CpPTU+RLakE0U/NRd450QqTqSf3qQ==","signatures":[{"sig":"MEUCIQC2jyzW1MhgSMy+gZIntNm9SSMtKh93jSibPK8UmaHYGwIgGbtb+funm2zqKMgdqY52B/MkxOLyvRdkP+bsGMObHGQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPXhyCRA9TVsSAnZWagAABkwP/jaortszPAUACSuK/LGt\n8XQbp2k1ybWhE1x970bwvDbMoeLUGo5doVjClKpd2o6Qj20c4TOw7+9hoVLP\n789esqjk/HNTkzRUvbuAjb1mb1P0+Wj57HxbPq+4EfHbU95uwpoTq0ncbH/W\nTzTYBBKFENlstgg1/spIz/W2T3FZgvrBk89uEZ44CmMDbCIZlWfrWjy9WJ3/\nA8+sStm6QEJXtPUsalqzM/s6f39PPFUJPDQXDKxYF4pS+ntJ2grTlE5Rrf1i\nrRBO3ErSMNviNwvRuRxNywwmsW42a65saLzWxGel7K6DJ1pGAP55bgycWPLZ\nUJ2+ckozKkHzttfeFmqI1pgFnTVFEwA0hTMPtoK4nkAC1OhWurYELCV7UVKj\n5xx53jf5TjiPWQzDyUWJvQPlTciAn6zgG8uFHVoMBhvL+YHOcVEs5I42cNu2\n1YoACrueI1eu8kickFD+9vBns9niQHagYu7Fpz8ktIvAs9Beut72vnLMYlmg\nvGK8A7LNwvEc9pLTQ5BwqANp2/blI/z3gGXlL9hsUor/ZfqmSw/a84eC6FBP\nKtbgvFdgkfHyKjQ3oFgZvoJn/ujf8IrsRwqruGSplFciZGq1kmOQZ6abAZj+\nIODP4YGETDDu6/oxLemEdNvSW7WRZe829Ua7rL6CtpYrAq1+cyqMPzEQOE2e\nuq8q\r\n=9Ip3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.2","@fluidframework/sequence":"^0.35.2","@fluidframework/merge-tree":"^0.35.2","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.35.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.2_1614641265983_0.3705333802455899","host":"s3://npm-registry-packages"}},"0.33.4":{"name":"@fluidframework/dds-interceptions","version":"0.33.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c2a788ec686dddb7e5b492720d7575d3a9bda1e8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.4.tgz","fileCount":80,"integrity":"sha512-AzYbhaPv5sPlvfGrLmpv1w07KgOWGSOeq2nclBwMv4MSY8nk+WqCK+pwYtJN7Fr41X9iDbMA3a3V8FngISKJ2Q==","signatures":[{"sig":"MEUCIBzHhWcL8P57dF1I1tKMGRZUPSDZY8rwk+KrMyi3gsPuAiEA/dWGtwwPz97tbZP+ZMj4OD/xWJZZlKQrHBsCbtX5SbM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPrIgCRA9TVsSAnZWagAAR7QQAIaQY76LR18ynkABNQrW\nfqTOUzgFFTAC7tT2ybPvXhXn4FE4M4cKP6it2IkOkg4TvqO6vTwqquYTe9fe\nwWxqfbDrqvgw1GPRi/smNGAmH4WHSPCCW01mRrW5svoxAmecA2zhtfwZz1cq\nmx9HBrVdD585stb+mske1KMF4IcngxWQjDFdP5b7UxsaQbIvQg37VUeg5L1f\noFDTo104n4OGPQLA27QC0CWY/AFhhLZSw6XZcV8fOfV5QxyMuvuLGW9bjJ+Q\nlaENpayViDpz3OmEHncRbLCjz90GmdbEfhbBmhnBjPdwP8IbbOis09ACXff/\nPKyBevr9B2Oo7/5oBAz1jeh3pkiDq2coR+PmySkW7x4dy+QCCJsYMqAd/ugY\nKKbq3HIiWJP13ix4V46uajpZZ1lVbyQ31AM5AIzX1INi0SV4rEe/pTD3I2fk\nGw4eOq5hOBH5bkW6kTGOYsRNYCAfZs5zmr+1wMdpsB2SAPnFvR+59a0edAOK\nb2adUJxJ6I0Z1OGQPdDzTKZ45uzyDvDwty07p6FRLgBgM/kCJKdmXD1t3Hc9\nkO0gjGLAdrcRGinOfHIMPuhPEEOFODMBCcljiVNgpl+qZlpVMFS1BbwTW8Pl\nEUXArC+F8erZSY8NgVp1KGTIjDJp5TRM5Y8AwN3I2EMW29joXaktdf0A+P06\ngfE4\r\n=D0r0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.33.4","@fluidframework/sequence":"^0.33.4","@fluidframework/merge-tree":"^0.33.4","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.33.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.33.4","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.33.4","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.4_1614721568168_0.19872985446892644","host":"s3://npm-registry-packages"}},"0.34.2":{"name":"@fluidframework/dds-interceptions","version":"0.34.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.34.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"16c9c7ae1d237e0c3a711343e872cc6d16ffa864","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.34.2.tgz","fileCount":70,"integrity":"sha512-sL2h7t+s4SVQ7g0A+pGe85Tyr0lOrv9mew3bX8xvCbf+Cg32aPT8QUFQtEfReA3NFuZuL2d40XIMBCvI522D5A==","signatures":[{"sig":"MEUCIQDcfsEu3WnCIHES2UFO2VpM5kmP8jtqvNojLnGi+6qymQIgaHJCopwU5LHayIMBFXmqlcXCrv9JWtYfJSuttcVtI/c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgPrInCRA9TVsSAnZWagAAtKMP/i+M/BpgLfwkSGh5JrA/\nNkt6Fbg8fXBHf8TKu6GLZRLm5g6VEnZnvbp5Z82wOSjj3wR8KL2FJvLJT1e3\nRYCuSJSU4jb6G91cSbrKWxkoeS6RTsWZGEl5RRZ+oD8qrPyYBPSIEBm8gCa+\nCiuZWePGjwqpKs0p4Wcv+8okD5c1TLGpop/XSCSKg3JDTg84ftRdDLJPIX3l\n71VJen+zRZ5lI3ubPsd1+MEkooOg404ZstFv+a0ZUEtR4oM28T3n9/MTwUOv\nDVFlnls7A0B45bCVmnHxlfVBo0i4RaQRyDIrQ2gIq53kHJ0z6ehwWY4j8svn\nwdjpsS6Nlzbrx/FS9AwfzhtKThV+g/Ss9x1mtbgyZ01owdbczM/aUBJ8OauT\nqbKw44VTbgq/D9eIGFxej0zR9PZXXVBulo3eiosjUFXSDtpjysdier9brPQU\nQSEAHVzhEjvpO1P2OrbU2i9ftOuMbMzPIlBqVRhsAg2VKjKXwW5SVnOOWk4y\nFDxxdCZIxxEc/61QACIMcJnMDq8Nun0Qraqk1cMGTcjrr7R0cfhJsF+iB9GH\njuBLr6bAXhsECEtD1B2pdjsIVStbZYTIgXzrsIaPo43JFJrmkG/V5bvp+fxf\noytXRLavPhcpzrNfXtcPKhUUADmKfqi0OWpfZmL5+LcXoYDP4c7y+hNXllkK\nf2kA\r\n=Rejd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.34.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.34.2","@fluidframework/sequence":"^0.34.2","@fluidframework/merge-tree":"^0.34.2","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.34.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.34.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.34.2","@fluidframework/eslint-config-fluid":"^0.22.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.34.2_1614721575266_0.20769413906259881","host":"s3://npm-registry-packages"}},"0.35.3":{"name":"@fluidframework/dds-interceptions","version":"0.35.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"25b3dfae0f4a959b8563f0f2979068893863363f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.3.tgz","fileCount":70,"integrity":"sha512-0u6HCUon9W0/BV3VD2XCuQbbjx5dCV+cGGGCejbES1QTf6tfWAo+abYqnGay+JlpczKNsrIlgYTZjYIxqaaiFA==","signatures":[{"sig":"MEUCIQD669AO5A0SUV8vLYpdpYA9dB/mOQHXg8R33fChtUa4KwIgOkanEYCYqXPx9Z4jymgo7J7YG7eBfs4TpqGq/Nu0EcU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgP9PGCRA9TVsSAnZWagAApZsP/3QRaR2zGmQy7ZOMEy1b\nMJ08wHqpqSPMpj/cAh6424qxkxWxVhqmzsq08fUHjfPMYg+hU1UfbByiwpox\n/n88FqQHdUA7ax14OATMWwHvyX+XRCxbAuSC+g+xVqF3sdzLMCA+2VpfwSNV\nLWCHZEbZsFhqa+/eyL/M3HHjYoLX71UmmK8j8wTjOzVpe/TR1OmgwmvTQb0V\nprh2i+PxWqSrrCiEunwrwAabSgE6T6djhuiBnVs8kG1tif+2vtyhgy7qSPC4\n8QzUbR8WGzjptQ/dugI+Jv5dfyayU62RdC5GU+FdZv7AgV9xDR2BXiXvwmIZ\nVm/t8RDmeMcvYk8m76C6lS3I/YsQsyem7j9+QN6axXuYNj3aPvqSBq3fzhKm\nUPqRYQJgInkY+EMs7eFk58KyGSFx+RJ2oIO/yTE69vJApSDBx8Ds4de13Y1l\ne0x13ufvyxLD5ztReyfcgHGwhs7DbsLPVRcr9jWE6rhfqeUxhBL7Q1AGgnrS\nmJiaJZeywFGWNC2SI1EaBpmKeE4eAG1TnJVh9d0GFYAcLDp4NX+QI9XOmToC\nL/SwoSTRFyKq/eaIZBI4VwVthrJ5RyP50ySCunn3m+l3FfxnXe3tXbvLviun\n9iuEupjkBUxKMWwDt2TMsej+jFPMLMJUeBO8nRR/A1Kpsbb8eB9eJK1NyOe/\nPUvU\r\n=ra2n\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.3","@fluidframework/sequence":"^0.35.3","@fluidframework/merge-tree":"^0.35.3","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.35.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.3_1614795717685_0.0005350791720504233","host":"s3://npm-registry-packages"}},"0.34.3":{"name":"@fluidframework/dds-interceptions","version":"0.34.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.34.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1617942c6e4fc249c35c02d8a726ab5418534c4a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.34.3.tgz","fileCount":70,"integrity":"sha512-VPElkmSgh0H8ngnv4OsKfegvZFK1Ypm3w07mw9/dpX7SM93wcSqNh7ZKmiYjADsFwJpQlUoFbfi4YuWRe1jGJQ==","signatures":[{"sig":"MEUCIQDcgZdL50rXQSisKGa1CAK+xa9mNx39MPMVsZBxcOGZ8QIgKspGapCgGvpoDXczsk1UznG24UYnrZasE2UhE28yCDY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgP/fPCRA9TVsSAnZWagAA5FcP/ir3e8bYQqy8ITTAV1KM\n2eRUr8y1TRjM9mLkujE1La+XsdG6wxnUNRCNs8awXkc7+7quAIfonVPcxcso\n0r6HaXev7GQBL3nHj7kuv/YfvrtqOginsqdR7ZdhuRPmFoXr/GSk/nY+NYY6\ncN5MeJzgj1Q9hx0bD6fPsfLGatl/Kbzsd2NpL7G7mQ9ci5twRLG/o79GSp4O\nGqPBlUebZ505f4exTjPzB7hpEndAb24szG87IW6JpJBhIVnC2pdN9hZRry6d\n9jSXawORHOdgdKoMEmRfaMX+gpKLZYMkKUPbXrYokGr3VJCzwbj/xJHqByrN\nPQja9ItbG8ZDNHWJHmRXyyjC/zJfqXdUaXHamofu/cmTwSD/VrdmmtID7Uc+\n30z61ZBXjXlflx4HDC3tgOBgcR0thRmrVsg8eRj8Yh1jy3/jVoCFkj9kwb92\nslH+hX4rC0AzEISrEY8858OQXyelcLsreQBdRZBRnslD6EafZ+adGMdc2/Gn\nqMFgJ+oDhKF0rNE0NNH4+eTOlfZByt5gYw0a+jb0PBDAvzvdDH9fbhct3WA8\nxPXxZrKMoU1CLOeIuuQ+KmRtDwvdZORyG6frtrStrHe16oWJjt/eDcp5Q75q\nGs5fWaSAVZxdyvtfNE7g3twLUgP8IdUQipslI82lSvCF4H6NSP1NVYwr/U9t\nBJhk\r\n=ZBsQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.34.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.34.3","@fluidframework/sequence":"^0.34.3","@fluidframework/merge-tree":"^0.34.3","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.34.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.34.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.34.3","@fluidframework/eslint-config-fluid":"^0.22.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.34.3_1614804943260_0.7905055954628564","host":"s3://npm-registry-packages"}},"0.33.5":{"name":"@fluidframework/dds-interceptions","version":"0.33.5","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.33.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e433d3533b54a446a07d950f4bab5009bd24244d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.33.5.tgz","fileCount":80,"integrity":"sha512-WnxN1N33YVEycwhZQYHAix8ITkU8KWc4IK/BcZHCUkY622CCrS9BVT3TZvxh3e+ctNsuQFYL2sIxY8AHMq6D0Q==","signatures":[{"sig":"MEQCIBYJ3yE0TZodMvWQkdQu4/ihI/teDWHS9KkfL6UAPLdhAiAQJZFu05LcCL0NQE/MjbTSH8Awc070agtCAr9FRvNc1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQSJWCRA9TVsSAnZWagAAtCYP/AmsqbL3ioXBzNZhw4jo\nzGQ4U0FCVRsOOG4X2LL2eJ0bobmNJgcoWXHMggpz/gLsHMxhzTj2SaOGLIvY\nI9J+8Frc1MnDKiZ6cp51/J9eE1r83mo7Cyy4ua8eSpMTZ2tAP+XIKPFdDVC2\nkX6+p+OdcrfRTVfthdoaEYRptE0cce0BClmt6BwDoci3h7HcTjq2UCbnV2Ot\n67J8JuMiVDDo4xpyicj6rDFiKIID7ZhbH7e3ierqTcVSkdn1/ROz5a/rtEMF\nmatpBrlizTgepvbuxH/0J4Yi6N3b4bBoIrcm9wTd1m7akjrUDUUVc7t7eRMs\nx0i03858YI55TXtzbtQlUPOjGnLZI/u1MLnCait+aqjlw9jGkjr4PWr3oz6m\n1yULnovv925h7bpsyppZBDNQxkmQnuj3OSy5+6z4UzNlSJ4fEXxG3098/D6H\n2QNElZmdWc9FF0TSNzvqH5XO1sb9mULan5uZIQxcYnss8ZpXEE8lzvIQoVr9\ngMgM1Hysp/2YxvbqmfVigSU9nnBpUkvdd9kn53G136qtodijQKJdzxJykKgw\nDBOgvGKXRPz7vvevhFF6I9DCs9315PUN84CWAyoJbKpP2eL+0cx7c3/kEd8T\nrUpLCavYfqJX/XjSf1Lt0MVWLngq9CX12rB3zxaGGS8OxQt6AGqZisJiiXHr\nsLfZ\r\n=7h6V\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.33.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.33.5","@fluidframework/sequence":"^0.33.5","@fluidframework/merge-tree":"^0.33.5","@fluidframework/common-utils":"^0.27.0","@fluidframework/runtime-definitions":"^0.33.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.9.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~3.7.4","@types/diff":"^3.5.1","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.1","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.21.2","eslint-plugin-import":"~2.22.0","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~22.0.0","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.2.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.19.2","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.33.5","@typescript-eslint/eslint-plugin":"~4.2.0","@fluidframework/test-runtime-utils":"^0.33.5","@fluidframework/eslint-config-fluid":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.33.5_1614881365988_0.38845761727865846","host":"s3://npm-registry-packages"}},"0.35.4":{"name":"@fluidframework/dds-interceptions","version":"0.35.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f19a1a577e73cc8ba6213ba8f7127e4115d4aab1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.4.tgz","fileCount":70,"integrity":"sha512-DE7ixKroi21b8EYmqbi9GP2tA+SxXgpIyB0/MGjhOtaZWp9JZLBpAb61ksu1BSuw5OYZU9Qr2He5iFS6sWxVGg==","signatures":[{"sig":"MEQCIE1pNGEJv1snkL5aoNEet/CmAai/hjowno+IEg1usLL2AiBJ0IDrjk8lC2dGQWqaQ6xctycLZ5ZaR192TP6UCE/jwA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQnfLCRA9TVsSAnZWagAAfEMP/21V2rlGM5rXJxTRNIZB\nUwxgPd/VECUQ/mdEEcWcCKWjqCsZFPjewH+x4x4GRHMAkq1psn0HUd4CfmR5\noF3ctL1BxYQvZalkwn1CUkSYv75MAJdQveSuGRWUiZ9sqPsjVqwmfTYUxvKu\nli4jLX/DE4ExaLvRoCZc0u2mB1Gu2Z8D0MxhJVFk3z8SiD/nOQpUJdNqOr57\nmhV4Q131wYUfKzL8tFVSVPIt9AdImLhtPZ5wU8XmRNR0Ta+W1IuehFor73Bq\notVges22t9MeBu7g05LyG7KghTg3aC6Af5ADMRv9iMFVuXpkSgzkRldBg/Lv\nJAwnNdcadnQBmN4/lU38W8AGeKeQrLK7hwQYbpLhGn5z8u7ojhaEMrp1e89n\ntBEkZqichIjIPBImt+qYtx2ulKXD0wL8Y95cI3NsFZ/ZoGuUZG9KsTtoHtro\nKknQWV7pzVI+4VOJ+fSCMbJgcSwfae1nFZ1BL037vmjy5FZTlbT38VC/NgKT\nJmQmEfQMio5Tgc3dxX4IcJaXpRIpi5Cu6D64KqcuTRFU3eWq0gzBKX1SfMbP\nEdSrtzppDvfuUnBvAi2ZtKXoa9jwxS9yttj5QBy71IwLymRVDL93GSAban9Y\nsFj9Is6HrZdZDYaKkzgdphLyvnu3EtksShZmr5GU0rmgPQPIKGTITiWGiNk1\nhHYv\r\n=0m7O\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.4","@fluidframework/sequence":"^0.35.4","@fluidframework/merge-tree":"^0.35.4","@fluidframework/common-utils":"^0.27.2","@fluidframework/runtime-definitions":"^0.35.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.4_1614968779302_0.7684695752135462","host":"s3://npm-registry-packages"}},"0.36.0-18883":{"name":"@fluidframework/dds-interceptions","version":"0.36.0-18883","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.36.0-18883","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7806eb0bd182e928e2bf5879d8ce51ddcc94b260","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.36.0-18883.tgz","fileCount":70,"integrity":"sha512-jwAr2K9wo/X2gBnNmjNkH8R+W8ZfIULZ7srvSQG2sRjjqenFn5jEcnjKwhoh+seGTGJoI65zJD2jRMI4NFfvEA==","signatures":[{"sig":"MEUCIA56tM2b8Wl9RvODSlMwJY01MyHmGdvTooaTuiJ6gW2lAiEA/5u+s+g77TejGgrGwE/C0Jt0Ljr8KIfRyxMqcE2zNCM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143874,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgR/ooCRA9TVsSAnZWagAAb7cP/0hYOSoV/NbwTOJr3Jsz\nQWe9TaiUw5RY7FsseGGzSC7/MahyuzheFWsHKO0FRaNHATgl2BEv9X4oX6W9\n/rAnT5Ky7xXRKPLq9w5ufIQoLNzEOvdR4WKOi/OvNTLcfB9Bu28FgozzahzU\nPERwoCysXTbDsxJ9t6u7ubZZAXGDk3BfM8/1gTpeN5fMNiN6jfr5++XLh26w\n42fZtugyp2/MxJStnzotesMK8KxXSXe1Hvh/qf7qCUKDXgpzhB3T66Od+jrL\n6rbZpGTmmQSqNKxhqFDb9AQqqRunorTFkzFhiAovvq0kTIeAm3iKqoUaNcpy\nfSrJB4EBATnumtKlNaNKs/e8yYtYMSFUQRPO1SFQcgg/SeHl70KL8jv2S5Iz\nEpCHP0uwYol1/gpRqUG2WlISDXFpmXSkTw0jIbJe+q+RccbWBRuc7CydYheD\n/haNvLHXpfTQFRRlw5IHrp7pBYqkt9E0nscIoUfW42sCstumnzFjShVUG4KN\n4N0ncdb/rbEYMs4sV1kArnvOkl7zh0QyhdKaB4+9Z+3cdBamIUxnp3UQ1O2L\njK3fVjIoWkOerhmpKBLUKE4XSKwJRXlDgFqtSQIHmCXEr9tJtd3FNtxX86cH\n0Ffa0rXKVd8WXEBecXEe0RUUbcLbNzCKINHwW290HjqSmNNlUkwt5HjjAvYM\nq/vx\r\n=P8tU\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.36.0-18883.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.36.0-18883","@fluidframework/sequence":"0.36.0-18883","@fluidframework/merge-tree":"0.36.0-18883","@fluidframework/common-utils":"^0.28.0-0","@fluidframework/runtime-definitions":"0.36.0-18883"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.36.0-18883","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.36.0-18883","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.36.0-18883_1615329832217_0.3105250112746871","host":"s3://npm-registry-packages"}},"0.36.0":{"name":"@fluidframework/dds-interceptions","version":"0.36.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.36.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6ea8d9a0749116780a279082524a39d05ddf651c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.36.0.tgz","fileCount":70,"integrity":"sha512-ktQycaJplrHLQXpdcnDh9Ev9tRs5FqfQ05FB2B5YyvBrjB+fa46JTkYaa7rrPu41mqulgejT5dsKKRg8tiOO5Q==","signatures":[{"sig":"MEYCIQDGPxFAulwGHW+e46NP10K1FcSZpAgexpMDlaxwtQ8eJgIhAIIOdQzjkWB0FpKpg5Cm6Js2kD44mGdAXNIK7ZczZzAh","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSDs2CRA9TVsSAnZWagAAJEgP+gLuB1bQBHDVtF1I9Xi/\nfcxA2+H8pXNBIO11fu4FNef/gdOSqC8YgUKsg1DAH/zZgWQ9lkmusSaSTwhQ\n/uaRgxMGBNqLf8CTU0L8OSP18Xzd/Wf9GXVKVIMggXB2D6NUBW+PkICdL68N\nFUv+XTbLfollmUKIfbMGWanC3Pba9rfI4sBFmyIJCOE3ig0emStQcswhj/tj\n95+WWuiO3/p9XXV6Dguhj7RFwtTFvqrAZg+f+kolYnmzCQx0RYpWFYtXfR40\nNlROFRGRZVy8hYwcInQERJKaAowFn87rwINKro/j3jxqKZ/F1q/TFYk6KRrE\nFtoNBXcnGvJzWM0ZjGBGY0/rZM5nD6BDr6wUoKhxIQHBa2e0syQPxZzgk5mF\nH0D5MVODh7CUCwQjONg9bMXArb2eE55jGIPnxEi3omiMIutPWAdHJKoeJoNb\n3VLIvVIaFhniKUTQ1sS7sWTY1tLaGPuySEVQfQxTM8vOHiPxIRttpAvliZ7d\n2jScex0l4pCMsSmb0ANsz21EKKA88kZ3jSUswv7lx9of/RkhClG6UcZ6Ekaj\nuXZnmx0qrXGpZW8bwqOwScD93MPY9ohXI1Im5MptWM5AM+pudLUARAYwqyCA\nu/7m4Cue6djWqlMQo541stnwgrctXwnPnSlT4Uq4kT+MCMUo4R9Bc3CtHtDL\nj9zp\r\n=9SuE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.36.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.36.0","@fluidframework/sequence":"^0.36.0","@fluidframework/merge-tree":"^0.36.0","@fluidframework/common-utils":"^0.28.0","@fluidframework/runtime-definitions":"^0.36.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.36.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.36.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.36.0_1615346486357_0.9894329687073602","host":"s3://npm-registry-packages"}},"0.35.5":{"name":"@fluidframework/dds-interceptions","version":"0.35.5","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"70eba8727c4b8f0991cb7e4177271a9bf78194fe","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.5.tgz","fileCount":70,"integrity":"sha512-Zx4DNC3xrki/K66MW6Z7LR13yFKm0ie89qpqRCUlwwcFOT5IG4x1HFFJ44Dv4o+4ypCu7VqfBmlF2H5IOFW/wA==","signatures":[{"sig":"MEUCIQDNDSto4NYp3o2Z/xLm7Mb3czKQ292vbGNiEaDDhH35LgIgGsZ2S14ghD4ZhjFMFWeS5rbr2J2r59wMWFBJ6qR/3+U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgVN0YCRA9TVsSAnZWagAAIcsP/j+FH44CCUp3a3UqjRDs\nz6At5l8MrQ4ca222/VjL6o7ndTTZqtLeHxGCJi2indxSEesZNlaanCoJRin/\nTZo2kmDSaWtYdo9cAAcyjz8DtFEdZ4qdGxojKOBwD5AtuRqj7gfgendJDWyb\nJ2HL62U1fKhTZSIQ+qFXH/uuf28K7u12XVDtcqTiP6oUmYieEzrForw0bqPE\nvgiYtNQqJErCukPZmOVxkBRzuPEDy+0IjNvNVSQdzqyVB9y3TpIcDEdPgjhx\n/GJH4EixiMQmYOid13OsYXiTu2o7RCF744gaMyAGjzoqO6DSJVXovaWdAOVY\nl9XPXv1PqvMGql51/wmdgqZSHAVhiBedrQhtqNbz20yjzR/32NgYsP0aMfEP\nSEzT2R3egupSzX4qz5PstCf3mR/ZMw0JpYGHnUuDNQSp0MFOjJAsMMmSRc8Z\nHY6WNuGdf+F0tPrqGrqGgeGA95qHiD9ed3PwHwrj5632bnlUFQUUExo+g7/R\nWygYHk735bCdkEAdXD5gsSq0UnONO0tUIeYox14r1GAYrplecPBriQE/iKzA\n+MJIdt2MUAwUJEIDIl57h+7AV2U4AhRTyWhCO7tKnlEo4rCYYMvpHmtSBwsf\nsD9kR9WXK4ROai9C6E57rp5eHgpSWU/53o8ExPEV7DHAnQl78Q1oNtxj/5D0\npBmb\r\n=HV2D\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.5","@fluidframework/sequence":"^0.35.5","@fluidframework/merge-tree":"^0.35.5","@fluidframework/common-utils":"^0.27.2","@fluidframework/runtime-definitions":"^0.35.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.5","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.5","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.5_1616174359490_0.7362704807784228","host":"s3://npm-registry-packages"}},"0.36.1":{"name":"@fluidframework/dds-interceptions","version":"0.36.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.36.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8cd6481ab2cb58cbdc2394ed5b7ff86f7974ac6b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.36.1.tgz","fileCount":70,"integrity":"sha512-RdlACgfo4OVR9+F52HIrstXb7csyZAeA4LPXL8aWwDuveJUTu2GnURfgK7YiaFSP1Aaz4SHw7VJl3qfRsc1zGA==","signatures":[{"sig":"MEYCIQClKVSReApUPfz5ScjxVoYRaF9t3WOwGduAior+uqrWZAIhAI1FJejvDKpvbAay5qXu/fNHncxrHfNW43U4rf3/TeoQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgVPspCRA9TVsSAnZWagAAZyUP/isFdf2x06dg9NbLmqlY\nPm3DotYs180dYALQAmfsEyKuiF5PQjzfbPgkOoWaKe4qrWTX+b2a1gYM6YQ9\nCMbbaZwqwVckJbflxtwgM3g9bYMwRUgv5jDeG+BbY82Sk3q7z0X8Q7nZk3t7\n/UF7NmLc6GlMWYVUgcqzTOG7czV6bK8PLn7s98ecbncXY656+/FdUk4+04xM\nMnf3o42UNH+7Jgm25/L2qEkB/ySQVOy/MlSDrmRtHsAtUTrzKnrqcuW5GOFP\nZxAjPgU81VwZ5Fz9XOYhtVvI6p34xEvJkG5ZzR7kR/LUguo/jrPn5nFljXVN\nWfGEzkhBXyBMM2RR+ILv/WfXYamQ9jbyhKqENEIUWrePcU5CYDylikmRLLhK\n073HpfeL2NFHAfWRgfCkByP7/qIMOVdZvZg1dmqB5oHWCIvUDRWS/P5L74Ah\nO9+JdpBHiLWfST7vSzeU8YrRN+5RzgJeRArH0QSlh8o5NM4KYM9w32iwwMIh\ntvasIRE89EP2M1mj6OXNlnSQ0bO4i67/2y3ioYEXjt6B0nZRCKiT65Xlx+Sg\nZee4mj0p0Dwe3Frh0w/yznzJPuryC0K+M+Vuv7J9ua7Rc8ulJdgIGARN4zIx\nnajAV/EJVlEAyyc186aG3SDnMAIevxY5FqNXqgEsS6Lz5Fr4iRoqBVJmJMcX\nHfA4\r\n=t55G\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.36.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.36.1","@fluidframework/sequence":"^0.36.1","@fluidframework/merge-tree":"^0.36.1","@fluidframework/common-utils":"^0.28.0","@fluidframework/runtime-definitions":"^0.36.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.36.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.36.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.36.1_1616182055105_0.6061737976388644","host":"s3://npm-registry-packages"}},"0.35.6":{"name":"@fluidframework/dds-interceptions","version":"0.35.6","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.6","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"db7c3e40af1aeaad2a55829ded8cbd0fd0d22015","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.6.tgz","fileCount":70,"integrity":"sha512-JDdVHs08daMLimzeV3ixT2EXnBcHgSxMdXCi5JDIJxnAFjijj8HNny6ZOdDfImhyJi/zFxjhRp7dYLIufRtw1w==","signatures":[{"sig":"MEUCIQDJzXRnz87lqwLJbnhgNNkSR4576W+nA7+0JGT2YcJrPgIgOblhqORQ17oz42LUntbCy4fiINmzlU+XPlqUULFZgu0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgVP9BCRA9TVsSAnZWagAAj8sP/2ENms0Uwm3mQp8K9PEC\nQ/axkjGtr0ux8g1W47yOKK96hQBC9+OD+KchB2A0iWdC3E69gwn0c793GOH9\nSmVA6W+xK9nNlUiredVeCvymBE54MDEKvt+lvb3ypRuvxWWztv1SGMvD8+fd\ne3hMIaCien3hLECkckB99DVAcH2oVwdYsMFV7wJC3h+fugxplGZ+wqECzNvX\n/TXR+/CR9anM0kyJoHbKxGCmQpnU2IoVVk3uhoCi1UHQFZ0AI8Dr2nmM7eaH\nSlDLMZ3H7AjGxGiMdmTXVZCvlpNxstTViWWoJSiTsUApXkHQkgWGkqf/WIUC\nJ2Ygd/eau6k9m7as0tAvnlG7LrM3TCI6B8y7k2oMIHClG1QsUI+ULNFrpBRX\nEXvr2bh3UgKarVBYXja9/0FoZL1E7CeifeIehd1gyYbtxMCKGS+GxmKG3QMz\nHtCtsJLWIIWStjbXrzUj3ijEXCsXz5+rRD3wq8LPqzEnbXUfpZjK28v/zw+H\n6f/bhgcRBGyICaKXu3SMdKirRqzy63q4+AQ6wgk28yMAq8MPSdYR80ZFD1Jw\nP1KP1+pGaMlYEoAVXRehGvDpZrf5r5D8fc6t3txkdkCSkuZHjdE3VifhmdbA\nPj1u2SUbhEsXo46DgRs8fn9cjj7AbKltSMO86bq1YU6dcvKSfGFmCrgxiS3c\n0CkE\r\n=w4ut\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.35.6","@fluidframework/sequence":"^0.35.6","@fluidframework/merge-tree":"^0.35.6","@fluidframework/common-utils":"^0.27.2","@fluidframework/runtime-definitions":"^0.35.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.35.6","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.35.6","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.6_1616183104517_0.9256876276088692","host":"s3://npm-registry-packages"}},"0.35.7-20343":{"name":"@fluidframework/dds-interceptions","version":"0.35.7-20343","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.35.7-20343","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c900be56fa8db404e705ecaeb5a8de833f5bbe3d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.35.7-20343.tgz","fileCount":70,"integrity":"sha512-MQaCqpIZuUF3IXPt1zoG3y2p8FcnO4uQvkTkaBDmmlqkzmZd5M5eIprSfD93tAw3o6prL5msYClx79s3pZVgHg==","signatures":[{"sig":"MEUCIDuP2x26MRhbbrXxoII6Tyw+uDxymCNyp1bBmQo/E1pvAiEAoWOGO1frPoT0iGq6CsExyyCtXeNCCRt2taZuCg+3U54=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143929,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWU9bCRA9TVsSAnZWagAAiM4QAKQgtJGJDC1FdxNYjmon\nyLZ1atjCbq5EpluyfSh1NcJrHsiNn8bc8D2cOnT3fBqbZ1AGpY8Q5scWRYHf\nR4/umoMcWFck6X8v1qjBrxUzTZu77UNf9pI4W6ZB66yT6Mcs8Ig2a5HAlWwm\nfP5ZD4Z3eQdyvc1YIOtGsJA7+vrVRM5ixn7FZsZbnG23gBgkCjU79SmCFCON\nrNziE0vMZzB2Ua/8N6PCIj/hKhY7ogX5j20qeB66Ph0D8Z3hXFEdSSZUK5qB\n6HMWsd3mPscAWEPNj3aFxpYgHYVezxKEBuY/1kwS4zWzqwyao0kZe9TiLf5d\nw+JsaGYiNn+LJrPAN/H96NoJZrN4/+Z2i3cgxLnIpkLLkft8EypzyZjxl2cl\njZEx45aR+3FmRdzKwcwrMd6FSLH7/o6NefLP1r1DBTkL3QJjZPSm3RRn0E9x\nHuC/OeR8ouSkPsE43nqBw77f5ST0JGKi4p1VTG1UwXHIW1sJEU+pkhmVC0Jf\n2HjbUUUMONeuLhtJvZ3HF/dS/UK4n1C3omrGh2IMfuK5vslaSEeWz7Sj//zm\n7yq9HSY2F9CbjJX40guybsPKCbtk16/UF4vl5CtRBQN6eqpxt/tZupMPHnEb\nJVBeWp3cbgyC8MXu+4eNUdnRab5YW4LBtd8kzFLLAnQzK8FRRsIzkyTlNwBF\nWjiB\r\n=QOG3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.35.7-20343.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.35.7-20343","@fluidframework/sequence":"0.35.7-20343","@fluidframework/merge-tree":"0.35.7-20343","@fluidframework/common-utils":"^0.27.2","@fluidframework/runtime-definitions":"0.35.7-20343"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","mocha-junit-reporter":"^1.18.0","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.7.2","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.35.7-20343","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.35.7-20343","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.35.7-20343_1616465755461_0.5966214072293223","host":"s3://npm-registry-packages"}},"0.36.2-20364":{"name":"@fluidframework/dds-interceptions","version":"0.36.2-20364","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.36.2-20364","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0c33b22d9f632b156fd6297b2030a5bf86f2dcfd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.36.2-20364.tgz","fileCount":70,"integrity":"sha512-/MdbUT5h1I7BmZQIQlzxIoUSYvUXzUyVODMhkSDmYhiqH79WMSQIFu0VQP/NHk85tZGoBFTRaxC6YDRKd47T0g==","signatures":[{"sig":"MEYCIQDS7Fyq6CZlR71P6sfJXhyVV5wtcTa9dwxzERyHjhKxrwIhAOjaORZfvRs50DW4zqkf7GR89sVj3KiS8CduS4ucMrtx","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWjeFCRA9TVsSAnZWagAA8OUQAJNPde3EELdm4qfBKkbW\nDE0QCwqUk43kMcz/v+6r9Xs4qYlhi8cOe2QJ4HwIAc9prIy8Rf0ltA3GvrZs\nkCcO0lMF66HHF0Rgu2cftXOrtDRmDwtSkP0tx9JmZLNDBouTx+Tag+kBTnKm\nOt3AXuPW6Y0+iRDTu1ytR0+SN9xvKOPS6tuiMZjxp6psjDzgH3Jb6XmMcgB9\nZAC7+s1GsOHWgH9QL1OrdiMa6elUAH/whx73rpwxx3MEQyKih5imZPiFfbN4\nHHoGE1FVXybGS3YMYMskAsf2XHSt0uRdNB7J02T94jy5woLllo4ix4lJ49EC\nm5j7mAj8hGhzoLHUrMAiL4Q9Bm1R3uJ9lITdRGHWbxM7Q7dVzRoU3SO66EXd\nVQgFO7cTgePcLRk7ipo8DZLV+YeHGdHgZBR630qbhg4jaRD4M8Lxv4XP8nAh\n4ze7nRMguuHvnmiQIqPFQjCKoyzqtojd68M72LrlOUHZJvy3ofvBdF/yU52a\nFBVDlIXk2lOYLbwrYlrNvyQQMTYWz5hdOZYS7K/v3pN3V1ItJstKzAJfy2Cr\ndFl4TTbS2KC2n9n8F9rXWQrUrbCC7lARjJamPtlOZqKN8x6vZJJmT/MdsJve\nwpqq8UD0Y1ix0NZxMbN+RNER0hVrcH6cqQF48LN/FYtnGn2PaBuW2fGi2c1+\n1l1R\r\n=7rEk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.36.2-20364.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.36.2-20364","@fluidframework/sequence":"0.36.2-20364","@fluidframework/merge-tree":"0.36.2-20364","@fluidframework/common-utils":"^0.28.0","@fluidframework/runtime-definitions":"0.36.2-20364"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.36.2-20364","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.36.2-20364","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.36.2-20364_1616525188645_0.30594419180732","host":"s3://npm-registry-packages"}},"0.37.0-20427":{"name":"@fluidframework/dds-interceptions","version":"0.37.0-20427","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.0-20427","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d4b560bce07447bb74a84b2e62a773a411bd0464","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.0-20427.tgz","fileCount":70,"integrity":"sha512-VuADztT40ETPZb120fX5nFFoQf3ICLcE84UaZe9mCmUBnip3tbXDbY+VadeB9c74BVz8SnvKTOLN5Mv5z1oQ9Q==","signatures":[{"sig":"MEYCIQDXk82Oc7LjOFqKLzRpKNaP06Toee1Vx09dAcD6bysvmAIhAO2T4WfTe/J4CWTx0zt7YkaS92TI4UJpw2fHCb9UbdA6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143874,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgW5naCRA9TVsSAnZWagAAMjwQAIupRICEjOQvsY0ETa9/\naQZy+5dyqzhtVoCbhiealU+LFiceKSCuUA37BJQp23m4a9XhVkxQKPlz42U1\naz7przyUn+k5DVkHNB1L2zQrlE0fttllQXAa/SFZQlrHeZ0J97kaxeM+VajD\ndn1u9zwsYIpUabLqO7D+aCDnRqmY54PERPUza4I7M0O+yPeEEIHlCtcsxima\nLUHP6wryMT/FYBgGSz3K+UwY/rk09eSAiYf8dWWaxh5Atc9C7zoh9z5DrzxQ\nNXsoLQd2gNgFjSoT0H0+h9qjJBhaz4xmAdXKLP/FCnKPSNYEK2YmGYhok1Q8\nlwEZSK2uZpk3jkMjJN9spKowqOoM869XWgph4//h6duVBVqRueFVbysGu8zF\nmXeREDzHu/iYbhDlmHacfc7Gi7RAmA1/mJP9Jzfaojv0GwQDq4X7Ux4fUC3i\nU91h0THWuknkRAXNkuhLVp6lJeXkaaU5FRHrLmxYxdSeWwQe01oCKMyfc7Tq\nSifRJraWJtp/EYp5SMqeXFoguQsvBrP/WLOjjCwJzz3bujpDa2fRMXvF+c2Z\n2o1cMLQ7MPbBThxPqRQC9mANmHmfrfirxL6UPsKMLLVCDwaxy8dW1hEdzK3E\nv/ZUGQRp6lLCU+vOGZ/NwS9e15Fw7GECIJXWaHBqgnGbMKiUpNilf/5xbpL1\nXQOt\r\n=Hi1H\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.0-20427.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.37.0-20427","@fluidframework/sequence":"0.37.0-20427","@fluidframework/merge-tree":"0.37.0-20427","@fluidframework/common-utils":"^0.29.0-0","@fluidframework/runtime-definitions":"0.37.0-20427"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.37.0-20427","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.37.0-20427","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.0-20427_1616615898104_0.9618584965090924","host":"s3://npm-registry-packages"}},"0.37.0-20517":{"name":"@fluidframework/dds-interceptions","version":"0.37.0-20517","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.0-20517","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4b8cc6249d79bb57982f86d10e08eee8b3f757fd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.0-20517.tgz","fileCount":70,"integrity":"sha512-2qFjNJ8ztZK7npMSHYp63acVmHH17X+D6IpWT3hl2c+u+dMfLohxBiGHf1VWveJE4GC/4sqR7TProJ341ZqjCg==","signatures":[{"sig":"MEUCICT6o+Fx+P2OKSDbhARHBa3KhUgIrS9KEO1js+1iLEFLAiEAz5ZDV/jpcl9N+LZSbDYuht3c7C678I+EawXyx++0+Q4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144754,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXPhBCRA9TVsSAnZWagAAzkwP/09C6p0iIvsa6k68TyBV\nCZ5zoghfp48uxAmgexypMKe8vbsHfCFmRTWRJEWPvJgT6yZFFu0hieAYJVtC\nBkEj9pjzX2BNKqo7IAbmu9go6iJZTpNkdzx3uuuGb5vQl27mF+ajX783bkY5\nHdgkoRWC1d9eeNLpYU+NhiWZiMhm1jbk3O5PjIfBStRkZEXa96D/gAezTI6g\nDyDouz1X/xxbW+/NIIYx97MoW6cTMgZrQHP+GmneYYkV+26v0CY704zmPybM\nyx2OVmLyu8C61oF6Vw+BUvyu+gHfjdg/aU91IKy+7fJHfADU6LqxggGV4hdK\nky4UFEYOjB1FnAkbs2xBMQE6hqmWLW+dOnLOVljEdnerJRadXHJhgXDGVxOX\n/hzzU71XCSNKv73hXQD4C3Trk1SolTdBqiKRJWtU8J8ctnpw/WEgBQF2PsD2\npc3sXGZSKA4YqoHhAyWUjmHHhPBC7B1ZZVYnileVEP/9UogqUHoQJD6dNhAi\n2/vmR3qPLFveyjDkHWqjoM3BLYHbb915j46OWGfBBQEIPj9My6kOSqwzfpoX\n58fipYW+nhwagW0c6/rY4JXJDJICC5OPGbBZZGcl6HvISi1mjIKFiJxfxhYV\n7zfHzVy1v0sdWqnSKmyMqwFtEytSZtqRvAQGD2vU8RqE5y7zyQYI5rAuNE0u\no0lA\r\n=DLoG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.0-20517.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.37.0-20517","@fluidframework/sequence":"0.37.0-20517","@fluidframework/merge-tree":"0.37.0-20517","@fluidframework/common-utils":"^0.29.0-0","@fluidframework/runtime-definitions":"0.37.0-20517"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.37.0-20517","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.37.0-20517","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.0-20517_1616705600982_0.6510160260273103","host":"s3://npm-registry-packages"}},"0.37.0":{"name":"@fluidframework/dds-interceptions","version":"0.37.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bdd0b34f174edd799e52b547fb29ab3a8f36a065","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.0.tgz","fileCount":70,"integrity":"sha512-Vz57JDXKCKGsyPxHKIvWem2cQrPNVCprL+/QsCaY/qsvUH2BbGcMM1f8a30L1InRR/OvgDEGygAkSqa1dn47+w==","signatures":[{"sig":"MEUCIQDYcszcA4L2Bcd7KTxV6lBipr6BPPXRcQxSrcs5r9RKzAIgXXk0+zs6h8EKejqrMKIFkH4UQyX+01qMmxR983cVjKA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXYdDCRA9TVsSAnZWagAAAl4P/10vTh7L8KLeU1jiPMdP\nBPt50MgOR6tvpmv6Xja5df9rYkwO+v7nFs1QCBGIFPmLYfEWGkgMfqhN/fJJ\njoT/ArZzm5p1Bfiv2B67sFdbaOp5KyguXdXJBQQRbeSO+8jRdMNYtuIR6jHH\n2+L1NIq13coz3QdQ4jnrcX2EOcUhODvxRSO5HH+xvLF6TYVF0ZoGkjWwsb+4\naUPpOQjXkiWqyaJmXHjvsqhqn2bW80odChmimXL6dxqj9YG6Y8bztfVYFKS0\nznKXV7k+IEzC9SRpH0RvYz17/mHh2jeU5GtODI9d78OB4wYBBwjF2H3Ivy4i\nJo8Qmv+wCZRgFztnbKkpNYB4IjnY4t/+MJ2ngNKeVbx2vyR3OH8WWzDfRnjg\n7WIhNAcpFOh6v8a2Bc/MEN9/cXLHGoURXyC+E5g9x28yJ/QT/pxCawHTcytU\nxeqi3hpZwyOvwend3kHKbwqlrYU8MHbA25O3dpjKyUjRoVD4tXER/ZpG79Yg\nP0vLdQ2MfBPdUxm6z5fmWKcX5E4Jt3KsJFnyE0X52T4UA+zmGiK/HgTbS5R7\nKMm/oUfCaa1/FXOI2sDm6koKusAMAtUVDDlzuD9O7kcjdxVXZBQlvdAZgi39\nuHU8l9Us4vfWLZ0083jYaS1+5FK/rqMZLFbuuG317GIJOxmfsdyItd5LprgG\nwDbD\r\n=foJA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.37.0","@fluidframework/sequence":"^0.37.0","@fluidframework/merge-tree":"^0.37.0","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.37.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.37.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.37.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.0_1616742210652_0.7089468436005462","host":"s3://npm-registry-packages"}},"0.37.1":{"name":"@fluidframework/dds-interceptions","version":"0.37.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"14e0009b15f4e9b4dc1e64991de666075f745bb8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.1.tgz","fileCount":70,"integrity":"sha512-L2Kc5wrgbAL/3JwVWZINkmUvc9G9RqWdIIRHGf/mtWHtwWG0M9u2IUbXRl+f9HS5801JjqYVPQEd3RYSew4h1A==","signatures":[{"sig":"MEQCIBR3eorSAfiaqk4uRFiIGsbK64WZ5OzozrH5Z8/MyA/LAiAeovfuzDZXAecq4hpxC+RbDz+dqDu1sRztRYGpTQm1SQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYiCzCRA9TVsSAnZWagAAelkP/14hEpxYp4pZjqjbrRc5\nEWQz8186TTml9moQx2SkRaB6byW7oRrDbKb2pfZOHMrBdcQbheCeBDTVrPtI\nD1aGok/f1gB8oWoADfCAbnF5AFqkDjsptt2Zf8DHLgzFGQ9aVuVbgM5oTFO7\n4/7SKJaWezL/DV08g6MPN4Pwtbv/YfMF8g5/7sAPbZYaFZuG2dF5ChBhQCTh\nXu+cJnhBceuFFM7Irjz0gGayImRom/GHR84qWwdpMGQ05dO6fTbHjlzlOgct\nrACxvWPYILIY78hQAhhgMcPWgKQb4RxhPhnF5EUAAbNcqj4zAe1T+98h1we1\ncWXvjMaTU2RGQB0uYF3bcAalbYQGNpTf7w0xOcA95bU9EnVXXckHzuKuCgqR\nKnyPUq6Gew+zvYfiXUHqgoW9tRUeR017ecpcbr7+KdnMFDpQPxdN1ncPAH2r\nAHcaSw8VQLaKaGznVErjm0Y40T8XY+XhyXGRCdWtTcENNd63gePJibC3Tfgc\nsE4S/Rs75zJgqmKw9QimBg1Y2AOs685Jzj3v4R6q+Ktzet1k37dSSXf91RvP\noF3WhbnL+VGC4GcEr1cAmwe3N4YPpWG8XYEOyqcLZXPI0n+hHxYq3POjB904\nH+UFMydxaNOp5gSBl345iqmUKlx4UB3WrH4Kk4ZvlWK2hrhNOIWo3S6XA3tD\nc8av\r\n=63PF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.37.1","@fluidframework/sequence":"^0.37.1","@fluidframework/merge-tree":"^0.37.1","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.37.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.37.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.37.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.1_1617043635080_0.3739292486891068","host":"s3://npm-registry-packages"}},"0.37.2":{"name":"@fluidframework/dds-interceptions","version":"0.37.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"114927b39b68c0a00d7413fbe918cb2c3f447167","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.2.tgz","fileCount":70,"integrity":"sha512-fO74NAw7zNxMXdwhBydL85QTEAjBZMlw0sy1bWcVz9oglagX2eCCx+IDZkJaFlyOzgOtf+V15foPM8fCfTGK5g==","signatures":[{"sig":"MEUCICD5STn/Zu34pVJVSZgW6WcqAxlA40f38lhcLlM75onpAiEAsSr1xjz6IWNFWXDsWgaSzFjVhxTWWSZ4xOEyjmv9mxA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYmWaCRA9TVsSAnZWagAAe9EP/RHCJ4VilqGls3uYLv5q\nmwR+oV1owQUl4J8kSSyzhQzypcY9ReKbQ1aM3b9c8ldOWqzKkHBoSUe92iOJ\nKYg6jiDDRXzWziFhS/5x9MWohiKB5HiDt55+51pQOjT5UNPkPy2u3kK08fSp\nDDZWc4t9q8A9D5OkyJPWMJ3V75tvnGON0SLI5p4sJsUkoz8+FV4J5rgkSIkL\nWctt3skFZ1o2wZcgfEmbBQHZhmdaLpr2XlrdKIJYd5oqpz/wwhXYMRW4jXvY\nVrp4JAcNRKt3kuctQenaTLe5/a70RVXLUPoK4fJW9wsL40AjvhX/cqr4CMCN\nB2O2rGdpS2HeY1wm6zS4FNg/Azit051LUoU0mWYmLwFd2ZLnuRbmK1+/1TYZ\noU42M1joB6o0XULMbI4cjwkHwFcIkblljnMcJ1PcKWPmnRpqlcofD6kOMmhw\n5GWbXFPwhFRIjitnEwY8ESdubPccCn8SuNHpROfQ3nL6iy+JezXxENlePaD6\nwI93JLN2VLB0khONGYjQzNo+XoYVDk9nyMVbsRFKVf8L9y4GdbKEs+nkhah5\n9RH+CMZGwargHzv4azfBWsZDjRR/fWsrzUWg0lw1ufbrX2GwdkWs7ihDhWdw\nnpbzuUrFYPVOneMENWWrFPSxK+/TIuncDOShUQDbpQg9V6Mca1xHjLH2CGIA\n8+pG\r\n=tt7f\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.21.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.37.2","@fluidframework/sequence":"^0.37.2","@fluidframework/merge-tree":"^0.37.2","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.37.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.37.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.37.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.2_1617061274018_0.3058869432119864","host":"s3://npm-registry-packages"}},"0.37.3":{"name":"@fluidframework/dds-interceptions","version":"0.37.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6bb6b861f02672e049620c4832da9d299e9f361b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.3.tgz","fileCount":70,"integrity":"sha512-fEZ22JJX3r1/SscwHkMzTBqETldQA1qrUxho+Tq8icfoQCSHeLnxg1p0L1hejt0J5cUBLCeT86nT7wkpoNZ6nA==","signatures":[{"sig":"MEYCIQDE1sLUoptiuBMtmNfnGC19aDOsXtFPpvILtOmmYa1zSAIhAKSZNF6PllBOhcMZcGPBxETDIGiBMk8Jtet7Y2ZTktY2","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgbKamCRA9TVsSAnZWagAA5p0QAJS2xQ0467jaCWHWZvHq\n4iM+8Hsz6Rr14toKZvOUDUmy7PSuzn437EJk3zqAx4JeC54gJ2awXxzu+/1Y\nxa6rKX1fpZqlR+FjfFV/9Z2ou3URkAiPufb/uFVfMQCjpkKF3HQv7zJ6taBp\nnOD0zH5pJYDDPqh06DOR2+NvqAGP1zWjNWXufBLSS+QRLyqlRAowsc4OXoPJ\nJfrArrfRcaJGxdEAwsuMTrw3I7NoXPRUeCJklIIVzmSaRUK9DvqIxipBmgHL\nRlEUHocHfLqsTXR9yrYTbNkx9JKOGcNGbTjO/lqD0ee6ggCaIHMxFyKCsEOJ\nmv9xFh4HaNISO8Z7tfACHfrSMe/iGyu8XMmxxfFhZ6BWpCKd1+X5AupnTSaL\nE2mlZqHka8j78nvUb0FKnPlK+4bzEc2vdy0ge9nS+Ft30h175+pejccDbdzJ\nMlbKztODF7SDnq8geblb6TDBMzAw+w+ru91ZDaVdkdq/myry5dR+KfvN7kHQ\nL0qGcqBDKVoktK9VnaroOqaCQUjZ4/vNF1jFcL0Nyj4piGcgAJV0aTOEqeYi\nE5bRuFbBjGwnxxcTT+rUO0aJMhySy6LgImsenLrgQ+TkKD6GgbHPqolx8k2O\n7AejjJKddN6lLkWKJuQXtRNIoletUobEO+bdvUGo067AeaAmQfGIHe3CASn8\nXsZz\r\n=/Jv8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.11","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.0","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.37.3","@fluidframework/sequence":"^0.37.3","@fluidframework/merge-tree":"^0.37.3","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.37.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.37.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.37.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.3_1617733285618_0.0388131455735754","host":"s3://npm-registry-packages"}},"0.37.3-21287":{"name":"@fluidframework/dds-interceptions","version":"0.37.3-21287","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.3-21287","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"49ad88cb3fbaedf2271ea4a88106d1ab3d53fd43","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.3-21287.tgz","fileCount":70,"integrity":"sha512-A9dJk23uRz3a0Vv+8Th3exQC2Ke4Kl/LqfleTRtn5/gF1u/3SJiXFBFDEEJSzOY2IjioWSjyORbyUQrAqfWa3Q==","signatures":[{"sig":"MEUCIQCGojU6hQmJkkdSlfo8zkQRvQLGhJqvTlsMn4KCn2xQnwIgG59gBjUnWDSYfkoWpyjc8hNctnl3LdqVjDw2nO0+Iao=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144752,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgbiwSCRA9TVsSAnZWagAAFMwP/iV/KSAR49w6fCWwarDg\nTnMr45//zqefX43ywOGRNllRoapC4G9Jj53VlhaAo16tzogYt3DWgtAUIYcK\nHPIXTjt6RL2qzrOi2DlpKhjGEJIQelWDgpZPJkDoep3yHgYN8H1Y05V4S/Gt\ny7fsIcx7KsfgXN88YcqUpFQzrU8pPDpoSlgrR9wzRS7Xqzd4gGv48rAGnGoN\na9jhRxvJBW9Q7A6T72EWNLPGnqywVnfKea14ZnSL/e3bQRTFVlPjn2De5s76\n3zPMX6Nc/GSg7F8fSHfLci846V7+Kpgaf5WyKu5rA6TXseyRG31D1FtVUx1K\nn1foHvOTz+jx/H2bHvx4CQJ0Zkal2m+kGhmLBde1BtqWP3RxLueNEMJ1CPdZ\nh5FccBpswl210MR6rMXZGyeHItjN0zMZwEtUfTGw0M+WviTKg/3OzI7cVRRw\nDfHyUZIqBWEzjEyfx2SWK16BRuP+NWt+eRrmUaU5N9pYTpYW4YnmT0gz3NaC\niDSAH/0zZe1v06YMWe7ZMj3if8WmgYUHjLXQajLzhp5LNduWoKYXMzGw41P4\nGXXgesLJtVSL+oibaRV4S97D68Z+F74eZ/xbO/owA51V7nKYDNvBiQcopzlZ\nG/uJgn3uLj7DDu5PDqfmCML6O72WmUgV6GEAL7/oONGEDFAR9qp3t4X9kduD\nuUVv\r\n=oM5o\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.3-21287.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.37.3-21287","@fluidframework/sequence":"0.37.3-21287","@fluidframework/merge-tree":"0.37.3-21287","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"0.37.3-21287"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.37.3-21287","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.37.3-21287","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.3-21287_1617832978479_0.44489161025214075","host":"s3://npm-registry-packages"}},"0.37.4":{"name":"@fluidframework/dds-interceptions","version":"0.37.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.37.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"663bfcca779fc3778ea493f81e11eb6d55652ed3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.37.4.tgz","fileCount":70,"integrity":"sha512-C+W+EodxT7xZBh3wSpux+9I44ONbxtdIDVEj38os/KAJmUHFAZJc5Al8ZskrGyvjArlgveamlYRgZPYFX+aZbQ==","signatures":[{"sig":"MEYCIQC+QrGCIom5GL8XbADGVhVNhapgkgWULj/GBjLcQvb30wIhAMcfVJzZvzHVikwGIIJ1Nyaf3DTWYU6FUYBpvGm+iKYS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgb2xrCRA9TVsSAnZWagAAPZQP/3lZzRNM5C4av56c/eYS\nswyHwKz536cx6TBXvRna0nc/Sh2KMPnAqa4jexjNhKYVc1zJDMex9ofabq5X\nbWWlKVLZTLZ9hGgceLUPgVvjdKVktajhvKx55QjO/GaH2feAGgG1V7dGpOwu\n3hTiEWwPB3fq6XAnxsMNnmqdylyR0G9PGeCx6gshnEA08a+QgQV0pmf9tjaM\n7NoH1c+SquuFmazolehggSEMZ9QVpEQanvLy5VQ80OdR8QJjGuegLqi0jfj1\nXl5agsEtFcTlHUO7zuuKfO5eTu2Ltp+sPoAbqycMS1j83D0Btq9rg9YQOHw/\nH6ypuiMOCZxgu6vKB0wAevp2z+T28nDzqbs3IoRHOQJhcARygjrUsrqq8qX6\ninToD1pGVwLMwlhRU6PWUrk7Yrm+jjZcbt+NkMMuTBAXQEoNHm3kZCtLI8XZ\nQWm4k3oPphIjciecTUvzpC1lhkdV7jSiMiOOyh3zYZcuCX2TMv/vwzRzDQ7b\nzzSF97H0gV0PuQD8UU3UIPS73AL5MAYwsbyR7u1ImP7dY1KyPg5FqxambemZ\nWDQme2p1bjPdwwYq9ZlCO5QWn+mX7Z3NVDaXtqjrDIPKO83e2sjNIoesFcND\nd/QCxXGdtTCrnQUv8UkJTLge/hoJ1PGJPvQm8F/Jt99n5H94l4KVS3m0PhVp\nfxpo\r\n=NYmA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.37.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.37.4","@fluidframework/sequence":"^0.37.4","@fluidframework/merge-tree":"^0.37.4","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.37.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^10.17.24","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.20.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.37.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.37.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.37.4_1617914987072_0.42743220346496846","host":"s3://npm-registry-packages"}},"0.38.0-21934":{"name":"@fluidframework/dds-interceptions","version":"0.38.0-21934","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.0-21934","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"425526d3a4a4c5863a2c6812eea7c2021e2bc576","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.0-21934.tgz","fileCount":70,"integrity":"sha512-JrZZ+AMIyrvyLnEss/c1sO2a0fogfW2tPo9/6W1E3cx7AkuF+7vfgSvLLOiuMuK4vUCn2HMejERk6pyBDBBmzg==","signatures":[{"sig":"MEQCICoSzrW8aAElcWNfSbvcSReF02Clis0hOpFPqxV9PuQnAiBQ+h+fYXAHX+amvQ4yL/U2Fh7GFfrioCXBWdk03Q9N1A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgdzN3CRA9TVsSAnZWagAAP1MQAJFSX8Iey8QMWl3uRz7t\ny6jM3owAO5AWtsMh4Nx0TIednMaQD7y21fOgL3JcHHOUBSX2lwZogeImb6iY\nt8v96yna2QkCTqQXJIbpltn7ABdlDIdihWNgeZPmYOdKE9MyqwX6NYrYsOL4\n47Ut3IzGt7Bg1W4tFQi8slEsCu7tqroblKLTmQvJNGmCiuz36Z9ikdzmDlIW\n2YtmjKj9R7l9mbapTYN8Qo0OxttTOm8rNYf8ZWTRHgHGAOI40q4k3IBWU6uS\nrkVev0HX7rlwro/jBUWSr14DB3IEqWbU0NpgiQa9XacEixP2+TFZj8jwKKoL\n3w98lhu01ILjo+Bjufb2UVB5v3jl3Yi+8f57S+3U5CmElPZyEZ32dEy2Lmve\n9/MWbD9Ci3zC+HcHyt2ZnIf5LcEr4LE4au9AUQTYxAIWivDw8wYnx9B0gXk5\nKHaFYTY+mAx2ehjyqUNS6uXxURc39WGWy0oOav1m3Fic81bsm3QZGnX+tlhU\naEyi6kH4ucDeNx/mUV6zxZGe6QVXRfVJpqFspyc8i/UNpbywv8/GP/jPHPgj\nRuEEFBrNfAhnG14rPw7f5ZdMlQhXEPO+UprxIIlVk6NZ+EIybd4/F4Zf87xH\nWQGXawVzhf3QKEkKDAkBdtlsmb27L+ir71LCGf7bKgifnnzkgOfMudvqAfhf\nkAfJ\r\n=sL6T\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.0-21934.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.38.0-21934","@fluidframework/sequence":"0.38.0-21934","@fluidframework/merge-tree":"0.38.0-21934","@fluidframework/common-utils":"^0.29.0-0","@fluidframework/runtime-definitions":"0.38.0-21934"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.38.0-21934","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.38.0-21934","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.0-21934_1618424694891_0.6558476193685836","host":"s3://npm-registry-packages"}},"0.38.0-22000":{"name":"@fluidframework/dds-interceptions","version":"0.38.0-22000","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.0-22000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7ce5cdfeb9e0e5a0a43ca4ac635e13e58979f76e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.0-22000.tgz","fileCount":70,"integrity":"sha512-j3PWQ68pi2PnV5XKjG7s25hJNVrXF0EYQV/GEyEVaxycGpQ0gxg9HSpSFEZju7DCuU7q4eKayDsKxPXPs5ub/Q==","signatures":[{"sig":"MEUCIQCb5exINRqLjeXTCv6vxQTESdJ3OuoypC9zBXFZtL8U/wIgdjRm4sbGNDLmGexG1mrHarDEvnQbIPC6YlV4jcUSRjs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgd4gMCRA9TVsSAnZWagAAXVQP/0iQzDHlOMoDVhUuKnC0\n+MjN0++QOUAvRrUT2dOnZsm9F1N/40eow4sKO31AJDvBKnroDot2RzPtcX5G\nr/88yLMVXypzdJ17S6w+TtCp6XF3XAn7SYEMg6UhmOu0MYHHYfsQLLg9eY6V\n5KqMINjd/gSbAc0vY3bzcLqKcTvpdxI2YhPlQLasfYFga/H+3li941nJJVAV\nStpVxygcWhFMcQ6SgjcX4FM6twgk2kLjbvbQOR0YV4/gtNale3PNdPO82WJk\nP/7hVJfjktIWwpLpNAk2S4Jj2Doo41fSSnysXpNn66XLlsi1W9FDxvAtEvxr\nf9FrEZd3VRg8GC1gPLyq3L4hdUI7VAInhwZhDP/D/6LcFndnzdk9sX4Mqz4v\nGBVgmX2n/aLSL0YtXzv0FnNRZk3PZWy4J97SNaXL0kFWfwVyNPeO40sHZSnh\nZFuLrOM/C1OiATxPm6/5Ijg2XEtsHA6nG1xTabBSaHUhom+8wBvIXfpY7TlJ\nazcX85VjF18BVmexfbvlCxe9RIIGxNP143Cne5u4tFhqqNN3yBOiOEeye4FX\nC4xMg3JR6ZkHlU9+T+eKp25pOccUGx/n0ZNDBHjVxtA6QWZhEWXO/JBHUjmR\n3G24K3W6qn5UaTtIPwT7INpfXVnDdk/1lWSJCJNRgvz3Ew+IdXQaVAmWqve9\n9Xny\r\n=WFPc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.0-22000.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.38.0-22000","@fluidframework/sequence":"0.38.0-22000","@fluidframework/merge-tree":"0.38.0-22000","@fluidframework/common-utils":"^0.29.0-0","@fluidframework/runtime-definitions":"0.38.0-22000"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.38.0-22000","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.38.0-22000","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.0-22000_1618446348263_0.17138366748213762","host":"s3://npm-registry-packages"}},"0.38.0-22040":{"name":"@fluidframework/dds-interceptions","version":"0.38.0-22040","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.0-22040","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ad0a18cb82a0a3b4577c4e8696cd690630cd0353","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.0-22040.tgz","fileCount":70,"integrity":"sha512-WEsouJH56Aot6eisNR6xFRE+Awf1pPCxcGIcdmUkdWowbIcqRardnW3zsJtlNfvCg0rwGXEdv6TXI4OeOsnrJQ==","signatures":[{"sig":"MEYCIQCwViwKIRNBj7l3lyEJvt+a8oizcOsf9VxMDME6po42lwIhAOvkHiHGTWl2uzprPj9RE6sG4sDhBoM3Q5jtUYqnXI61","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgeHCHCRA9TVsSAnZWagAADbIQAKDwsJxCik/BHM2rW+jH\nwCH84lDOCGnpvW+lNnbt4/Rtmb1sBAszGtz/kufUAJ/YDvUgAP6vGtSe81sA\n7jMowCeWVzdXJayaelezk0Va8qRjVuIjVYJ9SUcuhGoJS52KqHKu5+XMSGBm\n+nwwPyqO5iBmr6ZrX1kzBXWJt3ccD2haWqaLXU7Jh/LeaRRtK9qIOiqIkoH1\nUb+fy8otEZSmdA+72mN/iK+RrmEvkg+7RkoeWADoiCLHeqwnmP0icH59wIk8\nFCvBDD7YHs4XL1dWZJ8pCJtnOaMuC25kXp2IojN4Gfou0lr8ariUUqjEOOpp\n8T/sQW/y20jB09b7mmF3nFoCkyHqPdgq+XjkYSPcSHOhiqz4h1ajAiOZGY5g\n2KCXuNzCmTaXFKYo999IAa/yIuTbS1S5zSr6qaEiNq8itIYBLzdtfctcaYMp\nhFs9iBjiBSV0p2aqFl/0Grj9CMBP4Iksc7z2sgn+v0Sju0yip89890lKuJNz\nQhh5RwSy0+rhJkJzU34s8hvYvHWVKl8tiEcwz6yOdGK3foeDs7EKlm40h01A\nEU4NMy2rRIvsws1duumGe44FWgHzZJM330U6bImiH0g/RTS2FiJM2G+gQJYF\ncTMg+6J2WNWeF7mggOG55F8ztrq0ilzbxpzT7WG8lg6FD33Ga6a28VKZY251\n7kJt\r\n=LmUx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.0-22040.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.38.0-22040","@fluidframework/sequence":"0.38.0-22040","@fluidframework/merge-tree":"0.38.0-22040","@fluidframework/common-utils":"^0.29.0-0","@fluidframework/runtime-definitions":"0.38.0-22040"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.38.0-22040","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.38.0-22040","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.0-22040_1618505863062_0.37570817574859783","host":"s3://npm-registry-packages"}},"0.38.0":{"name":"@fluidframework/dds-interceptions","version":"0.38.0","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3d1bd5eca4c2c94145319cd362a8b6088912481d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.0.tgz","fileCount":70,"integrity":"sha512-3spCJ11ifJCW5HbmaNuuzUE2NXuVMxqd3UyPPoVtiFXJl9xKF/WhfhFN3Ykr1jay02KRilr9NThpdCsQGIlb7g==","signatures":[{"sig":"MEYCIQD8WGHznqJjZl0ngef9DODtX+mhdZSJML203K1i7RrhCAIhAKu4TVDsMEbbMyj5SqW8PikFPlUe2cIj86B1vVeBEuxH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgeNBYCRA9TVsSAnZWagAAjmsP/jA2FGY6F7ABS81Xzorm\nZVahZSw2Br5jILByraKJtIQqD3fMj4iE5bUl6wXwPM0DpyVV5171GUebRQKm\nt+cLz6j1xB/a2+Vv2O9G+3e9nyGuxJJTeaEkZfB/omOzHMq3RQgGAYXtvfN5\nSNNiK+r7QO6xZtM+Apz6IYhExjL6+p1m7rgX7lnVHNKLyeuD+CXf8/cngebI\np0VA5a2cnTGZFb5cGE+2ksdyckP7Ne9WntOwmw0R5+sL+4m7Fg8J9pWG6+Qd\ng9PXgQXTnhkgNAFNVf6v2KyAfaj3nYNp1pEGtIhxFRGVL20IwcQ3bQfsFqRm\n2dFtUkmiSQiYvKWCAyp0ugysB7QlcrtOw3RyL7gFZtNUouvkXc8sURKz2Ve6\nBbi6dPxX2Ztac7CiI1ikVxbcw0T4Tv6qerCimnnBfSr3k3D9B7qW3DGUsL7D\nAAmeH/DxO44g4n1ivSIuJ9pUhLTEyUqPMpWirMiFlGwPOVUqhZYmDo7qYXI8\nPxSqrp+zl080HnxKOA+YYGP0dmCSwm9iHI1KoJM09uYnhRM9HmVkvrMYrJdW\nZVqag7Vyk9MvhXZ/BBYW8E718YWHY4MlMzxpb900jEV9+8jiqamCDziV635k\nw+UXAafPzFTbjtW4nzYLxhA+24B77MwDMz6JWSVjEEMQE7aBBffv0UHaHy/2\nb25D\r\n=YJBk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.38.0","@fluidframework/sequence":"^0.38.0","@fluidframework/merge-tree":"^0.38.0","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.38.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.38.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.38.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.0_1618530392493_0.05169962515990312","host":"s3://npm-registry-packages"}},"0.38.1":{"name":"@fluidframework/dds-interceptions","version":"0.38.1","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fe19ca5914cf447941865593edce764cc8ee0278","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.1.tgz","fileCount":70,"integrity":"sha512-nVhkFugoiLd2A1RcIVLkz8PCsX5Q42tN1+kO0NVPwNauTR3UCHtnwRGK9aeHybAUOlyM3yVUJ5ADuk6t1jVwYQ==","signatures":[{"sig":"MEQCIEdrEKEUtW84ACcLaaxX6Q1qvmdZAGKdQ2lKkIGG2u/UAiBlwCNf2OMTC6kKRlMwmox4+nZUGl6z6ZGVN9KZzTphFw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgf2/QCRA9TVsSAnZWagAAv/cP/RWouTJTXBRhw/lSIcDN\nd/iN6KV8hvuXB0bt5q7JTUH+aAFbP/ZE3xkvVmvV1nhog5rp/97YqTVTxHXE\niJpIy5ZUjZ8MOeD9Awccmti0Gpd5X3yJxd/XjI1cq64uHEicFgDb0FEeOzn0\ni68dVaYPuaJOPzqyKSv3rpWzUb+O4r2xA4cZ/c/Szlr6Qu6WONRkWi8EIih0\n2gAWkiAZ3OryaVUc1kLIhzX9NkObX089ePMuojxu122hy9yxn/0lNV44Uagq\ndt6HJOYhvxDpAbwQ/00+mm46R/VNv/hgxd6RiOiZPjxZX/3XUaeo2C55XixI\nNkibWVINDJA4FjxNY/+Y8BFC8DMgBviy2D1MaISicobxObZbMcpGyFujnViU\nltvvAF8WMoL+AVzfAxe4b7c7wepIhPIYMIgqsDS/g8sD5G1xeiVBuhcGK//K\ntnpMuX2rhqTDWS4oHyyiHI7j64v0nQssOsbcIt5NHpSax7sdmQWK3lt+pWUj\n3NVlz/7kvdptt2N++/wiuMfzggYSzcc9ihzFaCqD7xBVr2mF6m7O5IOFCGGk\npttTeR/t/FlXBehGX09vrwRk0v/RLnki32PJPCFP01Nm77DTwRmQCKIGuhVz\neifTjxugsOpHMj9NIeXV9eec4xfcM0sWUbpVW7Zqg0jFRzJ/Z0A9/sd2s5Zs\nHw1D\r\n=Ld4e\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.38.1","@fluidframework/sequence":"^0.38.1","@fluidframework/merge-tree":"^0.38.1","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.38.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.38.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.38.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.1_1618964431576_0.37925576868517274","host":"s3://npm-registry-packages"}},"0.38.2":{"name":"@fluidframework/dds-interceptions","version":"0.38.2","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"17acc6a7725fc16cf79b2338938cd97500ca15d7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.2.tgz","fileCount":70,"integrity":"sha512-3wX87ZnC8173MhcyGqyNhDn+KZ8riwZCfjHMYIpkTFL9sIhou7IM0SJL/8/XDZYXakP6VILgNg6aIGiqVcjAEg==","signatures":[{"sig":"MEUCIQCC/otDI0vZjHi038ZiFpKo8N8Em0VPQq6rN+2hUHApWAIgArNmYihFOUg5gMhv+/q0QouKubSIylsSTriaOwLcXzg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJggJ/GCRA9TVsSAnZWagAAWVcQAI3ajMCfp9zumWRKnROW\nIfeiuwg+7ypbHVNeuMpCYqG/UIvrEHe8NhtiFqUYXgjYpzN4vasGgYuOFHJU\nxgRXdveHiFUPljPUiHVtC/4UYq/+gqN1mo/KIq2hfdBuw9SfTLoN6grpTX6B\nmcYz0OuwiReAYK1mXu34jtfnDdtuXLHNKnRm1VIeeUcvOiF9ILgX216zynRT\nzMqywt4Ddn+Smx2Y6XNBbvigXxiRSRrodO1JsQcItpMno4uIVOJE4rQd6LDh\nH7b3UpN5UPtzVv5TpFU1x6Hgyf6jKxmrAvcjVulnPANt8+aCMcr2VMR1R8yM\nXzCn95nuaBsCEmtpiuWyh8Idx1QLqjJpCkR1qZjon+aPYkLSVIrwpuZrF0G9\njXspHLIN4TZfwwp+qsMeWP+ZvDkCb1TyihgdMOPq+BVuoQa9ugq9DB4QnqqU\nRERN09IYvCmciyb3lcc5euEfUpJ6iDH915pq1jA3Tf6jb9HjrH+YBFtgqlfU\ns3OaIesUb9WcAzordbFvWT8MyvSGkHlhKIH/3Xxwe3vJ5tDo56ajEo+VFFt9\nk6ZbE/ALa1s6ecRM+xs5YEvtRrYZIWW5FcwzulubjP0OKdfayx8KrbiIsAUD\nx+6PUkMK9TXvuz94X4DCYK1Ek8b420gJvBLqxHwxBxRAc8ShZDc4QxfigTJZ\np+Mf\r\n=OS8l\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.38.2","@fluidframework/sequence":"^0.38.2","@fluidframework/merge-tree":"^0.38.2","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.38.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.38.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.38.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.2_1619042245686_0.5253057069053986","host":"s3://npm-registry-packages"}},"0.38.3":{"name":"@fluidframework/dds-interceptions","version":"0.38.3","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b292e1d5f353db7b054c45434e766045dafa4df8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.3.tgz","fileCount":70,"integrity":"sha512-VAvWHE/plDQESgO588Hr8tiUNX1HhjaDS4dkQ+lAw9Wme+EIMJ609vg7Hvwx/l5DMY7on0ESGZMBZfS24uu4cg==","signatures":[{"sig":"MEUCIQDgdH9xa9DLAfZqtaMMfofqALGIwrcp4Obmu85Zp99saQIgVG9mckbzfDUtBa5oXrYgqoG2EPDsLqbMb8sCoK6f3Gw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJggxqNCRA9TVsSAnZWagAAxGsQAKESJfvCObxwWKeKcJDs\nnTMTdYAHtPsjADpW4JQRRQpN7KmFc0CHJ4Er1RZ+79MAF/kUzw8pHPAdZX2h\nZGuOpDTD2a0vVvyvensFXMAqOnLnlPV3BPk1fBNcxvl8GuSSeALtb/9fk4Ja\nlaUoFR6NdEEs9cb6tyGMVO5ObglPbxJ0/Er+KGrC4t8mNZAxa0mG2/E+P0Yq\nJ5pGD6fRfSFY3M4AC3rjTQpf0tRWqxcAEfKgU13tsoxIClcILcTis0yTOUbK\ngwmke7T4WzbP3s5l9YfpFuuhHWAbMSJPKSEuYr20FXIIceFDKBrAha/kTGey\nCvXUSgcPM8v/M404yTo1ZiCDYD4s/pFR6MXXiRFMmv62h8a772ifnv6Ef5iF\nvf5tG9+jJ+lo0gai+CWGXgS8356FtA3kQcF8MSamIfc1v3FFnP5d2NLri44b\nMSrbcFQwg1DcKXvqN/SlStn6LAOR6DTodux+wBudRC1UHs471Aa8s7VoFW7Y\nW6dvUGyGDzd8vLdMHN7AsKlQBMt/w2z+pWZS/TAjXliURJK/03LWX4SE59zb\nhipwPY3mPcZlISk3HkW1k827DRdleguaZZ++OIRhe3P+7NAd7WLeWC4l4mDb\ndnrC4vRlOOs4oeMXRzIZcYGUa6t/UDUc5VuSU+94jTPaNaOWbr4vV9mrvdSi\nRE5O\r\n=khR5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.38.3","@fluidframework/sequence":"^0.38.3","@fluidframework/merge-tree":"^0.38.3","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.38.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.38.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.38.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.3_1619204749342_0.6222499695161674","host":"s3://npm-registry-packages"}},"0.38.4":{"name":"@fluidframework/dds-interceptions","version":"0.38.4","author":{"name":"Microsoft"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.38.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"39f8d6f50674fed990fde1fe8df8296169ef5931","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.38.4.tgz","fileCount":70,"integrity":"sha512-6kv782k/brq9R5Y/j0pCHWLI++JnnwJmUr4esa7etJ6doVYqMAWAer1Ti4MJITgQlFrkj0yNbuIC93TkgEqxww==","signatures":[{"sig":"MEQCIBno2I+xILmr1h3GwCcD7UbyM7s9V4hvKMbIYAHhQQRpAiAb2h1OxWDG9mbvVNJjXkJJ3K20sdB33rOgIkPGNXsuPA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgg1UpCRA9TVsSAnZWagAAc9YQAJJ0wPLZpDsO5p/qjNCK\nqhhTfdegtcEdMlDDcH0h8sPkrDVlFO+DZCONTkwojs/yGKcaEaFuwM6rALUv\nayOmO6pva6+vkjomfisv73rowhkAPRJht5KGXrvb79LfE3s+arhDUmrALcu2\nmTDEDD2XezVOywCnJG2Pc+TTslfc21H/jaFOFggKiCGgrEhPuwzObdoVmT56\nYLD90gCMTKxQdbbVCzH4NKWPImJbBfHQn2qyww01yjz63kGgL7kcy0JLJcxh\n7yrlyu+61sil3vr7BhDErvZjv3GKcdpvaf33VIKUd126MlCUTmi5n0KinRN0\nzq7J2fSK8kQcrt111wGo7/5KcdJqsrmuhyfwzZF+kW+cQTqJVjB23cEegVC2\nG97Nz/0s6FvYqv4gYNfeDHziAIcpTQd+8KJmqd90W3qScMNGo6wDuyTlKGfZ\nq0eSktTHcvI+3m3RYmmuHVElZGUKD9d7IlK8ADe2CLboNEyKB3iSlR5/2Jnl\nb1j4ASp9mKkNh5KuGYXpXe22PnYo2zcqKKU3v438OLRqfD4s8tSAUo8Ok9rO\nXBQjoAk1WhRVjVSM2LmWQwQmfxhjeIWRO00zZQucr8fLpDZOribpNVgbsBKN\nSSlu1VnfUUCLLvn+6Q7tfUHxgSWZdDuqKVbTjq9f+LbD5qKWcYpo2GRByxE6\n264Q\r\n=l9wh\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.38.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.38.4","@fluidframework/sequence":"^0.38.4","@fluidframework/merge-tree":"^0.38.4","@fluidframework/common-utils":"^0.29.0","@fluidframework/runtime-definitions":"^0.38.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.21.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.38.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.38.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.38.4_1619219753322_0.5141080542054826","host":"s3://npm-registry-packages"}},"0.39.0-23254":{"name":"@fluidframework/dds-interceptions","version":"0.39.0-23254","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.0-23254","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b6a54189e1d2b01e7bf07c3ba2befcfdeeacfc4e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.0-23254.tgz","fileCount":70,"integrity":"sha512-29Pb0bf2APmnWiCoJqBmGrs++2CvNtt69v6tkOO8THzhRxBXT7QqpKMLVzyshU49iqKvUNy3Dp16kTZNPGQ0vg==","signatures":[{"sig":"MEYCIQCCBq/vT/kNygXDEQeXXBhzV1InwrAGra6B4iMyAn+pvgIhALwebmen+l1vU/oTnsw85D3237Gg8VfUZgTr2pgUnc/2","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145639,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgiEZnCRA9TVsSAnZWagAAfhkP/07Q8mLGNS1EhDwgAX+t\nhZuzJ+Vyg4s/F4nbgW4a8p1tgpuDXhGFf3QtSTSFX1K2XcHZkCy1JLy4WMEt\n2NFkCK0sBRcixm/gjhh8COiKfXvOxNM4OmjIwy7As6HwB79OkVn2vmd1rGDm\nr8Pdc+J/2H7jUiyFScPEHa76c+VZbgalCfw2L/3pby2ErOfK1M8br0VauQpU\nu48wZoGdveXfc9v2+7ymn2WL/BqOWSTxoGsvUf/9lurM5gXhkAMI19UDbItk\n1TvXmme57B0ZaOE2/9Zs7PZKfofTK9UrXxG5xu3CvQ1xJl94ZoByAAcPc9Yu\n5CQGl9C0vStVCI8ctLKVKNC1cr4hZoDZtM253cjdK0tDLXXiHzdqER+KTFbX\nEpKSlATJn0MRnl4Y5g+6aElhgPZn4JF+o7tZQPVnwGScw3YS1BB1N7ui/06v\n2tNuFVqTtIxReVyTSTz6ttIMnL+p/41ghWR/2tkshilqWL5e3FwCUGHOj+Ml\nB/CpcxIbuVjNWscNEPB27ouc7lNAPnPGAzwxZVzUX0AL9CEEaZ8Uw4KhdexJ\n4j0zq/p4xCDGl0pYT2Uyyym0PLdcuqof8WQp6AaVkJdh0rixWljkx88BiWB1\nfiBlnkdu72YjmuAB9gXstOwh/55xaRTbAOzkiws+gr6bsC1SPkH7h1FIWJ3M\n1uzW\r\n=iPYX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.0-23254.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.39.0-23254","@fluidframework/sequence":"0.39.0-23254","@fluidframework/merge-tree":"0.39.0-23254","@fluidframework/common-utils":"^0.30.0-0","@fluidframework/runtime-definitions":"0.39.0-23254"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.39.0-23254","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.39.0-23254","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.0-23254_1619543655044_0.7658726813232821","host":"s3://npm-registry-packages"}},"0.39.0-23272":{"name":"@fluidframework/dds-interceptions","version":"0.39.0-23272","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.0-23272","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f9b2fdba15c3d50894c1502dbe4a92699d05e719","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.0-23272.tgz","fileCount":70,"integrity":"sha512-Dsjc30yqkwHfxiYebiYuJ7tQVc6Aw7Pc2R4NrCTOPuRJfz1xp3zvwoJ97dr4ztFs0d7C4ol74LXuBU65RxvDBQ==","signatures":[{"sig":"MEUCIQC0FfCH2U3PiE9WCh8Zizxe1+3gDh6X4xVGRz2Q7hZAzwIgF7JFmH7AgGEKxLQ3BjoSWSLatNu+hQw5amK623u/Ln4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145639,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgiFUsCRA9TVsSAnZWagAA/bwP/3Y1BWFnv09eZrhGb3TW\nj8kVjfb9WdIg6m+NoqmdvwAjpb6mrSgpsbSBRyOgcAyx/iz0wOFu2fGnk8ZG\nhAw0E9X3/I16ZmbAM3MQ5YdHAqAm22Dv+jvsGP5HNiVen/CfHBFJAW4VH8Oo\nL1mjRtQIwUpOKj2rX0FngQKSP6ypqp9bveElR5GatPBhIQOCQZKccD5H93sB\nM1+XqSueITChzaVP0lykLXybXgTlN5/1PRNSNbxRMhs0kS5x2HzzWETfSPmq\nXsk8T3pruTYK+q6R1lhOsy9ipvanINre6GY4Y5EBPVSD4hbR5X8clMU5uawb\n10mRHr1369SrMuPYa5onQwUvIB6057nHa59/+9QhZ2UI++o02IJBCD9au/ek\nSWeCmJwsn40QiwjZ3XwHyWYLsgQ43R/Qm0wkUlghE4AwR9YqWNonZgDatQ6P\nnu8knNlToScwJ04n4TAzIxr7ioplKDXhz/nFNMDz/QH/0kSZrYfh7PiJMazX\n6RIqnTLKwCBEmCgkCAlQjUj8LFWPD6Z8pRNDpkez1FZP7rEDNntCMD1wDTPG\niGcWF+96l0bupLFxHKwUIW7yvaFuOEd/1wc2kDI7Tyu39QjQ8akt+RUD0N8J\n7q2mRGIGIBHd4ERoxBl/z2eVUFN2cvQZWIqKq+iv6g68s8qfCMXwYLkwX9+2\nx+XH\r\n=RVQq\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.0-23272.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.39.0-23272","@fluidframework/sequence":"0.39.0-23272","@fluidframework/merge-tree":"0.39.0-23272","@fluidframework/common-utils":"^0.30.0-0","@fluidframework/runtime-definitions":"0.39.0-23272"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.39.0-23272","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.39.0-23272","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.0-23272_1619547436321_0.46925945986992246","host":"s3://npm-registry-packages"}},"0.39.0":{"name":"@fluidframework/dds-interceptions","version":"0.39.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a228f23b39b6564f7a7505dfc884778e22733ef8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.0.tgz","fileCount":70,"integrity":"sha512-4NpKKP9XaOr2XVKiEB3u2E88PhS5XfouSiStLa41lvUqjOi0z3bxiqUVHbPojiAdb4DsGWRpev3r0BpMh+zekg==","signatures":[{"sig":"MEQCICBayiFwVja4bM21icDSjTatzHr6yA/oax9E4y1j1QxSAiB8fSk0+mDj6OgeQ/9f6cgbLVCOqHUy8w5Txq5ig5U/7w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgiKezCRA9TVsSAnZWagAAZgkP/iwGlbbHFVSCvBN8lsV0\nzJ/T8cidvu8Qrd1CRmXsn7FSduLqkNUDmzUZ+MfZUrHrlFzWlGE4UxPDPRT5\nSGsMQ36ucfH0HIf0MJVCeGNQSI/Ux3OxiQ/yK+gDw2ECxxYlIF1UATRxPcLt\nXYzFPRLxVZCxKQ15I2coxenovGTdSjWu8p8PfEH8x03yubdlFKVVZDJG+G9g\nWUXzb7gmzyLYKefnhj5FfMSsho6e9e4AVtARshbotbnB1aSoAL9q946Z/dPf\noRcGgpf9v2jh9O25zLAd2MBTdaWQj59OXGzqg07psanuFIuxUSO7Mz49dSvU\nazHNhXwJGQ3XfYrcSXqdTSx7wPWWNebZrN6nNAWtTUrnFG65Fx1yFoQPOL7E\nyd3O61lqEeMndFmmiPKkisNrHfG8yM/i1+PQB5WUq2TVxQIiFYUU1bLuatkH\nhrki+DH2nycsteZkgs4xpvOPOFd7/VvBAM4sAix6sE115acyFW2WfCavrHo9\nf5DuDW4fmWQ7D8rPDYq8mM7NQC7FH55t4edRIlRafUvqQwFYH5AalusqUeBx\nTpjxhEWxL/jV0adWEe7RdcAcJ/5xqdvbKrYUeWuxhAiuzNVrByllQqsbwrMl\najDzsjGEomaOF4BSysh4xV2+yc88VIoDupSSVVYFXDIzu6rWPQLP/wZ8fzEZ\n/xvQ\r\n=/d/H\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.0","@fluidframework/sequence":"^0.39.0","@fluidframework/merge-tree":"^0.39.0","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.0_1619568563040_0.6696761375354516","host":"s3://npm-registry-packages"}},"0.39.1":{"name":"@fluidframework/dds-interceptions","version":"0.39.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"964e2f9f51a2707d99bf603220fb64d14297b560","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.1.tgz","fileCount":70,"integrity":"sha512-2nM/a2KFx1gpmT5DJ2aVL2IgJ1R/PsBckyTJqtyraPojKVmVkJe80wnsNP+cg2DHnQHXRczDRt6jCrhAM1nTRQ==","signatures":[{"sig":"MEUCIQDXZtxxHimyolI0b4zwP1FouJz5SOez2Q4yLE4yULgW2wIgVsHv5kCOSToH4908SvoPxxrd77tp2Anz2fYA9j1vdck=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgk0XaCRA9TVsSAnZWagAAwboP/R6eUXfWs3oPwbihK4oX\nsTm/1QDp3RPtaSCli6gdcK4M/HxeiDgkJUNaKLm6PkFtqgmWfurX5tzj4zZw\nc2egW6LBCCYl0tPzAvTRTjjcEfCtUZcKMoxhacx31jnjGPjcBUVUcg4G4VM8\ngDfczOLeEOTrPzhS90yVT2y0ARYt4gbrGJ54/QsDM77BEA5LIMe3WwQJR39A\nv/sc6PQcvz/WgFea2Vs4Sblk4i5VXV81l/E2sWvJ/kArCWxWjWfQ/p27X3rY\nT/CzWhnyF9Cgkfx7wfgVVq3oBFWj3+vSdwqNWkz0MVsZ5OLJZ/el36fdSAe0\nl9WLow0Ac5rbFIOS4EfSnM4oGDaQERwNK0ZlX6dpZTVb3YhKjifR8yAa2UQR\nAzR4RcIVlJf/jvjx8Dwn2WXKgpLGZllC3aBFRgPmKsUqGHz1QnNePKT+PV+O\nhQjKl91utfEmFexV9BOwzthNWGflzddm6LieeXolQ7c2H15uC0iMRJWXXWk8\nOVfPfVburgK9Gq+Lfhn+u2RH/QaPiHKd0Hg2XDSx0TF5t2fJFw27bqJ2bVRO\n/o1zVXnyhV3IM5l8Cm5ybry+vMTFxhF1Is4adbArm8cAYb+kSAv8HJg3LPlg\ndvVJH5guvrb9U3LmnthcOgHJwhdI2UFUee5DwY0U08lnu8HK5ryj5C+MnZdS\n23Rm\r\n=xVu+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.1","@fluidframework/sequence":"^0.39.1","@fluidframework/merge-tree":"^0.39.1","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.1_1620264410165_0.09719513487520115","host":"s3://npm-registry-packages"}},"0.39.2":{"name":"@fluidframework/dds-interceptions","version":"0.39.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6716c583ba7298cfa1d56a3ba3acc9b017c9e2ea","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.2.tgz","fileCount":70,"integrity":"sha512-Yy7SFKHy8Y8nkpServJ0XW286OHuEHRaoUSO1xqCvqkC82mPpVJwP5mVy1xZaAtm8zBBOSl90+rM0qR5depfaw==","signatures":[{"sig":"MEUCIQD1CeLrVYW9fMAgs0WFWHk8bio2gEa1hDgPt1Pu+sd+HAIgTVlz7B0dwXDeJ78G2Xd2wo+M5bJeqjdOPGD7d8DVntI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgmwY3CRA9TVsSAnZWagAA5sYP/iu/UbM2piEIkcJjjVfB\n7mjowW1tETv9OhIJhanMsER70lJKIRO1XnKf/IZUhFsZVsTRtPOQe8ikkG6g\nC8CzNp5seYq/SahLBUtQg07vFtW9+G0gkGSyYQIEtlKSMR6dcg/Djyk3NARB\n9C2q35F6wgKzNffg5hEy4hVnqGyKosBYqs/uQnActpRWcIbp23f4/J6W1woc\nX0NjkehgXZRk91YaEEiHeW8NBOZmWIY6YnDFp9byRJLzie+QiKywRBOtD3LM\nkDB/P62v+X13rXXWAdwn4P0PoOvoc/mgxQro+SRTD+PHEf+ZldpDE+P9KmQR\n81aFxcokWdyJhr9uBRffqQLFwindmmnNJDabj/SjK+uzjJaeb813ZPJ/8Lvn\nlGhrtHKjDsrHyCchyJ+3yVZTs1G5+F5LhxTC9Lp64NF18PlZbKA0av1MO7kQ\nR7O+gnD8uX4DMRg5k6erC/BkGwcCUze1xkqgpideg1fbDb7Nguj+aZ08QYPc\nziT69/sGdqinjSHBYfgUyaUqX/pMPhLFAbBIOWcaSquKMUk+M2SEIZSV8B6n\na7k5XZm+U8La9UaqZytCBVTEP75NBxlD2qnjwuRIY2NW8yucOj54niOiYDMO\n0t0RnZ21bL/lF8EeFMutwZSh1DPODdlHj9ybsydTowsXfDFIUjAGnxQNrSsI\n8tqM\r\n=OV2r\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.2","@fluidframework/sequence":"^0.39.2","@fluidframework/merge-tree":"^0.39.2","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.2_1620772407152_0.7812901513938069","host":"s3://npm-registry-packages"}},"0.39.3":{"name":"@fluidframework/dds-interceptions","version":"0.39.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"059fc5c0d13b8b7b49071f87aae8467193db1ce4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.3.tgz","fileCount":70,"integrity":"sha512-BpCBHSAVIkWB3oZRIf67Qjtb9ixrKuHZQ6GwNUbYo5EVHWsN8HSp+8QwOeT+o/znvvxW9Y0XvUhfUtMv/punvQ==","signatures":[{"sig":"MEUCIQDYn2k6ux+1G533AxWT7ypRvF0uE2JvEV29i06LPM/kuAIgAsG7AUpHpnargNjSw5M33BuBDQl+QFax6kgzlw+kChU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnWE4CRA9TVsSAnZWagAAiqIQAJ1W60asLeGaQOXw5CRl\nUyGbvmEHQceCCTJoNJgTn60rWFYOGoQhkIi1AzPtJa3+iQLhxPH8VKtigWgY\naGxF0Vvnq+eTuToKrMbviMf+jWNEkFR5WwCvrjydIWxR0AM/yZnTmB55nA94\nTZBiaszI6omAnPG9PVK9dWqNc9zGgbp3Q0LkPPcNh9DP+lzRz+o5VOfxNU7G\nb7eOigO8ByEw0eORSTTavcUiXeshwyDLI+OSep7XQMeP4BOr4hoG/QpGtLVk\ngHSH4jZPqgv6jb+qZu44gPHEeqTjrs5HrbW00gao5u1jFvtJohXgu0clSVyo\nagRmqIyIxo6hhy9UM5Fg+pzCGxUdXMoM/GCmsFag3Xw70TQY4wXkOTgTGBdf\nc/3c6h1MqJ7yS3HD6Mka20Lxqv/yUqBlfH+7IUtLi5DeUXY9IaOneHtriqCd\niIr7bY8pddUBQe83DePt43AEQsQwlfq2VKo12nt/M74dNjMOLYWqAFRa5AYh\nKgZHz0aM6L35P1lUeO2lX8FCBGvWBuNZodKvkl1Z6O9BnVccF2hswIcxelUF\nBCS2+YOhiI+93AV0W2hcEnBFuce78FFAr5AXwbiWK5EAfoF34psJ9N/4GTjB\nQjqRv13inIRxk04pO0/ymfJ0A2arkrKdmUimJ9/T3YpQk2OX6vFL4/8cbTMF\nmn3v\r\n=Zs24\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.3","@fluidframework/sequence":"^0.39.3","@fluidframework/merge-tree":"^0.39.3","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.3_1620926775565_0.7943154164125803","host":"s3://npm-registry-packages"}},"0.40.0-25719":{"name":"@fluidframework/dds-interceptions","version":"0.40.0-25719","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.40.0-25719","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"46c51b6eb33d9b0f503dcd0fd784ac9d1dae665e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.40.0-25719.tgz","fileCount":70,"integrity":"sha512-PQlgeFZrLicpQZuhMOebluZA9YatMKfhCx+Gu9+xzORYOByxGV5ct/UtUI5OFqWZPwfx2wDdcmq13rfVbK0AXg==","signatures":[{"sig":"MEUCIHadM5dn8Cubsz58CTsHEJI4PbCdQSV9GZ5qD3x85d0WAiEAy9ZsQVjUM6h4CavHxCkKdAOccItJkxZRkMlOAeNZRzY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145786,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgq/ePCRA9TVsSAnZWagAADgEP/A6ZM5DOP/w6HSFu+hen\nA3wmo3zvwLoyEn9lf3KOdqd8kIP7qXu5//97T+dHyxELIV0Y4qK3NoQgqwsA\n46VyROCtZB1Zrse8CAdkVpxf7o+L8+NV5c+k4thViSyD50b61OEqzl+zf1v2\nUXsUvQ5l69i4q8kXMG0tcBtXAR9KiKBHOkxeCXxzX7yL/gXw+a/yi4QdhYT2\nyol32I/0312CVEDTNOV5TSZrBd0e0AiFFAofQ86zxWTzd+kJD/fp3he5vPn3\nOF7fMCxjQu5B/SvJRrNerV83TUMyu/LY/+eHlc4jZ1YckdfxVBPb/1pGJqZo\noySh4qMfX8TrLbt1UjAsycU+050tXgtoJSAiFYSEQi2wUK3rU2lNYMQrVNkh\nqjZqVpnESoF745A73ZHBWD2EGZl/EWgNYS4PS7acyBloHEmet78oOFJQjwDQ\nhH7Rj6cH/F1Bd9Ln/pMIedRR9hfwWrEGg2oo3G/qRikWYc4zTHTPs4/OWbj1\nTmu1NIp748WKfp8zq0Pj1TKUQICKwysFNeizD1YKVWeqFvq4P5N2YA8+tXXp\nxBPyPmSIfoH97r5whH6aspz/jgTbRBeppZDVdqWp3TyUBY7BLtoMur8brm+3\nPGOUqn099mRx0uhoVO71qc+f5EHcltSidphefCiSizCSiEzP+RFZxyJgi4pG\nn4g8\r\n=D6qj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.40.0-25719.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.40.0-25719","@fluidframework/sequence":"0.40.0-25719","@fluidframework/merge-tree":"0.40.0-25719","@fluidframework/common-utils":"^0.30.0-0","@fluidframework/runtime-definitions":"0.40.0-25719"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.40.0-25719","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.40.0-25719","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.40.0-25719_1621882767408_0.47093408711343976","host":"s3://npm-registry-packages"}},"0.40.0-25851":{"name":"@fluidframework/dds-interceptions","version":"0.40.0-25851","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.40.0-25851","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"94c99ad82279548e5638b5ccc8a8c87756d7b443","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.40.0-25851.tgz","fileCount":70,"integrity":"sha512-QUfREVEOKqxpf9CCTIXpYRsFdk4vz7mZ1C3wiDk6uAaLtf/AGZc/rgnOR0MOrk60RzuQxgofxg3TzyOkmfH2Ag==","signatures":[{"sig":"MEYCIQCFjgtVTxa0SQsfFFN0SKPesCdZSJFsOhCH4y1lVZqbPgIhAPFYVoY5UCCB8LAIYZWbvHNdph1luLwJ+viYDZUkR1Eb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145786,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrXv4CRA9TVsSAnZWagAA66gP/0BF7dOUxOcMthdyuWxd\ned8WgBKyVul04+TW9aHbuTdiw+aypBL4gjnZhjbw2s1S2dXLeClfhOgC6szC\n0Nmc3NLQAgnxrd4wOTBgoYogCTSwTy/p+YNCkuEwwt7Co416sc1S2qFbK2OI\nKn3IuadKzB7NoyXUBZaZ6Qzo90kQhpvnK+D7aqvmyeYSSh85kHFtZCec3544\nLilY4QPn/eziuZd/xgkOe/DoJAOfkYK2245Zi1Icjn5p1JLJcZ4Zr4Qx5w/K\nhiXxP+vuWnEBVMna+TkQuYlnXtBA2zUKhemG/f/ZQiIzCkqMOS0/KZ9kXLhg\n9gB9R1rOSouTQKElteoT9zuDUQUzFhk0BE+GYF4qnAhXcYCdbpmBNe+Ap4Se\nI6yPPkONde06Udl2wWs3/EOdXbI4BZPaM1e/t7sK4/m9yUKEpapexS+voqc4\nr1kbp7IDPtthcIQ6yGZ5lT6Kh6DAxJdgn/E92v+gdncp5toLk+2cdoPGyqHv\nFAh/Wzi8xjOpPk2Jmm3nxHIdpGTD5h3t0fybOuhNRtkpARfQ9aomtGmiUhEl\nS2T+tfX/PlnXsIjy8e+z8Y0mEZKr6/EsDAM8kNuIJCtebJ9iX4Hv1LdoxhUU\n0SRla4egjqC6yEj/zK044UBUZODvoKct1nsjq8FTsGb+2q6LrHEV3vawcMz3\nJ2Vo\r\n=Oq9S\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.40.0-25851.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.40.0-25851","@fluidframework/sequence":"0.40.0-25851","@fluidframework/merge-tree":"0.40.0-25851","@fluidframework/common-utils":"^0.30.0-0","@fluidframework/runtime-definitions":"0.40.0-25851"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.40.0-25851","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.40.0-25851","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.40.0-25851_1621982199444_0.576023081819445","host":"s3://npm-registry-packages"}},"0.41.0-25957":{"name":"@fluidframework/dds-interceptions","version":"0.41.0-25957","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.0-25957","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"26a5b47ed060d58294d50f1a71afdeb3fac3fe5b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.0-25957.tgz","fileCount":70,"integrity":"sha512-tZ0WMUjwgENo1Zz+PPETy2XrUxuVs+tXonS3yU4ipjmacKo9gnWtybaFO1WbMHZ2tMQX4kp1w9r3KIn1Y7DJvQ==","signatures":[{"sig":"MEYCIQCePgps4CRj+qQNHb1HlbyXn44HICwOXH9L6/hrTVAN9gIhAKJkdzsKnr00jIsvaK3kJuETp1gpiqUYiM6WsQnHMcjR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrrITCRA9TVsSAnZWagAAEVIP/RAMxXc5bs5NqSwb+GEP\nktkoxD3eivjmVX7GEOsnL6rrFtdyxiLK1f5LWQNUFoUbPhg26oWRCWPGGeyc\nKGyLykttDINoE6U3jOX93py+R6yacHFvxoOQ3fp61YUDhi9eTFVik60LrGuG\ni+OY7zA/kmj8uXd6FhFfCB+UODMWrHLxmMYnAua2NhiE2nzIkDGJK0K70yz9\noJkBQV3LF6lei0uuM2ZdQPaWfMiIDmKjk9yp+frpGQ4DBdvNe8kS3bh6fAnx\n8bNWRJ9qg8shpk99Ed6F/qMGY0IR5K06ZJE4aQR5P1R6sR3fcdnsQyzKIyQw\nCqyCoN93WDJE9ELU2fnZekOxsrueD+2cZ2I/eVW9KuuCsvKvdPrLyrsgKn8N\nl7+oKyE2ZzpQP3f2tckcRezL4Kiza+J77WQJyHWCf/U+L3a6+IQpbq5hRXQL\nL3mwJE8f7af1BTQwmEaiVl0FXHa0ZEXUZntpaHGLaXpa5vQHZVBelrViAT+T\n8YRaMKRnozQ55EST+i+TVQbdoUEP4P1/8VDwIFokeozaocS1reEBDW0gpA+H\nbMr8wFptLAR4bi4dswuPlIeBK1o9/lN7ZnYUAObYNzt+rYMyOx9JyvGwDDZE\nALrMYiVUwVrELwVu7ICVGCDQaBDX2+dftjRLRDqo7JsqYDG7LxRmoWv0uBcl\n2CnF\r\n=DY6u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.0-25957.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.41.0-25957","@fluidframework/sequence":"0.41.0-25957","@fluidframework/merge-tree":"0.41.0-25957","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"0.41.0-25957"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.41.0-25957","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.41.0-25957","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.0-25957_1622061587405_0.9841374932304445","host":"s3://npm-registry-packages"}},"0.39.4":{"name":"@fluidframework/dds-interceptions","version":"0.39.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7e8245f2eec2b0a57dd1b1bd28fd9f25d0893603","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.4.tgz","fileCount":70,"integrity":"sha512-lYyapMvqWw8i6UHrx+IyvIzI+tI+pB/mUPDEFpQXKgMAyjuf4ldgTc3miRfAdVOEdtbQXxM8lcbsBmW+h2dbmw==","signatures":[{"sig":"MEUCIHb406buz+GCwKIK+1bbdebFCX46TxqOiOWJs2NjLpWvAiEA3qh25G7BRA4CRvShKZYnedivDMiR9V3XeIffWhPJSR0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgr8waCRA9TVsSAnZWagAA22sQAINU3fhpyng3RbNIeLdv\na/NcFmINQIqYKepA44zZLr+rZkU/tcarzkzVBVcawmfg5Egt8NvH9zcqVK8X\nMJWyHtohLjTjYqssiMfw7PknEUzFLYoNoB3EqXqxX4X2TTsJ3xGVvYk3pmuG\niunIMoLHl0RAKrh7iAqxUtvq30oqzq6PP6Z+jDTFxx5p5iXTR0KOrcuruUox\noq770ubl6n8eZOdmTMtI9rrP6vlFzQ5QUng5qb2hgcTHcBQM+bj4e3vOOS4+\nFcF43c0HpE419Ub2qOlhDTdfW/+VdeZuUveC0dMFlo8z74hjwTwx0m7hRPpI\nvHwdEtnzCKbvspUEmKzO5/25I4veJNuQlEaR6tdXHS5Y/Qh3SJXJ9VUL8Pda\nBBGpoLK5Qe/sGyQwWXHxo4Rt0CS/wJwKuJ05hfZEWoQmYwC7oCX5DFjhTIZo\nhWuLY/WUdPPNWcUy3ePVh014zcgEX8X3YQtx4svfs/KBpVb98lZiPuALGpWr\n/S8xMm+61ymX21+RENb1Nf+f5olo0E3BOsppjz+hIWBz+Pzi+BOJRMPeo8CR\nq8hOHThqmxrpj6E7KT8Mubfh5nPCyaTJGGSqrQb6TFWlxkllVS2LJQj3RG6k\nLBNT4y+BPI4bSMFdXJ9GSvI8tQZaPyJrJ9kTd5lJxoCvaJVJX7i4WTLBokaC\n+Rm2\r\n=XzVw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.4","@fluidframework/sequence":"^0.39.4","@fluidframework/merge-tree":"^0.39.4","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.4_1622133786132_0.04955932461668211","host":"s3://npm-registry-packages"}},"0.40.0":{"name":"@fluidframework/dds-interceptions","version":"0.40.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.40.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e764aed744d12296db02940138fa1bc45cb86d56","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.40.0.tgz","fileCount":70,"integrity":"sha512-1ZfZhTogvK07n0PcrkYxDCTFeHHoG20YzL/0XaZj/BgqkHKKcYwzYgXEjHoAu0zJs44tvCaF+MhdmIRZh/mMGA==","signatures":[{"sig":"MEYCIQCnNe7zO+1Q81+s4AWZQ686XwIvqWROISPsWZoElXBXXgIhAO3CRP8aSEd2DXOlTz4MNqk3T/cRJXM9WOVY8Mv7hUpi","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgr99ACRA9TVsSAnZWagAA2M8P+wTPK8zkdZ6fhz71YZCq\nyFC1rTiYIfWiEPGXMPOkckNnbEgNacxPV1MjpAD0C57amHNt/HpNUq6IcHvQ\nxJcapOMUZBKaN2qUuSV96oUfjmiz4cJFknUyVsAvR8RcN7WiLcgQRmaWRGeB\nKGdkCiwuqxyravhMzlHhLjiBirc+Ci4qkciZ38kF6i2obqKVYgoSGbTM0XJE\n8+SlvjuBdMskL7zZ0RFWEQ4xbEavAE1O8F2ekEjs8RmsoV4e8ly32Grb9ErJ\n3DzGLAvEiqTXDCg1H/AeZ8B6yzlgxhgFxslYDZUSq2m99ylBx+xo5/iRWaqC\nlzuF6GrflnC3EsY9oIq8oF3v5EcpFEyr4S28X1n3mqdCcUMEnLCDGxmp1GoX\nYj60Pe5Jgjr7U4iHD2wD7UU7d1QcFdwNJR8KGBIl/LLOwqysHy7bl/QrP6hT\nB8HqKQRK9/RYr+QuI6aKGkvmTePQtRg6QPQOosFRw9BZS9Qtbk4rDIo8GhiU\nn03wKpC3m4x9+6zD+2uq78H5SgyfiQx0bBD60YIX/RPC7qKCuYOxA+qtwC7T\na+mMvUSF8we6IdOPYD9RLOuJJ7m7Zlj/GJWxMJwLdaGY2YZz5lsgPaScoJw8\nnaURJKMfwuLw39Xuj9+1oq61D/Q6A8SOUbpnXkKQJKTidCZhWK5mHNvH2gyi\nxTfU\r\n=hMd4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.40.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.40.0","@fluidframework/sequence":"^0.40.0","@fluidframework/merge-tree":"^0.40.0","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.40.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.40.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.40.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.40.0_1622138687598_0.1494954897553038","host":"s3://npm-registry-packages"}},"0.40.1":{"name":"@fluidframework/dds-interceptions","version":"0.40.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.40.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"09d7b4bcba78bab038160f1c896f0aa6b75770e6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.40.1.tgz","fileCount":70,"integrity":"sha512-bJcq+Hkeo0j/SFgIO2SDq9tR6Ta9tHE0fzCqm4NvoAaeYH1Wi0SFyfzuinK1ygC47NspB77FPjw7+xNjxBiB/Q==","signatures":[{"sig":"MEYCIQDmpOnO0d02jsk1AZat5vrWyWAruY36HGa/n/XWWya14gIhAIsRI+xTb/XCdLsIrZG5DtP/stUmV+iblCC63KVBLZyS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJguXSyCRA9TVsSAnZWagAA0sUP/jaQ4awiez4CUWPCvf6p\nzITq/fVIKdt12yn4p/KmFVZ4ly87M+XRR7u7B4DUuSEYv7lsci+I74m5AkhO\nPMcdSbY3Apvpq6hfUAKdn9kkzGwjTjNqiz945ffhb6YvVw1ZsNJHCc84eILc\ndeHsudjkmI0cjwAcHYEUvGUNF/EJ7I3TbRdm5hBjbVIUCItI4QMTOIhB9yL2\n2mfBBhDEsc+bX18sKJSJ8wLBedHjQldd4Up95hRl+aOPNyGhzvkIIreA+5ts\navM/y6+m5w5pV2mTwWzN592nA4fBBqaFQ3ki6vrPfsp3E/PHhziVTDwHeL3p\nU3cl/LVzA0elr/nDB3a9u0TUZFxzz2rhoFbI5MH26mzjZ2Agl4P/G4yeLAGk\nNWWyhpo4jEv8kQCfCPnmC7aFflwN7GqGqU6BpW5HEuSGbVrH7DzxbMTICtCR\nxEdNVRbmr+pa+auublyQZGW5OC3HLDX/l2zVR6E1Nkah8iRH7uomClJuDNK1\n7Z0vyl/6tZS+8c075L96F7/ZTWlIL/j0mhJfZB50TsWiWUuHofvrNaLeg8D8\nMZbhDgmOUKqUJXYoTnerp/VrabIcc68RqogGqS0+e0dv0RLkTXk0NIS4Fe+y\nWlPMugNhpxnKlIrKTod5389zC9YtYOsU6xDhmpcP3HFzpMgBoxca3Emyua5c\nFGHp\r\n=mOZY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.40.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.40.1","@fluidframework/sequence":"^0.40.1","@fluidframework/merge-tree":"^0.40.1","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.40.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.40.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.40.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.40.1_1622766769917_0.9093328335169173","host":"s3://npm-registry-packages"}},"0.40.2":{"name":"@fluidframework/dds-interceptions","version":"0.40.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.40.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"028107e16cba120dcd4ffeb0a81a74b0a8bc69ed","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.40.2.tgz","fileCount":70,"integrity":"sha512-aWh9ux3tMFPuVAmaKhsCGdCDNzWIKZN654QyHIIU/Zxmuae62gg+lB8dMQDpdjaPQaScUk4is7z5xlKHPiYFQQ==","signatures":[{"sig":"MEQCIHfVXwYvCPGEE0pGzpX2KpWxaoDBEIpiWeaBXpXPt1SHAiAm2U9LTsR8RfLBr60tJGiHgnDaDneNmYk852K8YJrrUg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgvneACRA9TVsSAnZWagAA88MP/2FUyMVfWSsTJe7CL0EO\ncS7Rm0Fbba3zAlV8QhBJeRK4i6H2ygv8ymILU3SOHkWti1lpWaGAalwNaE7H\n9d1dZrIZp6a1sQ7SytU6KDvkw1mnPYVEN1l6xTb/TjDVEB+0BY6tkW+d7FCN\nK5CgXTtSO+xYTGZpMpWGlG8W08U8NbNTIXfzmMU7wxq2YO4kgEEqH+clhfXJ\ndHk71yFkD+lKdi6B2yP+w1XSPKT2VfWUp0EYqbTGYZpINwwxl2K7dFmKXGjC\nnF8u9+M9wBtjyZcqRz3N4ZHw+VHe6zrHUQ8KMEnI6krqqHSrFX/WRg2LyqBr\noGxB6AHOIIw9xEEFhu/hjimpBOYpuKoxhEC6ujRxrV9Zm1AGtIVd8CsWKzMx\noijWicR+T6y3eFMk0ax6eIqMeb9+Uvvw/Ctj2jZUKqnfCFhRzFCzE4uK9QbX\nFZ22Wi2MzkaV5bGZ5+Dteh+xAHXmJ5oxPQHnPwnPC/pAM90+ThQ2eS2Pk197\n4w5phIf75VidnMPOFEY+dxb3Zqtsr+158v53CCfkvoeDoICUSb6rgrfr7GEY\nzE/X4P2nR8rFXynzepbs+BqxPBqrekQRIWUsBrzsO9i3PgSwBRqPYI//ApOx\npTxMX0Oa7ypNeLLBFtF0VN0Mf8ZACF9GKSErBie1UpfneHztFhLIDUmXYyk4\nJl/a\r\n=MI1V\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.40.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.40.2","@fluidframework/sequence":"^0.40.2","@fluidframework/merge-tree":"^0.40.2","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.40.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.40.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.40.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.40.2_1623095168309_0.5471480992153788","host":"s3://npm-registry-packages"}},"0.41.0-27154":{"name":"@fluidframework/dds-interceptions","version":"0.41.0-27154","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.0-27154","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7a6f39d404389448c34d88bf28379b334292290f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.0-27154.tgz","fileCount":70,"integrity":"sha512-hZjerdjCF9+WhRydsWeAAxJriYKTpFqGGX2+XDMndKnYJpaHS4cdRH+VR3vEkZNXpwARD9F5KqdoRlx12G0lsQ==","signatures":[{"sig":"MEUCIQDwW3x7ajUjqEBtPJX+2u8frP3uiCPBbh8YcJ/E+L55tgIgQQijHo4oBXBmObwBmwahureYY9T/a6lqte+p+NKzvhQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145784,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgw7I8CRA9TVsSAnZWagAA7BkP+QCQl8QSgcOtjslLb//g\nPjZgnK8r7x1cnlfs04RrfR6wDCUVHGuELQo6ACpBKnO4wlcrXyOogN9NsyWX\n3esrxeV84KSTrhvsGrLlzKqqJkGN3lWFMStMcj7HVxi6S0eETJ6gZf9SGa/z\n11/aNrTpgWt2xXq0U8INSO1d0fQFuHywxrQ+ouXtpMUGI8L8HBMuwsMFRIWi\nUT2mxYjuEIVIwzSXhrwD5/dF92UF3HBDjBYenpMFbeahcizTMIIcSxYoBtE3\nbwFpassOBrmDy8M9C8jI4j3CeZV4lVv1+N+WMnuWG8dV7oxCePArW5yyftS6\nN6d5pI4wqQaJ8VrzIdzeLLOJo6Sbd18fsVDcNdaRn1PC9Sulyx5lWqp8TPm0\ne5LYSlK5RTRscBDtmHoMHnsVmRu9a7UlOjL6V98/hd6IGcc67HIfn1OXherc\nyN6n6jvGpYfOdnsrEzP/wmZnUsBvcVHKTD7tioFye+fJyosUehPm2rSXbdxR\nfMt2o2w+fySVHtaMC6m3X/I/z9j0CNqXkRHNIZ+Apv+/6VZtAbAkyHWwhM7h\nYfghMk95RGVa5EVxiY41gU0wZxAANn44rJ9Us+uh+OUNprSIW1PZwgEVVxXJ\nCMziewWHxBaccrAtuxYFYgPnkPUd4RC6k5HoB1G786klhByIoKTVsiUis0gQ\nk91h\r\n=hvbN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.0-27154.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.41.0-27154","@fluidframework/sequence":"0.41.0-27154","@fluidframework/merge-tree":"0.41.0-27154","@fluidframework/common-utils":"^0.31.0-0","@fluidframework/runtime-definitions":"0.41.0-27154"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.41.0-27154","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.41.0-27154","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.0-27154_1623437884659_0.6608725397256059","host":"s3://npm-registry-packages"}},"0.41.0":{"name":"@fluidframework/dds-interceptions","version":"0.41.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a1c67a7757a72d8b91b0607adbbf19d658538d25","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.0.tgz","fileCount":70,"integrity":"sha512-/dCZR0HJ40A6UZCp56XUCm6noHXEQbj2HnPO17ZBcKBnl/442rLLJJlQ2CHmxJQHRrE5YhVQorohbiG0P+HHSA==","signatures":[{"sig":"MEQCIBP4xkwq3ZS5WzxIRSsCENGYCSWajxo8bxiAmL/E6IpZAiBlzr0UAqESRyFfcwXpLq5ZmjYrXqhGcqj/GCclEsHNZw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgw/HfCRA9TVsSAnZWagAAYncP+wXZeKBq6EyD50GwmS+R\nz1VmYJ7BqFtQrJOypG4NPhbWKCWml+P1vPM2v08P3krLrHyyzhv1cdMP3Tjt\n6P0PolcoqnBRNFdLwFjsA6oXHz/sAWQj4Rr0QTw6LdzCjPVLbhOhk7H0BDiu\nzj3SY6bxsb76IFgIhRfy+dT6IXzr2MeAXSFxtUxrAh03br+mj0uGbN002AJD\nv7NWPGMRXL6LkWIj9u65+b797cQmWkf6ZTF5riHIqBWSG238vjkNmE3u4zAq\nZklsmGxtxJE/0OHesEnaPLWNbGkcXOnPNNi+aE69/vJl+mIK+qhyH9MU7I1V\nvmYRvVGhwl0SaTtftNbn+slX+rKAjsJ6sZ96RCFP1Ujc2kXyZl/4WK0CNcOL\nQi4aM1G17omwib7O5SPZlChSkb0s7Wx1gRKXvztnQ5aV8QUKCRJJWUo9OYVy\n9yyiSNcYSPnFIUnosQR2Y/8BZ/RNJkqzrxyrTicNEw84uq6RRSpjDNQ9OZEK\nFaSSpSbYxTed/WquSlrJZFzzthPW3B2IUrOIK4LEeucqIXGBF8J9sXIJDUDi\nLY+9YgRZ7D0zfx8Kvp7ksQVKkZU/CvSY7agM6nkBFgvQVwPjn+/VOXn1ZHha\nkPuCpLFBOR7Y1DlsRaFc0n8dIYQ7cho7nefNVFctyPf84QSen0nuDzziYWSO\nQKr0\r\n=1Xmd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.41.0","@fluidframework/sequence":"^0.41.0","@fluidframework/merge-tree":"^0.41.0","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.41.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.41.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.41.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.0_1623454174884_0.3505401147556386","host":"s3://npm-registry-packages"}},"0.40.3":{"name":"@fluidframework/dds-interceptions","version":"0.40.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.40.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"002a906a16ddae4993e617c0dc1542e0e87daf23","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.40.3.tgz","fileCount":70,"integrity":"sha512-cGSxUccEgAkvVk+T4vCBWHHkL79qu+EYbqW2Pm8FHuNHwfMs6/fH9l1eXeEuN8O+vnUF1PSUF1xEMdYxeM+mlA==","signatures":[{"sig":"MEUCIHWaulRX1iZoTcD+kyZ9g7SUj0lSVrhucVG6R9h0Y61vAiEAtm2l+ApJ6q9ttPFprl551CV4y64A64ggh2gMaILCWwI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgyP8zCRA9TVsSAnZWagAA4dQP+QAdXJkJJLCUsvSIGgDS\n7iM3CEAO2hq3J7P3e9wuUQdL9gcXhdjl/AUiOgNnkkP1hLve+NPmEp8dWS9q\nS+9hcDwBoRJ0HTqL8SqyZ5JqYmb7qCe5PbhGIg0Kyb9eLGABdUhDlr1vhqK9\nIH0iBVr+JkWK+oXNLIgDH0/EmlGBJWN9mM9rYGTE5SycCqOk7YslEEgGLoZn\n0gUe4j5+5J6c/0Rj5Q7JrPkhsCwajevZbgnErz1UXat/9E7wuI0yrZH3ax5X\ne0GIIxyJDOXtbWI+t6QOn6qUj7TEYXTQY2nCy0eMTdSqvj1Mq033sWJvtttw\nCGsFirh/ER+dEww4FhK/B1qKVH9fh8G5cPMg0fVivxiQrk9PE/ZUumL+fzzf\nzUqRAcZDOv3ONWGB4dAjokd3Mu9v4sivem2788tSU+AVAF+4doAmJVxg/dHe\n/W/1fJDi/AgqCTwA076ndIk1qOQrG+RMRMGstWlVrGLLQs7poOu4DkxsMX1w\nS+YJGfPYOmUFdWtY/xJa8UfPnyYa/KDH2xHPJF4/QcaUmjilZVhtn+5Z/965\n0IfP5yVaJksTRZFVwDJAXVDax9u4HB4O5Toz1OTgx6TE/yJ+OJDvnrwmKhtB\nyMa0eyt39a3bCBLT9wlx6WdYmAjBJq8K7Ty5bwaqoPlgCEXLLGEQLV8gAvv9\n7Bqx\r\n=dqD7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.40.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.40.3","@fluidframework/sequence":"^0.40.3","@fluidframework/merge-tree":"^0.40.3","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.40.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.40.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.40.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.40.3_1623785267156_0.9490445548841577","host":"s3://npm-registry-packages"}},"0.41.1":{"name":"@fluidframework/dds-interceptions","version":"0.41.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e3c6245a9d86ab2e509cfde5a075aff8d336f350","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.1.tgz","fileCount":70,"integrity":"sha512-fGid/pUaSDgLziltzeBhXuNcmMsuNdDPfEtDmDPlxfqiCPEYFORmYbYSNPhJ/SkimBq5icSca/qPQPbV1igv9w==","signatures":[{"sig":"MEQCIGABXiTcuAYVdIxAl4wXoYdF3/g2pm5xfWdYQqLOiJtgAiBy0qcvnVm7ZZJW7mNNJzuj1Ua4vABW7kvNzzeUcM8fxg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgyViqCRA9TVsSAnZWagAAYfoP/Rq1qQ/1lmR01I9gUYsJ\nAh+qnD5qIzsEsbxIvJ3xzwAa25A2l6s3LeO1tvWj8JF8ugEBqyZVREhTKdrB\nvih3Db+3LzvcUg74zR/ZLcb0OOx1OWn37QTK0fDUMF512gRyChVgsXtp7pD/\n+v1gVI2amYu9b0bVGwRCwCYFoMMg7vr+TPJiYlax+iomD+RJ6jechqsaxNN9\nn9YJzYGSjQwnBGEPra9fZ7oi5bWACXVVnjpLHrltdpMX+Sodshe/syruP/tQ\nkZMHE7vpXaBNaXJHNTwA0GmDzE3mTGhOe6/CdvjarLAQUtXbO6W8Goe+rUjK\nbzB0Y9uK/jtcyJNtEM+Zq2rUp1BCc5oUXo+YpFfhvFG4lc8l3h5tj5lo84ZZ\ni6ouf1ELo5su4ru7ONqjVWCcBNLFAe262Y21LW++q0KdZRo0zIr+IyldUKmu\nNMNYWGkNzPGhaWFMIG+XrJYjj3vTusYhWVO9+0qLUym9PCN48/xmKG0D/+w+\nJBH3+jFo0wi+3IpDNscw2UfhQSHecf9tX8ZUUI/TtgD6HkrMU/Olz5sxYeH5\nZVOeHOCDJbDr0WwkG6J/W++VUTWfvV5HuY4GWMk9e97H7klzNE/vw/Wan6GK\n85HmKJwqYRwPAfEAP0iaEQ/XGC2TNeZRA2zHlAHi6hacpWDxaNSWE+qxdMP/\nxzn6\r\n=PJ3d\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.41.1","@fluidframework/sequence":"^0.41.1","@fluidframework/merge-tree":"^0.41.1","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.41.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.41.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.41.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.1_1623808170091_0.7215874215143343","host":"s3://npm-registry-packages"}},"0.42.0-27549":{"name":"@fluidframework/dds-interceptions","version":"0.42.0-27549","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.0-27549","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bc0d47366621ac7c0be6fa1c74d09e3cd2e0a451","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.0-27549.tgz","fileCount":70,"integrity":"sha512-vEcnzmXC+ytFmsiowElsd8tJQi7cSngUES3OwbkfeYmVEurN2w5RxNRvFGGeHoO5CF3xG3ZomUwzCqpYbhhwzw==","signatures":[{"sig":"MEQCIHUhn5ddwUF1ZKgXedOEvDYKqOx2uLATNQmSJ2YNTeGnAiBwfWq1XzV5HiBlRnOtnSb29CLDnvQ1c5eAuu7LQbut6Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgyhkoCRA9TVsSAnZWagAArsgP/3+puk3dGQG/JFCQPlA2\nfVsdzRUq3dcgRv7mj1AdVj2b530ZCQbjggRhxYxIIpCd7RqMNMWer0puFSsf\nSpOuuIx0GCuPeAvjzk/umnO3wVO++pd+y7LAWIn4apIba+l3fcjp3Aqc9HRP\nuh6o5JFBJfi+ctSxXHT6usXS9t6oNbs9r1i8AuDAei8CHu0hulr63jgwACRI\n6Y8vpDBoVmVxYb+t9dfVxqtJV3SQCN/7+rPPgwdeApBlOHei1QOiK/fmDmPN\nvv1SlLjNoKuAN1iwmnSy2Jny/ULny3OEdwr8s7YYkP7idBErV8vlvb7Pku6H\nWYszeDdf0HdynaYhlqsV41OCcTLIsH6wGeHz9nIsSe+k5eDQXgsCOWqdANvu\nedXHMH82sgplctLDfKVkVX2k+1EMubSF+iaWbIrwS9sWT5cqPOIaXxbHIuSz\nbAuMqYhylnTcQaHfmun35e0NeSyHyE5Qs2s6Kv8l7eqilowh1ceYq6on4F4B\n663uLVQ8mYIlrlSXNbZzCmjFBbDAiSY1vRxhKnmNqswEXDQzkFb2Bt/0CqSH\nc1eTJ5QE2M/SMif9wEKAmK37aBrDy0AWMWoa3ZXeNu3K9tMG7q9+xx06SRSA\nXoC7DfKJ8jTJcEUeS3Y2j+8+MgLnu3QWaBlKR2up14aWgsdfM/jSyD+18/AP\nFnom\r\n=zvyY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.0-27549.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.42.0-27549","@fluidframework/sequence":"0.42.0-27549","@fluidframework/merge-tree":"0.42.0-27549","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"0.42.0-27549"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.42.0-27549","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.42.0-27549","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.0-27549_1623857447559_0.839836387925472","host":"s3://npm-registry-packages"}},"0.42.0-27644":{"name":"@fluidframework/dds-interceptions","version":"0.42.0-27644","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.0-27644","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"95f14c07252e42ccf1a2b3a564808f5872b49e41","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.0-27644.tgz","fileCount":70,"integrity":"sha512-KDdYE1EH13+/HDIYZLgk+XJR54AaGyC5+XoYVmfm6XhJ2zl8Tk5l9GSIAomPKUSbt+sm25eAKfKhmRirpgGtaw==","signatures":[{"sig":"MEQCIBSY0VZx00XYLdgTKrVpNNeJszVXbXUnco83xrcs/8faAiBXqpIP2ZZZKUhP0brBbdbkNNfMYvEIeAota8uYqvrQ/w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgynKvCRA9TVsSAnZWagAAAGIP/RNaiVe8LdXyOHhzqkiV\nTpbZEaay0rmVEhKRJntJAF1YFb4Wo3DHXAZg8TQwl/bklP36syyCqt+bjik/\nkh9yaFT2idD2EELIPJy19q6xEYDWxixqOUsOOZ/ct79hTTqjz6BL/lqZV3Eq\ntcE5YQrOhwzliunAXVwABlrWcOaxTtHeeD/AyppyoB3ofKBsIgnM+CyAzLTw\nJ0IK8M69RlKqHBRXcG9OSyE97bPqeIKoiOLhNei6b83Tuw8wqEx6P2lni5/m\ngJ7FtXFl3AO+JveT3qTKEwpeb/IRMGKyBmL0LW2+Mjju1crVI+AzMN4K530L\nS14t8jEK/k856FphOh8i1Yc98kglZDjNxn28bleDwBTGSZz+tvAGJZjEGfQ5\ngI9/MU8d7nzW3g5058Z7Y1dLwKCpoLOFH9b4C1szaNrWsZX8Jp0nQpyFcSGi\nxtX09m9Q+qJ0gDJJdVQ/3d/T4ovSNG4EPi6zJFk5fZBYAHuotr5ox2gk4XWf\nl9RGrm4b4a4976MfphLaKGKmKEALg1Xb2+UhRlYAXsoCbWEtTUgB5IWJ4N/v\nMrlQgHglNxsfFSnk4c71ZvSdlNLtEiwgb1avbOc5rXRJq0WX4hBgC+ni+x69\nv+1v6hc/jGoh/vJmXnnA7sfKJm+8mYUZSX0OxqbFSEuwM1VEkzK5hLp9UE+h\nIzer\r\n=+Zkn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.0-27644.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.42.0-27644","@fluidframework/sequence":"0.42.0-27644","@fluidframework/merge-tree":"0.42.0-27644","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"0.42.0-27644"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.42.0-27644","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.42.0-27644","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.0-27644_1623880366978_0.5144087269050528","host":"s3://npm-registry-packages"}},"0.42.0-27677":{"name":"@fluidframework/dds-interceptions","version":"0.42.0-27677","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.0-27677","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"01b9391c9d714f435419e58b0d272090d76e634b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.0-27677.tgz","fileCount":70,"integrity":"sha512-X7p5/qPQqo5ztQpH1tUWGs130/uXr2PTGR3h3Io5RmMq6Vq9KjDng5hGieLLgKbO80ZkdW2OE+cxFfRiFqYnYQ==","signatures":[{"sig":"MEYCIQDPeGuMM36v33gScC6P93gzk2iHTraUdlYPZkhCudJ6gAIhAP2kvIKOxKkfaA2KdszK3Mo4R3vnn9A+kQN+GiLTHooX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgy2O2CRA9TVsSAnZWagAA+okP/3aGrSpTTpCoRddjsjWl\n5GSkk3WecnuaHdXWH2xmo0LT26SpGjnW1/KjyyNn4wGWZAmaQrvm0mNODsJv\nXHccCc9YFvNUaFe6TBtYntm0Cy7JqKi57Y3QXVOH7b/x0cy9TVuxnK447NQv\nU9PiDns74k2xJ71Ivz0xK2cnSGbrGBVVIXrC8T2VYshmMp2oTNGsJT23nY5D\nevPShdMXPp72OtZHXahb0Cr2nWGjtQRLwfud/+l7+fzmWIOIkddFAWVRt8ug\np9PNSH60juMlqvp3KoOcykRfMGisg4FaL91EJD2E8k8orLlfVtTm8rYfy/w3\nFTH/2WBXgXnStyVxnCqBdLpW2oM5/++ghIpS+PM1K7qxXP2qTKTPAHzbMvzP\njAovWeoPy2ncXegXqXeWMsu9C0ndpI/PosDCwiPKezOj9kw6+5egjgPgXvWV\n4YY9XirhctlVWuMmVVLl8RzIKctxK/SRZo5xOY3nTdlEt5TjtFep8xtLWfRP\nLP0kom7SD9thr5dce7TBFaPJd+Ewcs0U2OjFhxtM2VK+z8rMg/QcDmR+aaGD\nJ3mcjz+50ygerU/sZu7U5pPGk0tjoTplcoqAYoNxKbZ3/15WglKmqMv0MUJd\n8OeHTERtCtGCSu9CN0as/lGp0CHbx5Y0B0Tl/kOJBVzU5/JQ4L9a3ERbetuN\nrv4x\r\n=Pd0t\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.0-27677.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.42.0-27677","@fluidframework/sequence":"0.42.0-27677","@fluidframework/merge-tree":"0.42.0-27677","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"0.42.0-27677"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.42.0-27677","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.42.0-27677","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.0-27677_1623942069592_0.074655462595826","host":"s3://npm-registry-packages"}},"0.42.0-27683":{"name":"@fluidframework/dds-interceptions","version":"0.42.0-27683","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.0-27683","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1f18be4c7e8f2895cc3390b8e38b329d90d483bd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.0-27683.tgz","fileCount":70,"integrity":"sha512-V/VhgJb47bGDlECgZeL2KpKUEoSQ0yM9/FT728AzSYOhWKvISiRmUlB3Z9qizg5YudyJt/nemGMacT9X/JcmhQ==","signatures":[{"sig":"MEQCIAIEbp1CD+NyaZykj9lWwo/tlQVvttcd/Y8v2wsJKcgqAiA5197zSibD8HT1mfiaOJPe0f+eP3JCLEgIxwlU8iEHhg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgy3iYCRA9TVsSAnZWagAAT2QQAInwDBtSw/7OmtnbrIq0\nmEJx7dNhD9DD/uJqqYzQU0hZ4vFQGVZEFU2ufkZHDMvmEjmwn/uy92EOol7E\ndO40tc5RAbcuCaxDthfaZHBeD+7fpaoxGmfJld0E3r6bxtUWwDAGBbdg8OoR\nN1vtXum9XiV9WqAWUcjstC60NCCf85hwGKYSMQyejaodQRivpe0RPgdD2rl+\n89Mkqurh51DvZKXcQ+yXSM5EhYkDKVUdL/BD/yezCZJm4yvfC/o0LB/szCk8\nEdhWkkG5dQG4+fAJF/M3R++e0k3qdfnclYTCLbteXd0bd8TIxeMXMOagFVcm\n+8bE1Nas9rPw/YbnKzqdSx2mI0pdfP8wfTY+5lTmOBoTDBmP14AdK0wNKwWC\nxVf7MGp9wjyBOPjxhZ5fOmhWGo5C/XBI8AgzRGzLP56p7ny1Eogl1cMMtgwu\n2lyknMfgGsnTKPeJCmB5i//tQxWnz47HcVT+sJ8YfVsAhAhGymrqNb/tfh9D\nTM4ZLi42opmxOAnnBa2Ab1rnunDY4buitfbOFUos+TuOF4sjEpr5YaooR+zq\nirHV0nBhULKqOBK/Zu/Recp8Nefd4hV2UeBHnZx/UcexC0PE0e4gRi++woED\nHZaUkxnN+NlGOCWsbzbLo2B7WFiSGbhvbEz7WGdSUDbYRCYtSpw61LdE76a5\nFhPf\r\n=1z8u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.0-27683.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.42.0-27683","@fluidframework/sequence":"0.42.0-27683","@fluidframework/merge-tree":"0.42.0-27683","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"0.42.0-27683"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.42.0-27683","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.42.0-27683","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.0-27683_1623947416417_0.4026175568322776","host":"s3://npm-registry-packages"}},"0.41.2":{"name":"@fluidframework/dds-interceptions","version":"0.41.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d4d7fa2f10b7fedcea057a59e98045c3037934b5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.2.tgz","fileCount":70,"integrity":"sha512-VjSoVWfgY4+8cE2TlFl1CPZREbLHcYghC4rCJrPAa0WQaR1SYsbhQBwBRIksAUi/UPaG60BEylbHS/3q5OmgRw==","signatures":[{"sig":"MEUCIDGKt2ivLgJU17hRUgOeKcvq5K8lYNb+nHRCKnflZ9BeAiEAtD7GYGT74qTeu3JAIBY4n2wL949uoDn2Ibz3So7bAWA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg0TDFCRA9TVsSAnZWagAATMQP/jdNCG0HtoDXZl/twSzx\nb5Y6lZdnc4SfbsHUef4CfNcg48HRaXiuQ8gwUpSRoQkDQXf6w3CGZVP88IGp\nC7sOepVgtE98hYv7WJIe+qPn66JU72jB4K4YLWYc/3gYK9wiiRCsGuONYZjg\nI+q33bCoUO4x6XGcl9tMwyeaSfEgkfqUODDhmUYvIat6Gjz2S7GOCpgshFco\nJAP/lFp/jzzjwWum3mw0UY2aNc8h8k7jpszMySEiv7QUrC6B1wXbKtUwkyNm\ngOCVh2fxrTyrxtW05i6Io+zWM0aI8CyEYgvMLstW4F2hszis4k3G9e5Q8iiv\nfmnXZo/EPIXOvfJf+yatcW7pTispRC1bBDSUjSXU8fJBvzPP4xGB1de+/z9w\nhR9o5hFhIIY9tKbPbrFTCGU6xJ/TgkMAS1GBw1wyHH1jn+TIGftHtsunbYnA\nhIwD6BF9eNzPFRCeo5xa5q+YZpF2Gsp2pcQPhU1JeLlr8jPuCbLOO3aAOrvq\nG0PymTLZ81zQW6MMyGxLjy1WdBzboqzhsNMjkruNGKJ57erVRRpMAnpDEu0D\nohyTKba6opyVBkJX2KbP2i+aqhyLThsfSQUlMaf4YPEFS7ZUfI48s9/OrPJB\nRHiqCn78GiypUAD/xagpcVnO9KkCxJ9X0rcw8Q4eRpBILgYbNJuqbjDdDWRh\nGZ2j\r\n=w2Kn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.41.2","@fluidframework/sequence":"^0.41.2","@fluidframework/merge-tree":"^0.41.2","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.41.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.41.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.41.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.2_1624322245439_0.9964988541551358","host":"s3://npm-registry-packages"}},"0.41.3":{"name":"@fluidframework/dds-interceptions","version":"0.41.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4dfe5890acab8343d9742bcc59d95feb59c4f3bb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.3.tgz","fileCount":70,"integrity":"sha512-wldVGf5lfmiPeGW4yPym15I6HBdCRLOeh9g3drBHdsl40QGRpMyS/1oLjp9wYNsnv8Tx1N13xY5EMkten4BdBg==","signatures":[{"sig":"MEUCIQD+K7ojr21I9ICDUaVSxVqXIjPtBv2guK6dh25U5FY/rQIgEEXfwbAbnctRNQs7jCsx0Y2px0wDzJU0S0dgFN/pO2E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg0m0aCRA9TVsSAnZWagAAe3kP/R/jrm0AyoNLxpumeflx\nc8y4NOG7jCHmFglwRyxNBIOY02HnEJ4jZbmLxdJPPpl4ukzHB9FWtPZjrjOm\n7QxnDe8pNfeNmlguwxTM4LzzPCDO3vqSXkztUwt+Q9pCUORN4mq3wd+Tm046\nzKvZ0bwDsq2TRSwMI8F5H8FKtRfxDr2DAkTxcd3klK+OIC0yBIk6CFyPhToD\nkfjILABbMH83TjzAeWS17oEXnqjIMjnh9kfgx+3LDD/fwVW4acIFiJlbbXMO\ng4d+xM5orzyXP4FxpZHf84QV5evDTTC7Limgj8YEFXKn0nCr/KvMAhhusZXU\noIvwX9/GEQzxgUGcLBIsAXq4GcH780Ioa6aQtLDtjxiRQ9zZjFmTqhorKNCK\nMVkKGcGU2H8L+qW8R42uMQgI6cTGWedJYdzQf1Dx8qH7FOAxJWy/SD1T54S5\np1d40ypOgieNxkD77MqvHGcaWUUm3UuKpzO9ImDdk7ftgwsmaFAfdJq+o5WB\ndKdOmkDJr3QuXkY+bqrFuTrppVm/p2a/4s9tPkWmiHeKUS6wSSPbxEAQELPJ\nMdlriL9niJgb3WsOV7EPQMLReySRfebdq8t2N15lbemBbTZFacga/aXSgYD6\nkrrk6bcAD6KVqnUy6RmWGFcNx+9OEFH8OO804Sbsgnfh68riCo99n9PMxMh4\nzdPp\r\n=jhAT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.41.3","@fluidframework/sequence":"^0.41.3","@fluidframework/merge-tree":"^0.41.3","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.41.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.41.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.41.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.3_1624403225923_0.09727568614737114","host":"s3://npm-registry-packages"}},"0.41.4":{"name":"@fluidframework/dds-interceptions","version":"0.41.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.41.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b7c6e18ef827fbba4a5742154331ecfbf420428f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.41.4.tgz","fileCount":70,"integrity":"sha512-g+TdgnHkIkZq9IGpdHkgIwb59KY/LepaUqme/+UxyVFvCBq7unKOS/U+0gbsi5UiFxiI5PYwRstXgNB/sgc7yg==","signatures":[{"sig":"MEYCIQCZMGzkKhrZrIUnPSiP9olqhGPZPXQkDTJ1iKVS3FQpgQIhAKB9FDInZAHA2fYV7+IyHaepO1HjItY9cCII2XT3zEfh","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg07jICRA9TVsSAnZWagAAWXgP/iMJwhR8Ccydley9DeMW\n7OSyIkZ5BckuORSJAomutgaO9jdQ2NA9M348H3leChw/2VgK79pCVCm3dHER\nNh31+QRDf909o0C5loDAhAPH7GD4Eeiwsxn8V2E9dY49EsOtPV+BSUjYMtbJ\n1jEwj3iiU3AEC+Kn8j1KCuEeVZ3GOD69js5YckVvl7OFa1CcwA0q9aiwFr5B\nENCM7aw9kpftQnbwCrCzEsuAYmW5+JlLUpKPs82ug9TzJRiut6KjJ4SqIAnL\nkPglK1qbuHWcqRbV4VjKCu7amEcARuXY+OpXruI4kUSjmsZaP7NnxjUzmHX0\nQ50X+XsPGkDsuZWjys+rdEVjwfj98EA+1wfipV6E7nW3a/3OGa2CGvXShsxb\n00Jyv+qtfs0fkUL/uGF/d0bAJeo1aK3KDdF51zl0wI49oB9GXCXpFO8MV5Sl\nGXINmc+c7Cf1VKty1nvcuGd3A/AvstL88D5zZHxSZ4uawR/2jRU+khcfWTSG\nOBo0goASzfQtEUGnIXpTQ2+6ruriZD2pNAv8jkBN32McNkx9Vj6klICMvnlf\no+fBdLScqIPrZRlbQLml63f+K1no3/e5mmTOSjcjEamQkCQW2gV4/qjjqHWb\nKoGM1W1uHStrfoQ/ej63UzOBvliOkucnA7kI9igAb/o8grMH7Q2LL08Fjcvi\nKKXR\r\n=WWMy\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.41.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.41.4","@fluidframework/sequence":"^0.41.4","@fluidframework/merge-tree":"^0.41.4","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.41.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.41.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.41.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.41.4_1624488136262_0.7377600212787827","host":"s3://npm-registry-packages"}},"0.42.0-28410":{"name":"@fluidframework/dds-interceptions","version":"0.42.0-28410","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.0-28410","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"688e00b122edd7eb111243102f0f1329057c6d4e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.0-28410.tgz","fileCount":70,"integrity":"sha512-WS35KkihGYsgdKyvEAzAiPbJM2VH2SrzQbdqcHAbJBPM94cCzltjAQY6dhJDZpzv1bPZRw638kLVKx9ulmtI8w==","signatures":[{"sig":"MEQCIFLej4uhblRT1TPzqZnzJBEwBt7LVzZeKY9YcUTzaNXcAiA8cGFkivUig06SCTkcBmCC7CP8itYWuGeRStQFGEmF3A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg1kJ7CRA9TVsSAnZWagAAIVAP/1OWoBF+MUbQ87VJrbmz\nwtEKLup//KN74/B6sUbSfYl2DMaXUNtcxN62mgOQujCqeQekKfgv8zTmAdSy\nUajWPeCn9ulSWa488F2C/RUL3r23Fb8UcGRLdm2T8tCtc47KA72OVmq7Um5U\nUlDC/TMqSgcGXiQeI1DylaoFvJEwjMDP929tuYrdmFaMMpVDEAPsaJq+qyki\nlEI4jphi7ZKHdvoxtL8WR1TJGOA6vpFcW2XPy0vrj+MCKj+f2T19LRB4vp7I\nsyv/OfoD9FOZ+CpvnKDEZeLsa6TAVw8tZ8Oi63qrId0pn5V2m5K8G8WEMUWl\nyVp3ilOzLtEi4GcBgNc7S5A+QctfNMh1e5L6naVj5Jk8GvPNxknIgUef4yWg\nAZkYdupvljSjppc2q3hpkMg9oqOXGj7Mb3D+ojXmLfEgUMoRhOzt5rQJE927\ntZFkQid4Zh6ZiK3HfhX3oRH9XH1g2KW4MB+tTAP75n930wbSin5ZTWTWkIG8\nZh4H14bSdbl49Y3Nz8zcZ2G2vE3iAxJmkleb0W4k358ZDXFeDKNmkp2WRG+t\n3tTD3hZ9s9LitHpbZGWrCviCjawscQir0G1hNKx4LIgn4hUNOcZUTxqvDdzB\nSpfcD9iK5ecYpbQYQcOkfuw1npnnsdwL8hNYdioT5zqsnqHsos3tVCDDVKGv\nZ4Sy\r\n=+Klw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.0-28410.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"0.42.0-28410","@fluidframework/sequence":"0.42.0-28410","@fluidframework/merge-tree":"0.42.0-28410","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"0.42.0-28410"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.42.0-28410","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.42.0-28410","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.0-28410_1624654458582_0.9133940768247597","host":"s3://npm-registry-packages"}},"0.42.0":{"name":"@fluidframework/dds-interceptions","version":"0.42.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ef0723c699d41455b0775f61a8911aa958cabf95","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.0.tgz","fileCount":70,"integrity":"sha512-4lW61BIyWXSVEE73ApfmgaJJrqfxxogMOWRfW1lpX+Jn0yjn0gElbHfAhQ4zVDi5yELVFK+FX1VonhKubbKnMA==","signatures":[{"sig":"MEYCIQDBXanIIsgh199gfP8kvjbst2Qmzfx/zzKwJ6T9wArsDwIhAKP4F933FW0FnBw7vfCqzaULaU4rPO+L1ylM1hDe7rIi","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg1ojkCRA9TVsSAnZWagAAyvsQAJB6IiyNX4HHzdb0x9zt\n+UPlPpib9bI0JlB/47NrcK72y8RWNYlujEfDDctsfysxxij5rdywLrIiZtae\nZMw4I2Go6xkWtUxqxTND0pfZZ6VrlYZGveb4Bu9FpoytCDkWFkcWl/TAqGOK\n144Jkq55bauFxvzRhNR6rIC8uBC0x4LXXiKMh5QsnKuAtes+qthxg5wp4Mna\nNAjjIg4MAeG1uxxIF+W4QCFO+MNVvdLrN3hW/7RBZ3gkxXkWtVaWt8dzAHd8\nv6Z+0bSYUWr17EIihIH3yyEqZO4eenZ3S2yCefhJHN5ac8LpAmqXjKT6DXRN\n9aNjqSAN1CUfy8QE7SqaqIxXo2uKab1vyakiYBJWNAxOPjVlbkDMoChXl3Gf\n0TXi6G4eMoQP7q3n/p/dpaW87eqPfMgo8LHDBixViBNhLRw0HfYr/KaPsG1H\n5Wm6yNF1+CMvxyflD8CZ9GyiIDMmg0WTXLc6scBC2GIwYqwv+HskdHuF0NnD\nUijN3jwufmg4K+mzQw13GpSbjM2758+NsQHxfivxFR447sCXtBwBqFVOLVEF\ntyAvrIVqQ62cp1TX4u6csavtBBnNSavIxAKn1hQpc+KjQVKaTr7aMoLn98gf\nYnNCwaNUU6wXHSjk7NjijkXhESz7Ms9ueLa/c8FBxwSPIS+8GB2tqDQttQuO\nrZKk\r\n=yzn9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.12","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.1","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.42.0","@fluidframework/sequence":"^0.42.0","@fluidframework/merge-tree":"^0.42.0","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.42.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.42.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.42.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.0_1624672484038_0.8181843173149397","host":"s3://npm-registry-packages"}},"0.39.5":{"name":"@fluidframework/dds-interceptions","version":"0.39.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5e1334e669f5bb89ec616d951deb8fcceaa94926","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.5.tgz","fileCount":70,"integrity":"sha512-7a40sa7a3HBbzLnNDuPTQHZuulLZBPZ0FNHmYv/+cPENo25n0ogBRsOkSAOirs/N9Xlp1GEY5CuBnAfgqQcN8A==","signatures":[{"sig":"MEUCIQCuFFvbRS+GK5ypEOVBaelN/gmHjajpBYS8WzWswCGDmQIgc15/TfEkBzq+09W2A0G/Y5UIgmRyJUaCSx1U6mxb1gU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg5iOBCRA9TVsSAnZWagAAvjUQAJZ/eTvnwAX6ILq66tAD\nmwXt/rDDmONGdYXePM6AT6lLiRRtMaIYFAZMvO0gnxGrCxsravhr602flqwQ\nYFDDgoyENG9tU5fNhzEYJPDj0rLt/BCKpppWNZP4y3G/JHuPTDds7UsZu//H\ny9VKdJNZh3tpVNMVqVvnYGIfeAYXghsmeQxqPHaLvOP1gYDugnuncO3FvDR5\ncZ2vNcYlMi3XxI9k8iVo3FKHaZEjgccSCNjsTz3eSknQUEBVXOJuyHkEQDk1\nY+vCJPt01BWuP2dCvK4O9cvv8ysYx222dff//pnE9TRH6XeKX6sLkJeqzhZe\nm8K/BEn6821gh6gOO7qmKRp8AFs6g+QKR5E9XqHTv2fZJy71EJBxQXywXxmp\nwdEaWqoaxs44TNFKVvv3nNF+Sp+5zRqZOd/oJq3hvYszNHimk2TSqy3MD7Eu\nsSd7G7a9cHnfNtZExLZkfZv8O/coQ9jJROERxImzYvXron4p66qUEf0delcv\nk6bXJDi+av/AA6rYOHdLETRR5U430Oq9v0VuvY6g06tb+8wrofLeGqDVsDEf\nezeWjpQARebreUaDdp2vlYhKs8DRtwJlVHJv2NlVdlEECHdt/TFDX01JCzds\nT0jXjJa7EchL5XL9eT7dHCzrwjJcULKRYky0fLyFoVKJl1CoFWZ2LyCGcx/J\n64j5\r\n=8aFs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.5","@fluidframework/sequence":"^0.39.5","@fluidframework/merge-tree":"^0.39.5","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.5","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.5","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.5_1625695105211_0.024811466667328252","host":"s3://npm-registry-packages"}},"0.42.1":{"name":"@fluidframework/dds-interceptions","version":"0.42.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"613e88be8679e5e36d01a8a3788df95a450f7d7b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.1.tgz","fileCount":70,"integrity":"sha512-TfuMHIkH5JW9roORzGi1e0PSF4gdZXJwCP9Iurw03IjYFIUkyhUhbZynXyC6kOO6UU127fiQzGPcMl7H5xNQcg==","signatures":[{"sig":"MEUCIQCmi4/Dl+1s9TESrLoN1en4bsuFyNP4SA8UH+rvhz6dFQIgMAkbhzzvzJbZ0uGqmslz0+fniCRja4LbI6tEqAX9wbo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg5ygXCRA9TVsSAnZWagAAU2kP/iv1HBMzRHXTS8zotGUC\nkQGG8wCrAk6iXUkDhzdClw7V2VsEkoV9NqtjE+Jxf0HA11DnAmeKT5B880CY\nxjC5TbHhZlLEji5oUzkHUKYp0oD23Q9nhqDo0/04Dkzqq1uPJC182cvxb64k\nPpAQBY1gMRagSI85M4S1Bvi/GONgYhtBQRMmjBIilO96RsiaYx3NgUKrkpuZ\nkTK1rCXFVM6i9dxX12WvvD27BGScd2dOmHcUa95AfHU/uufylIYxMQyVgzCy\n2eJG0ISfC9SLdPaOaCV/MIloyoHUYBplvZ5/4uV8R5bYGbNz8xpFRDFWEb1/\nLiCyTr69lYvNlYCc17MKU2jrAAQfEck3nSDndwYdJhsbL6kPTm652XIZEeX2\nrdGKZdTJy6e+ytTFH+ZRgwNMJ24A218C8ULF8AhrHGza6iq+62HCB2w+toml\nkfCTeGgfq6/PSmT/X33fN+fnZ04vkV6eM99bhMoy4PPdPi75djk/dVjo86Ek\nKFzJAVamGW7US7VncpGUZba9tUWOUkKC6r79PRs1Lk7cG9b7dZMaUCV7kjZt\nYRU+OIZsI7T4k9WCz4xT2YOobNAjwz7iXdrZ+ZZH6Ch6SXsyhkpGGDYA7arM\nlIybiy8kZ/WS4fUpkd559LjSYu718zx0pl9wSuCIdWeaQifSg/vgmgVMyWcJ\nlaoi\r\n=X9Ce\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.42.1","@fluidframework/sequence":"^0.42.1","@fluidframework/merge-tree":"^0.42.1","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.42.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.42.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.42.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.1_1625761815488_0.7721165864440551","host":"s3://npm-registry-packages"}},"0.39.6":{"name":"@fluidframework/dds-interceptions","version":"0.39.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.6","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"dbf83b8e97a5531b83b2b10f4c11eb19d3315511","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.6.tgz","fileCount":70,"integrity":"sha512-AYqxub8IZ2e69XcFf/vqu5XY6QtfOYCRmxrKS/VO/v6zeawDshSs/U+hzQLcr1qvnOgZUibHKr+tY7+zghdXyw==","signatures":[{"sig":"MEYCIQDqbEzULetY74IoHBrs7qB1oAcRQphUE1EdpM4cHGfz2AIhAMuBTv1lcVubgXKqDPAPGGXTyr8LQfg5DkXzmu/tDGT3","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg52UuCRA9TVsSAnZWagAACPkP/06eODKQwvUP7bgIvCWR\nO3V02Ia7zOGFJy4NUD/x2CxgbDs/TBEmF1DcmCExwBviy+plYtrK7aMUNdD3\n7G4jQbfZS2IrWp06DkyBmcLSqQkA/pXOgIFAH5pzUDZYjeWde3GAH7bCe8/j\nYhHD5mZ6AtEzmeKCjKdAWdY6/DXxj5tQnAw/+HIbNDSYnt082NTmTWGotIbC\na42L+j68hhU/2vS8O65APIOKpRwFXjziYA4hd19vYTvwHBIbUzuxYrHo2Grt\npm14b4KsYcUlkM6JHOEE1ZO8RtRFcd9pzdThz9nKRMZyTB7467gsNao6Xg95\n6L0ddnDh7mdcTzp9L40PeB2lGysYmvGm/yTDCGLEZoTVH9hvSfWixKE2vLir\nkkzLu9eZcZKjtoovv2nqD0zzmfVDEstjY6XMC9fKzOfvf1gz/W8miYm5ciuS\nO66ljJPHdZMqKhBN3r9xfoDOHf9xoTgvXlk8ZhM1Mv2b3i34EYguWkXYvJy9\n0nAqMApiH4pF+HNh9hH9bVsIQcv46jeVCiI5mJNd3fXTLKufs1Dksvsn6gEg\nFsAj9A3aU0GJkZaKU4MmcL/imCbmJ5lmZ8g2oqQDyMY6XMrR3lUInv115e3r\nfk082alDhGW0Dt0bF466fMPCsVZODReHlg6jVIacr3Zll/9n1ZoeMkUomlh5\n7Sk7\r\n=Jugj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.6","@fluidframework/sequence":"^0.39.6","@fluidframework/merge-tree":"^0.39.6","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.6","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.6","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.6_1625777451974_0.3575506331731986","host":"s3://npm-registry-packages"}},"0.42.2":{"name":"@fluidframework/dds-interceptions","version":"0.42.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"21aaf5ab58ba2e6d0cd435e1d83a000f4bc92ee9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.2.tgz","fileCount":70,"integrity":"sha512-BVaBXAIZNXyQp9I1yoqRjW0OMByaDHMXvdkMcm3lSs1VRCui/NRffI3DMAUWSzqWS5gdOefd4k/ut6MAMscDBQ==","signatures":[{"sig":"MEUCIQDFaQ29kqC4vz22zmMGOqD0T3iPFDKA9xI69C0fb6+OMwIgQm7ESVSmD68UWfg8Wd5g/ulvYPMnLTcfYpUn0o2snVQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg54JECRA9TVsSAnZWagAAk6gP+gJn2XWCx9NWWhYZHmNh\nqmuJg6h6feMFSJpIg8OmXW0lSj7PcKzDBmXs5hAQmXAqeTEM4b3miq7bPcdz\n4hZR9HmFS7pQny5xPKhrZO2aqmadgvG+1afcJWEwl0ksWClKcTitdu5D3gmH\nZk6eEoSReAfhgqaPlMDiHaSZWiEzfLnus6pfw5/dO/VjkyAFzEY4JSRhvSdX\nnChh83Vcm2z+83cCuJUwldH/sySylvFU2Nj+iuJmnS1w42xTmzQ6TWI5Uum6\nIEgid2A6LxEn1ISO5DiPTe2g5b2vuK2+BZg5Cv2HvNCAOFTudeRA2Iwim/Id\nXw+4LLCdATDzRHf5OblCpR6G43RFtsnBb3spB/gyLa4cehVr/TKU/xr1QW26\nnttCkPV0U9eFRPyUYKlykzLwlpWCGW/0bLSXLGk/sHZJBKQHbm5Pf4/ekQiP\n2ahWsUMLT2ktLQSipT8BZRY0Z93BC2psrq5RvPHJpnhhhPI9dDhYQwfm6mi7\nLzMKiBsGgigbDJi39IjyvV9q9s2i9cldZXecinVoCOOUWkNWCEVoyfmmqBoJ\nTB2iFnEd1HBuj5PlioFZbOhTuyF1y6taWi/gcW3io9H71A6lJqSnGxFR5/TP\nAZaOMj911Wx0pwk6kjZhj2wZY7+OumhQvLublO6urARQ07k7fRn0gKTHJZSf\nt+zg\r\n=Kgoz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.42.2","@fluidframework/sequence":"^0.42.2","@fluidframework/merge-tree":"^0.42.2","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.42.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.42.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.42.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.2_1625784899678_0.2610724556284063","host":"s3://npm-registry-packages"}},"0.43.0":{"name":"@fluidframework/dds-interceptions","version":"0.43.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.43.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2d64c4398504d7b490eb04ed7717acb87202d51d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.43.0.tgz","fileCount":70,"integrity":"sha512-/BJsab6j+ytRezB/C7HcQoq2eyTYJnLpOlG/S4n2VuxEmGjmRay7lG1Yh8QSIQCmR+O+5mppoM6vEh12bxzziw==","signatures":[{"sig":"MEYCIQDebkN6ROaiMGsNIhecdNFCzxb1uQOvbyuO84OE8yvocwIhAM2tYSratmPwWPgfoIMcY5GlBe6Fftl5ttr4F/r7uIKp","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg6KkACRA9TVsSAnZWagAAJqYP/RI082vDahfWOu2UkdEz\nw52llwMfwocL0eAmYJmXNumby2cPuCQdb8J5Bi7qv7ue4ZgvQ0sWd7tqPwPK\nBA641EQCusMiHbamTRjT2Gy0pnZUBMHDPY3K2uv9SXwBQLdWGXFSvIZy7+NZ\neTxyfPW+eEqVZTEmZQpILnOHjmv4BrOnNzyRpEqLxpMkWI6irPr2fjV7FeB/\naekshbp8PFkaqQ4kJdNrEk529bNxOG2zvMKnmFkQYl7trO58w/aShQX99nBS\nLNuWeraLn6/x1JO4h8BgRSMDfjaZYVnAyHLqFGnGemf168msNqhmTt60Vbbc\nUBiDi4argGAxVxCe5LIdgvGhJxuldmdXvf7Oojqhk5npu420zOKY9z9gUUe6\nN1jep+WtCb40fh7FvpnolWwuwxX+k8ds2KZV/0cE5FZK6KB3x1D0uXPLyCBA\nj7p5q8GWDDIk1WawxEm6Zg7m1rRFvz3r8SH3cKh7alXzPrK3SPFhF/GDciPA\nTU5ITbvfRJ0bRToHOzl6bUzuRKcGDAVu9JfmsT5znNEH05EUsR5350L4030/\nGejW0AyYPdo9kFVvexCeSx3pd68pprj5MyYtbyHw+qnb/SCh/ArWpCMKLyaI\nhPR8O5viAPhYuDY6xzcjzQkL06Yr1vsvKi4esfctRQlwjwBKIsclgIG6GaYO\nYEQI\r\n=jZRN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.43.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"@fluidframework/map":"^0.43.0","@fluidframework/sequence":"^0.43.0","@fluidframework/merge-tree":"^0.43.0","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.43.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.43.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.43.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.43.0_1625860351941_0.042829788280832615","host":"s3://npm-registry-packages"}},"0.42.3":{"name":"@fluidframework/dds-interceptions","version":"0.42.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e78b3099fcb47a92479ddf16217ae1bd48fd72bb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.3.tgz","fileCount":70,"integrity":"sha512-atvXOcD67tErq3RbJlrsI8EayuM6qdlC50m+yYo7yPLLxoprn02d+m/koPx99EL6iLzKitEyts+0X6uc9yjFyA==","signatures":[{"sig":"MEUCIQC/aOGlo7jRO7vhar6OncFtG/5di3C7AYScM8k+RLFjgwIgUPXk+I6dni9rSlnY4jfz1rZZcWheFeWCwB4vzvAeGVo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg6LhZCRA9TVsSAnZWagAAYoMQAJVTabIWvawn2anRzAse\nleOLjUivFc27sIOZsPko4U8NKG7qyDPNDb0GLhqQTOAPgD1ps50J5uuL/DIU\n+SM7IJLFpASSytMR3UxGR7+oQdpe1+Q7Ryp5d3Y6Jeh1x9mnr/jA/H723K90\nHJ5dljdL59aHP2vLGb8avWv4JFsp32Rq1v1mFbZvSogGarrKTwivRB5VAVl4\nGxh5uMG/BmXD5HT9062Kf7PvoNHT88NhrO5Jnmog2jhvVEkT5AgJL31RGMHz\nntYt5ildbLK5fvN+RodJjw8rslnVHIz3hyUcfSXcKlrwg5CTOKmFiAMhseB9\n/EOPo2HNBPREbgDYeWyEcgVmmGT6Y7RjjrX2zrIXWY4La/njEHizMm50uXWu\nfectAoZG3MbeSk+A7j9VXjzSZbXhwORfnNzJcs8V2BYwDNo3JFCxZ/qPZ9bE\nwIrzDGR6H1S5Md6umTkNUjl9seXaku0ObddfQ1zsxr8C+GnG1H6BVwrQtEDU\njcIlywlednEij+crkrtQNlt8aZRAJEAwZsDqhP8rMzH2WDrK9iL3aMjSMUMa\n2P4IDmjylmlTXvkVNTd9MPNylppQIxCoxj/8N4fZGbn56OTjt0cE7Uvc8c6U\nutwOI7NiyWccOGg5T2JMu04xXkNMRMza9Vd3+fwrPe38DY5oJ0y/bauFgyAo\n9Dk9\r\n=lJ+2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.42.3","@fluidframework/sequence":"^0.42.3","@fluidframework/merge-tree":"^0.42.3","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.42.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.42.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.42.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.3_1625864281160_0.6945315862986119","host":"s3://npm-registry-packages"}},"0.43.1":{"name":"@fluidframework/dds-interceptions","version":"0.43.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.43.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c061e1d9c2483b01959d524f3f906dc02df9ff12","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.43.1.tgz","fileCount":70,"integrity":"sha512-qAio1fE20bLdZs8T9PMdp/zFaMmd23cHzetn7K5L57sxaDCnXPoS4EA928S7X+U1JtFPl/kw/YQl24mY7ig29Q==","signatures":[{"sig":"MEUCIQCpupjleJ/aPNDtfO452pYTpm8NU0RDEapmJOLmaMF+UAIgJTkKOy6XHfxQn0iOacXQ27/pfrGOPYk9KMjcIPzGHXQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg9gdYCRA9TVsSAnZWagAAsrkP/ih7QTwbRgdt2Mf8fj51\nBZtrrRyPb+Fj6amhak9cXPDyJO/0W/dxyiTugLuVUF5Klj1HyPK9sD5YIR2Y\n+7xm7qHViLWunxRysgMgZ4UfHBAZowyNWOBe5kiTcgrngW89wQpTeyd58vZ7\nzE1Hl5LVB0CAOSERnKC90BJ6cYQXtTy1NgKrC43ZegwnirlY7Mx4ZRDZr++D\nuf5toy2AW4S/Jisu2ch078eWsWXuKf6wkt/43BYas6sIVn9sAZdABIIKSd1Y\nAWkGcj76vzAStlUGEv82wxGI62p8p6cRcyPIHL5rC4cvZWs+JBAIEi0ZIcH6\nNHqvV98UUQLB6dF6vYBE6wfhFZbDXnPLsbJ5OjdyR5SEIKsMS/eLg5mlMg97\ne873rvAkhUui9fjef6I+v31EsUPG19WQJuj5xNpKe5zkmUmaQwUsYbNosptJ\nr2YwY3C4PhScRVu1SQC9rW1zKojtmG6ct8qUnSpYPjbrAhQzYM420UBlPisF\nE61KrG5WZlIUFaV4JTrZipZjeESuuMF834ehZQj+omi7uGgFTWIXdm3itVk+\nYwC4iavmrc+KsDn9mpMNRiy4mskOwnbVoXnMjq0yp1cXqJOmAfn+qY8WBb2V\nELZVbOzdTYs4pqki9vrDIryhsDdWAugCfSTVr0eBdngt3ABtCElEiRoZWiZb\nUMwL\r\n=VCJI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.43.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"@fluidframework/map":"^0.43.1","@fluidframework/sequence":"^0.43.1","@fluidframework/merge-tree":"^0.43.1","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.43.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.43.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.43.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.43.1_1626736471907_0.252561119929436","host":"s3://npm-registry-packages"}},"0.42.4":{"name":"@fluidframework/dds-interceptions","version":"0.42.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.42.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1ee3e3e276e5ee01c7a12b37844843729ceef108","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.42.4.tgz","fileCount":70,"integrity":"sha512-PClZtwYTCQTv6mtbyA1cUWlAIZqJhCeEwhLHvy3WrAN1Rn2QO1jIVUxW780KT6gYFTwlmK67xeNAEllE5vJwKA==","signatures":[{"sig":"MEUCID6AhP0X2ijFKskMRMDXJAyXa+sgfUbfmDLQ0vMfWhaZAiEApzbd5dFnvZO1LiWCVap2mXu+rNuBBpeSeyj81qlTgOU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg9hXECRA9TVsSAnZWagAA/Q0P/jw7xRq1/9MZDX3aT+DE\n7EHfzewgp84s8PIJ2fALqvK1f1XEtqwuRXrakNMm5Ot2h73gyVu+8KMkpGF/\ndgkPrv/xgkBwcxl56qMQyW0LUo0vCd9AZ/Cslf6QLckuE57ijry5ntleVixk\nniXdrSdbET0TLFFLCOpMEFoYZZiXZOn/IGPvm1ayhDS6jRBPjZ66X1jZnqS6\nhrjGdyeksuI0y16iVYThrpQOWYe9zLUxRgFFI4ZvPq8LIM0i3JKmCehOgPLb\n4J3Rr/oiRI77Vs1ES8TSYsowcYhZUkYapMLK/cVpkcy7czqwVlNzkKwu1S77\n3po8C2kIiLKXgVrGc4f9v8cm0W3Uk8Xl6/RK/g62vJHzKPfoCG2yZgZPVy61\nBF7066Jm8q6MZreUonlDli/a0rCZbrl9Jr+wv1rWgq26Z1xrZ4mCycVhZD2s\nCRixyMmq7X2CwhDAYmWM0LCElckwj7PR0bAGiypmN3Cwc1X9yjdNsyTgJ1rs\n8lbXa9iCub1PEjC8OCvZmaHc83v5pm1oQK4soe9i5sG1Yk+6M3j50GXSQCRJ\ndNCPWAKFlnu0v3+58WL1UbdU2MwupE16BckgmmlvKxqi7MvgUOKCcrmXCTJE\nlzC6imjKFEslxroK1md9WkR4BXltsBqAhAn0IlKj3fmP5f6kcbCeC2tFOGdQ\nyUGz\r\n=DrFO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.42.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.42.4","@fluidframework/sequence":"^0.42.4","@fluidframework/merge-tree":"^0.42.4","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.42.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.42.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.42.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.42.4_1626740164181_0.6925679539742369","host":"s3://npm-registry-packages"}},"0.39.7":{"name":"@fluidframework/dds-interceptions","version":"0.39.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.7","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"121b87f262fe205d8ff68ae51a902a7d94f83eb6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.7.tgz","fileCount":70,"integrity":"sha512-z9kB1mvm847g4mB/pRbKgUMMTI4E52oBDgYkQ3hJX/M+wSlkbMN7SqkMVn1rv1aVqIwytndQbE/Scmrv1kAZ8g==","signatures":[{"sig":"MEUCIFkQ/DGtofnh+oCklQ6hzOc0mTqufjvesL14B8WRKvxOAiEA2n4o/SkeGJqAf/UUhx1/lLB/JKeFEDfoHhE27/+vbGQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg+dBKCRA9TVsSAnZWagAAy2YP/iU8j64Rizj6DDZPysk4\n2ZmfTozK12FbU3FMWMrbmgLL5p1LjwBcyTdh6+MSR7z95bNBWNZxw7kFE/No\n5V7pIMP73E+Zp/LsHCtvSiqY5j7lqkNhWrqqFit2DPpC/Cljb7sSUgcz5ppk\nrclD1kYXDpsoX47QfefV9N6YJV2Pf36iB0SXCqwmycJAlaMMnZffly/cfOzq\nWEIJ5TSlo2mmouBzE5rtM5JezsW5BC8cthWjswl2b+THw5BgEuvSSPLwES+3\nagtvHwFJ0Ce6MBE6Za07wypDdHG8ooUeoShMXcr2uUIoFiJGHkKbCVnsBQp/\n7i1y3GDdf2dKScyAlErttHaRZfhqnSvU7cPYfU/rtlEt0dWnwKhiC5Ego3JP\niLzCIqZ4WHeJz+Ny+aBqsOIDMc3He4VGisY/Zs9+xjnvpK9j/awqJhPWuHgQ\nwX/G5jneoSyUHONo48HtJf94Xos1ZQfHMfwmj2cL2DUhVKTJPE/+GVSpkI1e\nC1YcMB6F7MOnuLTl57bNjmzIsXWaUXAa71vxo0ym0623caCDwDnjxdahQ3MD\nVueBWbeeyYXC6vFFEbQF/9nxhR1AfhuMYjHaXexo8J22xZk18U/Dw4bMHg/Z\n4Wt4PYET8PnvFanalAggEEG1zNmnrTPZ99G2Vz/Add3ZP+vZcB/3oB6JG/h/\nTOKi\r\n=g5FI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.7","@fluidframework/sequence":"^0.39.7","@fluidframework/merge-tree":"^0.39.7","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.7"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.7","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.7","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.7_1626984522081_0.7367016074093531","host":"s3://npm-registry-packages"}},"0.44.0-30858":{"name":"@fluidframework/dds-interceptions","version":"0.44.0-30858","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.44.0-30858","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bb8f4713a06340d5e0385519ba1e19a06779f41a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.44.0-30858.tgz","fileCount":70,"integrity":"sha512-RXpUS135aHvI9YvD3AnLhLmt4PK6sITmXNjCHJiS5HZgAfMnn0s7vR2D2IFCNrBCqfoW/aB2/UC8I2v1z/7JGQ==","signatures":[{"sig":"MEUCIQC+PsFXpsLasx3j4B2hNmPTTbHfxG47k7FJlAmavapT0wIgOFWwZjwKmQePyvdLDzfo37sl1ssHMtfD6QEO9tGH0R8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145727,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg+e1eCRA9TVsSAnZWagAAUfwP/iNS2K5B4R8pBu9eHVAG\nE8iLr57x3l9QkkJHunL8q3RrJiwZKKHYsmOc2VpblQh4Xrz+VW2aDJOj6bD+\nmVyjJ4go9JTd3U1VxRuzAAtEvlo+fn88OArl03hrLFbluHgkf6ls2rkAwKYs\nOt6xqUuMM/K5OcG7JBQN7DDQHK2bCcUSLVm2S65NYOp2wHovrB1zRi3FqgBQ\nZN/rCrZJDJNFZl63rU/3bB2GeHZoYc09829ILuhwjHZbnI/nKSZZL/iyji0F\nHHIaA+J139DjuEErkB4twM7CX92eZjxQCp/lMOiXO+GJ2R/5Io5nOKk57hDr\nhgdjGhMwTXX6h0J7ctFkF1L511+EGaiSXvxoOqwwZT6tasAjXaILbgX1m+nT\n7NPxEnvls49R4xBVCLqUke5UErpkERemupggKFB49CiWBtfTHaU+S6nuCU0N\n56piVaxXRFs6AR0urtagamXyPtoe14CrP6PNdSW9aHCPy+4ABx3fjbw7p+Es\n9+JGpwwtXcY3nD/GqmqBm5fNLhFsc42Ld5aG63Ytm46P9Jq/vNd3giIKaGcr\nbmt87EZjqR+KY2SF2n+qlWvE276rMABBm+IO5qOtNAdKRSfsalde/YulDx1D\n5k4d6iQ2uvfYgacrXUJtSsMQPRS2w0YZzpVneG5TlX25LzJjZNauh5pTTsyB\nD13+\r\n=JOjH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.44.0-30858.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"@fluidframework/map":"0.44.0-30858","@fluidframework/sequence":"0.44.0-30858","@fluidframework/merge-tree":"0.44.0-30858","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"0.44.0-30858"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.44.0-30858","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.44.0-30858","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.44.0-30858_1626991966540_0.8320266535894121","host":"s3://npm-registry-packages"}},"0.44.0":{"name":"@fluidframework/dds-interceptions","version":"0.44.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.44.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"91b7bea8c31dc13313183c6e15486c9c7fc01e48","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.44.0.tgz","fileCount":70,"integrity":"sha512-5ejC6j9m1MgxP3yHZYxU8Dumfv/mp3kYDkpC/1jReXLXCjR7D3CZoQLLGnDGNQ/P3xmJv9z7Wqtb5z7flextsA==","signatures":[{"sig":"MEUCIQDrWrq+GWwy9ToNOfcz3nV7pgbfrI9u1L9g/dwfeJO/igIgR2EHa6gOyEvYSQib95dlpVzod9HzJ2AEWUSRsIAY4bI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg+hyOCRA9TVsSAnZWagAAsNUP/A90f0yj29eFxNqhUxK5\nBXZjeeGrZvEuZTIO9zxy1qqWt5eS42fiVEg1M9pIzHYWslZeSn00RD8UV0nA\nRcD5sY1BTMYS6kWhOVJyfD7hb8IPjsEanl2oSBCIxbACKjaSd2hf6fGPkKBP\nuWhtlFwz9Tcl5Q5WrgiPtCblf1mpJoUxdHzSwPtbrIE1EoEyUySuQRzjDv58\nEUAXwQgqw2qtvfhScWj5BZsYDED+rtVMpN3QAwGGnqNDLJklQfjrU/kMRlQF\nqDd49A7OY/BbBtLzm0cQtBb/WX04jUz31wgyYgKTZs0aumtIZUuIBfRLeAyL\nuwgSQa8oMjtXBiIP52VAjx51PMOmS/yc52EwXhjZ/e/WjcIGCIkVZyMnXImv\ndPFHzUfvrbqP4lW8KULxDLOFjHVafXAgDm4/b/L9rQqQ5XujnSPIHsY0sWb0\nWlfp7i3c/ZHRWXLfaqyN4ym7/3inzW9BCmAmfVJgVnUbbp8YDTpjvuGFLmub\nvYVfO5aPq/wHadJtiEF3jX7sTP7vjH1iH/sNuzk6TN34jQHZcRC+b+mU2aHe\noGcUnq3PXmgPuOn2a8ghckLMtTmFRQGozb9NJwBNcYcRUz4jorcn3Hb4QYAL\n72OTT5MsQ4soBhJ+sbIBjN8A3SyvNkyjrFVa7RBTZGnH6f+iZC+D2KtK9pVB\nVFCo\r\n=Kcqq\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.44.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"@fluidframework/map":"^0.44.0","@fluidframework/sequence":"^0.44.0","@fluidframework/merge-tree":"^0.44.0","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.44.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.44.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.44.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.44.0_1627004046784_0.8921494423994354","host":"s3://npm-registry-packages"}},"0.39.8":{"name":"@fluidframework/dds-interceptions","version":"0.39.8","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.39.8","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a6759f7554cd3b167b272608ce2df41b4b3fccf8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.39.8.tgz","fileCount":70,"integrity":"sha512-qAGj3+jiM20n6wNd8BvsAtQOxzQhYWr2oedBHEgehuJxznIzVGvnuyqHnouY8iYpbFTPpUZLJYK9YT8xuhULrQ==","signatures":[{"sig":"MEQCIEmCqV/Sx3htvbYX08pW6a5NzIhP5Ix9wxC9uxxjDE8lAiAmg3GRWF4n5JUF4VmwVESduos8L9wwJAxIKuMeT1jcHQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg/y4kCRA9TVsSAnZWagAACAcP/A555u2MM1tVk0Msg0cL\nksZCXH0GGHA6YqTjw6/3cBEJD7W6lOfDIMjaKbZnJDEMsuHZcQLvKVZwrm+p\nfoIO63rAKm0cUWH3ApTOcdEEA5C0DgIJR+ey+SVHyhiKkhJtyVhv6lw7K9OR\nVLYh/fdkAXnT2WGPBL3kWpml1DFr19UA6/OHIujtlv63oDBjuBamsCRTV9yo\nxRs7W89our5Hp0srEfgYwsk/f2OtC8mBo4suR3R+1NZLKFY5cO6coybAE41Y\neSbmp6E9EnCDn5yM/YPtOFaFoXsh2uCX9RUH5fnUToYWjhY4t7l+1wGM5Rmt\n3BQUoOTSm67avYpSQEH97sc4CjSwAh0a3wv0bnfi4Bj8D9oy36V2AQBrWYTm\nA+0r0Ak643T2GAZp6FrM7VpIMIB1fQpZl+AmSys+BM7QUTkp+r1FwoPkqK0+\ngGyzIEFSX2odAtbnPyaOHihCNkOhEv92LVVEe5aSYnQNjn6JvoHjYMj12RjO\n/4p+xPgrjmesloZZnfMXWlbADfgwvQCFJiJTLTjVLptPoZ7+GDVuEhORwaZI\neR9Ys1GsbyMHHkTwXeyxGSq8n6ZZHWlvaIxbsuR0t/7qvSKS+7TrKMIqvUR6\nrm5Q1BCp+IlpDtvEYrf/o+5z60j34XsJ2MuH7hTF6HTjuhBZGVFR4TvuX0Zy\nOvNi\r\n=9Y/0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.39.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attibution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback funtion can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback funtion can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key dervied from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback funtion is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.13","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.3","dependencies":{"assert":"^2.0.0","@fluidframework/map":"^0.39.8","@fluidframework/sequence":"^0.39.8","@fluidframework/merge-tree":"^0.39.8","@fluidframework/common-utils":"^0.30.0","@fluidframework/runtime-definitions":"^0.39.8"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.1.1","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^5.2.5","concurrently":"^5.2.0","@types/assert":"^1.5.2","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.13.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.39.8","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.39.8","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.39.8_1627336228401_0.7933886257983525","host":"s3://npm-registry-packages"}},"0.44.1":{"name":"@fluidframework/dds-interceptions","version":"0.44.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.44.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"06ee46b8b5b1fe1847ae279ae504e76fe803339b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.44.1.tgz","fileCount":70,"integrity":"sha512-vZWFCq9RpuoDy7Xy0ocvievC2dSJqmpnxAJVLwE4ob7aWPh/dCAjl9Qv65dRPcEwDVs5IyIcpaO5kG2FZZdR/w==","signatures":[{"sig":"MEYCIQCFTAfYCEip7+FRjtSw0e4Zim1barXIwYcXHS2n9xh21gIhAKijJQA6PtAZJwnxBYVly8TTAUtU9oU9Mqi4jJz3h4oE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhCeWFCRA9TVsSAnZWagAAZ30QAI5CcLmH08ZYOv75a46x\nWFzOqkac/7ngQ3Wlivk6FkcMgIpi9YNkdEXo9Bu1e/+7OBOOMGdmHQRkLA+f\ndsV0I5IseOm6IR/XgS0e9wh20IhDlzy38c2LOTaqwl7aoNJQ345yb8FGHqsh\nqgBaDpTJBU0t8GsgTMIC3cI5/r+UahshaDdvE2mGK78Xr3x5z8eQ92JSkdC2\nrz/8S2Yr3gvcuyo+BlZumR2KIfkwMAopPch3wgUecFFg4AcjObaCZpuTmi4E\n3FC0bEEbgvalrM9xP/jNKr2w/rRY/kZtKmx04bIjZK/cWd8LZnpofmqAae5n\nbod3RZ2EThHDZV/p1nnpjznjMxnH87kkeeV3gpkqTIFSIsLtYsWdEA7aEgo5\n9S1ZDGfx1Gn0PxhLAzqzaeBoFikBIWUC2wczbRJwe/sHyT+zJVTZ0v2Z7Eb1\n3Hsbl6/UbcH0Yo2CYyedohVtEv21eXgYXuMJAoRgRXL0Yqoiuww3ABEEr6OG\nfdTQKNTURRLu2zWbsZaaNg+ssCtsfcHnKTHmEx0lMn0FX4r0Wi5NTMwQEyJg\n2+PE1x1JihXiLnQs8hou9IIA3Oje+sz1PwO4zHsPua4Oesg3tu9fTFl/yhMN\nXArSLhgrknp8nJZr6fikWSsKnmUzdZXE1gBB8D/yIfyKezQ5MGo0YpaGqjlF\nduta\r\n=XzBW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.44.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.4","dependencies":{"@fluidframework/map":"^0.44.1","@fluidframework/sequence":"^0.44.1","@fluidframework/merge-tree":"^0.44.1","@fluidframework/common-utils":"^0.31.0","@fluidframework/runtime-definitions":"^0.44.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.44.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.44.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.44.1_1628038533733_0.01250972035751241","host":"s3://npm-registry-packages"}},"0.45.0-32948":{"name":"@fluidframework/dds-interceptions","version":"0.45.0-32948","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.45.0-32948","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9f455ce6bc3abf79b1751d5979f1c3633455723a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.45.0-32948.tgz","fileCount":70,"integrity":"sha512-ZbkwEy7E3QG7NSn2Eeu21tXR0SQYlM05hM8IQ/eYWNduZepd7jGzVIMS5ySpuI5SYnFEbAXTmffpfjV574vlLg==","signatures":[{"sig":"MEYCIQCVTd5r4p4cCQCG8hfoFTEHLYTZBpZeQe9BbPAphvBP7gIhAJkjjvZ/nh4G7xlYmWIutJZAFD20oeCa+wGcWduzJqDb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145853,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDZCPCRA9TVsSAnZWagAA3C0QAJgHrI/wMObUNLQ7F86X\n+vQJB07uz+fM8fXtvDxl2t5BCi5srYlFUzYcp2Yjyla1yAqPdiSmhgy/aEso\nONJEA631gHqkfWdeVimVNqhk/MWEU3MnVAWVgO8KfPvKpDX/l9lEE6V+QhGP\nmIWcmYmlAfRcSAyHNmjpg++8LXgDUq4Huxb3qVcnM0JQjSN0q/7uQhw48j/T\nZYGqjHzGkVl9e33++0Ixyn6g36UtExDCJDbc0oTARJLl219O2reSjBWXLIWS\nsnkBcplQCI9/i6Xr1HE2PW+DZWwzM+n2wzFj5TYQrpoUxU79CFdSswGmeFwE\nM3o8z1ORM8Cux81dUh+FsOfLF9ZjkxsWxUQlPBpVS3ArmwAme34tiiuJ+WQn\nbcoHZ/GF9Tm6QH9K8zVcnG0NbzV6Tyu8I0s2cY57YMXrLzLGFTFqNdu17Q89\nWQmkkww5hqwGIN8jc/bpZCjFKFY2845yaJnluT6ZyNHHE6lOfpQRc/PSmOLL\n5CrMns8CmUNn8qsB8vmElNSQr9AvYj2Z2xTEmrRDw9mhM7kdTgvUqTXkKKH6\npUwVxLeO/gWb2SoGmFPsT48cIfuKR7UgsPagLOoICFWNkaPJ5aMMBfuMWb3j\n7fy68nrEps/PCTE0Sj6RRr4Y/emOF3ar9TsUuX2rVS9Wtb2oUe6zVDEoHN2P\nDiD4\r\n=zTkY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.45.0-32948.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.4","dependencies":{"@fluidframework/map":"0.45.0-32948","@fluidframework/sequence":"0.45.0-32948","@fluidframework/merge-tree":"0.45.0-32948","@fluidframework/common-utils":"^0.32.0-0","@fluidframework/runtime-definitions":"0.45.0-32948"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.45.0-32948","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.45.0-32948","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.45.0-32948_1628278927092_0.7344735022135798","host":"s3://npm-registry-packages"}},"0.45.0":{"name":"@fluidframework/dds-interceptions","version":"0.45.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.45.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"77d060b296b0141852281d8bec905682f0e695fc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.45.0.tgz","fileCount":70,"integrity":"sha512-S4oxfr0jH1e0Vr2EzoMH0ua1s34+VWp5oDTNLXkYG1TFaGalK9D5y1VUUB+QjXvIRpOgReaV1XFdp6C8p2jatA==","signatures":[{"sig":"MEUCIQDVqfhhda2HMcLVEucJq4rj9l3B1RiawdvA41z40mWUKgIgcVFHhGE2AImMtm7HUIJKG1SlF+SA/fhGlByDx0kGcMc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDcRwCRA9TVsSAnZWagAAuEEP/2qPrOSw+CR9+OyqHLO8\nGOjAGQIDIkWIAwvb28Qc49sJ5NKkN83PNmxyy7kMr9V19UssfAtsPPX/nzp0\n7yfdPXtwgq5grHCljMJMCAIDVCqrs3E2Psrejwh2Sqg9hsCMg17SGRWanPlr\nWCEOa2w8MuB9V9lFY69GqYumxfbZmI82DwLhXgnET9Auwf357sggt+ZsA0lZ\nH3vgfk818LBl/hS1afZiQ7eYJ8b9dilxExvznKbouEylOfDm3m8Zj+wmnye1\nwVgMWOTuAup+IBVJi49yPoDEQJygFp9VD+qZdGYZzZMi9Bq2t2kGixJdQYYk\nR/E4ZqwNGrK1FxAz1o72mPz9fKkQdZjvvevv9EAbK6xDtNqJkJpz8BrfuCGv\ngzPD6EW8BOREHXwXOCGiDVJwbUziI4MctGpYU8QEaTFb8aybcU9v+cXICN46\n2406yHu3ESOtRgomaWWZbrFcA8Ha/XC6BpiIQDR19Pxz16RIoujS67OkbrZl\nL1Jd8aImSm3MCxDsRwV4+Ejc4+bk6VEk2MyYncCnQXAwPBUUFG3yi5I81IHV\n6RroK0vaN81DFQDp/b2zivFBZwkEIsB8cREuyKarwyw2CIhVoKP+5mCIRjPN\nyKU6SWdAthz/HGSjVVy7mcTUdnevhK7DLCwRxyqIK8uyFNB5oVBVfrCtKgUT\nSVVA\r\n=Cde0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.45.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.4","dependencies":{"@fluidframework/map":"^0.45.0","@fluidframework/sequence":"^0.45.0","@fluidframework/merge-tree":"^0.45.0","@fluidframework/common-utils":"^0.32.0","@fluidframework/runtime-definitions":"^0.45.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.45.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.45.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.45.0_1628292208597_0.27084861745499755","host":"s3://npm-registry-packages"}},"0.45.1":{"name":"@fluidframework/dds-interceptions","version":"0.45.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.45.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5a0f1cbe6baf197070189b7f430846be08d7e63a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.45.1.tgz","fileCount":70,"integrity":"sha512-uLOu4zizfjKlbeYHfFttiIQLedA2yn2Qof9J3QcDO5YMJoT1t0Kgxg81bJ4LyVBeI8UC3FyGMJ6j1Dj7d8oXGg==","signatures":[{"sig":"MEQCICAk7vFiwBBwbJsUq5ux3/LRpj/a8JVm0nRMsDM+GtwGAiBZPKb1aGh75XanP7u0xTwt9sKxAorwpoqFPzr228sMMg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEdXqCRA9TVsSAnZWagAA3GwQAI9a3VQu5uQlmXYaDnQ0\nGX+KrS4oLiBymrRb6cSQnIT72ztnaSDkYw3ruTDnS4/wbQhpcEvWsHNTqo0i\nyeI0gk3GXNtpVA2dEpf2pcdAtBIZe1OCcmaFiR0yI+1z3XQ1C2lXLhpGr1wH\nJVzOYhrQvlYPhnyAt+48cDiyZAse+S6ef6H47n1+mISlbbmcz+BAv3CW5gbp\n3rYAAnl4mmluFb15UGrzVQHPesZa8xo5ZEhmrOkmVpQVU+1uYVgwctUyJipQ\ntOgvHWJPsXswJlUSnC4IToLiwnzLYoXt3xk4L8iu33O8v52GjWR9B6Lruofc\n87WNkPFibOlOFKnKHBvaKg9sIAnuB7EcttxZFNlsJ0R03YWf3PnZ09BxoCym\nQTmvXUlzZI4fDZYpvugEc6fnTUN8iqYVn4im5qojulV2PGs/dpGHWcTYHZ9Y\nitjRzLnITaDPKWIzRjiuhdr1Z6WGtUGySA109DQOHxc4lTuxX0kJKnKNMO/g\ncWS9ciTpbzTBoZ2bzSG/SYxD3L18GuSasHspNNjsBa8+Olq4Fi2dK4c7ugOF\n6+ZMDPJgs8rih+JOdg4+3Q8VR15REiWinuikJPtb4wx2BD+IafsXGUT46Vyl\nrehGM/tCCubzUzxKf7iUwLR5ymKOp20YCAOLJHhjOayW7GpIfGwspwBjjFM/\nJ5X/\r\n=iBv+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.45.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.4","dependencies":{"@fluidframework/map":"^0.45.1","@fluidframework/sequence":"^0.45.1","@fluidframework/merge-tree":"^0.45.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.45.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.45.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.45.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.45.1_1628558826438_0.4814321589392465","host":"s3://npm-registry-packages"}},"0.45.2":{"name":"@fluidframework/dds-interceptions","version":"0.45.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.45.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"506b9179b7863c7de9f78339f2b17fca22fa9c64","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.45.2.tgz","fileCount":70,"integrity":"sha512-wu2hYTuFgBS2KTkVdU4bun35p+dLKQAYIZt3/P7itU5FHO7sMYlI+GkFA5MXvVYyYG0X3JI+F82vCH7lbT7xHw==","signatures":[{"sig":"MEYCIQDE1hVxRIDYjgD7z7hCa2/HvyUULQt+rPaH6WInUDx+5gIhALshNFwEcYT/OEfKpuQ5vLxxfq/d3zu7QDCK8qL37qu+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFEkZCRA9TVsSAnZWagAAS3cQAJFy+qEXNjxGmtgcYOJ3\n8Tp/DHNyeCoaZCyXCvE0f8h/V+2mCKSzrHx7OR6kEhVPbDJet83Y0YuNL2ww\nZ3Dub/5i4ctZPNL/pIHmz2JvthkGEPgAafJaZMW/lqehLkYW8SsnwLgZ5arc\nlJFXapqPlM3S3ysLEe8FJzuCUy+i/LYz7cumAvuWzfvz3dNssNt/F0upyKdD\nWmvr6yP9Djd9JYvWcoCh0k9KLLg1fAZiXqJ0RmkVEbprznXYYMI468YYvQtU\nnP5vdXQqyyMHgIN/kMcPAEIp87eeIl19LPlcKBhOSmpTfOJe0TLgph45cIYS\njMuoT0+69seKAgOAowanV9Tuu7uxuvSQamOvP+WtA8EoFpOQbGKI4k7V3b0Z\nNQ5qa43DtDYrbdpRTGxHPPwLb0O49IoTwK5ib58HsLIwYixsMz7r870ydwBM\n222UY3FR5tibgzz+mUDSn8TOvgLnEGFJBQJDHdvQsS2WcBsSyj9zqCLyvjCe\nAr9Ql+hmIh59SOvpGoc//bFUnhQjYpI5FUxlAUHQ9qPZhrZHCy90ZMG1SjDQ\nrKmUf2AXun5VI8Rb3hUaLs6mghYxDt+ffsLrAOCdEjE9X+PcyZyG+qiIhrBi\nAxWrXUtyTHNIy78gd6C+ja0oOjjtxRQFuT/uPDBSmMHWS99zNK1A3Xp3i/ov\nlC4m\r\n=7DMu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.45.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.5","dependencies":{"@fluidframework/map":"^0.45.2","@fluidframework/sequence":"^0.45.2","@fluidframework/merge-tree":"^0.45.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.45.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.45.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.45.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.45.2_1628719385536_0.2405721486599115","host":"s3://npm-registry-packages"}},"0.45.3":{"name":"@fluidframework/dds-interceptions","version":"0.45.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.45.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"438b5f4963e98161934e7ff40251d4e3551bc3fd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.45.3.tgz","fileCount":70,"integrity":"sha512-ZnLUCqv6BMSsBt5H9L/oxay2+xkW75bZ4YF+WcvrLvYWD6MLCkHwOK51zKXceYIfNPxZDr3FhWvuhmBJymoCQw==","signatures":[{"sig":"MEUCIQDNoMY4TsKrOuN2I+7ENg2CdeodBDEpzoAey8r0YjPQ5AIgA1WeoMRyRzYkwftTEEhppjU43h9LWn/u1+JEkN8QALI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFcIgCRA9TVsSAnZWagAAJbsP/2oagoi2mrt03UIqO6G7\nVgN8+WWqtSA7wKMuzLhvbsTEOPGY4tCu5AYcMNrJDe35xt/IH1TXY9H1Ks9T\nun5y6gEUy9oIX3IBR0CZ5MIoVM8pH8o4iZylbuf4A9Q1nOpCrBMkSRtlqbnR\nd776ray5QyB9BkeEwK7viXP7fIk188oOAuaJA7Vx/o8YcUJgQ4J3TYcMo5Tc\nTdvU3bEouOHCF5eJbjjO6pBZ91JDoZudkI+dLu+nFbSJmrBu5IEO5n75CV9y\nlBUGtFcHQk89D7E7kFySgXyB0SAhVK2g1Mptt4iYntOYd57DIGPUTGhCz4rJ\nR1vbmZLJCtEYwocYrLrTB10KbJZ+4TLveo0TLU2p9DuZK1sGTKhLqw5Rowq7\nTb5WLkHABewlD1extGd2Oprm0x+e7CywLF01qHJL5OTld5LOwo0AhI0IQa6C\nlxuQSznNdVTeL5ZGg4lOTWXB+BrE5Y5YvNkr74nVsbgVTmF79ak9wc3Tiik5\nAMn8uKDv6kE5Rya4tnLrIFBjLrdHBsR+wg1m09fyjv7/mAYgYC25T5ET6lCP\n4a3ExDceUIimQz3BAhrJLOwBDcp8eMivApLoAuvUqgsAIS+2pww7OfAHszIc\nbgdn76FpddOovIuMfbvaqLzZ+3Dhu0WkdCUFW2aQCiKvAjpHiYkDOGYndXIv\nRz+w\r\n=EjuQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.45.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.5","dependencies":{"@fluidframework/map":"^0.45.3","@fluidframework/sequence":"^0.45.3","@fluidframework/merge-tree":"^0.45.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.45.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.45.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.45.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.45.3_1628815903842_0.7143600495324987","host":"s3://npm-registry-packages"}},"0.45.4":{"name":"@fluidframework/dds-interceptions","version":"0.45.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.45.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1457763e6bb22bfddeff579bd15434bbf483eb94","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.45.4.tgz","fileCount":70,"integrity":"sha512-IbM+ILZ8EFWSnjQQDBeeagpmy88LKPHpbwH5+nM3kElO1u2oJaWH79e1b5+UEonGSDccVoIrGXGnqO+EBm8wsQ==","signatures":[{"sig":"MEYCIQC0Q260YC4ROSpB0o9kiRCuV4WMRSZdr+NTFt74aI7KBgIhAJoLLygUeWNdbrbXI8QcTmDk3nQX4EAiUt3tHj+WBubS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhHAEjCRA9TVsSAnZWagAAfiMQAJ+m5M17XtV/pwgYlDct\nU8Du0U1OfLa6zWD/qH9d9yfB1xX06/7YnaPZ4KQi8n6NP7qFJq/b0sBC/B60\n9wTtnsZVpnr5pG3WiZU5oYz1/rwAO66knxlesaA4BtJZpAvJuP/WsrSd2Hln\nloL9uTLYElbVaQtRiTBUoJQbAytnc6C0NDmdNRnw99fJ5DtF77lkiA49Tj2u\nH1fExKSjFUYRThtE9FNomQAyerbdfG0xnOcnOdq6o+CfKKAMyESLJsrqYBhM\nNFuXTfmgHSka3gQziKRAXwlBNL+zsBX1KIAiNUz/7+I36TFEnD+A7lAswYVl\nkZd7Eb4A7fP/FxKXuHAD639RqyQniPmBP9vL4r+PO00WtlCh5eRtjtAJWq+H\nyYoxg/ls0hW5+t1N/sbmsyDQ+EwbRbAlBFs5NSNjdtTwNV1+sGMwC/MvmBp+\n8X3UM5A43IF1PMxFI+z1bcgut6KOCXuW/WmBq6fhuYBnsOLQfEQiloz+8+1r\neT9bsZaLWCiKDVe+gZBxImBNJFNPCqG3e/ofeQiJAEsxMcYY8oS0cByEbDIa\neDjz4oOn+TjBC2OJhbfokxdG8yaDdCztsQiAMhdkfZBH5msl4jUVBmQY/ZRL\nTzzJcRL+BFKlQ1QDzAf2285yCnCRo2X47fYAwTKop9moj4TsMaecmSnoRMxr\nVW1T\r\n=rIgA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.45.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.5","dependencies":{"@fluidframework/map":"^0.45.4","@fluidframework/sequence":"^0.45.4","@fluidframework/merge-tree":"^0.45.4","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.45.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.45.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.45.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.45.4_1629225251686_0.5478657226245558","host":"s3://npm-registry-packages"}},"0.46.0-34784":{"name":"@fluidframework/dds-interceptions","version":"0.46.0-34784","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.46.0-34784","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b7eaa342bb9cd6126fc350413ec988aed50f5528","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.46.0-34784.tgz","fileCount":70,"integrity":"sha512-fxR126qk95fQpHe/AVgXyBPsLvQTJJL2p3TTexVF1GqEdZZ/+ZpZnW1piEuGazZUOLeB8DIEFcYSlZ+KDHg+Fw==","signatures":[{"sig":"MEUCIQDUt4Hh+M81VKT8pD2Ixs1Qa1OP0wDNBkYg9IY9QYBaygIgeoqKzDcW8IXdYHKGBiJ0of4j5c3BFyqYxvh7TOFl+2k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhIDbACRA9TVsSAnZWagAAlCMQAJVpxrlmdFr26t7BweeW\nyypu+cXXrYYSYwEuyyv2npVuCkHGCLRrw0BTJVKhoFE4cO4hylAZ9Suv26Vv\nP8IUUxYMLuf6Yp0cexTU/q6vrJh/p9jBJcg3nG4wOCfwr1JB1CE6W72bUMCZ\n5o9FTWOTe/5d8BisB/zD8eYfE6uz73GYyNPWn4bapo0tvDBhhgHarXYd0dgC\nLOZLgzkekgx93U1IjtI/WbD1fQrKoWuNGG2s/Iv7krZSmuV69sIAHgyPmgGS\nIm9GRDw/bu6ysjO1tg5nTdB+g6bYW4J5fRxVAODQSHTw2IxyIoRrMzS9MrDE\ncYWBKFkOzEjBdavFnqvGuaLCkVt7uPerS+cNnKw5BtF9Av3AqFStPbZ0X5pv\nXQCO5IA3rP5cjg1EYUVVSyY0CwtBInkDgjgZD8ocKsCC6OcTWiSYqJq9vQs2\nDQKqVfQtxg8jMDZKD3wu0R8OMl329qxtP8s+yE6J5TwW/Fuje1yimBI5+0fu\nVPN0enYc16qBsLjlP0yZqPfoyOqosk8+h7piVP3ihcbRnrfwPz+UkqUC2/Fr\nL2nD4cmjmfWQPz4Pplhm+O4xGgOWu6FfeLZQLt2lcNmgSzrWm3hzNL2K0Ws8\n4d/AIYuCkkqJvL7sz0x3pxjPjpOhgwAsDMZbSmt+IQWmfFvP3cvxYiL7oUrC\nfJcm\r\n=i0wH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.46.0-34784.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.5","dependencies":{"@fluidframework/map":"0.46.0-34784","@fluidframework/sequence":"0.46.0-34784","@fluidframework/merge-tree":"0.46.0-34784","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.46.0-34784"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.46.0-34784","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.46.0-34784","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.46.0-34784_1629501120727_0.5327446421556989","host":"s3://npm-registry-packages"}},"0.46.0":{"name":"@fluidframework/dds-interceptions","version":"0.46.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.46.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3142d0c977c3b1ace7af4196c5b7c77732bd313d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.46.0.tgz","fileCount":70,"integrity":"sha512-gnzQXQrJbw7G2chrR+AbJ1cSRvXH3FW0bmoBqhgzaN1VH3xNHR9P9tzDJI5f6NkQcO3GjjKOB49Ff1ayZx7PwQ==","signatures":[{"sig":"MEUCIHT2L0MOB5xSiD4KSIVAwzrFgo2JJNGVaKj/ilCKuoIRAiEA/qybDhtc6bivTfzhVy5kHS+zuD7NM7Z6HBQKl9dPoZE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhIE0vCRA9TVsSAnZWagAAcm0P/jLq2hRDV96SZmZe3LFL\njfIr3wp/86Q/w5gCFDPyhcvknkYpwCQ6DMS3LhTpmgpQw6/dGeBC+XSfp5DU\nybOPh+iO8jRRPtelebVtd+a2zf8MwjwNej0L28Ycc1zpmRMq8QqlmpM4cb3A\n3D0xWgX2ylJngdBJzIhkccmaGb/nbMt0Dnqg+H5zJGRE+ATsxI9c+dHCENv+\ns0ySiHTQcjUXDGvX2hxCjxBkOJPQ7lb9nlk9oU1LzYFb+arjathS+nP06CNr\n4AFxZHV+dkLY/1DZ8EjV2PW5h1ZH9apjUXZmTl0PPAdhMsHvbUJVKiwV2HoW\nGFRY5xwVWbAD622uyGnzgg1vVoND1obMAhJYHXfa81NGgHJRJJWWhPfnZ8D7\nHxfJnyDkSiFN/82aF/nsm08VCD3/mMDYUQZ+oVEMePA/9to/VQhyGXDpAgIt\nNqkERmMhwwsmfD2UAquqn2T+wWHp2SfOGif80stAb/kAd/SVTSVu4lXenoUC\nl8wSWg37/wCPxPC8ydnGWwevijmYx1x+o0vrNDutK3gDdAyomsa7GS603a/w\nW8jSCp0LY82W0f5F2qyG9Y35i8ssIspzeml8ricET9PK98/BqogOFJ07QJEh\ntgzezD3Gthu6reEL6satacY5XJJ/PWWaKYtGyR6PBeLdpgqdquPQvirsfl83\neQ2a\r\n=qnqO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.46.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.14","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.5","dependencies":{"@fluidframework/map":"^0.46.0","@fluidframework/sequence":"^0.46.0","@fluidframework/merge-tree":"^0.46.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.46.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.46.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.46.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.46.0_1629506863116_0.6496389931599076","host":"s3://npm-registry-packages"}},"0.47.0-35912":{"name":"@fluidframework/dds-interceptions","version":"0.47.0-35912","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.47.0-35912","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"59ace1bbf1cb7f77137a7e1b50887b5895d5e6a9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.47.0-35912.tgz","fileCount":70,"integrity":"sha512-M1afJRd6RFuvtcPnPLKXJOaXT7jpthwKnnDj0RNAw+rkz7zSpy7uqKqja9ElgiJNibTZZXAukVlXUAXlDvfxjQ==","signatures":[{"sig":"MEYCIQC+/Vs+kco+BnfxSAgXKUhn0Nd4Xjjy0WsCxCB4M06EtQIhAL+HDhqeIjxEQUkZt4e/MC7UHNsrVRrCiCcs0ngsyibu","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLsFuCRA9TVsSAnZWagAAWeQP/3yGVjVXQBvKW87970KO\n40PfhmnImdenUxGU9h3Hw2OrMTBpc6EhYtHBiSPNIZHvAOa9UApDIcs7s7xz\nB01TNAQ0tJ6L5HxVqSfIgVtuJHzB77W5Az4tP6p+KEnl7gryjdPT08VBx5Dv\nc+mK/sxrtXpf5YcF/13wndQaHEy/E2G7ecbpfy/5nagn6t4/1sjStC0gnudu\n0Kp56tesmnAZgxVIiwbuc38E/zAkcOq2w7ZlHbMgFPQG79oSAl3z6CRGQGC1\ngz51hr3oN1c5FEEqdhV/y+wGY8LHGuidYaYPV0+e5lfVLV/1aqFr5gZ6xvEI\nTWdq8QEB/m1kjfvUPMite0NxQMEraIHWOK7xN8t4YOAPVtZiYo66FZHs/OB4\nS6rIvqDeI/wK6sJuIOsGJ8bO95i6/MujnI8xvOGNI9vVVuHxvAFewS46jbj7\nGo6hNdQcOQfus51WxSHO0gNct3/Y5gQdJWBMizd4SM5fGSeNOzUo5VRGczR6\neaBpmLifwmXnjnfCO3f2KWKUUhAghmHiqRo4MKPQd4bttip/QdgUJIglboRP\nNwIglAO/DUMtHPtktJkRWVHbvFrTs+mqc/XxnerR7sHjhjYat4LuwjqClf2/\nJre5mqfrYFbtwhC5Prloki9McKijaTmWNg7g29JTWqHWdsZmPScM6yFv8KJq\nP1tm\r\n=6mMv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.47.0-35912.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.47.0-35912","@fluidframework/sequence":"0.47.0-35912","@fluidframework/merge-tree":"0.47.0-35912","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.47.0-35912"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.47.0-35912","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.47.0-35912","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.47.0-35912_1630454126102_0.12852887302903104","host":"s3://npm-registry-packages"}},"0.47.0-35961":{"name":"@fluidframework/dds-interceptions","version":"0.47.0-35961","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.47.0-35961","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9b6c42d9f425d43601eb9ff58cc672119fbf3e9f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.47.0-35961.tgz","fileCount":70,"integrity":"sha512-wUDq1lNY5S+lh3M59Pd2+Dtx10zYEPBgf/4FJLCtUWOIcjgAn8LoCyO5DsrxS7cWFMm7+5gvGPAq4Ei04CC+TA==","signatures":[{"sig":"MEUCIA+NtdScJw3hDT34L8qxQu0+3mRiFW4rgh15gly/tEbYAiEAlRIgmFKGZT5PWkKXgmGmIvWZQt7pWPJ92XqcZv4pq0s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhL7hmCRA9TVsSAnZWagAAGVMP/io2QZ8Zo5Rya5J0yYsX\ngGPaY4zydNXdPWxDPEbPpOZzg0DSNBZV7X3Om/UB/8KKw4qZm5j7QLj6G9Qx\n9dUPVD65Qeq9G8ANmBy8hgs8UtJJE5lY0KFej1F114NOkZZtkroTZkoNjRJ6\nxLxaCcsUTo8TSW0BFjHO0IuY+GiXJAHN9cddlxoBPvZi71EvotBehRVJaLQe\n3zwjG+zFi5P0HEoMq5rPA6EA3D8Np3RWvecxKMALIIpsrEbEYxhMKHnRjJ4U\nAYrdvXlgvdkdY4Vj9Jn9W7vzKTSNvrr683I+4BXlUEZVQSDB7aasUsP/gWZB\nYPTo2Lr9Kr8YkrgdBiO8ZuEH0gweEecToCdYQURJq88eoEH20rM2Hi+KUb5+\nWFkLFMPYXJIADHBeVruRNS79BPQ/k+Jr0pdNHA2jypLl2FApAsqaPMgoPbn4\nIJd927mC5l0nZYFD38aMn5kXUdMbc2lQZYJXdii2SsbLKpWemLF9i1WkmmtO\nx6xBYJOPGbMZE4XXLLsvL/dr+88CSz2d2Ya0Gl/JsNt2h62FPPLwW3Ko1kkz\nuIisMopNY0F8qcFhoxfnDs4Q5Yoc+AZxOqaF3IdTnuII2PryiKRZBpKt1lFn\n1OyE4e6B7x97Fxf6JOwl8vOao4aTTUcBp+g+7S8tBu7u0SuNTJ0juFoS236f\nGLkT\r\n=655x\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.47.0-35961.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.47.0-35961","@fluidframework/sequence":"0.47.0-35961","@fluidframework/merge-tree":"0.47.0-35961","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.47.0-35961"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.47.0-35961","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.47.0-35961","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.47.0-35961_1630517350079_0.7099549196213433","host":"s3://npm-registry-packages"}},"0.46.1":{"name":"@fluidframework/dds-interceptions","version":"0.46.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.46.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ea682387773bcf2d13ac23517f0e9f77a92b45cf","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.46.1.tgz","fileCount":70,"integrity":"sha512-glSPBCM9xwQ1ralEJvGMBGnMUir0U7DRdXv5FHvuBh8ucUeQIkKnEVdDD4xvy938sPvvJsenvSE3NXW1EF2WYw==","signatures":[{"sig":"MEUCIB10MV3GYPEFnFJtclLdgeYatlG+ol3xtuFj5iF0BJYhAiEAlZMr/imKsEVF32URG943nb5mHCtc64c6c6GGbbhaUJ0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhMVW0CRA9TVsSAnZWagAAplsP/RHdmHya8blkLTAGBKTd\nXklAkyrAtNihYRa0Se52ih3dcD3Xa3c1qv6dGF+a9DxmSDetE9YwxFpo9q0V\nB43YHWnf6Z3YacN3MZqEQhQv2m2v5TEwcdLtZWNAxR50SScvIO60LJpB0WXQ\nb9kJVY4JjQJdl1sr5ySXTDrOJaCG0XSMIML2iF+gIXfDYqW9785CuPhn01jV\nxwLuSqZTDqVuv5aIQnlCyBTw8XgRD3NYRa6iLVuztl7ghTWfzsCC+QeLlYTF\nOqYX8Y3CWNR35Oy7ZqIbtGlSSmNRrLErpovE1Ss8weuO0DmtiX/VwEfQ7NkA\n9a3ObXDpxilQrEmKVJKZBsFjlDagbJ3WfFDW6p7hbT+zugW8ogkZNMGe4goE\nOpxq3D2LLukHDltCE+0oJM6g8q9HTL1b6Yf8oolq+YK/ar5w/ElRfPwBTSzE\ncoCW0LWGYgBaEYDEaLZUoiX5dEXCQlZ/AUy/GMEBen0zOnT3AuQkH8gPDf7B\n+yfEyXSemBOpQEb/86SG8YSSuoPh3tIFal2fdSP8KtUTiryOdVs5nfVqbPso\n3FtxMWh27Do9ukIc8igPYkVOY6f1fFMi3ZfYBt00SS9nZadrgh4m4OKuEj8v\nBTcdGSRs0XQNH6l1urnVodx94MHLxkBcJaaT9BWRQBXmh4JhWK/3cg+4oDNI\nKtvn\r\n=H5FS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.46.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.46.1","@fluidframework/sequence":"^0.46.1","@fluidframework/merge-tree":"^0.46.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.46.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.46.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.46.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.46.1_1630623156284_0.8802377519943794","host":"s3://npm-registry-packages"}},"0.47.0-36362":{"name":"@fluidframework/dds-interceptions","version":"0.47.0-36362","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.47.0-36362","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"75c19f88a767da737652af57a9ea9df9ab09459f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.47.0-36362.tgz","fileCount":70,"integrity":"sha512-Sq0n3uGmKEFuk874F1rEp81gjPslKAuy7MLlo+Pi5nO567xYYaUzIQuzZ1G+AmAMCzEZSQjveKc2vq+rtAqNmQ==","signatures":[{"sig":"MEUCIQDC2rjJccaAfaK2kbeNqX7SAFemrKHaV5wC/qyWWmTgsgIgK3cfX9trL+pfMpJ5KTvpS6T4Mdi23mSdgG1tF9PDRDs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhMmp8CRA9TVsSAnZWagAAxO8P/j+HFQU39yboBV8g6+wD\nGsKcXBeBNAx8eMJ/WOGEPP1laSjeeoZmTpyXuVTfc7taINEDzSwZjC5z5XYw\n5pyBlHPzF1fhypswGmL4Ev0IeSgF/JuzLz+6GfHShq6l8LKTZowXtD9nOJ6R\nvysjJ0r70XH/OneEcBomatRDMQ3RUsnj5hmx1GSDLZZ0PzXvgtQ462uaT5YB\nJ1vRqLQjtI7RDRtfOZH2i36B7o4LCHziCWWl5iFLpCJEy7ZPnrHXB8mpLSRq\n03gyZChfWuIlBSkDWhhNMu34quqHweuHZkA4Q5cqWSn9N7DsZ2XQE/dHf+DG\nnPNAlPQmSKeCKdjg55MGvwLFjmvCG6xZZUA/4+RvpYfNJ1BAHuJTWO9Abc/2\nlUGdUO5fHWJjAWdDTu/K3gEsDLsDzzgRdWubQlWdsLtCZ7bnlC9W/0oPPikr\ncVDODgrawPg5ZL5pnHq4X/YFMT1Aeeo8hTN87hsJvrBpNMRvxyq9FbvS+xuh\nz/3pP6z7fuNhHtg6bwW9cnwZug3/gkWQLg0kLjEKT/mmx+S1fi02pRuOdy+J\nfMnXSLAVw/zAnjPZ7Gy3Ss+y3cVkw6RZspzzlrTUUj8oWZd5l7PWTjCztj0e\nhwWs0HHFivJTOjP1x5uyXwh+3e6SS7+dXnxKeSiLdmflUz582LeXk1GF+Yfn\nnjkC\r\n=jiRy\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.47.0-36362.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.47.0-36362","@fluidframework/sequence":"0.47.0-36362","@fluidframework/merge-tree":"0.47.0-36362","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.47.0-36362"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.47.0-36362","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.47.0-36362","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.47.0-36362_1630694012634_0.15139280529375365","host":"s3://npm-registry-packages"}},"0.47.0-36699":{"name":"@fluidframework/dds-interceptions","version":"0.47.0-36699","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.47.0-36699","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1d86a6e730e44fabaea58d155243535a25a70be8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.47.0-36699.tgz","fileCount":70,"integrity":"sha512-OBxN5ssZXQFzVCOVEN0+OoBqNGYvUD69aJJ6fDyBBg6sCC3Mdl9DlJPGPce+HGbMG8XOgv9eYFpgvVFgG1iOYQ==","signatures":[{"sig":"MEUCIG518EA45+jemHNfbZlbW7aJh5Sq1awJqz2WHKdQiLMzAiEAjSAO2IX1EZo3LaeDQt+CqqgCn0X8pkygX/4GH503lxY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145853,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhN/lWCRA9TVsSAnZWagAAg0UP/1MRSKZpMfgi/sm/7LmS\nNW/E3OpAmqpdtNv1ERIOBdTcSM3BEst0/KYncE4S/attxPE9T7/1n14vFUJF\nE7t1xiWfQHZl4iTmdgBu3d33yG/gDhm+YlsWGZTg03WpuTr2nnVe18/Gkk8B\nbWhWsl0512hnBNmIJzZZMv9VX1Cidp1qP6mouiNOLve6Lw1bjcNCYzzvEjtc\nIm7wApsFTO7mjKgcwLYCGrEHXpgofUokDE46xuOyEYp0ce/m3E8AhLBobZ7O\nOVN8CABdcZQER2bwEIchPaFb4v5/wOIapJ1E4TSQaY7DIq/eah8iw72BsHhp\nK5pqHKUjFxPUiJ/oCohzCPdI/mW1Nb/SQITrbBMZP6omVoTCS7geVwCklgM0\nRioEwseQcXCaKuRzvoLZJpbfHJ5qHj/8FfC3yVM4D0kaj8BPaOweQ1c4KnL/\nHRhaHYarfibqBOcdSwISJbyf5h/rcipzrsfm9kOYdMaHvIIZkvLr+DQaDafT\nZBVodQ90vva5796vdsRcUTl2Yr+dShY/yCwvZH5hzPaTzsWe3/VncXBHjvjr\nuPshgZT7jsPuXxOUMRmrqVGAmpCpoFYeZ/NPD/sTDS07vK2yxpLMPOU7AO/B\nIHmYgEibWChqS7V+8lOPXbXNqlm1EnOOXP0GyAzNu39T5Yyq+g4EeQOeIaGb\ngvHj\r\n=OUEH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.47.0-36699.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.47.0-36699","@fluidframework/sequence":"0.47.0-36699","@fluidframework/merge-tree":"0.47.0-36699","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.47.0-36699"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.47.0-36699","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.47.0-36699","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.47.0-36699_1631058262066_0.5375209422737253","host":"s3://npm-registry-packages"}},"0.47.0":{"name":"@fluidframework/dds-interceptions","version":"0.47.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.47.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2c41b27155e633e50c5c9cba83ba46a406965551","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.47.0.tgz","fileCount":70,"integrity":"sha512-nIBgZexGQzsmgKMnMiLLeQg/3kEnoCrYWO3q0zthlZTk1ci6kopMUPfk44Gyj2/rpw7Mcl65qDSOjuKCqQlrvQ==","signatures":[{"sig":"MEUCIQDLBhUj8wOoKsbOhYBQ9xUDaf29DTxMOANFHHttxxE+RwIgCRbebf5qHyM89Z06WrmCXLfp6GyPNssbIHsCIqI19xc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOPqTCRA9TVsSAnZWagAAlbcP/jzIFsiis24E45iFUTnf\nFYeDxtnjC2gbXFIfeeAtCOjtaAD7F2sWpK4OwbrSahTEVhZkiNDkHNI2LDFO\nQ9ScUsNpew6U5AOS6v5/qZfzCOj6mComN+aaCo/MevjKgi+YjyhrJeZzP8js\nWXCch6ERU/OonxDzo+WMzIkl0E7kZBDRfKlv//ikclCkK2hrOIrCpTdGUk9q\n27sNeq4F9Dp1hFJtTTiUJxEuih6DkHx0wkYSe4xZf8BoLXI6Ijl3nVBVKAG5\nwDryhXQqeO1eYrWX8SARZ/IZFTJJHyJgsk01nq2ULEeRPdLjO4ssLR+xc5qZ\n8ENajaUw18XDWsKFVj3YZMEjoFbhhgN1kODETWM4puQ0/FpHuYt0q+87GU63\nzfesP65c5n8xOCMb3orO6Un1CyJCCFNQKTUyTQ0K37iWRosfvChyZArLtlyN\nwFC7/Bd/WpvyAaQ4YrdADvKOnYyMwgs7sC7vVfE7ZJKzC44VExpyNbAPJ3Mf\nEb4bGcGI6ypOAz6/N8azGLTFHKlmuhYKy/EkuGlOcCmy65bIqBHFhr75WKLL\nt9VY+AyfMWHrlZ7APFaNh7ChiDABs4lKxHvC+LUVOaocfePZkfSYN+AWoaN1\n0ZPO8ThjRnptJArXe49kXZIUcI06ABI6g/4CeH+vuCfHHrDd7ynKUVHSe0Yt\nYpIv\r\n=U5OZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.47.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.47.0","@fluidframework/sequence":"^0.47.0","@fluidframework/merge-tree":"^0.47.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.47.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.47.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.47.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.47.0_1631124115245_0.2638286240106913","host":"s3://npm-registry-packages"}},"0.46.2":{"name":"@fluidframework/dds-interceptions","version":"0.46.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.46.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a7d9b33c73878101a8172eb63a2cc728533a3a9d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.46.2.tgz","fileCount":70,"integrity":"sha512-uIc+vC3Q9wP4fK0NZPKTFEU5SdYV5rKjQYStONMlUBbW+ZPI6qSy5Blu0P7uRT91Hwx6P81QkvY/Xyr/GY4rfg==","signatures":[{"sig":"MEQCICmhFCkmBGeplbqbTOPH1cJANDtKBG5R88fxhd2PZcSZAiBgPEXXSr63KMR4BbvRpgKNAZRiHIErLTkENrnlKINOYQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhQm2sCRA9TVsSAnZWagAAurAP/2DrZr7mPzcMaGviDUTP\nyepkkR1fNGv6CjSOCiyJitrEMfRJl5JmLKrfqkXSzd66wEakgv5oZeL64LIB\nPJKAIZBTFxTv3njFNyWyKP5J6j+mU8xgfIn9ejZy8MVAjXdFhRRi9snTyxQb\nEs5n6wr/hbjhz8kXHqaua1lIxgswBi849vt1ttmuGWcxe4kLLQdtThg/UYJP\nRep5+XVVwoUY2cqmdFkXaghD3354ta6wq1zea1rUUzt0uZ+KN/FhFn+F2pvW\nhELMqvARcmOEJOAgeRm0HmrJiRJMVhGgFI24CZbK+zIxr6Vfa5vMQ85O0uPi\nTxXCq9KSVA6xak45F+TnybvN7NQ6Q3bfZJFjB56sEUeAnQEPS0VgEPbdKPvp\nqkmEQdeUFMub/IXBy39erJnGqcziH/8/mlOfe1qtBfM68L6c2c4HQBy1L95X\nRTvkS8WdNEjEtiVTO7b++O3D2q/eHrCHEHSONgTv7FsgRrKOtMy72bUIDThD\niDPwKmXuLEdZLbd0OBzMVu7tanW/Si6bIf0zGbTWYJS6bnoG3wCqyZJ0NDoE\nH2dABAqUZDondcQBY2jwvZfTktoB8/0RrCW/EWR4bpCKElXT07SC7DTnRUb0\nEQzTL+SzpdtFf46j1PRBcAwxttviudYKXBiLiOOBKp2tvBNdeoOd+oG6iM7K\n2luA\r\n=PZ7v\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.46.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.46.2","@fluidframework/sequence":"^0.46.2","@fluidframework/merge-tree":"^0.46.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.46.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.22.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.46.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.46.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.46.2_1631743404729_0.16913017128049734","host":"s3://npm-registry-packages"}},"0.47.1":{"name":"@fluidframework/dds-interceptions","version":"0.47.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.47.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"74333fb53f7bf0e9ff703dbbb5224d0cfdd32617","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.47.1.tgz","fileCount":70,"integrity":"sha512-NutO7WkFZmEGeKwu0a5dOKYUFvVznECKLK+diKcuF+LdYPoJfHQNTYxXQUHlRimoe5+JVazQ5n/70kNveSbH2A==","signatures":[{"sig":"MEUCIQDZbHXT5H/v/wN8mKMM054//oSnENrT1DqfBe9Mzkzq4gIgZVbUVPE8qx0ioFE4SmEzOF4WhawWetVv7KziN0I1xWs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhQnq4CRA9TVsSAnZWagAAsG4P/AmA7WMwWYoYT5ePJoaa\n7Iufm9Q5asi5rfGTC2oF/ensWYiZPOGaKzVJ4nBI2zk2j405NtmhByNdgt9S\nIOOUBFPltaw8LYBOy+3jy+2so5LMTu3j/voYAGAP/mU2k/F6gz3jHxWOUfQe\ng1J/QY7zYmfhRF0iPEKhJuwRXvtZdTJWgseWb7qAnaPpQpp8IJSdd/TFEK0w\nE+smcMAAGceGbQxQpkJgQlbdBuM3QDnAnY2dJcMFoENWDrGmZEgtqyP1QzZM\nq8AMzWSg51JcLvY19datYz9YGt9vkxh3cnvLavC8ayCcSAp/Qld2LCCNoP2m\n2rFHDCQLcMGvxNZQ6cnNRIeMDhdBheyjcuDhew63+k+H4u3kgiv61uVDdRIx\n/5el7yAG9xioptCAHp8c22XWROH0Fz4cMMA0jBLLtbHyqS+UzDeClyPkdZap\nz7KIOcL8JsWKxcYq7NKDyrScxKz4BAjCUe5i6mR40eioCCzXs3R/WAxre639\nZPCYbdxuymmFItkfiT7MSex4g0rtsIAesPU2VSGaZM+zSb8dtr9I2i2do1g+\nTpPveAMYXIlF9QuPQFxXtKXjVVHSFZR3/uEXSEzyBy+fr/A4wiEFkWSvlJY8\nqKklfh18NVi4enkph+pR3AVID+L7pHnqGWIBjoxe5dSl/eV2c1Cbcp37DsKn\nWhq0\r\n=NG09\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.47.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.47.1","@fluidframework/sequence":"^0.47.1","@fluidframework/merge-tree":"^0.47.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.47.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.47.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.47.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.47.1_1631746744380_0.31235706652159534","host":"s3://npm-registry-packages"}},"0.48.0-38105":{"name":"@fluidframework/dds-interceptions","version":"0.48.0-38105","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.0-38105","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0729b88b0ba61d6563507a816ad69e99629d48c5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.0-38105.tgz","fileCount":70,"integrity":"sha512-eEoAO1IcXBc0V+M7JS3heLNsXUTsbZL8Kti2N+88tKKJAamWvarnd+/wKJVW+AkLBL2YTZ/rPwEl2mhyVhAhxw==","signatures":[{"sig":"MEUCIBUxOd36cbwutCaRynmjSHtfczdQkRqiIPnyMYZsXWdwAiEAujQFiPvD/FPDdzw/nqXw+o82Zkf6GfY3uKEiC5yewnE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145853},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.0-38105.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.48.0-38105","@fluidframework/sequence":"0.48.0-38105","@fluidframework/merge-tree":"0.48.0-38105","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.48.0-38105"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.48.0-38105","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.48.0-38105","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.0-38105_1632173038224_0.14818169744373066","host":"s3://npm-registry-packages"}},"0.48.0-38142":{"name":"@fluidframework/dds-interceptions","version":"0.48.0-38142","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.0-38142","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a6bb11c6739649d05e7a7a6d303969549baf66ff","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.0-38142.tgz","fileCount":70,"integrity":"sha512-bdsO4RrvWALeiNVQdU2rSixZztAZMSxxFDCnPTLOBsANJP54KWX27XxpowY9DtSKNgTPDpYsQ1Rq9DPECDLU4Q==","signatures":[{"sig":"MEUCIAXEP4KZTeAvNi4A6YpNRWfwHikazTdYwjWTpIb5yqBWAiEAuRavKH/qven95WvEOyHBjFKPVHGlxIGTLifE/jqAYmc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145853},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.0-38142.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.48.0-38142","@fluidframework/sequence":"0.48.0-38142","@fluidframework/merge-tree":"0.48.0-38142","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.48.0-38142"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0-0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.48.0-38142","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.48.0-38142","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.0-38142_1632240127031_0.11639546712476179","host":"s3://npm-registry-packages"}},"0.48.0":{"name":"@fluidframework/dds-interceptions","version":"0.48.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4312787a7334bda39943c40aad78180845cb6cd8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.0.tgz","fileCount":70,"integrity":"sha512-JatCpaV/PYdPYxIS8NhtVV6AOkgQZ3v0rD8omq8hbTJ5PBoQVVCUS5/ZhVt0Amf+vihlo0pJdcu9YVwB91QOkA==","signatures":[{"sig":"MEYCIQDBlfnzPWEiIyHVrp9ii5iOH2Kovr2HO6xyq5Nz9dO+fwIhAP4sGloUHVTm5oShr/bJeOxpdypAcNT9BGA6ixqi5d1y","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.48.0","@fluidframework/sequence":"^0.48.0","@fluidframework/merge-tree":"^0.48.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.48.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.48.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.48.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.0_1632254966552_0.6079655426945763","host":"s3://npm-registry-packages"}},"0.48.1":{"name":"@fluidframework/dds-interceptions","version":"0.48.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"833692659a97272cd3ec043ee9b77c093510085f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.1.tgz","fileCount":70,"integrity":"sha512-ocorvoTIHdfxFtg7mlnik68h1xzvDwkc4K81fkOEMdecaSCxp9+b+KxFdJlVJaRR4FQ5WKJ0q7wgSZ6jHkMQMw==","signatures":[{"sig":"MEQCIDzZpH5spevSVKOCx1fce9oY7tPUicZlco03PE4iX4koAiA+iOEtQZnIIEx7V22g9zVSGH3BhssQJBlmGkS4aUUQFQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.48.1","@fluidframework/sequence":"^0.48.1","@fluidframework/merge-tree":"^0.48.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.48.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.48.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.48.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.1_1632436171463_0.15703830525217688","host":"s3://npm-registry-packages"}},"0.48.2":{"name":"@fluidframework/dds-interceptions","version":"0.48.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3b318140730c7088a32e411a7ff0961ab26fd91f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.2.tgz","fileCount":70,"integrity":"sha512-74GxRX3XE21LcIffMk+Yd7o0WhEwCOsUOByDOFvnmgeS0Be7wIcw7TzOHzPOSOhAXBem749xsbsJr3S49E0Geg==","signatures":[{"sig":"MEUCIAyHS1huOom5f4WGuYgoRsj42jCYYPgR9Y7b7PVnGNJUAiEAiReG46bBR6Eud4WI+VuoqKqcgvSJcBNX1EoQ4KixZRY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.48.2","@fluidframework/sequence":"^0.48.2","@fluidframework/merge-tree":"^0.48.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.48.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.48.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.48.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.2_1632772685155_0.2281154003594661","host":"s3://npm-registry-packages"}},"0.48.3":{"name":"@fluidframework/dds-interceptions","version":"0.48.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6a4641414b4d354606e337677d867ac53562308e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.3.tgz","fileCount":70,"integrity":"sha512-d7WMIobs6z17YZ57eRYpIhJdlRv+uOdiAJCJJaTgGNEqJiPwoS2KqaDqenXE5UG7mh202G0DPH5nl/q3jMGm+A==","signatures":[{"sig":"MEUCIGWXN50CxTXawXOHAF1jFOalfIzx5oX0r4C2ymFr2xB7AiEA4BrgO6BZO9N5rEEZpUkC2RlOjBUTqEKEyg+zmXYMwIw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.48.3","@fluidframework/sequence":"^0.48.3","@fluidframework/merge-tree":"^0.48.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.48.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.48.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.48.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.3_1633033873849_0.3004588775621142","host":"s3://npm-registry-packages"}},"0.49.0-39015":{"name":"@fluidframework/dds-interceptions","version":"0.49.0-39015","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.49.0-39015","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"76aacc6886337d477f1727cc8fcf5506fc744f9c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.49.0-39015.tgz","fileCount":70,"integrity":"sha512-AajoQDGKdTt/q4Y/NTC9VpsBcFJHAuJcaLVcUJdn+/oVEtU8AgI055KUap6e0O1SckVxFHSz7K8W6+rZfEDmwA==","signatures":[{"sig":"MEUCIEKzBquZ59OTEnhpX4DroszTtGZPJ1aGnsyyKOVXUKhEAiEAp4BvEv3gw41nUdK0yCupTcghu0Z59t/SYvQgezK005c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145851},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.49.0-39015.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.49.0-39015","@fluidframework/sequence":"0.49.0-39015","@fluidframework/merge-tree":"0.49.0-39015","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.49.0-39015"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.49.0-39015","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.49.0-39015","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.49.0-39015_1633039291387_0.540647356672002","host":"s3://npm-registry-packages"}},"0.48.4":{"name":"@fluidframework/dds-interceptions","version":"0.48.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"08e3f80e030d7b57ee706a9c61720e87391ace49","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.4.tgz","fileCount":70,"integrity":"sha512-n+jSmrWpNIfneWs4zE4EoTysviVz+Xy0SX3Kwux2ClXBvvnRek+yrs7F2aKQUKU9Tib2kov5y7RJueCebs8iFw==","signatures":[{"sig":"MEUCIAnJSfl4Ladkfn+m2aeqEeiGrjhswhml2nlLy5WfBXTvAiEAmflXFvg4Xf1QGlxA4iC7dTlNSexBj0rlanr5cVog46M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.48.4","@fluidframework/sequence":"^0.48.4","@fluidframework/merge-tree":"^0.48.4","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.48.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.48.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.48.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.4_1633108909270_0.3955483798298891","host":"s3://npm-registry-packages"}},"0.49.0-39313":{"name":"@fluidframework/dds-interceptions","version":"0.49.0-39313","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.49.0-39313","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d9e0b6c62ab131a4d1e9da3026680d8217e391f0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.49.0-39313.tgz","fileCount":70,"integrity":"sha512-VG1xxKEhuHETy9y3dhbqaMVzz8mLlW4SYYAJzdS/LfRLWcHx4i7gElmUEJGQkeYtXQr+8ILxwkIkUmccsFWgLg==","signatures":[{"sig":"MEUCIGxc1yMNnp0z6jKZsvngY3D1OuhTF2VLcfKTZ0pkxHB7AiEAyV+Rd2Rg7gTF21vhOUt9o5P7Yha6WrtZGhnayG2f2bU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.49.0-39313.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"0.49.0-39313","@fluidframework/sequence":"0.49.0-39313","@fluidframework/merge-tree":"0.49.0-39313","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.49.0-39313"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.49.0-39313","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.49.0-39313","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.49.0-39313_1633389805206_0.180613944252644","host":"s3://npm-registry-packages"}},"0.48.5":{"name":"@fluidframework/dds-interceptions","version":"0.48.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.48.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5c77b547a7540bb9f3bf47cf95fc67dbe5e13db8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.48.5.tgz","fileCount":70,"integrity":"sha512-RXLjn0HITTH3kRzkti14C6QpJyL6FXf0gmGZrSaOv+zGjLO1Nnj9c92ML3p2UvqK0ssKX+GTUSeo2NDFiBF8kQ==","signatures":[{"sig":"MEQCIBsaxz72flvLOKbKVEPn6NzBXUE2V7Khps88BHbnxFWkAiA/juHv5rEipFAPJEaYxq2TrHsdyWBUWW9ZrP1AXGunFA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145769},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.48.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.48.5","@fluidframework/sequence":"^0.48.5","@fluidframework/merge-tree":"^0.48.5","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.48.5"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.48.5","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.48.5","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.48.5_1633471180867_0.4763657538461419","host":"s3://npm-registry-packages"}},"0.49.0":{"name":"@fluidframework/dds-interceptions","version":"0.49.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.49.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"da9bf964c7afcd3f2ea545c972daf151b3748835","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.49.0.tgz","fileCount":70,"integrity":"sha512-r5fMdXcZn7O2B3oay3vNUa6Lt5jL2cQx2QnwZy6eEeA6LRo5fE2QkRrtRjx9iOBbbggL433dlKYD9HY+FpP6KQ==","signatures":[{"sig":"MEQCIDFByHTYoJCxrqIW19zM2vtpLYoHbwz+gfOpgYsKjjpqAiAYj92WT+AJJGf+YWI7q3nXgHIIvRMSg1Zu/5D7NC2JUw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.49.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.49.0","@fluidframework/sequence":"^0.49.0","@fluidframework/merge-tree":"^0.49.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.49.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.49.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.49.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.49.0_1633561343767_0.8727792067127205","host":"s3://npm-registry-packages"}},"0.49.1":{"name":"@fluidframework/dds-interceptions","version":"0.49.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.49.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6b9a4d51995502557846e164a8f1d1650b105ccf","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.49.1.tgz","fileCount":70,"integrity":"sha512-7A1fKNWWN8IA6iJndPIVYGq4aKSOT4ZM9Au/TbWy1Y8/gxOVxppAYdWGuprnUyIVt4Kkv/7F2AWGL38jiHmA0w==","signatures":[{"sig":"MEUCIHMOxjBSHKSLjAYq8xOUTNK5cqeG7ifvUDscIkLmjbw8AiEAli9BQQYcoNzkWCG117XemTckVOtHtD5B5iV78o57Ib0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.49.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.49.1","@fluidframework/sequence":"^0.49.1","@fluidframework/merge-tree":"^0.49.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.49.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.49.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.49.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.49.1_1633969539853_0.5447245954618487","host":"s3://npm-registry-packages"}},"0.49.2":{"name":"@fluidframework/dds-interceptions","version":"0.49.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.49.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0b89dad16a3cb1b85e7facb58445f52b5ac75b34","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.49.2.tgz","fileCount":70,"integrity":"sha512-svRy+69UtkwfDVwZYMHcmbDc8IHg0xRlfUe9UM4Bg1Use35gbHCiZl1GgIto1vdEU3hopLLQT2LqLd5wnyxOeg==","signatures":[{"sig":"MEUCIFuG0FQ/BugCH5VAMoNOrzrtxf36t4q/pv0oIN9ZMmwUAiEA8205hIMiKdLZkwLIy2axVLtd+33/JxiDgz64rIFa6/s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.49.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.6","dependencies":{"@fluidframework/map":"^0.49.2","@fluidframework/sequence":"^0.49.2","@fluidframework/merge-tree":"^0.49.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.49.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.49.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.49.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.49.2_1633991047175_0.48087884302677875","host":"s3://npm-registry-packages"}},"0.50.0-41365":{"name":"@fluidframework/dds-interceptions","version":"0.50.0-41365","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.0-41365","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0b43f3499ec30daf52744e4155c60b86232af734","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.0-41365.tgz","fileCount":70,"integrity":"sha512-XYeNuyDiZwpea9n0fL8i30RIQN6HWcwUefjji+9n/EojTAS9/HGEoahlawlsQoBsVkNfU8wD/fhV6aQzTmhkDg==","signatures":[{"sig":"MEQCIB1LTV5iC5dh+56grryGENol6UIzWWCEgmgyr3tD33DJAiBK1bbqG1n6paFq9zFbiDeYxCARUhinM0h8SbSNSYm4OQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.0-41365.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"0.50.0-41365","@fluidframework/sequence":"0.50.0-41365","@fluidframework/merge-tree":"0.50.0-41365","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.50.0-41365"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.50.0-41365","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.50.0-41365","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.0-41365_1634835771457_0.6105345607057384","host":"s3://npm-registry-packages"}},"0.50.0-41540":{"name":"@fluidframework/dds-interceptions","version":"0.50.0-41540","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.0-41540","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ff43afeb1e1c519a5e2ed7b4ed0d9675eaa7dbc6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.0-41540.tgz","fileCount":70,"integrity":"sha512-JbKe1pskWU4aDDBhfhXzfjflcD5heZurbntg5ZhAGoUAbttgZqc8GbkOKQWuOGZWbv3G+y1+K5KeuQ8c5iE9lg==","signatures":[{"sig":"MEUCIBdCiG40vJf4OSwXh3IELsdkGIlr8jXJAOcQteFBJKGRAiEA+z9xHOQxeVFkCc7GrFTohhsLlBt3JeBZLHqotdRqYos=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.0-41540.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"0.50.0-41540","@fluidframework/sequence":"0.50.0-41540","@fluidframework/merge-tree":"0.50.0-41540","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.50.0-41540"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.50.0-41540","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.50.0-41540","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.0-41540_1634917918909_0.23074350807531063","host":"s3://npm-registry-packages"}},"0.50.0":{"name":"@fluidframework/dds-interceptions","version":"0.50.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8e5360c34b2ef3cf3fa494906556b76c85a670d7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.0.tgz","fileCount":70,"integrity":"sha512-VHTf+iKYQvgyrK0RCb7VTNbq4uXIEi6v7GE+kSydIPP1MGf9TYYcroaMrg0bGXEJTizPq68fX9yqY/pOzkjgJg==","signatures":[{"sig":"MEQCIEIWfzsrcXLSXz9O44nGhhRvFhWPRvo9Xc6/EpMOu20sAiAh9kAA6Eymx6V6JFHaBs2uAlQyVyI5OagZMmNm9mD3mg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.50.0","@fluidframework/sequence":"^0.50.0","@fluidframework/merge-tree":"^0.50.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.50.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.50.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.50.0","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.0_1635180664961_0.4527568234036745","host":"s3://npm-registry-packages"}},"0.50.1":{"name":"@fluidframework/dds-interceptions","version":"0.50.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7ead6a58d0221b396ee9d46c404e9524a0c7e4d2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.1.tgz","fileCount":70,"integrity":"sha512-g4ZG42n+/cXbdyyM+6nCwRWuoOTENVrbGLQ3nuPBrQa7rZ3AEcSiYe+RHG0+jAzKPSMrwuOwGQx5cHNVNh9k3g==","signatures":[{"sig":"MEUCIF+xMmyoIB05t94QDJp5oq4w5uBryj+ONXK91MdY8lwLAiEA0xLNrRCyyNQDORVj8V1Et9b1ibsqXDtEGKuINcbtR84=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.50.1","@fluidframework/sequence":"^0.50.1","@fluidframework/merge-tree":"^0.50.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.50.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.50.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.50.1","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.1_1635375355041_0.03734828371925247","host":"s3://npm-registry-packages"}},"0.51.0-43124":{"name":"@fluidframework/dds-interceptions","version":"0.51.0-43124","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.51.0-43124","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bb7b5fe2e43d5f657fb9f43cac11686166b32dd9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.51.0-43124.tgz","fileCount":70,"integrity":"sha512-zi81yos2nHP+S+8RctDQ8L6WM/r+xuyAGkcZX2d9hJ+nQ6uI7+XHYEWBTyAi+qV0D8+F+AdVKuDR6ZHj9r9YNQ==","signatures":[{"sig":"MEUCIB6QTo2AEiX4wkBJD3I2UfZS3Q0bOUoereN8CSgLa1/pAiEAwMnjzny/EkMSt3TY2nW+E5qL+uJtPaUpR1+P38RJnaU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.51.0-43124.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"0.51.0-43124","@fluidframework/sequence":"0.51.0-43124","@fluidframework/merge-tree":"0.51.0-43124","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.51.0-43124"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.51.0-43124","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.51.0-43124","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.51.0-43124_1636158440985_0.4072903654662796","host":"s3://npm-registry-packages"}},"0.51.0":{"name":"@fluidframework/dds-interceptions","version":"0.51.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.51.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d6d7632bf7c1d23933319f3d00c237af5eae6dca","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.51.0.tgz","fileCount":70,"integrity":"sha512-KI6wjOyt2PoOxbgT81ti2OZDntUkwMQTF8NEL6o2hDtwGuj1sKjQcuoYL3LFANioLjyge+FLlTMCWF4RxHdCzw==","signatures":[{"sig":"MEUCIQDarn1IPY0478sBSEi9762aPsjcNayx3okHqKlEu0BL/QIgNf/43gSGJ2K6iF9o2OQ3m6sRYntGrMlxhvDgp71A0Ts=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.51.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.51.0","@fluidframework/sequence":"^0.51.0","@fluidframework/merge-tree":"^0.51.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.51.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.51.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.51.0","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.51.0_1636582874239_0.9761953568072606","host":"s3://npm-registry-packages"}},"0.50.2":{"name":"@fluidframework/dds-interceptions","version":"0.50.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8d7f1108a3da2938a9526037c3fa34c5487fca84","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.2.tgz","fileCount":70,"integrity":"sha512-JuJj6tnGYuM9pbE0ZCMXLCF+r1eyDXxVKPSOY5Amc7Wzx9D2zx81cqjQxq9CFH+N98VNWjAa2GHeB5MJgou5tQ==","signatures":[{"sig":"MEYCIQCG5quhdroOrEruKV/gDBAgskPOPGAGadn7bDi7QYDUOgIhANVHkQuywcqSXgPs5nzfLp4CgWEBSAZgnf6zXqG8yRLs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.50.2","@fluidframework/sequence":"^0.50.2","@fluidframework/merge-tree":"^0.50.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.50.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.50.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.50.2","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.2_1636751635720_0.33750758392143365","host":"s3://npm-registry-packages"}},"0.51.1":{"name":"@fluidframework/dds-interceptions","version":"0.51.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.51.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4d44d59207cac81004ee0c76e0332473973a561c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.51.1.tgz","fileCount":70,"integrity":"sha512-4m++JapsimDu1XqrvHfh0EZeL0bcsg4vflOxeExJTEJldpYCTzt/r0hcAggNjjRyMsj8zAdRJmPY/SCUSCgOsQ==","signatures":[{"sig":"MEYCIQDSOOQudtMQbNW7kB0xTDoAslTp/+eq8lQJgC806o4PlAIhAKsy04wL80z5lx4VtbYf+xzDMAo/hYZ3FoDMHfzCZPS+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.51.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.51.1","@fluidframework/sequence":"^0.51.1","@fluidframework/merge-tree":"^0.51.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.51.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.51.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.51.1","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.51.1_1636754540418_0.7265755727297576","host":"s3://npm-registry-packages"}},"0.50.3":{"name":"@fluidframework/dds-interceptions","version":"0.50.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c0ec0086df1a8b300ab8b2d7dbaff07eaed69f8b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.3.tgz","fileCount":70,"integrity":"sha512-n0KPFfPnL2caEqRQAmbnB9jusLh7bR3WAijONPluuLHW7DhOTPgzLgN6+sAMk6vxWNq9v+VHgSxzHwd/HmyhvA==","signatures":[{"sig":"MEUCICSWuhtyMO7LhwTonEQ6uFgOixlNZrFsyM7U/kl5ymPUAiEAk3fOdBht20DdjVXOliRpbzmFhahFkoaPx2PHgiuWmVY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlsw8CRA9TVsSAnZWagAAFigP/1ZUtiUVLKVIT0p4CsuF\nsps8dEq69vyvgaNvJbY9PWJECMyx7UiQZVju22GSIbrrI4gxQk4ARV/hYqu4\naSvtFsYxCDouR1ExsrFmcYSGlzbcLoONlgj/hoEF7mznfpEXwh7CrJqgNKPX\nAUJfHgwLjjJTtCGa/A6PMY0dheKQcW8X14OychMHgmmo9FMKQ6N3Fs6FeTBS\nDvKpMNL+7YHOOoKLKrBLDs0udRX4HYnBmZ1IdLI0/YXFhYObQLS97Mb2yJnk\nI5tmAX/cCHhLPSen/weW7aVHlnLJhUGsmdoH8K61AvNIcAl1YXs1XgvhB7mR\ni+aDIKhsEbGDF/6ArAV98lwl+bM7ZpUKTlnDRnxKLAS0Vi7VgZkp+m9/+rHV\nwRna5G6sHoaNLX96u/cC9xJjV7tuFTSN9nS7ItLjDbFvN4t6pDopR3SNoUtp\nRVejokZeCKCUUsV9o6XHs/qRG6+RQ+CpUyAiBVkJakzE+TL+DWSVR8umeQ+2\nnaLcivuGdygDGeSyHVhgyCAAUNQl2NXEof3VdBEe7y17fmHVTUz+ZQhlsKBJ\nJn7gUhNH82bKdW79jmYgMK/T+gYi1fq2csI2n7zpuwe17bCN6kQOi5Ize7bX\n13ynecW/IsI/BPD3cq5DcIJKvmDX7OWWkNgy0ICFZlsH5FE3qEuMqyjHWtnN\nYQN/\r\n=5vzv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.50.3","@fluidframework/sequence":"^0.50.3","@fluidframework/merge-tree":"^0.50.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.50.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.50.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.50.3","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.3_1637272636270_0.24097105473647473","host":"s3://npm-registry-packages"}},"0.51.2":{"name":"@fluidframework/dds-interceptions","version":"0.51.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.51.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f7116c7f50032bcfa6092f02f1928932f335da50","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.51.2.tgz","fileCount":70,"integrity":"sha512-5B5QFu94Et8LI3u/gMZs89oO3CKKP02qhwLfAEbxGU7z7szvEjWMMSP9okJ89PVoPbF0LSog7i9+g0sz0MuLPA==","signatures":[{"sig":"MEQCIC4mbNQI/rm58GxRnkYblyfcOn+xQGGuPxUsfsl9qGCQAiB5V7akE6u0S+XA0MVeLKEu85oA3Phl6JDg7T22Fv1Wrg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhltg+CRA9TVsSAnZWagAACyoP/ipkLG2pZccIdcocZJ99\nZe6FU/0QjSInwXoTdIyaQ6c57NGSDtR96agnB3TLtBcS2tlSIw8JbvHzSvUC\n4yvoNrEctjUR7vc/pkkBOX8NKtcToYrAiTJYiDqgO4EBNmKvHLOSMeY2bsg3\nz/vBJCzZN/vMJ3AOTSnGlyLCc1Ot60UxccvntAudLVIOwtlxLOEEb4Sf9us6\nThy5Z7NrlYZFPj4YNrluqNHaOOxiW5u9LW3vnKlz02h6sDFkaVf31KIbeK9u\nxLwgpI2M1txF1lmukz86ell3TmVGwowT6ZJ2qIV8suMmc6v0MG0wMgAJtFYT\nyIzgdOgnEyhXs9dYEsel9+RfhHsho9M6wYcE5wKSLdl5ru30T1i7X3Xxm453\nuQNafMIa3D/gg3KgQsxyEeAseuEF4ruDIOlACVQIaPuC18QbRtkeqFbTLUrM\n/Z12SejN/P6WM7JuTX4M+8//4ASZWop5nuZxlI//T2zG0lXjRx9MVSIdDyXx\nx1Ry51JXVe+ZtF1nFZewrJLLfCdGft0iVmkDkNXRhYoqMk/vQ36LxdE+hTEB\nIf8wSJUvCMem6P16CCzCqsO4K95kKKYW2kMc/T1Zh0rbhsSMEDM3hWJyHKGR\nMGTQqEv4WUd+P+/Hz2IeR7e4YnGxKHcpBIplwokXRAUPCQKYjJ/xN4ecFOSh\nxxAd\r\n=IhnA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.51.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.51.2","@fluidframework/sequence":"^0.51.2","@fluidframework/merge-tree":"^0.51.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.51.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.51.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.51.2","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.51.2_1637275710063_0.36384100352100046","host":"s3://npm-registry-packages"}},"0.52.0-44610":{"name":"@fluidframework/dds-interceptions","version":"0.52.0-44610","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.52.0-44610","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b719aeb4d969345833bf368c5bdad6f01a004d47","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.52.0-44610.tgz","fileCount":70,"integrity":"sha512-mFQ8Nhl1M4zURAnLz2HlghuapadmY6KYuZHiryRJG7eF2Wq3HedKbW+ybReQ7JjkNLYlCXUGpao+Pwhk//w0Ag==","signatures":[{"sig":"MEYCIQCLSaTlGP2Y2a55/1GT/QR535HWDn8r/Gon50FWZJQYnwIhANANC+pWI2wH1Pn6g3b0PO50a0henzc/ipNLB2uViHq8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhmCzECRA9TVsSAnZWagAAxMAP/096K5lQc9X/acF1e7bt\nP+oABA5pmn5w1HffIqHoJLwevuv/NyU4cDeXM7He24k6pEw8u+RZRULSU8Uy\nguJF7mBjCtsWaong5PCzrd/tN7xSDZjdnd4ycnmST+bjc/QkYLwqHt97NymQ\nK0fbfMs/My2nhmUl0hLs5f0G2evFUzWdtZ+PLX3gM840+1KyHbIOZZSjxwvJ\nxncheW/ZdAjWJIAGUC4OeLtl3FGpUFVhzU5Mwayr8cVONhcnQF/qunaoI+o/\n8uZD30z8NLTKvuCBFae7mGxCJtUduDUnCoxiOGTZNGghlkt5RXMle54cIB2P\nDFBBUNRcFcoYToEkD/3pbwXtGXIaBAnwRbAcCYsTwyRCmru36CQMcCKSAHfp\nN5SQFAeeEa5XVrcsPhl7Z7SCOIi+EtFyJw9SiQLV0BixfCRnL+J35Xp2VelV\nX9BG7moqRXR3qRQm9L8GvIARG9DKN+bXCZmzsPndKHTB6bDAZoxA8+rILhrK\nRJ7780QXiXW7T2OiRELhTtQO74lAgLAOBOmrlXOrlpQi7TSLOPHkb7ihU//X\nPnEUmwFZjJLAUVo2owMan7oiX7BNCTd/vhLlUJVhcwFOfll6NDzFVngbxHqO\ntOApb88iEaFqYqDzRZfR75ZZb9jyKZs+mccz3O9jA+AwIddXEk4kf3ErqrS4\nCumS\r\n=YB8U\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.52.0-44610.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"0.52.0-44610","@fluidframework/sequence":"0.52.0-44610","@fluidframework/merge-tree":"0.52.0-44610","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.52.0-44610"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.52.0-44610","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.52.0-44610","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.52.0-44610_1637362884600_0.2613767448166462","host":"s3://npm-registry-packages"}},"0.52.0":{"name":"@fluidframework/dds-interceptions","version":"0.52.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.52.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e380f4d448c1c65cfc6cf6c1b1a0b08a7e73fe1c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.52.0.tgz","fileCount":70,"integrity":"sha512-2hPShdkyNCik46r3Xrqt9YkIx8kd6cYdvNkp+AOSKGcYfwjxNwO+Ken8DhywQBTHk3qdhd1+kRoZgRNaurEmgQ==","signatures":[{"sig":"MEYCIQCptIqyT5JnLbs16npOoKj9rZ89coreLxhdrBz9Tx/gjAIhAMJisaiR0atPGApZU8mL58eUM8D7Oskvh4fXWeTeGs8U","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnBe7CRA9TVsSAnZWagAA2tQP/2ma6ppkyZGVfBl0sxin\noNnzWZ0hDL4AU3/MGWyOMPwPnW8OgFlLOAuKyTh1u09Nbqy/WcGO1wXBWJcR\ngg6KykcZIVPhHu/kwR5Yjk16CU1ajvYg4bC7adJL5wdgYw2DUZD7VJNYTFfg\njTfrK9j+QgbgfcIIUiM2ubIsIP2/3H1itYaD/sYfNwKW79+NT1qNJCZDwlhf\n4QLRCfoMT42teFkBvSJrUrqYIPzPv9sPaI+W+xsAgnuiq9QUi6pPO9pWkgD7\nA5BOq9oEyy6VEotYYGtqFjqwR8z128Z7ZvShlEuRMjta7f7fnZHp4oRwpMpy\nCwg9HePNTfuAVH11UB7lRZrtRpvMgVhK8fDuO5oNwx074xw2TLWA/8QlA8rp\nvMJF/l3G+iAwMTcdeaeKEPyszHA5hRGUDUPgZxYUYT3z7N+GjeaxXFbd9VDP\n51wZSbuf9BwwxDrV8/3K9NdSTlVHkUlLuWqbcPF4pFCxIimbVe/DQaQ0aI/H\nWsV2qPsMVGGbkDJNWQjmz2aCiUQ0ZrODCkHKTTihlt2G2HstzC/jWF8PJyAY\ni1NKofljjOVydnlaanEKjs898tgosqnJH4TT+o9l/sYmW3AfJu48AaLu+4ge\nQ9eR0F8uiT4QyFmA8k951656TCyiwBnjJapVEBjxl5hyL45G5JTBMp6ThCfd\n6VBV\r\n=9ut9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.52.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.52.0","@fluidframework/sequence":"^0.52.0","@fluidframework/merge-tree":"^0.52.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.52.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.52.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.52.0","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.52.0_1637619643691_0.8131631615608201","host":"s3://npm-registry-packages"}},"0.51.3":{"name":"@fluidframework/dds-interceptions","version":"0.51.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.51.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"eeff60e8b94a170b5594ba9671a30bd353017a37","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.51.3.tgz","fileCount":70,"integrity":"sha512-eGGtBd8VipLLbknU4bx+LN5KG7Dx0CZJz7rEZSDIw2DJ8WVdetw+sBRhjS+YGONn6W4p+yLsGqOvWc1TAz6U9w==","signatures":[{"sig":"MEUCIQCNPtBsBl9C5bj71xdlqvE6/pJv8EBXbhI9AF9UXIhMcwIgXc0X3iIRt33/V/7bkCVw60+FiQjAy9d2fEBbhY7UxeI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnU9BCRA9TVsSAnZWagAAkkoP/3iFbxLtIaWK7qVd6HlX\nGZHu+J7yg71fX0fhxmFmtY2ZSKaCONEqCIj8J/rB8X1fLZ1c0g6eKYL4pcbH\nnCHgBkr1Qw+fqRPg12+n3xJ6ZDfjAPDvvepQLlrrLfD8Y+f5Eyg7um5udV6e\nqo5mjTCRHng0DExrbjzDM8wHFvyeeOotCdhwewd7bSHjbb7vNgKcNt9ojIHH\n9qovE44pccWSXY4D5J0pmsuooBpdAINEVEJi77FTaiVRZd+omvtUS2u03m/D\nNy0MvMjZxq8oj0aC3RK7AdsyRi6anY5hedSgYbm380Aj47sa1kacCeH6XuUj\nGV4Zb5CsJVn05qstO+09hw53JWZaQtTnmAWUcrvxQMQ4CzV4tXXSweBi8Qvs\nQNgSJSWes7TtRGg6lgpvSgG5ATjP9Ei1XbGxqEWQozHjruUAzPazNlEGTUpN\ndbTWMe3tuQEZTwVtH97KAkaeFXM+7M2ZdE08+vL2t9kKGtCFN3KVzOL5dukH\nIza7i0VfKNPT3LHyoMHWKFkw2b0tsBRzplv2gu286FKCQSqXFZGwfN1djNDK\nfyvAGibsA93yr0AQxzU3URZPxtF6K/NmWBqCF20Tun33AkyLXYMGN9gnNmUL\naVAmstoIbStIHX152qpU0M4RocxkrKBSM0e6bWe7Yqn93192h0faqThZKZUG\nIUlF\r\n=cu5D\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.51.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.51.3","@fluidframework/sequence":"^0.51.3","@fluidframework/merge-tree":"^0.51.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.51.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.51.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.51.3","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.51.3_1637699393627_0.849531224796199","host":"s3://npm-registry-packages"}},"0.52.1":{"name":"@fluidframework/dds-interceptions","version":"0.52.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.52.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cc079e0b002f5fcf9e578914b879aef3206eb206","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.52.1.tgz","fileCount":70,"integrity":"sha512-GyX+GK+IAXSTSVSX3pZ4o2dqYnBxqaZNtdB9ouSBwla49IU5bV13v7CL2fDkjhFx6ItCjMFSAWHvFzHdNTKu6g==","signatures":[{"sig":"MEQCIDKESGBU/S++rNHi2fCA3vBjg55T29CA9b/iWYWSw6BCAiBWPrnhoDiQMf2f4sdfONciMniiWkzNOoUgzlAE1ey3Mg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnWG/CRA9TVsSAnZWagAAr+wP/iLw55SvsQ3US/qUBO6G\nL5JziqNPP7S5RuN2UyVxOE595CrhxGzt/tqmiVvv0vWy0LAORIoqsd2ug/cx\nkstGnbnQfxAKQJMJK8fkSZyU+3LA3ToM9hw6Q96m6OoMKyXmAXbfBsLsVjlH\noLE9wkJrJwc9c9I3lraHpIZx6AxTiQc+/OPZxUM1kzyKHckcnfsWm0dD8OSI\nrhi6P9+5pt8Ify77mNtZSW6OQP+r1aqBQ6UEPfPCqmvEjxonrDAuLHZv8w+/\nK+ejcFDuwJRCpJUtuPDxeffNkKBHW1usxUzvUDS7J0gZ57d75s4DaQ0fdT6C\nzpOyXkYmLzDkxxMAE3p43CvX2WQwjetq0q9Vx6fpsW5u9IsR12EDeCQ3PRhm\nbZmmSr///rbpgOsBDvW81Rto/HA0qpNHtibIJLS4y5JivKqJJ3YQzlyCIuBb\nhiuIjJFVJ3dRsYbL32AWfwa2st8TP/p7cOn/WikITu5xfD+rYHL4eY3ADXq9\nrPN3blzCBgY8w5xoZ+JDkTjgrrKk4zUTCOmvAKYYHEyFSZXchD+ZAG508RQI\nkrN+qatMaXtAUiN4CSjPUGnwyD5rvUonK431bHa3JgJvO1OflTen2kqKoa+h\n2txvNx35b2XlXr34gBZntbZjgSf1taaZX1O5AO47WiJl3j+fUZwcsyuf4qUa\nY8nH\r\n=9hUC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.52.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.52.1","@fluidframework/sequence":"^0.52.1","@fluidframework/merge-tree":"^0.52.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.52.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.52.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.52.1","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.52.1_1637704127827_0.15056458985111698","host":"s3://npm-registry-packages"}},"0.50.4":{"name":"@fluidframework/dds-interceptions","version":"0.50.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.50.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6879fb70dcc58d4804a749edc4923eb5f9205b07","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.50.4.tgz","fileCount":70,"integrity":"sha512-9bl9XguK7w1UOFO8/MaRcOos/CJPnzhUKwTjMR4Vkq6U3r6d3TCbnUeTQrhQpTYXdMGgrpegjL0a2jYzb4R7tg==","signatures":[{"sig":"MEUCIFgOkz6hgIhvZER+I4MniIJW67gSl+thuvIxjUUsgYoWAiEAsJ7N6wXWigMY4kR/nE+ASo/lEjy/pSt0CRhFCEpcWWc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnYQlCRA9TVsSAnZWagAA6AkP/1fq5b9li2EdRzYFfMar\n337+4cdaUJTim6ZIbPp1QQtqkPrkDs7mEYT4TxiS42NsRtDRExp02pF2PuuI\njTSQ6EImRWpZgmJY1I+9YpYN7FMQYdhwyDh5kLg73ms/jWXxfjQfiZqOPJJe\n6kmzYz8uUVFSqTtWKk7jsNAIp2Av/PlAz52SopYju34e3QzxEAdZDqSzRiQC\nZ/FxVwaCr548HtlocSosZNsfoD03Sp7CQYmv7WkaOAZacWZA6tT+BbCm6loJ\nNsGv2qnApNg9y47xo/nnp9OokgVwV3O9q17umYEumnnFcteDaM8+D6BEhbav\n9beiOhrqGxexYs1Mxn9uO+Gss6Ar+93sapV9BjkHwyL3/wzlWD/lJE3rk+GI\ngW9+6dsrp23VGkK3RQIhNBFY4xQMpTZhXtLUlxDT/xwlzc4S3UDfkjuN2xMc\nlOLg2yb4NgAEpqCt2f/lb34hW4BHsmQV5UGcFAH8JGpJCXnpNbo5AItJNZyI\nGevHRPpzm7jK3cHKuV6lM7BkZOf7ay4tkePpHA+de3UPvgeNOO+T4ALqaxas\naSclyd7Ft6HKDv5HXfCstB+TTQ/LN6hhqOy8CehwlqaWcvHaSJVPxNXnuVn6\nGhS60OCzMMOxyadtllp3JsKnBaQmzD+MEGHbb4Z62/1vDMkW1LHHvYOnPsj9\n6C3k\r\n=LC3J\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.50.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.50.4","@fluidframework/sequence":"^0.50.4","@fluidframework/merge-tree":"^0.50.4","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.50.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^5.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.50.4","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.50.4","@fluidframework/eslint-config-fluid":"^0.23.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.50.4_1637712933843_0.9340779253543245","host":"s3://npm-registry-packages"}},"0.53.0-46105":{"name":"@fluidframework/dds-interceptions","version":"0.53.0-46105","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.53.0-46105","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cb6b9a976e3ac3495ca5010e619d40ca7ce009f0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.53.0-46105.tgz","fileCount":70,"integrity":"sha512-B0qkiMR4vbeWtUFK6sbWdqjwJTXwfVA6z2FZI2kAJ6D0MKUYLm08QCmSSbxTNuA51j0vR2sdKwz3ES9TBBLlfA==","signatures":[{"sig":"MEYCIQCpC0SEanKtGbRV0FnnJZLAHcKYHZG/enxqM3/OUy6gZAIhAKNtU5clmhHQ/zCgZkjw2b2BOvTQmeuFZonfPbJYWw8J","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhsTreCRA9TVsSAnZWagAADgIP/2YQ/FHwKEGXtYO187mt\niWjE5OPYW6KXJMrvxFuwknzOf4GcDIGPCQe4FlZBWM3ipkOOTrZu6uI+i/Le\ncwQUECSI2nS6KiCTv95cWevjVqSMn7h3l2Tdneu5FZa0h3REewr4pdNsM9Og\nBuX6OCLhVkbNSuzKDAWZlPvqVS72dj4OkiRSsCt8s+JeF6A0mFs7y8HgydUK\n0hnCtEgoN1VaP4uV23pDSC8CeV4AdSDHc5GhZi5cIZ2LrjcuKtBAgufRUC9J\nIxrX0Drkl4xBd2Bo/NL21fiOmxW3tC6b7BvQJe22zCmAKVarSfZ9kz66xLlg\njDpklnts2KZW4alLYhuCxH8WvPZwairyOLS3MhjeM95ikBlo56bfv8eK0McZ\nIVZrGnQ2MwpPTXlDuTgYxc03ML1567Fc/9c1E43TOuUKVpHtKkcSuYkWg6+9\nLMI+62+wHzir7rqrXOgkxKUispg0v684PN1wH6UIZKuNLr9PkcLwHHB86Hrc\nMWPSF0Fod+nEg8uUsI2gHPsK24gedRY8En3Ihv0zDBs6X5WiSyed/sgIZiMY\nkUUz6nr5SyzChbv+dZFgh8knbA2icD8cd3Iq0vi+DL/ZSWZ+zq4Ze/HAbOsq\nDgW6iP49EqD5DGryYhDKDjkxpqkPNMq9hilqYKXk7GyGfswb5JmOV1Dwbq0W\nQQZj\r\n=Aqa5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.53.0-46105.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"0.53.0-46105","@fluidframework/sequence":"0.53.0-46105","@fluidframework/merge-tree":"0.53.0-46105","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.53.0-46105"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.53.0-46105","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.53.0-46105","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.53.0-46105_1639004894514_0.6725334796619906","host":"s3://npm-registry-packages"}},"0.53.0":{"name":"@fluidframework/dds-interceptions","version":"0.53.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.53.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"61a9e2926431ec5b41b34c873153226942034c0b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.53.0.tgz","fileCount":70,"integrity":"sha512-bCuARvvnS846cM+yLVdPRC+2aa2B8K2vXXnRGnFSDeW7wGAgA/ufyYA+xC9rC1l+h2PXZJsP4FkZqOEtmUrZ+Q==","signatures":[{"sig":"MEUCIBBowtFjE6ER6j85aZtmN4yXGbqf7CmiSBssgj1+2eHxAiEAh0+thzmC7/OsIYYvusVfzLfZ6MOn/wLxfkRxotI+rJo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhs6RFCRA9TVsSAnZWagAAFSQP/280qCbMqSpkEgjL+HF+\n9NteBI5M0F1m53m68oQ/mfWZRHYtgH2Xp0obxToXzKVE9KH7FO48AmIr9DnU\nMwfZmFnq0wy1xd6kKKKXI4/C68SprRTAlxFJNoc2W4NI2fiawXz0rjHeCwLy\neYAM3kGGyEMA7dVjHGal9bmTo4ZpKFL5sqtSPvF7dJ7+bvSNYGcnayxJgzNv\nmAO0T/ZKquyLey6zVz49wLZF2wOZj2S9dVo4Y2oZ1iwCUVQ2y/2tgfiOkKjb\nfVV8s5UTDXblRZlUaQoQIBILfI5DQYe3rFOdPS9QsSAv34NZdxWqSfdIndq8\nxcQ7EFnjjtMWLtDgAUX+dB9q9G1MW//eu0Ehib+EBQciexGSV7SCTH3K9BfE\nB8wbVqhP60o0Dfkdu9Bj3Bxd4HR/uPPbstmohyc7CMB7yIyXevsl8BoNuqWj\nWEhxUOETtfH6+fLnAOwAo92MC3s45ozCpXapxxRWvUPyz/7waPKrotEDe7h0\n5JZEdnYtnQ1B1+4v8ic1tS1gZXyo7xADxVBTxOS5/7k6WAI2Z0h1dQFNn86x\nBPP5g0dLtv8qWSsIBVlQgWcBNiF024JhkQjH3ACH0v9jUSXi9/vER/iSldyE\nVd6ztDWwp2rx7X7m2sF8GZTSaXez8GCoVp2UmfML/7ILU3FNBEFMXT4V0rev\nGvZr\r\n=b0G4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.53.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"12.22.7","dependencies":{"@fluidframework/map":"^0.53.0","@fluidframework/sequence":"^0.53.0","@fluidframework/merge-tree":"^0.53.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.53.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^12.19.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.53.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.53.0","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.53.0_1639162948808_0.34659189194881335","host":"s3://npm-registry-packages"}},"0.54.0-47413":{"name":"@fluidframework/dds-interceptions","version":"0.54.0-47413","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.54.0-47413","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7ba96905239ddd691b434c7d93f9a872d0af4bf4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.54.0-47413.tgz","fileCount":70,"integrity":"sha512-2AeTvhGehptEtm5oayINwG+XQV5QWW2X7Q1WR5FE7XbD7qk+vlAj134s6JhAi81ArVwN1fbQzELixfFwj31Qfg==","signatures":[{"sig":"MEQCIBpKJxWrE1dCHf2Ou8k/UAak/yDsGSk1Q9JQMzlX+mVgAiB4K8L/QH+iAa+h2bui/IF+AN+C07g5pompXJfovNgzRA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhzK1yCRA9TVsSAnZWagAA7twP/i9aGPescHjkUeND/9ih\n94Ybr6a6L4pXxB9yL1BiGdSovtjNUwQNkmBKLtZUh62n9jwIPmEX304kkleF\nlB7YipSLfrbUNXYdVtHfSWhlnKWlMx9ypUGErPoHdtfbyD7lvR2jYd4btNP+\nHI70KwEdDVkIQoHifMWf3XGlOPTrWt3iC9E1I5fSaf+nDaVibsEmnvvSfE2C\nCooJpvuLXKVgDxYzS79ZhZKoC6ckFbE3xKg+ELHK39J1ABxg9pxlIi0n2EOW\nP0Cqhx//4WAYTwepKOAJJlfg/xPDxe8wgyCr2NDkLP40X9/l+Ojru2YLrGYB\nN4FlMB91xUawNGfuZoiL7xzRcMyEKTAryMZZznsqvCnPdaYurotVmW0dmflw\n28xY92Lu1bnQ9757fhdVLdRKBACx5KrCr9ufV0pDohP6G0Cbtp3sUI5zb9/D\n82Xd5Vi9vgek/GMjwXKzne9OIOI6oDWS0obbGKp9/JToXrfjGQwyMPw55ZAN\n/HErMeIAmdr+4TA1k3QWEfs/lIxqHw6Crq1CVwj2VFBEIRdNQbohXfwf90qj\nHXrOYCkXvt3Iaj0lsEajbL5tqtaLMoKdLuLmERhoZP13heSuKrR9hhMmaPEV\nx3Bz7VhE2zljconc2LO6VjhpQM8HygW40n0E60R5OPWep/s6GYWYxw+yLYhl\nqonv\r\n=6qCA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.54.0-47413.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.2","dependencies":{"@fluidframework/map":"0.54.0-47413","@fluidframework/sequence":"0.54.0-47413","@fluidframework/merge-tree":"0.54.0-47413","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.54.0-47413"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.54.0-47413","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"0.54.0-47413","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.54.0-47413_1640803698132_0.6493282045852682","host":"s3://npm-registry-packages"}},"0.54.0":{"name":"@fluidframework/dds-interceptions","version":"0.54.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.54.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4315124190e4ac41f1ca4f171c145833b81fb632","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.54.0.tgz","fileCount":70,"integrity":"sha512-bA4xjFWdn59WnQCaTKOvYZs5Ad+co0xQyXAkiL5Ese0aaqK2DZzpOvVU+FYtZinJz31R2Q6vnNVFZ5aC1NWlJg==","signatures":[{"sig":"MEYCIQC/GryJDo+KQWmcgjpH9JPeXLMG6sUWKlokYpV1mQ8N7QIhAI5a1LEVSkXqozBj6WedphvBTrX59WYUyv0Tp5PWp29x","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh03q1CRA9TVsSAnZWagAA/k0P/0sBXumZLBL3JWFHTRM0\nTsjd1YjoWaD9wPCTwg5tQo2KXVcRwuCvdQFI15cKz8PgcCdFROgM/uCYR8ta\n4qW+l13efOqAZg5YzB7e4gYnb7gaZdcz0R/ZhqsUADBZKOWmeJJe3vrnSwiV\nDgvDr54zKGrkblhwmdE1WOJWa2DM7UAM6yGwTdaMxm3sNst31PwoT4CsRt93\n2IyASEVolcdSeC4ROWreNdmkFslVLvpRMiX0dT0XSdHmJgzxHUCh/1YbliF/\nyjdLTvOS9rB+I9o5P/qWr9z7m4ul6tRIzgSPO/N7bOcuE3oF/Y5et0eNqZM+\nDly6UeVZtjfo/mYtLNU2JZ5Rkod+qIKI0G410GKkXqC9QaGPXnnPRF1OsQXY\nbSdMIVGgpYU6Ro7/Djf6tBEZtd6efVDcKaw/mF4wWUmUJ39hkWPMGxzT7iBF\nenau3653H7NXfGp8GsyWE98R2ENHaO9GyQLA+dMbtTQKD3bL87BuyXJ+VkUN\nFw26QJEPOuZmDRn78teHIx+hnzHekgp12DosyqY+YrloFuGz11MV5IndTEeY\nszatQAyh7xPslwcDBKWvqvNmgKJiJOOPdeHWGpBt9Ls3P3abQiYEkY2TABRB\nRcqKFxnTqPquIs1p48SsenSyI3zwdtwOgq6KH2Sk29uk5x7GAegwYLiYsXZk\n92Hg\r\n=X76c\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.54.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.2","dependencies":{"@fluidframework/map":"^0.54.0","@fluidframework/sequence":"^0.54.0","@fluidframework/merge-tree":"^0.54.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.54.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.54.0","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.54.0","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.54.0_1641249461049_0.436632566627819","host":"s3://npm-registry-packages"}},"0.54.1":{"name":"@fluidframework/dds-interceptions","version":"0.54.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.54.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"397eb330a96e5effe4e125267c322eb1e5b7c5e3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.54.1.tgz","fileCount":70,"integrity":"sha512-35QV1nc8CDLr6dZlJvT6rowowq4CXKDYkWe/W0E8PnsfmBfiy6nVDBUTBd0kgY7iN61YfWpknnyi624S6JSebQ==","signatures":[{"sig":"MEQCIFKomYzxAdCHthmZI+M3LP1a0Cw29mLHzG8NcNXlz66UAiBFdnKQJf2Ox+Whvw/EoTXdmZLTmgF17YabTLPx5y1k2w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh1hYECRA9TVsSAnZWagAAkDwP+QEqM1SJ736rdJAbaUEZ\nz/ZyvsKxyU45CYr+JO7yaqa7W9gXVF5/GPfW8Pv8XDBQ4GlQGk4DJMJla8vH\nUlkg9u/434+oPuuHGkr9MOb0TvCg53PIp3Bf6det39BvBT1Y9fVUITf6fpmk\nGBdIEILy2hyISPXwX1pdllFkxeSXy4mnjyIF1FCHMemmRbfupmADumgfgGk2\n6nLnOCo0bBk7ywc3t4FRgrWudAgT78s7e6JmWT2RmcZ1D9ZGDHJJBdSpBZd2\nNzMwUtzgiRRZzQr7MXhGUiVAeEz3jkreUxPS7dZfcJl9mDs5VtUxCDkX0Mk5\nu7KF3uq2K8QzOovXdi1dfBawOyxWDvylx89z5vOLpI34nzvSg/eVL8Hf9xoQ\nrjVowTvvk5UeZecNEwRCxl5STfxoBJRu/nKISHhtxDjVTAiDMqLlh4f419+u\n+H2CkoZRGL6fQGMGGoo5McTUg7/P2ZOu7rrIv0lRdmslsrsrvHgDlxuntnGi\nu+VJ4KZXhWFv+ViUqgOiZC9F/j72n+hWFWf0toSLcmuuE+lZeQvggNjf/ukf\nHUCa1f3oIDRQaZVKPeAp+CYjjkJ6+Ee9l4r6KCqHNXukkO5DG3fB5bbQM3dq\n3kaVfOGvmkz9DLwGcfTPf12CNhuaASIIOavkasDLWOPk7dutmZgk1FQbSua8\nI+L7\r\n=8O3a\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.54.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.2","dependencies":{"@fluidframework/map":"^0.54.1","@fluidframework/sequence":"^0.54.1","@fluidframework/merge-tree":"^0.54.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.54.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.54.1","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.54.1","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.54.1_1641420292611_0.7459931222511695","host":"s3://npm-registry-packages"}},"0.54.2":{"name":"@fluidframework/dds-interceptions","version":"0.54.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.54.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ec9a1ffcb85897a6706e2e07cd2eef288fe773cb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.54.2.tgz","fileCount":70,"integrity":"sha512-Fqa2L9kQoN9HgtDdbTCEDwpNToPmtGSm4ipqTQkHWCfDEvvk56YfjHuKl6T9YHcdmADcQakFToMTRK26QPwIBQ==","signatures":[{"sig":"MEUCIDy70fqnFRsItb2HzS95PIE/mjTFIw5TYZ7pE4WEoTy8AiEAqF02SfBI06iZm7yB9oEdGTUAxfoEd5ToBr8Y//137Qk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3e30CRA9TVsSAnZWagAAWeoP/0W0xH6n5ZZJQ4MZPRJh\ndPix77sbJPd/acMzBkmX4h/XLhqwZ4xVH/xV1pfPdxBsVeBaqnT1O3UmJ8EV\nUmZVdEalUj49mIU5N2/gDt1h5fsE6nq8Hst7lzkHoEt30vFK3szo8wZbfb7L\nKRWqJ7Z3RzA2zJd3wMdCpvta/LISRKTn4mxuOb16+pkRLKoKdWRqbz6pz7EG\nmX28c57P3w4nP2/02aED6MBeEFybD9IG4B3gB6p+u24vx+KJLFxgsuDNT4KS\n9eHDRQ5bTXrSKHtnmTreAvnk3E9haLb7geHqylnO4dy5xAhil2IR9xuyDPLT\nQ2ee3RS/XSxE36lzbKTzM+CCbCsZt6qduh56pfbskNe/NoOLyg46StvRQYjG\nS3c0QukTM8FPDdVezRgG9X8slu/PUGW5MuD7jhKdDEop14vYs/E6Hg2pnckC\n+FymSI39MxTpzgy/jrWZkWNbhuDpbijDZLbsqc0k5a/6hTx5mH4gYTatp3C/\nq7iuoOXKWrGO8nRbRGNVVM7TwcaRtZ79yGJ71rKBJDX8xny2ZIHwAwdpiFAe\n2rCQfY+KAfXwSKVk5fNKqEZj8dXC0n2RpjN4bw+uKa1pKVBcjdPVuYExWJwc\nBJqf+LReRlh5DrPBHGvOR3Z77AkB8CZaH22SFmlrzzQpz8FdFlGTWIX2/G95\nEXA/\r\n=TiPz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.54.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.3","dependencies":{"@fluidframework/map":"^0.54.2","@fluidframework/sequence":"^0.54.2","@fluidframework/merge-tree":"^0.54.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.54.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.54.2","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.54.2","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.54.2_1641934324385_0.08522459849116681","host":"s3://npm-registry-packages"}},"0.55.0-48551":{"name":"@fluidframework/dds-interceptions","version":"0.55.0-48551","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.55.0-48551","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"15ca46e1bc6002bc34d21f4c6b5a44a1c2689065","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.55.0-48551.tgz","fileCount":70,"integrity":"sha512-XBekWbXBOEziR/1mzuFzl3oyYDYoH4f712jINWecR+GMVBnpeBNFdFMqQmAPMZMg2gwEs8ac/PLrpFKGPfPsGw==","signatures":[{"sig":"MEUCIH5JvjF6hYnZ9sGFumc6pKHO6FTQifE8VI52wIg11BM5AiEAldqDxRcWieDBfEdcEhgL3iOUzKWp2L43iI4uiBhESbk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4er/CRA9TVsSAnZWagAAx78QAJAf7MygmIi4XOK4/qyj\nOG+NUH2PLkd25Ael5H5Nq38XrL9GPYYqO5rJNsZg1H7uLw4ZEguLpailowed\nUPEXxogScfmKotaF3vChurZtAEPM/Y42tdPe1CPFAAL7qAEiO23KNW7uywls\nbvg0+TWem6YP8/QZooV5Sik0wN6gZiUTywtirtVrUXV54GZjtq07KKJSu+CL\nyOqmOSY4sJKBxAy7WG3snt0vQZGdqyb0CoXLtaZ050qiobbalwHlidtQspO0\n3sFDuGPle+g0MXYVQYnpSoKohZNjLAdFW8T9v56+GQDucd3vzlweMdQu0FzP\n/wiokI9I743Ga6u2DfHRU0f0Xb4ZApKteNJyk3q1I4N1AbrzlF7mnXWaUKOh\ndKWGH/H1jaywp5JvgzbHtUu9sUtr7Kd2hkXxIbSL9czi2i0gmOj4OXaZ5Q2Y\nQcn2WMwA8hjiOBAb2YCcSEQ1l4QwHvaQJq20zKz/WdprwJ6t3UK9gANOeEi6\n733TBy9Q+hxbRSmzOSrN3ORYdBThBXdx22LhJ1Cf+esb6F1ndbzGVxze1Ur9\nqfqpr5M1qry/bO3oSwpL5K/qkxIbQZtByKhOTaVd1YIOCkpmXvN8BzerXi5l\nt+Qa5DPFGMdxiekfR9XKIyteDXdIQiwxqEWeVhkq8QqOxfCLwbfW5DOHhDaE\nITYK\r\n=as84\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.55.0-48551.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.3","dependencies":{"@fluidframework/map":"0.55.0-48551","@fluidframework/sequence":"0.55.0-48551","@fluidframework/merge-tree":"0.55.0-48551","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.55.0-48551"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.55.0-48551","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.55.0-48551","@fluidframework/eslint-config-fluid":"^0.25.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.55.0-48551_1642195710849_0.38385795234899733","host":"s3://npm-registry-packages"}},"0.55.0":{"name":"@fluidframework/dds-interceptions","version":"0.55.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.55.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"16693bc2f8caf9e39f4e557840f1dd0b84704dcf","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.55.0.tgz","fileCount":70,"integrity":"sha512-HXtqAplOouK46Rj70RxduFkSWhVhx6y+FZapTygC9xU/fhZEd5YbThWi+ulkKXADzqwUZy47SR44ir3ZaDYZzw==","signatures":[{"sig":"MEUCIQCGyOSeJOyHq5DtlF7kOm+dOvUQ7Di1MC8lDWAlgnpULgIgT2pw/pO9i0+a5+lup98njdoO+zYfJLP2GuSGApAq7SQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh51DaCRA9TVsSAnZWagAAI5MP/0p1XA6Xf6w+8A0Ox2dz\ntco/YO5llO9oSfvTdNl1ZPDHRaMgi3NyMj35ApLGgSC3LVqBBNHzPOoV/MmH\n9RgVOsHdB1gFr/1COsLR9mOcBdHkSAHJrEkz9CR/4oj7JAMXTEJfQPBID/AM\np+JBsk/Xc5uAdpFLLLT0ECqE6Bbo5tP73aftuD82oSjhWbk05GvEVxDLYJKr\nFoFMK1opUXw7RCBEkKTE3sheSSJ1qK2EYuGXGEKlgGn/iOsItT2Hr40lhArr\nHmwCTfMvoYjeycdAQ4lZw4zSeVg4Ff4xlEhehHLuJDO3KjXB89/f8QXiZ0/g\nmWaFVhFlCJ6PNB2XYSMifhRiNnOmAIW9b80vEUXze/Im9CvpytacD39jK01O\ncEANsWE7ykDIhJE8gvutdx1cl3iGIGtmO4qrJgE0HKDzaiftefoIZAzJesg2\nj8Agg0wLqqk9NDYTOTTxtsuTlDVVuYmY+77vYMVe5ijDGE/obkrDtj9+P8jz\nmHr7hCCKjrM1Z/69oSN8vc5NAPLjLWUCHEh+ZFt5b0n20eMUhHmY/R+m1byW\nsPHXnsrAWL5eUczi2XrzXUGMDZ3lulJljHgU8VoZKzRILEqKI+iThiS8BZzi\nQS2k9fj437KV63RXUHea2qaETIZhBY8wRH9Aq0JQxg4kCbfKQZGuoyUG+e5Q\nxOPj\r\n=/a/w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.55.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.3","dependencies":{"@fluidframework/map":"^0.55.0","@fluidframework/sequence":"^0.55.0","@fluidframework/merge-tree":"^0.55.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.55.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.55.0","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.55.0","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.55.0_1642549466413_0.27531378257174355","host":"s3://npm-registry-packages"}},"0.55.1":{"name":"@fluidframework/dds-interceptions","version":"0.55.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.55.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cacdcd2fb927a0068c0ef7f4bb22a966da2656eb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.55.1.tgz","fileCount":70,"integrity":"sha512-/SRS4Wq/wSknc6lH/h0yrUI9X7pAd8IemoifY9VVuuF6y01ifzCZHwx14NzoqOBJ+UvoCptMyEkVzM8Pz2N2nw==","signatures":[{"sig":"MEUCICEd7vZQ4qjwDMuvgaJYRq0fI275kq3FuLRAJFAHxajzAiEA1fni0DsQ3MQNTfhyhuVa04ilAgEqQrijCMPVcQgRBHk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh9D6cCRA9TVsSAnZWagAA0MsP+gKn9UbfhTytTvHKIf9Y\ncOfMJIHjv/WPfSlpPMjya2PGhvc5fYEdlNZHC+2NAAS90TLAYDWp+o3qreU+\ngHIP9k/FMhfwsHPQZqXYw2gU/lXCCoV4/CYetKVNUxnLQaLcLgwcGtOGocQs\nAbQ5po457D+TbHCPrePESGeCFCmDOHrPD8rLaik2CJyXku6R/5rEctvJB36F\nRBRZsSueso5T+bvW69J+ZLHI3CbYK+752UTB39nXqoVuhpnBJBuTgILyRWIP\nZiAmgXmeGneEeu56/bjjdBY10YLe35r3mwUHL5iobxiQLqDoY2A9Gi5bQBFU\nTuMIpSYO2QjfItWSM1GA6jDx9jYRJ0rm2+hbvMXLIh6WqZ2ULa7VhasPZhUK\nuf/TZFphm8OH91Nl4reFW+cGmY6Bc72cQJz2DrAJrmb5z9hiTF1SCY8UMwGc\npleqRvC0wr/rTx/qQoF3Re4vMyiOPK9kmVsRn8oeshWrch+Ta951C/uaqllw\nD0NqW9Q8VbtW28anEp32UNYiJ8NgtSXbHa+d8ltYgP8z46CGiswFkv/Yju6T\nz0wyPgSZG09D7ijyVXe5/qc8UETiLWEcBNxm6/Bo/AIRQ9FPRWij8QrYwCv+\nnPRx8shMXxqn6x2HaR/A6fHmHW7kxu8Ddh3pP65fgexacSdG9iwqHu+otMR4\nL/UJ\r\n=toHp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.55.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.3","dependencies":{"@fluidframework/map":"^0.55.1","@fluidframework/sequence":"^0.55.1","@fluidframework/merge-tree":"^0.55.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.55.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.55.1","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.55.1","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.55.1_1643396764709_0.24503082556447708","host":"s3://npm-registry-packages"}},"0.56.0-49831":{"name":"@fluidframework/dds-interceptions","version":"0.56.0-49831","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.0-49831","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"99e51f21b946ccb03f3a3c10d67dfa44b5e05d4d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.0-49831.tgz","fileCount":70,"integrity":"sha512-F5tv5xFRXyLMRI5WmWE8tcDENAkotJbkjVp3bbU3LS02HZXlKXfhNKrJB9ZAmkAVuK3q9Mydwe/9b4LJ52shHg==","signatures":[{"sig":"MEYCIQCrINwZkKh9gDw/XkcmD5GBcNYfxLKUS9wup+2EtyuZogIhAO3eIbnJKhJpxeCe1RFhCWD9a8ga55kcW2d3K6/U/mD5","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145526,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh9FMaCRA9TVsSAnZWagAAwL4P/32YL6gPP4YWVpYjH7gT\n26VT+3gUo2FpQrEVTX8d0z1Fq5BmpMULrMVgR+G104m30s7VhNp4TlT0SGwr\nblYOz2d3T90ZEgYmdXgo2xAoPoX5Ba1GhwEq0Mvlpha8snIvkNhtg+TnI2iV\ngYcHg5L6aofHX7VGNdwYjBOmrvbFYngjG5PVLCrlo5NhjxZYHVOSDu1SZzP5\n/KsP6++Jt3TWStUSQnROBp+FpdwYIXPptXbSDSpT5awqC+CYvyesETusgCjV\n01UaPbGDUKUpP4Q9aLvct5iI4mFs1v3aDQ6Ehry2/eNtEzyiv1Mim+jHhBk7\nQuG1RTeZjPV1qxTmDlM1iJEYzv9sq1ZHVcKPGPJUgFyWTGrka5PXa9YVtM7r\nLRQzZUkPo5u3nfTlMBV8sCBGoxXv1dM4YcTccZrO0tOIZuHwJtIGIv6csEZK\nl3tbMHSq2/wvLTXsC0jq5iliwha49lcTckbR/i9I4UrlLy9zA3ev0jhy/3Es\nY1yFQtQrCgS+xEDeBuW4HFZ/dwQJQdlscgFsBPdUbPKegTMQ7SCYBzFsnTM/\nHpeMIGncklruM7Y0BJ2WLsV7VqtV3G0CrEGFZTWbWIgWZgLnuFzPpXQwY2bT\njYCJ9gRnpmijcYvE3gCOmyF67MB0TZQIrKy0frwemMNTVvHjBGN+Zr7x9tmb\nQiFj\r\n=OKN6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.0-49831.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.3","dependencies":{"@fluidframework/map":"0.56.0-49831","@fluidframework/sequence":"0.56.0-49831","@fluidframework/merge-tree":"0.56.0-49831","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.56.0-49831"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.56.0-49831","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.56.0-49831","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.0-49831_1643402010528_0.2534156152593423","host":"s3://npm-registry-packages"}},"0.56.0":{"name":"@fluidframework/dds-interceptions","version":"0.56.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"68754ae55d8d9848f6de009460acb0f96ac53fc9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.0.tgz","fileCount":70,"integrity":"sha512-WZHjksOX4TX+XCvvi5wDoX9ZvJSrrNWXp40VNpeiCVHfkXuLj8tUqyA2vVWcqUVuvmg3+DCgwfCNUYi8vSlbpA==","signatures":[{"sig":"MEUCIQDDYVwvz3GXVQ3NWKnDDvxoqmGyYxe+j7f5gZ9sVgg32AIgCEZH5WeLHwT/LXNU3Wivj4q8MDnFOXDn6TIPGXj18ho=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh9IsuCRA9TVsSAnZWagAAPNwP/1EOx1I5kAkkswif1fW4\n6iaXc975jB8p8vswbPEeZ/m56mClELT5pGwu0KnZwsFt5RStXMolgS7rzzJM\n5LaTJlWhpWShTGMGsc+UatVWcz87SLlRfIT8FMlT0PsEYdZm8mrPE5yUfq9i\nxh492wZXqLA7wncobbTHJ8tUljMSDhyDNEnMtsnMNqQlJ9qAeIFcAy9kDya7\nj0pDYYJ2+uwzegeZc4LRv1crgUKe+m4vuS1+6Nv5aRaNBEHHgXweMaviFcCZ\niknCWxpW9fcmqXMgD+aOXQORepf+jd0VXBY3vrLI9L7prbkpwBjm5ozQ8KAA\nKt63J21K/nzdxYIAUTADRw1bRqpjS52gXWNMXUa7t7rUk0Zbtebqaiselycu\nkK5WjSu4cD1v9AIlT32jUNO8AeRm1sVTVYvwl0+DWadW7Jr0iNCOtoo4T8BX\ncXH00kyOAhh14vgxOkDrVVhH2EPMCv+DIkFfc7mMvr0+WtT+j1lnz2FntprL\nYQYhzbfJcPkwxJP4P2NSenpD658NyxdrBZrS9J0A0vShoLpmMdZm5/kDcKaR\nN1PfM+4gijVD2dzuwraBjvBDtz/Eq9YTpO2mqFjuw4vPiXWj06HniqQ/oLIE\nA6cIxDTXr4LYDBZquxIoqxVCgZX3Vfq0JespDCaRQxw2ogWpkuwS/kwoicn9\nBNiT\r\n=vmj6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.15","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.18.3","dependencies":{"@fluidframework/map":"^0.56.0","@fluidframework/sequence":"^0.56.0","@fluidframework/merge-tree":"^0.56.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.0","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.0","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.0_1643416366342_0.8348181313748686","host":"s3://npm-registry-packages"}},"0.54.3":{"name":"@fluidframework/dds-interceptions","version":"0.54.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.54.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3ed37ec1ad884c3eb99f9401643d5a9d0301007f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.54.3.tgz","fileCount":70,"integrity":"sha512-wBaRy++rU/B0wC8AHZQvPNkOGFR84Jb8buF5cSd0+YAcTrXBaaNK7w/sJHNO/dgww0ufBl+ZkScqjaXdTH+jcA==","signatures":[{"sig":"MEYCIQDuQ+VLDcfb8tgUdOiyTkEBz5Il4a/s+x+D+d7sXMs0+gIhALSyk3aX5YCkN8qE5X5rcuHFy/92p68BFrAFnlRnewoE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh+zvyCRA9TVsSAnZWagAAhKsP/ioNk5KrKU/tpVZeNHXp\n5C/kxPVpoi6/irVaHwWVsGf6KzTwb7jQ4sNOaVQeej5I7wi40EqmExiG5m8Y\nyuvfVfzTaPfYbbYAAqQ7IWPMdeD4wyu5co5CIv5dKmYRtVX4SbcjyuamhJDC\nOUZ31prmPVclSZ1/yWmZ/66ztf1m3+yPpyxbH09WSelZM2bWSiVk7f/JxOqp\ncD3xjYLXrfKWWr3l7oKRu3HRuhn44S4zu8hm6W9NSB2LX2SvSgk6WDa5FsMu\nF+vCSI3N308qiMF611kiL7T98xgj2UMBmQUAQRj4oPX/33ReJbXx1blIo5+8\nFpLv7dItD88RCtvIXbvIcn56WLX4HwpEEZbklZPdLly9ZvV3Gz1ZSvGq0SJn\n+WdQtShk/Kywk6bU8mrgSY5SGDj1l7Zf7jhQbzkA6fG0OqVGlpTLxxKN7CNV\nP62gfsTpErAS6qWjthGFZ9w7/kOOnnpyvhON8YFVxJ+7junOKE0ZH2LVwodH\nz2pj0VqmKThiCP5LwxWt1yoc0t5dkFCbAxeiptVFrg65J0dtLjyXOrWky615\nHsuYqXGYfLeXDEDSYtibhCDOsLF2iS3lBhovJDT8Rglvfex/VBNfQGJe3Rag\nu9ggZXPDpuWZ+tYOkQiwDFPudhGkxYxD1DOYXsfwuhZTRWGyEXtE4ihS4g5a\ncSw0\r\n=euQj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.54.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.54.3","@fluidframework/sequence":"^0.54.3","@fluidframework/merge-tree":"^0.54.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.54.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~7.18.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.22.0","eslint-plugin-import":"~2.22.1","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~26.0.1","@microsoft/api-extractor":"^7.16.1","@typescript-eslint/parser":"~4.14.0","eslint-plugin-prefer-arrow":"~1.2.2","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.54.3","@typescript-eslint/eslint-plugin":"~4.14.0","@fluidframework/test-runtime-utils":"^0.54.3","@fluidframework/eslint-config-fluid":"^0.24.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.54.3_1643854833952_0.9879219453754993","host":"s3://npm-registry-packages"}},"0.56.1":{"name":"@fluidframework/dds-interceptions","version":"0.56.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"541d238dca4069a07f81da4b42cab5111169284a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.1.tgz","fileCount":70,"integrity":"sha512-V+Mh8BbQQQ8k3BGtqMWxP1S1oDhWXSCXzXQSMuOJ0iiaYc2Ylvgz1PRFTijtcY/ucjQoOuLXHDgfYtqrU5uHKQ==","signatures":[{"sig":"MEYCIQDiQj/12XI/E/mbDlMJaydTPdPIqXTCPUPIwkmXWtB5nwIhAO8W0O7PnNHYqHgbUKEILrBJOGmuvq8uaPDZNlZQrLki","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh+z8zCRA9TVsSAnZWagAAya4P/0I2Rgg80AGr/i3dpm1E\nIrCsYk/8vYQxEgXx3XUh2oRffFDAzqwFfhuKXjf9FjHlzsWkJRL4bjP2ihAd\n9Pd1AInh4IUzkNVCW0BztwlORvJWEw4dSn1R591kSNSkDQYd4IpOZptNvDwm\nrWi4SxrsrIXng64wvmOje5h2fc/D/AmutT3Dlx6sGMpx8sgtMc9aQ8ZCNRy2\n6pwsjyIix7g63WJn6gFp0FqMuLSZ73K/Cy6Kden0V9FnJYH5FfB2nE8RBzX3\nO297CSWxIMtD6yErK2sO1sPRM27fISWWFH0zmyiidvKOI/xmfTmz17LLwnZB\n4D8r2KnOZ46ojbHJUnE9o9oKbRJBpVyLXqjpif4DBKDtnFDO0dt66xw15B28\nSaZ5A1Ht7aQaz/F2zVqtGcQYwcRuDvRlnyT4BZyd72gzbTFL9Vhw5uCMBZ6s\nz1xOcEjYeyIBgayTu8aYD753Fu3sOumQRlPBQF79M3T2zT4NliQadELg4M/9\ntdBmsPzdDGBjDwDolxEwZxJS3faxhtbV50YLDcWUOZwX0KAa1ZxLJH21TTBb\nCHUH/32LclULMaXas7/nsJZY9XoNJA5+rvT0cY/EMHnn6YdOI6AWaXg4+bvU\nuukTre+8j1VoJvudxUwA0nPMLSuplMqkKQ3zIm828qGF0YUY/vHjhqUR8C0o\n3GHH\r\n=GPXH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.1","@fluidframework/sequence":"^0.56.1","@fluidframework/merge-tree":"^0.56.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.1","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.1","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.1_1643855667123_0.15052100990214323","host":"s3://npm-registry-packages"}},"0.55.2":{"name":"@fluidframework/dds-interceptions","version":"0.55.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.55.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"},{"name":"danroney","email":"daroney@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"109c85c90343bc99acdbf089af0461b4c2a41fdc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.55.2.tgz","fileCount":70,"integrity":"sha512-iEltNf1kJXGh6qfIIjgKSOsXVWCKLxWhWyuMkzU7onxtXq4f/zrbuu/LO2kTVXunuKdsRAc0ZXfjd8GXGUVl1A==","signatures":[{"sig":"MEYCIQDAGV3BEPhy506rpLJ6DN8IcjWSUnlNLlRnrXb8s8y5fwIhANagrilbn017ndZcDh7hR4igVHFl/57cqL9Fi5DNpFCy","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh+z9zCRA9TVsSAnZWagAA/6EP/0YhfT+eTpukQyTSf2GJ\nHTQItP1rucWT7PYAFNf4ThQG4fpmqA2CeeCwp//6VlA9WGfy7qWJv+BJNo1R\nNmonE8rxLlU0GqWWbifB49fHZ1V3wTBLzp/7RmG2vGDzv6ACgP8tOnyyk4zT\nvJcPjyg80ZyvhuXY+lnuOHKmKog2tge63kmw5QkO9W279RqvXSAaJ/ubEExw\nczXKlT2wUN1bcEZ8+WJh28Gal0n9eOp52Cn7xqtEETt+LqKzQ87dovtkr/eH\nEp4zTlL9I91tArLddfJs1nZrHs6VZxgJPX0UG0EvQUceYDASrQXeiGhbwYAl\nZTDNElTFqqnb21dAy0KbGZGwRRMVZDB73eTxi4atcnpAoyM8Ut2aKk2IsevH\nqpg0MinDEKiQIMncyXT1mZ67V+ZBMRIm8nEuN+yvvctPAGAhg9V5TI8rtr/z\nn6lXf0sF6CRZ2JbzpIOe04YE5iT71DHSiCgmnyX9u99B1IujepmSGU4XZyj0\nEvYbmSFVYzfVx9X19audhQ8+M/DSwFCG/9oj+foVTXUL7HaO7XHOPW+kL9EX\nOxxINk1sZIeuiaLnuAeDMSSQ40cMITut17Q2RlH0yREXh1pPQ3vEJJpql9Ag\nN/4MycsoCrN2nBDCTmVgATt2KlZ7jN/nM5aC14uNDMlCp2qmlsZ8hTBXlL9a\nurtb\r\n=Sogc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.55.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.55.2","@fluidframework/sequence":"^0.55.2","@fluidframework/merge-tree":"^0.55.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.55.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.55.2","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.55.2","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.55.2_1643855731249_0.5820296573391774","host":"s3://npm-registry-packages"}},"0.56.2":{"name":"@fluidframework/dds-interceptions","version":"0.56.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1d6bc29de44622c822164e1a169c04a3777bf8f4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.2.tgz","fileCount":70,"integrity":"sha512-0ivZXunyE0545Kf9AG1rlMZyDUXA5wlE8cyIR5IYENSr1I/oknhzd1eBv7Ab2tGa2o8AGiGLK0zIdM7bSToztg==","signatures":[{"sig":"MEUCIQCE1UNn3j90IhBneuYqhEYsFhrcmSPtOQenfrHWUu6MYgIgEjVE87ppSfpi7bkIvA6lDl0zYpqmQ4xhvOIjgxec0hk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiBFVBCRA9TVsSAnZWagAAA3AP/0APp3GTluXUQOLiKKF8\nudYXEjSg8p2/X0WIjJpn6iJnZ8YtF3KCK2KYMqGJB3jDLZkkNHRTqnHDMqeK\nNPzxnzKM7Hucgg7KwIcKpwnnxFW3MA42Xogtp8m4DqcOQABcc9uoeQn3sSQH\nGH+dCbjqj56R3+MX9IpQXGX601/dP6cMcRYGEeg3pmCo1psGH3Kk6H0MSgej\nbSs8BaCLuYIIMpi9Kdj1Q81WWxeeV2AeuimQCoAVUkPiMjjNQw0qonAsyTcQ\nGoTmy5kuISk+HVTd+/36IbMGCc0C9yyRPHSeljn+lYA4JqgHWhGFhkC0Akbn\npjiA1zUHiZy3DJngD/mEBpQKsBvg04fDWffzIXcJF9Abd0nKKuMi03mCcqVV\nFqncOz8iWmHNUTmy13r8bYoaVSBG6h8SLsw63RtjzoiGMxN1UNrv0L6RC5zC\nig6eqjyWPsQlsw5e05fy9hXPRwd9yO/sq3il6K6kHK36sZCWByUXlU0l69Wh\nGo+GkefBMLZvqt8C7YzARTBkFXWBoOZlw2cQXSzDO+s8cMKMkx1UfG/WU9I9\nzhoCgE9gF06bs4WcsQdkkWAH6hAy9al5ZpFyIZJj1yY+rgHkD4OVZOAIJnPQ\nPm83VM0vj58pmkomEuOKNYhwnDHav6k/WhVAgXfk0FLkIJyy+feV0uMCnE8n\n6gyV\r\n=ypjl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.2","@fluidframework/sequence":"^0.56.2","@fluidframework/merge-tree":"^0.56.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.2","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.2","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.2_1644451137531_0.5995007861859476","host":"s3://npm-registry-packages"}},"0.55.3":{"name":"@fluidframework/dds-interceptions","version":"0.55.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.55.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d9ab7881742cf851345a2bea2ae6df1b0c7e5482","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.55.3.tgz","fileCount":70,"integrity":"sha512-FPAeeXNsP4N7EC1/saqEXlxZeV6rtRqymD+4bdSo0OyvNA7SarUAsiXyUaHoaga178WHVie1TXB0AYF3NKsyiA==","signatures":[{"sig":"MEUCIAPwNmNrG9k9C+NxfgugyDuiDmoeQgZNEYeJctgkgfLbAiEAqXZGDXojCbFXjPLrv3uHVQhudVhA35DOvzBgSEIFDqc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiBbvgCRA9TVsSAnZWagAAx+IP/2v9mIjDyatsvPCyksZr\nkp+nbszAFf2kEuAeyO/QJcEXA1ZMI1f6a9e8Gl4XDYgt3T9BeypR2ynk3bxn\naBMMRqhjL5H2XFPgx4HVy8UyWF4nMhOJhn75MwqpCXqjdtRkKEUuIEe1I58u\npGTP2eDe68JlLOZnBp9aMIAhWl+ftsytQztjQXHGBMBH0PwmxHN/zGQwlkx4\nbWw4CsyhNp3wWlUtzMTarbo7ZJ0zbuDuWSlNcir70Lnj3l3WWqu323NlsQie\nHa4tPj3uWZWt+qJk/MzyzqcBLEJZwoLqJo/cKrafXTURewM2/pEJZaKzE1RS\ntNq+iM87ngO9cdctSXXFrndocF24bf7AnmTSbAvyNDfUgMsJkURCIiqNycqX\n1MapkhrIk1wYV6K90PEAhtCQBrgbUmSX3MQ+CpGt/xepZxrojKLdUC6jEKXu\nXCye4LzZUJqt3fpVZooQkxQmCqdTqOCP4TBrT9PZovG4UAcp1+oW1Sr6FVCA\nXHrkJLpZtrc9ssXSVeVZd9yo5QQ8yvhkdY7Mz/Fr8+3rr2ewWkK3kvKSDRiX\nqVBDBgxs0bpFo9Yq5nFinGTFQNEnA4TJ/wuU/93LjZR/X/TgHP2r71vSUfhe\nNtdWXYupVyfNLClDSZz4GmONC7UXBkNM9BBk2VD5gpMAe58myFY9col+tBrJ\n4ZUM\r\n=GsKm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.55.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.55.3","@fluidframework/sequence":"^0.55.3","@fluidframework/merge-tree":"^0.55.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.55.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.55.3","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.55.3","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.55.3_1644542944013_0.6265944532086136","host":"s3://npm-registry-packages"}},"0.56.3":{"name":"@fluidframework/dds-interceptions","version":"0.56.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ada58258f86855c5d0c0c3b7e71b93b3e5a1a30a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.3.tgz","fileCount":70,"integrity":"sha512-+87JV/WmH61OLpivlWI8IBB53sEcBM8dRHTCU4zJZErvKgFGjqzdMj9hhaXnhjx9XOasUPz1heIHbnMPRQ5x2w==","signatures":[{"sig":"MEYCIQCjRYU/dUR2+fXuc9FFvD5qOlh/Okk81Tu2wv7vgJhqzgIhANiC7uuF2a+eNHK6CAHmHzNonZQ/ia/OFoV4pX9Z0F64","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiBby1CRA9TVsSAnZWagAAY8kP/0TDt4hUGYmbxLyFQeUd\n3hbJ4194DmNwPXjvdXAkK0JxwbM2lpS8P6XCBdTzc39/50zv8KThIYGf7El7\nvZtEeoE/XUvDqYuSUN6HY/jB41XRIA2z7S+X21xPNgjbtQtKa19kXk4w3/Vs\nEBrkyrKvXixP1gHqTkl6dCrGfnfIVHj2k/Cm6a14JfbjouZ5yGOIZGn6czdU\nC9+G7fD9w57sd+uR5GoEpfrg2Uaek06cY9Zp77OUa3om0PBs+b+LbLvmAmFG\n7yUa5GURLwfg3MXNbicW+K2W/lDg2MNtGgHHDk+Pq+PciarYbzAbZqRxejcn\np8InJ4l8HOActo0Pfr6f3f/qJtkuE1TbvCBEF5jZ285PM3FlKISgFv2jHHpx\ng3exlPVFw7bDIkc0iN6U1WGZTFVRMWjPb8oahLjTppREtTHnieehMJs+uLJ5\n3GCAORXM7tsJKzzEFSDHJ7XY6Qv0jYkOsgXqerYYJuXlfRABv6PcCT/T83T8\nlAUOR5fkCZNM0yqo2wZUCOnfGVqfApWkSc5l9j/5SB12659iU3GZ2ycnzf+m\nhDIDTCzfUEQETPJFCcbmbwYV/S9xhr8mYjBcjhpcVhjnaEqk/1bLwur/MuXi\nhZ5TMSaiKBlK1Uw+OEXoVHp7cb4hTo1C9264NQ89BrxNSWMY3XVcKXlEZ7mW\nmLPT\r\n=NiK9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.3","@fluidframework/sequence":"^0.56.3","@fluidframework/merge-tree":"^0.56.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.3","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.3","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.3_1644543157350_0.2294421371193076","host":"s3://npm-registry-packages"}},"0.57.0-51086":{"name":"@fluidframework/dds-interceptions","version":"0.57.0-51086","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.57.0-51086","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b5536dad6dd4c879cfd22c70b6ab05b54a7d62e4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.57.0-51086.tgz","fileCount":70,"integrity":"sha512-/1EDVBqYNAWTFSjsjttGOIzHu+iUsydiOsDii5v8EVGxbocsXCSYTb0n7OfYUxtP1uNrxdOAa4dwOEV9dWMVbw==","signatures":[{"sig":"MEUCIQDQCEVLJtSTSiHH/BKCAVl0r3B2rl89LG4k9sKcUne5GAIgPt/49LZnjxwF+aU9jP+c5mETNDBjwvI1/jSzFR3kX+8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiBwmdCRA9TVsSAnZWagAAc8YQAJ1TiwZXx/ZrIv5fio1l\n7tCq1f1KmenRgefVSZvT8FMj9IljZYW6R5L4Wf5PWza70ZiB0NfBb/gmw1QM\nwUzqW9VjhOV38kyQA6/12AtLp0wwk0gGJZsKYsfeO8C1eHtP8xNmNzU7Cj63\nrrCHaNJ+eF4lQgk0SA8c7BfjfSHGAopz6TmDlU8QdDeU1gy6n7DyoXyuosLC\nEGqsPjugiRt+38VfZQn0ZA75rqV5310kTfTgWjISlggclyXQeFySNa4EfWuV\n32iIHX5GnozZ1WfmF/bI0+lGWSzDloTAg1q3E2h1kszyXjvic4l2IzIQlFW9\nxQRoPFC6UXUSp5nSkAaRThOvQozg1Qhtcvvhmg3OzGd9y06+kfWEiXOBcUGh\nMVdU7xXd3uEo3Aftu3mNSSS5ps+UdhFxrC05698SdaTEhbdkaql5tZ4BVcEl\nBx3Qq7fdE48fzB2heGH/3ZDsfGnvW4hkGl6V/nibcedREYHEKq9ZskCeSVc7\ns+4K5b40mWwKN5UKhbnndAs+xbLGHU4lRV6uuejvx3ljJjIoCUxO5GkxGPPC\nOZa70+xaid0/jOOSQMaZtw6jgYi4mytyFxkYEf0Ov50j40NTyO9/39W5F3uV\nbIR6etV/q37ATNbPhTk+gJGvpXgfhZ8otnsodl0zGhSGzsq6vquYvRUb8f/2\nNUrX\r\n=xO6X\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.57.0-51086.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"0.57.0-51086","@fluidframework/sequence":"0.57.0-51086","@fluidframework/merge-tree":"0.57.0-51086","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.57.0-51086"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.57.0-51086","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.57.0-51086","@fluidframework/eslint-config-fluid":"^0.26.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.57.0-51086_1644628380929_0.9107467380102903","host":"s3://npm-registry-packages"}},"0.56.4":{"name":"@fluidframework/dds-interceptions","version":"0.56.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fb8448ad62aa150cc0b56cdb99cc7a8bbca306f5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.4.tgz","fileCount":70,"integrity":"sha512-3q9PGV64VoIDO5pBZ7PeCC/dIz6vxR9O+v9Lkvr24uHXbQLeio4lRQpM9qvZZ9hpV+YxMmRYdoStH5fz+AYjcw==","signatures":[{"sig":"MEUCIQDB5aSr/hrj4tqtPsHeswnQhujdszGnYHThMnC3w10Y3AIgZU17k3SVmAPiVy1Rpgm1sySIwcyLU80n1NLY28xWTkc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiDqkgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmotthAAommOLbMzLVBESGbbJXm07TUb65etCdrSfifUw77w7zD6jzPR\r\nyrq8V8cmPyoezU7uL2bGYqV94+AE86ljibLXqb3ARd3GBYqOndu4KiOpvnbi\r\nL1wFiFzWQ5JSyegL2PEd95lFo0dtVEzo46p6NjpB0wgvrKO+lNMowgIsZxdU\r\nRnBAXGGOvh5ui2OoB5q5E0++kHaMf7w8I7PXc6ueQx3CVxJvjEebABNFORM4\r\nXOjsUfhmvpc0ObCxOykPhvB4FDzmVqkiKxzYKjUQHKt8JY//ZvA8gnEQnuoP\r\nCU3i2aG3dEbSQLMvXBs/Ky6KzVh/7mH3LWWxHkLxocwOcdS1JduAZBN+OxyG\r\nD/XIrzhDDpPwohD7YPEDYNqq2SgDo0ALpPo4ox8koZw8As8gMLS+ounfHmBE\r\nM7UUJ5Ow+xVICuBxCIOr3a29Ii/QQiZhEBjmjeCT6ode5TsDDYqNiJefdEk/\r\nTd/mZs75bh6DLeQ1UEisgC+82XcE3e/rBn1O6rBjdiYEwgKdZBF93ISnY0mY\r\npW+juMTgp5vLzpSSKoU7Ixr8cOE2Fs1mpDgDurFpZ92aw4vxvHdvodSCtWJ0\r\nu599/SVdVr2o6d1HVrbDbBaY6OnAFT/BMRNsGcYjNnjdW0JwAzp3Riq3E+m9\r\n3Wd3BzNKiBK2I4HznE3DLjpb7x63BMnDQMk=\r\n=FqIw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.4","@fluidframework/sequence":"^0.56.4","@fluidframework/merge-tree":"^0.56.4","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.4","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.4","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.4_1645127968145_0.6268115590110688","host":"s3://npm-registry-packages"}},"0.55.4":{"name":"@fluidframework/dds-interceptions","version":"0.55.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.55.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6cfcd470b7ca102c18c1a2095ca3cd46774241c6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.55.4.tgz","fileCount":70,"integrity":"sha512-iNKXQ07sqQ5rK8aB9wSDcoom4ibzluqupZ8peT6VB4lE0zCfr7Aku/ONhgZPPyn0iMrpoUqZr2Ck4H4eHmigdw==","signatures":[{"sig":"MEQCIA0i0W8Jth2mK2YsUTgKzmNE7p2dDyzsPd3KfLksvONUAiAyWpxOhSJGaWTCo1dKyrWq1z7fM8HPGO2rCTu4hIIgWg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiDrrrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrujxAAgy36Jywc1lXfhd6PzJJnLRDckLYIG0aDhcEv2L4lX+8PCaky\r\n9pMO1J9mGZFPfiZHSbnPSdQjlfkPi52S/xiXZYq+rhvP5XlaOq7nkqOiIxEP\r\n73RxZw6kCxKJx/hkeROzBMgB35rSt8/iR8KOowKSdOVQY/adtvYqy7d/jxYR\r\nhxbMVUoDYGP74eoE/KX2rSs9ZFpdidjv76iwu6tcEJLe1iKdnZQEnwy5P0fS\r\n8PH87g4E4uBGi7levJQ6FaNwMEozrwRjfgsuGuUbAPjc0EjM8WJVsKn/0stK\r\noC9WKXu/pFol82PlSWI/t//Tp4X1qRtB0deTe0lBAtYtZ04PSScJvS0OSF66\r\npqjbE5YRlHeC2Bnx21G9Z+omjaBXvyvPXbgT3tDkGzR1zw0bvI54Fn7zyikh\r\n2SM49ZxC0XOq9xPRHLYNl1s6n1ctOJEAZAosYIqGpS3i+4y/wb17gUjQq66e\r\nk5JQqLnCk+YYUqXlkNuoM1diLrSX2i+VDgCrZ4fGBrh8CS/I/26nXsIkaCb9\r\nl+ISbSnW8P7tJ01TWdxXjS2Wd/wqqj3xlkvZgHT4crpjaHUiOlfuvSws3ywz\r\nyY9v9ALfh8/8E7Wh/gO07nb1vb85bTGWVg7zERwukfenlP9Pjt7T4zFVtNg3\r\n2AItdeUXwxA8q5A4ipkVtjAWgtPVKdJASZ0=\r\n=9ShV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.55.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.55.4","@fluidframework/sequence":"^0.55.4","@fluidframework/merge-tree":"^0.55.4","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.55.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.55.4","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.55.4","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.55.4_1645132522743_0.8695217889640554","host":"s3://npm-registry-packages"}},"0.56.5":{"name":"@fluidframework/dds-interceptions","version":"0.56.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9396bfb5114229a1c38c0dc50322c01a32f10c07","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.5.tgz","fileCount":70,"integrity":"sha512-FZd0Uwnzy4wt2bZIjeXEUeuhsp4U3qouTKqCSJseGESud1I3UyetEaje7hYzTXtWkcJWWhCLtExNVFIxYH4mjQ==","signatures":[{"sig":"MEQCICh9WW3uwQaRsuk1yFETgAP5v4r2P4vtJP3iYxgQ8OTSAiB3EudiQxF4myAHEpu9ma+6D9k+GFwEqEz/BuisFF/Zpg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiEDzxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqXTQ//QRQq09gmV8g3MrxNXYFcCQO1gYdmC7uGa8UIdQVtMtShEGk9\r\nu42Ql4AYMqZEC5cO7UtDlYQuVnn7jappOQJPDUWjMBrEHOMFdMItQIjsWqr3\r\n/QfXvViTT10RKMeDNXBMesSMLiQd1MCaHHoMGsp7ohFNRL2GAvpZKF/bvzYZ\r\ngJLxoX/xjQZBX8TDXkafb5t0jecx31kH27Y6FsZWB2zN9PAH/gIHjQ0Hz9Wf\r\n+dDz1SMbmn+fkUdXz+OA9acQpeukrgw5VlU6MSeDrfM5Lv+zM7fa9txMQ84S\r\njg3lNXWZvRvmEddDYfLtkwWb0qYzaIzlztGbnpCC8Qw6IkHX3zrkJowQVvU7\r\nCPJHlKJAxg4UFHy0Dt6sfY8zL+3MBVDYe4ttATNOUS6Nz+fFw8AcmbU9bghe\r\nmb8Iy00HvTs//HTBmFkrP9hm7s4GLRyeSz4OQz8F3AJ5FWcV/0vS7KILuxvk\r\n3YNqHxqvt5QhyHLlfaaz7t83fnoyPsOVNwhT4sCT/gO5uCTgxPZRfY0A9gp1\r\noK+Vlm3Z/MA/SYI5pGclknsNJuCOC8B+MunCLeupwGSJXN0FrE5KA5nZjg07\r\nkb1ye+WgtWZMkwyy662RMgnmfp5PWbdBhn8jU8r/ZBreyDiUhdQ7ZDATsK+L\r\niJB/do1QK59/yzWIthGLlhDCR4Fav21k6po=\r\n=P1gJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.5","@fluidframework/sequence":"^0.56.5","@fluidframework/merge-tree":"^0.56.5","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.5"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.5","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.5","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.5_1645231344804_0.9866542789388948","host":"s3://npm-registry-packages"}},"0.56.6":{"name":"@fluidframework/dds-interceptions","version":"0.56.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.6","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2eb32f2a0973fa701e8d14ef407172ca49d324c6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.6.tgz","fileCount":70,"integrity":"sha512-+VoW49Yo7tMkifJCz8GOjCv8V1SKyOU9jR/VO9B6J7tvgGLKz/tUtp3EVWzGntqAX0FcDoqjge1Oj3flVZj8Cg==","signatures":[{"sig":"MEUCIBZAqI2kEh+r7Eg9R8XJuQDB18kL/6NGfQN1vNN4U2eTAiEAyLPUzyhsK2d/ZXT5WEdHcYZVrnEBYE4BG1xe89TkXzc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiH/m2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo61A//YVi+GxVqYM2uswscVuUHxj+K/5xJ/EwZA/IdEwEaoDBbUOrl\r\naHZ5EbBtckjX+K0TchbxtqVp4hdEJU6HGyornnK7zn1UH2Waa0ryLgm1IRvi\r\n8n5Wo2BLEbxJ51vh571beBpFEOkgdx/UW4rpKZvcOSnP9nVzhNsGoaV39N6s\r\nB3qswUBCcc/m9oBWwxQPjfuDs75TmP3C3Uwb3WaAuBSIjWVDBLiN/LPSgcFd\r\n/Hc0c/nGRDAboYdXqLS56D7UvmyWL9oCF2e4J7M/QiDjmdVJdhPGsLgZgAiU\r\nWHVLxZgtW1PfZh1SWk1spbuC5TGRaJxWny2XrO0EVqA6axZGVSLvR+4j1NWD\r\n6A9bfSc8UjPIVeAAePJBV3mYhtW7AlktAIfgoUV70BNQnGM4OISBrK6QRvoX\r\n3TXWZyMBd8lNQO5UTk6A/eKdkc1rEmWUGXm1wVg7pKFJ5PYF10kHw5+amBq7\r\n3023L0lvlz9ArjKG4DoKUhCHLSefTNdhyo1TT+JWjBJVl5QB6PUyYO8cP7GS\r\ngqS+62nyfkV18Cqbqr3vdY1gwLNyfzoYW2fecUD1X8YNm5rK8JSKWnLx9fIV\r\ntiXfeY7R1u7IVE4GwhiIUFOzbRKd+kiwZswJwdra+jq4zSeIAkUjHdMXq4QN\r\nd2ZirZ7aHGFTj27sPflRWQ/0kQZComjcHSs=\r\n=aLc6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.6","@fluidframework/sequence":"^0.56.6","@fluidframework/merge-tree":"^0.56.6","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.6","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.6","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.6_1646262710677_0.06789635672861727","host":"s3://npm-registry-packages"}},"0.57.0":{"name":"@fluidframework/dds-interceptions","version":"0.57.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.57.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6a0335353692a12f380eea750e639a4ff0cbcfc6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.57.0.tgz","fileCount":70,"integrity":"sha512-kGIMfkcA4bqkHwtYziYjM+sC4GvqwK/TzLJFbYHEoFIxXWhj32CEfVSBKvFK+q8230UleRjCQiMzD+rU+bHQ4w==","signatures":[{"sig":"MEUCIQDqUnZy5BUCvFbmOhEDDguiRRWOdGyJo94UcgiiWJkowwIgPc6yacyB5Wa1cHbSE7qW32r+eoP9S0exyPXiHdNRXHM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIATqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfDA//fEDUxZhZK7aBvHMaI65b8GPl6MqALvI1BmMcLv0nuzdRY2QP\r\ngolitiJnkRJnTEWRYDDAoVOlyRlR1X/ugTH9+J/hZZNgDo1k6oygivc0pp4L\r\nLpz67rNnAI9g7O1B1505queR239CqxFAys2eDbhDGSaZqFxVI4dNgASHOSO6\r\nBtu1ZrcNa22C3ncKDgunGttG1MNXsnCCPMg9jWunhpKKAjxOo1m/ECM2+5c0\r\nHotkUdd9WGBJqYw2F9V1I9xvFetI5hXeRGcNYXwa+T8YkYKTbarsFBMEXVwi\r\nJpZL73cISXWiuXnRo3N2FY/cEJy2MEZJKrs5SHPV3aaXQR8ZbFeyiOtNOc/J\r\nUPbQRMpD9JSHieCjSfm6E03p2o2ok8hTelIIc2HrhEOICdYEL4lQXxxiZEBT\r\nTgNIqDjbmGOW2l2wlUufOA47VlPrknD2i3FRYoM/8Hr5U+Mf4mHD426qcbQS\r\ndq7ohiJkojeG9Wv5tpB22HAHxIq1Vt3NMrw008lHfhbEnjB3mo2CSgr1YVYd\r\nE/j04/gSImkhtsZ60/HgaySVmiomS+pKA5byRiehvsUuRf4zyof65zzSCaw0\r\ny2Gu/mEYwQON6spzSI3Du/zmm3J9TX/hO661LqHFiv3gITSsJGEd8XTEq9pg\r\n0dMweVZvA5NyJrj2rfBZ4wLJtbMSZIj+R34=\r\n=GiOk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.57.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.57.0","@fluidframework/sequence":"^0.57.0","@fluidframework/merge-tree":"^0.57.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.57.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.57.0","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.57.0","@fluidframework/eslint-config-fluid":"^0.26.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.57.0_1646265578079_0.12455008390175792","host":"s3://npm-registry-packages"}},"0.56.7":{"name":"@fluidframework/dds-interceptions","version":"0.56.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.7","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0474808fb58a26c69ccb9ab3fbff4411c64f9c53","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.7.tgz","fileCount":70,"integrity":"sha512-GlsEvw49nfgld6+nguPAQNEe3vvpdfMJ5TDEywUooYfjKTE2ZgjvzOuAWVM1Dux0msVlni4ucguIRGYxQN3Dig==","signatures":[{"sig":"MEUCIQCA0SK6Y5PTwNUc30NwwI1+PCFUYp9YIa5Hkj46WN/FywIgLo3M+1zsn4anjshqAhCldGHQkCJOdWIiNQqica85R7M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiISIRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo0EBAAkWQAFP4rhKFlC2bbwdYfOkU4mfBcxu6cCmOsUd50sPeT7xa9\r\nb29zvJX5xMRhwTuZkKmbFaStsZIIauU8R5KGX4Kf0lopXI3Vyz1Cf6Aqh6fT\r\nei7uTontU4GmCJXbArZbAB230/QDUeMu2kbeuoKIOIuZxcp2EuvX92toKk8v\r\nRnPKFfelOPh0UhBd8CveBBAEXth0Zodtu119VTKIrZOHjzelxR/tPj8iKPi3\r\n6JVHrkpQGvVYk7DvOObuWeS0ZkE4XkdvPu+0r0pbVBDSkqbC9cBF+Jl2ZtNu\r\nYB7a8reD4Kwy9Cf9txeq5KN/gBG6CVMAtxWA26h35Cy1haZSkq+QE031tR/d\r\nJgTD1CbHGYh5VWksuTVEhQljMvmmDlq0ukK0KuJuXcKf/zxNm9E486IRVOIH\r\n3ZRkXnksKrY4dZJhohY5OQemn5//5So+ASrhNaHioXCZOztCmvGVRaDE+Q1q\r\nLANVcyhl+aOovhrpFEBiUQnuozP1kLjVH6M9vRCuE4ilHSmxDg2WUBXRIQSW\r\nyo7SlDTei7I5o2RT4s0w+ntRMX67KC6+i/wAzwNh5nP+sTlqgBQfJAG3GnRm\r\nKdRY/IFRt3nMpYCXS5DuynWoareFW2no7wyZ4yzAJmpOsA5slr/2Ag6RsMlO\r\nJgW4nhCBL/GLucN3po7Pk6ZVTP4tmZS5gDk=\r\n=kFg6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.7","@fluidframework/sequence":"^0.56.7","@fluidframework/merge-tree":"^0.56.7","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.7"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.7","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.7","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.7_1646338577487_0.883221589390941","host":"s3://npm-registry-packages"}},"0.57.1":{"name":"@fluidframework/dds-interceptions","version":"0.57.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.57.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"80a9f19c4271560fe5aa87c9cbcec9b34c876e6b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.57.1.tgz","fileCount":70,"integrity":"sha512-pRkAaeyFliv/iMk+qjpcATQpX2ua7nyOG+MMgNVyM5fhLfW94MIMUWjTUZGJ2MQvS509ApsI9ncKZ61FJOXenQ==","signatures":[{"sig":"MEUCIQCAf8biR8jeHL2jjyXjKlWc47WV5DUB76kNjNuUT6FlOAIgPV5Ohs4fMhWOjJeOxJVyqsguzQSp5yvUVsskj/PDelA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIW+JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDtA//R/tEfV9hPN5QHuJnzMxCVLvxBB2Af3VyaDRxEINCGHQTjmPf\r\nMOpRYpCggqgfy59YR1JFizlF5oqloYta1lSCGLc9nk3jP75PSBcOCeG6BWGH\r\nJEeWNdtDZo9GPOfhO43MeZC6eUrw61wMLoAP0jBy3PucjtzJQKpIczf3nDCj\r\nyCP98ueqTBqu/l2tfkWZ4Z2ItwYrcoxML1bcUhhsy8l64LBvD7NM1gkylSqL\r\nBQFNMXXFANFYjzymX9YVXuT3hcY60a6pqlhAtFjYUHFzUnqxUVgDnDss17H1\r\nxw3VBc18BVmAyNlfFtnOqrhTHrWJCnfvz3MOGDckmjPtL+scK5l/CLJxoWn0\r\n6g/M0X+DgasB93dQs8a72M6r6z4fCXs1vSVCOU4+XP3wNh+NM/TCvwsTDbv3\r\nN8BnEpMlASbVfPYQ988vlagi93jnHWlzgx0Gj02wbWfq3FtwMKKpC0T4cjTC\r\nuV/0hl6vIDWQZfq0JzNI+L06DRFGLAZiX95B7nHiDb20JSlp/JRNNwlegX+q\r\nkASjKJb9hf3Gz2GX7dXTi2Lv/QWiLP8JUi5mO0SXB1y3iGwfqDLwTx9avGkU\r\nysFklGgVemtb5fEbhZBNMr7JADf6SriXexAvO8tbn3ZA7YfaKE/5HmiQJasE\r\ng6/TDW97M1LWSho1PPKpHSsC0/bmeC0VILU=\r\n=od1o\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.57.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.57.1","@fluidframework/sequence":"^0.57.1","@fluidframework/merge-tree":"^0.57.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.57.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.57.1","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.57.1","@fluidframework/eslint-config-fluid":"^0.26.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.57.1_1646358408935_0.23726429351969625","host":"s3://npm-registry-packages"}},"0.56.8":{"name":"@fluidframework/dds-interceptions","version":"0.56.8","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.8","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5139c6a194bf55530f074f7d145968359b93f24a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.8.tgz","fileCount":70,"integrity":"sha512-tHaj0ScqiST96gfZJJOb0HMJqyaVZ9MEGwkEgV3Pn9KZHn80fLsUETC0wTTGyiNy+h/LsD4Iz45bS2vnxn4NXA==","signatures":[{"sig":"MEQCIDABNEw/oknbILvW0sxuA7nzHvqGFsf8xBMfGUT2HvE8AiANAFN3h7PeAVbzg0OpYazN2civdTo7kCuAKoprDPyTvw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIl6jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq0+A//VwcZYeh9PikzlDovJQ3hIi1x6OaCfogg0VOInO1Lkd/gKgM1\r\neinuIaljA/JSqT2fQdKPCMFQBDBWAALYNB2V5wR5jU81lOda62sfJYjlbNqE\r\nqsUocls1eddR9518c/uReOce2tY1LZWwuHXz2kBjELJYEoWrnxt0ee6WCEl+\r\n5YyHxTBoQjDu0tS2UfSTVAVwSiTPgEKydbmtzX+UkUjTY1Z8kyXoGBZ8D6vo\r\n7jWsXoPtb69J4fYtFWj/SuBAUtiETIAUcmxNXfDgEYcRusb+FwGCaB7XsNaU\r\nCM0T77bEk59PQ3HsjzhusRy0nucROfH+TVbrP5VLhLdVNjrL1GveafixpbYE\r\nRwHeIys+IKOnHSRdj7z3fDO3OQL6rN9lgPBOXbeSAqPOFD0UXeg4NxXGAECH\r\nfn2d5vEMFjgwkde/WeTi9ItP6e9cjy2ngOPxTEXZAAG9cGgGOnoNqqarxEe7\r\nNhfQNWzkr2eXRDhYzLL6SfQdHJ4a5QB5RZuDgsxHQMW3W6h0vtWFGlKeyXSM\r\nY0RUhjLc9fg2pv53QtElpsDUAJwYZBcBDQLzIcc/Ohlixmdr8+QJX9cqOjmX\r\nFORdYQpu7Y2yEK1MJ2T12zdiGFBDQ0yUre0fgWRoT0R1evbHzAcgkUTXFwNt\r\nWDGkIUbJag5JDXiAKXRZKU0dBJ7z/OCHNbY=\r\n=PGjv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.8","@fluidframework/sequence":"^0.56.8","@fluidframework/merge-tree":"^0.56.8","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.8"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.8","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.8","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.8_1646419619406_0.4945090935390897","host":"s3://npm-registry-packages"}},"0.58.0-55561":{"name":"@fluidframework/dds-interceptions","version":"0.58.0-55561","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.0-55561","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"db64ebc73139be4d6194866a73de3af4a90e614c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.0-55561.tgz","fileCount":70,"integrity":"sha512-uq3mLVkaEAMJXKv0Pvo4MNd9MJUIvzp+gJEMoTEQ8X2Of+thg72w6M8hwhuxCkHLPG+yqvtTgSacgmqJujvP0Q==","signatures":[{"sig":"MEYCIQC805tnAUO2woKu170Fi6co97sLE+MZyeDgBxYSLYNRgwIhAJe/qBHLORdOPecCPXqVyhBxqek/hMLWEWqO0qbkas3S","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiInFbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoU/Q//bFyJsIqNkF6ThQxXUaVMUFWTGH4mfTH4D3CodRX4ofV+IeVl\r\nYLdN3Ch4e6cTr3u6WH+i5yqEJNUbrGRU9bqJicXgXwZg6bcZ1cdUCENqEN++\r\nvMtwDH2i3QbqNyGxe/X0EKPn6CqbCjqeTIjzoa3VShPKTID4PWS2jqtvIeiF\r\nW7AyjPcbXz7d/Gvfze1HYeGos77sPtA0jpfoov44fDyvnce6ICEreUs2QHX8\r\nwUhFJDC0iHRiawjqYo4XyekBaNVfnaNcb3Sg69JqZH4jPIPDdcOJaQkmmzrc\r\npQgNQXeJVJPPPnbbds+hOf9T5hMOrhGKMutFOpm44uIuvxYGWdYkBcQVJcxd\r\ngaRh/TwSq53bcPDvmAzINX+u3eTaLUBCVYD9nj+k1mL7sHxECJ2tu2uFAMZX\r\nvm2HTNpVfyIwUXkqJHcWESASNcTHjULeQQs8hyg7TrwJ1sSmGlfqavc3/uRg\r\nmwKzVe7CGzp+CDzFxYxq/DTqpo/Vmt7BSmEFXlB8d///RKEvy+2RN3crDx1b\r\nvZb0DIEcRfL4gQC28hkGEA8l8cE5rlCAfg+4PWbcCtQT7huAFO/vfdiUI0zO\r\nhhkSxQFZ8mMNwBJPIgUit1TmbqRJx05tzw4MY8JBi5Smg8vXw2nl9AYcoQDE\r\nPdG2P7dSlOT1nOwxBinkebGCjdiBIZVj7CU=\r\n=9FjI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.0-55561.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"0.58.0-55561","@fluidframework/sequence":"0.58.0-55561","@fluidframework/merge-tree":"0.58.0-55561","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.58.0-55561"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.58.0-55561","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.58.0-55561","@fluidframework/eslint-config-fluid":"^0.26.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.0-55561_1646424411309_0.21496472211269846","host":"s3://npm-registry-packages"}},"0.58.0-55983":{"name":"@fluidframework/dds-interceptions","version":"0.58.0-55983","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.0-55983","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2e395ccd3416ac9dce39c87c7d02f8cd64f2c25b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.0-55983.tgz","fileCount":70,"integrity":"sha512-Ou8oEncIQk6kCWDO+oKpEXOOpuDGRCQbQUM1EpiYFghDlF7zKnodlXYrBttrwR1deIh2AmcLIhtbORmez7LSsw==","signatures":[{"sig":"MEYCIQCVweGGSlQ+B1cIZF6dwCCz0sYGdO8rtmrXBkRANKV+dgIhALn0Kee/WXmbAUuwa4UEXkY+wUYPH5Hr6tpuNp8PtyAs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIrRHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9GA//ZjtCq877lYvVqyXaaNSGGspbz0xaFdfVWqSTIvD6TU7xq45r\r\nTxLxFMoBF/yBdESRbxt5HKrRNHidrW+YGUXZL40ljMOzpZbJDH1+eJV5R9TH\r\nSqMTh27VHC9kSmd325z8UJ5tGYnrs51PGs2OqFgj6YugYoOlMidZKVUmd7C/\r\ninhfevXWPN4oxKR53TehYRkfoo+6/Fc1nuE6RAWz3zAUEK4Q0ohari9vuTSD\r\nn/7GdogTI1BVYdidzV6laYYYMCyAxGS5pPan5KYmxBBmoomHvXT8m+gMYsVf\r\nQErb25NP5sqwzDK9FD6a79sYZUgIbznWpMSHK/3KBn1vrk26dhGAdtRlHGMl\r\nj9XVGb/u6DeiSPX2lltolPJx8Kf7ZvA6K4V8EKBQxl/+70Uys/7HulwiJi72\r\n42FcEP/9+o1eZx1auM6xR6dij8ZdaWS+IDk9Pe7njEaRTEk6bdzvMXnnDXln\r\ny3LuiRyfuuHY86gjFAlVnVGBV9+LDF5jbI6ZdC/AqhCyCg+RDzGUIzmunoq6\r\nmqpHk+OPOHiY9NyIrH3yC8BtYhwzxMUAGiRGKRS9dYBq7nNBp+6ux2udAPAD\r\nN2XNPl5KP2ORqXsTcdT/4nmYk3Q+uAqHfU0tm9A91Rcy14/mILWrYvfi3JCL\r\nsJplJFDfnnbAe/8qcJm/SkW8r2yNrg/tL4I=\r\n=97Sb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.0-55983.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"0.58.0-55983","@fluidframework/sequence":"0.58.0-55983","@fluidframework/merge-tree":"0.58.0-55983","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.58.0-55983"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.58.0-55983","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.58.0-55983","@fluidframework/eslint-config-fluid":"^0.26.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.0-55983_1646441543514_0.9498275641214147","host":"s3://npm-registry-packages"}},"0.56.9":{"name":"@fluidframework/dds-interceptions","version":"0.56.9","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.9","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2fc9cc021a90c05b0e7267707a1f6e56ac6348e6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.9.tgz","fileCount":70,"integrity":"sha512-Zstc/KAg8XtfqzYRMoP+i6S07EDpQZwAtj+5uDf85KPNkLkRpNstARBoAnMQWpCLwZAjwVCvxMdqOAKeLdjRYA==","signatures":[{"sig":"MEUCIQCNDcFpVIGOARD8z7CSZaJRqZlhHWS2Ju+TyKR7veTmgQIgcw7W+m5HfyOEltFmv49WVkG/OqY9Bqdf+Btkqok37go=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiK7kYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqvzA/9EIKsRj0IKuNGahvNKzg3eWhwfyFS3mL4gtV6FZYrqcFfRIj/\r\nH78haxtR8bzU1hpO2DJh6jxWe3KS3id3li4EImwpXk5ceo8IxqI4FyIJIQJP\r\nXqUYneduYdgYKdhsbYdx4SP9QNE3zpodKbd4XtdJhO3J+pYXMAG4sTkkdZFT\r\nG7pTp9LqDxAV+nSZc9M0Vu6/GTvm4FaYwroXRn4ItDRGvUwlu7HoEHZvLTQu\r\nR2Fpti4Cr2kyEfwg3EwcLArJZsYEJxBXriQyy3g8hG2sS+lqH4l8PwQ5JB2F\r\nJNt1j+zOruho9J/YXraGwkjXXKuXgOGGzgFNh3izGnmlpWOyMLIWiwh46qoK\r\nVN0C6zxIvEM0J/HgsRAl6kf8D1ViWS9Q/nesQqQ7AXA4GtZwq5WGeTt+axST\r\nhi2bn0myG3h0k+H1/nI6e9jj4dfMWXrOkoyihAX7Wj3CfaGxZtoW+6kpPqVk\r\nxrb33hg11KqiwpAqL83Pv7FJyuKKAtl0zTjAJm7H7+6JzBHSvVRQ5E9usdQH\r\nHmTQGREpCIA03k4yiDSIYPnNKCOeak4CVJAGcOLG144tQ7ZceaIEh8A2GCij\r\nBTkZNHN5nJmycW6XDGOevVXWtgg7T3vvUIRBLcSgtTRw+cgyP5i6Nrc7I4Rz\r\n3j+UlBfCm2l+32ynusNiHF4Uy9fpzCBL3sM=\r\n=PtJP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.9.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.56.9","@fluidframework/sequence":"^0.56.9","@fluidframework/merge-tree":"^0.56.9","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.9"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.9","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.9","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.9_1647032600128_0.8295143584482227","host":"s3://npm-registry-packages"}},"0.57.2":{"name":"@fluidframework/dds-interceptions","version":"0.57.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.57.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4b8ca71c492fbaec1efac36bbd364e94c856898a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.57.2.tgz","fileCount":70,"integrity":"sha512-wcIPvyH9aeesEIffE0OBhrNWvjFPdO/b4KrLLnYhiYxbFBKmz3fqOJFidMbLNnufdCmtCiTf44qHfGqiuN3Lpg==","signatures":[{"sig":"MEYCIQCEDMCz2N1opSYNk9/mEH1Ida2c6+9TujmCGBTzDXFM7gIhAO5ugGfV55RS70muMXrG0Zk0IYeOn5rX+zGyHTCxRk9x","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiK+F3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqIOw/9F6Cb9d25r2sbNYLgTnzFBClO78SomXnXh3XSQn9WwkslYIKO\r\ngD1sa1FOyY2PTHbcBMCuECgmvsjR44Jx4xpG9Tr6nhUcvlbSRVCPGqu/y7iP\r\ndcDadxHbbJBBv3yqCBOqysCbVyWoPqU3U1GT8xAQTm1aLWpdpJ+lifISpoiG\r\nzMGxtebMyBDCg3W73uovvmrlSJUV9DpjaTD98L/iFXooppzTBgEXuPtPNkIo\r\nLKUpqUBL3NP4C/Uka4tdDlnSL0tiR/HVm7dAEEILHL/AVI3ZIUx+zMN05cuR\r\n5k9Xomm51wtHzJyD7YJDWeo6tLg+w6qAXvFPOje6AJRGYtMHMZ8HKhHNnxmP\r\nM4mDDO+5EV0AydCQWQF/+AoNFA7jDJD7mOzJuOXch89ZInBoQGokOiYDtWbw\r\nTPGGCPKeGOhrHmLyFoX7qUkw6v+CUN3M+YHyY6riWpi1cZO6kHekGLwp1FSW\r\nv7vq/Kc1W4xcJ4ZTjtEYhufRrvkvOfkhGZ7PIeik/U8mR/EwsmEdHatCpQy5\r\nrF5QqpgHsQoF7iXGdPBukftfvifRXCZCA+Lez7WsMA3OW82zIgdr22PE/d63\r\nsTz1HbjJbx9PHxt/nQsF/iAhjje/PnXHsq96aB9lD6Hp2WVFF3D3Xp3UBtMA\r\n76Mg7JdKHEoaSg5wC0jNqVHX141BOdh0Hy4=\r\n=wAFe\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.57.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.57.2","@fluidframework/sequence":"^0.57.2","@fluidframework/merge-tree":"^0.57.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.57.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.57.2","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.57.2","@fluidframework/eslint-config-fluid":"^0.26.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.57.2_1647042935649_0.18276671886028528","host":"s3://npm-registry-packages"}},"0.58.1000":{"name":"@fluidframework/dds-interceptions","version":"0.58.1000","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.1000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"50124d131c67f8a36b271ad0e018d441c40ff7b8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.1000.tgz","fileCount":70,"integrity":"sha512-C+neqviTquL6DxaNadJAXCij/LlfOAqhnAxLCOPbBnONvLzqUF1/plNK0KhFtm1ccoaJ6IXZZlZ6UKdTypQ1BA==","signatures":[{"sig":"MEQCIF+jZ+qTHkw1uZIA5hI5KWDBrRsDBLcSoIm3jk4Pau1HAiAnGutLsikFwGUgtBp4pWSlxIkc5APhq9g4UKGqUyhsYg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL6T0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrBOhAAgsUV117RS78grmQW9YVbBgRZU3Ur9A92cnrMeXQbTniDg697\r\n+HzvqU+3j7/f2VHxTqSBDca94ssepj/ZjYLEig2E9hMiVEbXIH2ic7JxwOwA\r\nWCrTfugEO/ay0kzfuZlFF1uOFAUCDB0scMaBypI+pH7HfPdljmnjO3uzi+FC\r\ny/TNuJW29yanOgQMaEgtcRLO7WcutKctwem78NouBLvoEmtAnJiiCPvKVGbp\r\nyeUGFUApBaMtMGDzAWZHbXdYbvLfGPHk9Ng9x1D2PxJMb9739YpyN9DoNxQP\r\nLhzURxgad+Di0ZuoEWRUC+NfCEq92usgA/NprJXgYW4IcmGMbC8LQA21s8qL\r\n5KnWaugNDXdy2li3BRqs/rclSsufOsM19L9ysP+1B0ZtFeUI8A45DNVl7TTp\r\n3uP0aDGY+vKzusWXR91xJYWatrm59oIGJSM+RVdSAop8BVQ5N6i0LtM3SBhU\r\n9ek3AyAWwOg63WDU3pdcRtAGRLUISOzssr/dbrlXyEoYnDgyh3Kv2cLhCy51\r\n9u4LOdfACt4WeVRJgXlhz/GJjjc8mpslH5XXZBadFLMbllQ91MJ4CnKAKV38\r\nwM/erPdb+0/lMJmFAoDPXUivW6ymkChTgVwAQTtMoGTK+Y5GmEd1DC5Q2Y5B\r\n5QsqvAkOFY5rKtOzo5CpXE7SNeT8N8qV08Y=\r\n=/V56\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.1000.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.0","dependencies":{"@fluidframework/map":"^0.58.1000","@fluidframework/sequence":"^0.58.1000","@fluidframework/merge-tree":"^0.58.1000","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.58.1000"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.58.1000","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.58.1000","@fluidframework/eslint-config-fluid":"^0.26.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.1000_1647289588264_0.8020661771793978","host":"s3://npm-registry-packages"}},"0.58.1001":{"name":"@fluidframework/dds-interceptions","version":"0.58.1001","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.1001","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5a11418a235f4af597500f0f85100e4fbc97f3b6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.1001.tgz","fileCount":70,"integrity":"sha512-tdYiyEUYkWDvDE0vY5GWGh1kCgBf0VJxlWSn6nXEHvcFPUj7x9tI8iqVXDYbxBFdPrpO2G6PSagx4HI6Lstqgg==","signatures":[{"sig":"MEUCIQC3m3tMoajxVcAAKnUqZf6uwHY+81PIlQY7giW2j7ENZwIgJLmQUznUBEG/khC3OlFH4+HWRwkzwuAb5I76RDOCVA8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiM+QGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoowQ//axOwsHWlUeyitcmfGOcfTecL+8EU3Ocn811o7FOPA9bg15tE\r\nyfN2v/GSWOs//RRueaLg4t+jCqqyhn46fs1MLzH8yEED/7Mg/++2sDdhFMMZ\r\n8QDXu6qBJMQmE91Sn+BRCKl4KfaW1hIzzWdtBISHwDkqAxalO9A7ePb1risa\r\nl5oa6adgZ5fH+egH6Bvcq/laiWEfOiwrNy0m+snWTNjZct5XQ5rjmAQ8fyQk\r\nU4rLjOaHcrBUR9UEvDUw2fJFtdc4LtL2+JIstpOYfE7Lo/Ca5WOZm22Ueavd\r\nID5Fi1fGNVHJ4ArM34UkKH+rXJUi5FiIlcX4La+nHD1kRyLBoCTFZdF6AK0k\r\njsBsaXE8ufBoDeK6aVtUOkIqactRLmz2NTk14rHBTt+O93vri6djw6Wgnm4M\r\nOCkohN1MlQbs1uNNjNFI2x5XYvyf5J7H5eISGlhwnebUQ12tl5CzIQ5wxgke\r\nSIsfj1JcVb6pzuHcNLR+rwgcp0Iltla5hSS2l7Y9zJRuRB2pLOAnfyHdYZeP\r\n/uCu7fG/37qvAZ/sQCJCW1/uMAVaXwzsKQczJE/e1QOdTXK/jLEl/+lM5/EL\r\n9IIv03pes50GT4BySNcBLLcOg8N2RrU7hyiQIk32/bK8QaAO62OH637xlG0m\r\n3KdHYaUFSVTKIerpBuzXch/l8NAAE4uE/No=\r\n=oS+3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.1001.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.58.1001","@fluidframework/sequence":"^0.58.1001","@fluidframework/merge-tree":"^0.58.1001","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.58.1001"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.58.1001","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.58.1001","@fluidframework/eslint-config-fluid":"^0.26.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.1001_1647567878439_0.46170389687631186","host":"s3://npm-registry-packages"}},"0.58.2000-58133":{"name":"@fluidframework/dds-interceptions","version":"0.58.2000-58133","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.2000-58133","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"652f851018b0b3462562c4c9e3380b443aa3984a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.2000-58133.tgz","fileCount":70,"integrity":"sha512-2aw5ShtvvE9DI4cQI3PFCbtg8MDAU3YiGVjvE/Dcr1uKiGDOu51DfgY2JNU4C0nwW30TFkKtMCZAR1BbipCb4Q==","signatures":[{"sig":"MEUCIQD1XYoap7LJctPvBLslJLEujjwAyHE8ccrRhL/SVcKj6gIgZm0Rlf32gaKAd+zDoW4SPAGdehn98wxidYJvs223L5Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNQQvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUWBAAocR6eXjf+LGhFegkftEzseTAmfKap2TNu0rgvSEuTLdavT/G\r\naGLPXcGA8uOCn2fv3N7HvwkeAksUzF/15AOoRlK1rOwIhK5ufNPGooN4xYVb\r\n0gqiWrMr1rrZH2YqyMisdP82HC33EHF8QAHYPxI5MMOHJ1Hy6SjODtKBmnOH\r\nKRVEiyah3ak3+3TckLCbhQ2lhMrmn2g+ZakoDy5t3POK2RaKgA/DiWLz82HR\r\n6AIi9YXrB1G4FEYExrGLwGWAl34tLTGoFi6ud7x+N9e30gSQZmOm4sJuNSX7\r\ny4BDAyFmkhRegm1hag2Head0Bit6wy+7hNjevNwJIs1v6fXiq/3B7nHlNjmL\r\nKSjicOUibuJ0dgE2ucK2fstLjgFoM78bz6GGU4cCVbctAnUJ79kO9CAZahMz\r\n+pKGAbgIHH8BlEKW0mg5VDvhenQUF6fyEe7qMmAnIR2CEFUTtaqb7DtbhrY2\r\nni9GIfapsNXerMrytE08LpBQZtHNHbf5BHlcLt+e1dqCt4j4xumqmXxAeAvD\r\nHs/hu2a5SmICGw7M3Go3VC/C29hRlJp8sM00JXN6wn18EgG4HXB+4Hr+GC8A\r\nxkP2yxyXgZoquz7+EsHJmxaOhEHhNpgs5qtdI3VNHqGDdDvsxzaD1xpGIWjj\r\njZrC76k5MgkrfxKHWlOVXV7ep+A80qpg+qE=\r\n=5HQr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.2000-58133.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"0.58.2000-58133","@fluidframework/sequence":"0.58.2000-58133","@fluidframework/merge-tree":"0.58.2000-58133","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.58.2000-58133"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.58.2000-58133","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.58.2000-58133","@fluidframework/eslint-config-fluid":"^0.27.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.2000-58133_1647641646902_0.3414859367337457","host":"s3://npm-registry-packages"}},"0.58.2000":{"name":"@fluidframework/dds-interceptions","version":"0.58.2000","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.2000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4f4776bd2d65d27abfaa70e0ecc047d312771f7c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.2000.tgz","fileCount":70,"integrity":"sha512-/wxcBIy1fxRLfLP2CosouTzdOFvY0APi4S7YxiOjgRoIaxxa9PWCctAVhVB+ktwxIbHDYHsz/IPcBlRaRK5VhA==","signatures":[{"sig":"MEQCIC7UFxOQuaSva35GQJGnUnRMKJrtY6baNxMIehdU4pURAiAuPToEwytqtjsbaOzojiyt4IKMfhXV3pOM6zqWXaRCMA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145583,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiO4ZdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqicQ//QTUOWH1TuPqjAzsQM74CTF2oA3IbE1CGpwFDijLARNJGIooH\r\ncQKQxPUn2BTcZsM2I0/UhFXIcSkUAbAf1QU49Bb2BQjkSOw2AKwszPRD1EHb\r\nfXhL4BoawDeljfSqHXbd+EUj2lqsr3oWMh7LY6D0DCBNiCxVnS4zBNeCsTQz\r\nkZs0MhlTd938TxLjG7q09s0AfU8UfXp66NwxDrc7wxf7tHSeGPdbruE7ZyKA\r\nl31Se/JZotUH6jV2yQ9LZKqkXjM3nOmYBYU8OR2n+B5p6sRlDBk2TRsYgpQ3\r\nnpxqL7E4sBQB0XS6g41/lR5fAxwm68Md+kYpM9BRTNpc9sjjyq5BuHBXGIUT\r\na+44BLoUjvCcqgxUD4mmmsWRGJu8Hj11B/ffPDR5Xmi7clensnThndMdt0ue\r\n1qnrYMVuITtXRhWeTMhyi9ZLGC8gxZCf3KUPXn6Jht3AQWwO5c6edOxQt8DO\r\nkg/ZzjtrZFgTEQRitBkO5Vep517JNDUVGKbbys9Y0TBMi9VSM8Rvcmy8vqiJ\r\nde+ML0e9Ghg8YF/HKM07rXsi2qDHQJdwfcwDH/ut3j86l56yOAkOEGY7H+XM\r\nUEGmzHejXe4lpK0fsFV9AXbkae9yGzWAQ0uNbXxA1zEkpjc9aGkidyQTKUtr\r\np9ZRVjZSB11FILo+LQcoOXeZF7nkBHfRa6A=\r\n=trBQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.2000.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.58.2000","@fluidframework/sequence":"^0.58.2000","@fluidframework/merge-tree":"^0.58.2000","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.58.2000"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.58.2000","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.58.2000","@fluidframework/eslint-config-fluid":"^0.27.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.2000_1648068189205_0.6774234614111223","host":"s3://npm-registry-packages"}},"0.58.2001":{"name":"@fluidframework/dds-interceptions","version":"0.58.2001","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.2001","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c23315a537280b4a67ecda88297338900e74d4a5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.2001.tgz","fileCount":70,"integrity":"sha512-kd60yanomwOnWN5qzDT2FnU1OrGXlLf0NoO3oFvqAT5mqv16Ex4glp5gIi78lCatem4RhUtOxJQ69+CQFcv++g==","signatures":[{"sig":"MEYCIQDrCfnqNy5SFr9KCtPwNkKF4p2qZWb9q/soLlzx2r0pbQIhAM3lsF3K/I68kKJCavjJsBiqtTsepSY7Rbn1cuBNsPsr","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145583,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPRXsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpZdg//W8AI+EEUDp7nby/PxirBk6vr6FIFT7MAA2OukmNUr6URqWRc\r\n6vLKp0lpStFT6pXlxjpc8L1KlFsM9vPeCuji4VoIgaI8BJpWXNIHtcaCeZUF\r\nwSNMENDbud8zKD0CvDS0bwL25mydGm3pvRO//9S9PGVKa/ZHq8zB3suO9/af\r\nqM+Xe/Gn4DYwXmTqQc1vyR7RoQ8jqJicKgC2SCcngASBiTT26KX+imzhI8F8\r\nAfV8LqzxdF9gtQFVpYcBz8T7xk9DscCNJXMMJFtm/kgaDPurejKIqQYRWAeR\r\n3FsCHaujbO6R1WtxDrYg5f4HG8U+LFWVPuxseq2Jzmauu3hoIONSfLYT4dU9\r\nJq8KzJrkm3GgiTxL4GtJAIcYchf69BBuEsUUW7S1dbOYO4xscKKhA0tM6Fib\r\nxrfRVnSgpC0KLjR/DR/EVuwdCNsLkl9DdeDNRvethdOJg+n8/2W3xpIjNHlY\r\nN92Q3VUAnouf/vZ67ivffyTUhsUYzkLhRJJaie8vddfPbeh4aKd+x9B2bOmj\r\ncb7XGb9QunJq1ppa8QJIBHrRlGux+uCessg+gtkS1eV5b2d5CG8hcjw6AzyT\r\nnTsiXAypHlbrqQvD4lmtioHdNHr156gKuFDj/R7GLraWsg50jBXORM9q8p0j\r\n4H4jzG5Yy2gBkRJGClmUtFEZ/o+0zrDfjrU=\r\n=nzYb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.2001.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.58.2001","@fluidframework/sequence":"^0.58.2001","@fluidframework/merge-tree":"^0.58.2001","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.58.2001"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.58.2001","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.58.2001","@fluidframework/eslint-config-fluid":"^0.27.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.2001_1648170476284_0.83403197966021","host":"s3://npm-registry-packages"}},"0.58.2002":{"name":"@fluidframework/dds-interceptions","version":"0.58.2002","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.2002","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f641cc504a818ba8930b93535c6785d69218879a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.2002.tgz","fileCount":70,"integrity":"sha512-Cik0hwbYbORbeEKCaaI9JR542AXtAirKEt7IGZ+X1YaH6yD4zlqF2V+TFmwuN5UQkSwg2ZI3OcUTNYRr1Xw2BQ==","signatures":[{"sig":"MEYCIQCyUQ0hEfd2Gn/ReF1+R58jjTtZK2oy1c5fqG5FguecVAIhANDCxTO2g+uxSFe8Gcxc8hBhhIXJcNV1qE/6qd1xhbBq","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145583,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQgUbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr71w/+KrqClWv8MVgvnpQcw98oxMFozv1GtIhajnMtgT5OklkfxsHr\r\nWm1DsEvzsiPdHBgKQnWbvm+Oc9W9H5IU6AtyU6Y2sCm5VZ2iZXlLibirF20n\r\nIljeE+TqsMDrLnkP3//tMCoUTVt2iwkUu0wE+NJgP81wwCPbVBeKqov/3FER\r\ntuoheQl2Gg0igJzOI3RhkU9FPFNHatOn5bPe1eb/qF/OQqs+U8mD4/qw/Xwb\r\nNJ3pQ4X7DAMrdvD3t4fCdShh2NSLivP+mevEbBCNNpwZgSkFjR7zFV6yb2mh\r\nD16lK/ieFtll5ZOVWEReVrObDBGc13LnT2oYUwRKgNoP2oXqfMrPepwmOr6o\r\nOvoBXIddBst+3akIFxG3a1Nv0mKWMLrjhbixj0lIuUksQzmWNAMnvhE22Vfx\r\nzWTL3vhnXchApKZmTko8BOf2uIcEQ/Cn4KE71gHyKVMpzWsTpUAlwzvOQX3K\r\neLjFdltcrB56fCzKzsFFzz8TDff6KWxahuATtDa0nkKEAC7rsX0eRLt+Cc5q\r\n1mKlNCyxLQYgKqQvaTj2/Ka/jZ8TAn1uZWN5jsbs6tPIm9nDtSk4IWyFNX0D\r\n0p5qqyI5F4jsLXvNp2L6LU/JzSVc02MPsjrzH7a9O3iDrssNOyu78brHETa2\r\nzNBxBZnJ/RQ0udf/8Mk1WAx+uCra6pi0Cxw=\r\n=4S7m\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.2002.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.58.2002","@fluidframework/sequence":"^0.58.2002","@fluidframework/merge-tree":"^0.58.2002","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.58.2002"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.58.2002","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.58.2002","@fluidframework/eslint-config-fluid":"^0.27.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.2002_1648493850966_0.5936951834844206","host":"s3://npm-registry-packages"}},"0.56.10":{"name":"@fluidframework/dds-interceptions","version":"0.56.10","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.10","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9e2f90fb797c7b576dabf6d658c59e7c8681a967","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.10.tgz","fileCount":70,"integrity":"sha512-mKxkgNB5cOtGqycOL0IwXjOCw9wgyuvtnZfPibiVNaXSzgIf8pfkj4PNRepd6+XeSucHCG7zoGiPhqCp0892vQ==","signatures":[{"sig":"MEUCIQDGkPObaXnWX+9SkIzQ+zG4X+kuxUmL+Yn7n9/oSTGMvwIgQkC9BXYX5AyEoJalAjfKC2WT2w1dZI9mFTxgl1bgt7g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145458,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQjFbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr8+hAAkApK37n1C+EMBLQ4VhlT5V6as50Jd8sQzjJ3ANP7Ag4pX+UR\r\n4h2dXwE4gp6fpCBSNbzruBVlApelv0XNklUAMgGXBT2FVAwe/ScN2DznMiHI\r\nhvSWGT78iXKIDoJsvZm6qzfpxqOfupMa6ADqydco36AmGjPzvdqSmNM2tER9\r\nIG9IJT2uO052FQ5uUv3386hdwiIq3AloZJqDScAgx6fzGxXzZ8uYdoUHpDj9\r\nHSwoHUm+LAiCQrfyT3kwxXQIilco9vi6PuWoJI6htdMf1utuYE36nhDiX6Rn\r\naF19GyIg937gF9Rx/PLE8grvdgzLqG2+2gKZmarLnR5sf9HyzADcWreKFu16\r\nu2jM57vVqbFfS82ekhf3BodKZTXfF+rZn6qhAro7O3uQYICadlgroyRiHzND\r\nKSGnVMRvVofJ5BQW4SUru5KkhlL+1SrmjR5YUVX8dTVlYBGFJL6suQ7eTsTW\r\nlL3XRQWRnoUmLSFB4ovZdx+HTs41uwaWXl3/ynyKtp0bkNo0mQ/EpyOQBgbr\r\nVlObzk/gpflcxufBXDnRJzYpE0p/6BkKXNU6YJEGoU4sB9LpG8QR1oChs2v3\r\nRAaqMjamllVUBO40IbiNWRf0WjEksODZeLtt/qSir7C/bALEJpU0wxDnqYxg\r\nhkAJIRJ8HhHivXTECnw9Za5G5L0QzrEa51k=\r\n=sS0L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.10.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.56.10","@fluidframework/sequence":"^0.56.10","@fluidframework/merge-tree":"^0.56.10","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.10"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.10","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.10","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.10_1648505179282_0.5552726999635365","host":"s3://npm-registry-packages"}},"0.56.11":{"name":"@fluidframework/dds-interceptions","version":"0.56.11","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.56.11","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6160fd5390cb442ebfba8c744cee3329e6e1a55c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.56.11.tgz","fileCount":70,"integrity":"sha512-e7ev/AhFq6JYE0Ssa+by72Jg86CJDogTBVz2hdL5jPXiYeeSWoJZcnXnkkKlgLyuKywsLWCN5a+mbzL9QG5gkQ==","signatures":[{"sig":"MEYCIQC8G+K1bM8LIPiXBtkDpmrfGQtajIVZSxYGuhNobZSh3AIhAO30HMOm8d+nrx2S5W7ujvAorG5fd4KJNvgsfM89PMLv","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145458,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQlGKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrfHBAAiqAPEV/+2a9Pp29p6MIOa0NXOXuUjwBaX6qUy3YRerX3wK7b\r\nIvvkaxmT/lTJjo7ToJ+jKpwGxqYOCZUNQPxk1ROGyXYvq6PEWx3iSXEcgW5D\r\nTrN8xOg985mHO3ndz7oMSjmDtuUHcJEh9H/am0HjEDyIkDo75nn9wpfS+Suy\r\nsH7NquooBXfzKzEmz7o2w/Ay+kFxqZ1HzkNzmsowmY212l9lbZxF6OFNhKqu\r\noxSVNWykNXvp/b8MafZ4j39EPkv9PWf7P1M5ZGmFRGiIhlPhFU/1BmFTJw01\r\n0xLJua8oCnxF+TxM9NBSxLotyhE1WyXArlTszd3xakwE6xiK96YcASVXcOjA\r\nqVukSf5pcyYcK2lb5x9luukTvVUS2DBsQZ85vrOV1h53PP7/tg0PmENWyeBR\r\ndw5AuK77M3CMsKjUH/tBu1wMEDyFunIKyiR9PXJnyZhQVVn/I8dZQQu2zD34\r\nTJD55PO3vFYQyhbI2hlubrdWvWOpjera/ow8gfbRc6OECotI8ENpiErchRjf\r\n8fWTgdWnbJMK0nbCEQZYj+anstmDcAimQ3cI8HxhV1AZCeIrCTNRmxfgh33/\r\nNh9jVjInUIbl5o0X6Q52ayFPmzLaDDwIwMM+QDKMC9tywoeOq8o4kkxrqn2S\r\nMl8LRzb69xZadliHBEEstvLkwhefiDEzRlk=\r\n=PLpf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.56.11.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.56.11","@fluidframework/sequence":"^0.56.11","@fluidframework/merge-tree":"^0.56.11","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.56.11"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.56.11","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.56.11","@fluidframework/eslint-config-fluid":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.56.11_1648513417903_0.777118768791059","host":"s3://npm-registry-packages"}},"0.58.3000-61081":{"name":"@fluidframework/dds-interceptions","version":"0.58.3000-61081","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.58.3000-61081","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4777ee5bb31feb66d9549caff938ece07e184f6b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.58.3000-61081.tgz","fileCount":70,"integrity":"sha512-Cmnk7hbE3E6UM2VwT8HPyGoEwmXt/VJacXm67o0pmWFvBj6gA9OcBahPjo6v3YODiLwRoBcFnzPvs8A+V98rGQ==","signatures":[{"sig":"MEQCIDvEVAeKhgx1NT5cLTH1EG5X94EVOBgtKtucrH+GcpT/AiBvtelR4HMdow2XFJ0DrCcyN5EeB301jfyIny5X/5yJFw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVNwbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorXw/+MrY+oEBIoAJFEkMoYSekGn7f5J+tL/Vpk+nRTSjY80D32tSl\r\nwV+FSPEmcWLfReXZpDEUGMotRf2JBcDuxvxUxmCcNJOVaqE6FZmfHlKhkGlV\r\nk0kgqfsNv6pPNSAullwY7DNIUGIiqlyYn8h2E4YUF1x/Bp5TDVEOMH+geR0d\r\nW08YkNzZ2wQ9k0FfQ376Rpsuu90sw0VVBuOkZ/1eFLSyS4kLZLoJUHYTvFKp\r\npKMiROtgDCtGFOxw53JnuS4dckgNVqSRQxoTPhqwsrEywgNQ3nsAy3edl7gB\r\nJSc9As2W5mdpSwF2yDEbkRf8+WOVAUvgj37+PIkMQ+VgbLESShlR5E6dRXZr\r\nkb8PV7ag1Bly6URA6E0g7bkt+OjEgB09324enEh86Knl6eolsN851omXtS/V\r\nVZV+VubGS8GhwaPugoI8BeAGpDlyHNOi/mqJIKzM8KPhRuhyeaIvYOmuV9qn\r\nlSoTcDntjorFxkp4m2q7mJvO1IhLo8OuAA0qvV8AXdZSQ+9IFurzO10zAbzt\r\nWWjKTZYnNroR9s38pq8KJMJFaPxnkOVhcrbIkgxg5Z94br5hzr/crIgRBjs/\r\nKHhiWWSuueOY+NKqEs5tH90/zE7JBpFhCn80GnjnPwIexZ5zTABzWM6x4MrN\r\nmKmaYVr2vvc5ZnH3rOLe4b+kKOYukuHuvpo=\r\n=T1yz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.58.3000-61081.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"0.58.3000-61081","@fluidframework/sequence":"0.58.3000-61081","@fluidframework/merge-tree":"0.58.3000-61081","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.58.3000-61081"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.58.3000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.58.3000-61081","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.58.3000-61081","@fluidframework/eslint-config-fluid":"^0.27.2000-59622","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.58.2000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.58.3000-61081_1649728538899_0.18585387851840096","host":"s3://npm-registry-packages"}},"0.59.2000-61729":{"name":"@fluidframework/dds-interceptions","version":"0.59.2000-61729","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2000-61729","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a1df793de7b44969a8ad3054399686770eef18dd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2000-61729.tgz","fileCount":70,"integrity":"sha512-srWRjO4yMSangTDzP068S4ju6x6BQy0FdIIX8FVFT6sj+LD9qQ9VhPOKFMaFM6zJnP/sEKlH9CUHAnKRQYPWDQ==","signatures":[{"sig":"MEUCIQD8esEosSb316x5yAM3ALbXCFkCAxWDT/tkZ4t9Yh/WaQIgW9EPxUJoqwfRKLFxwPZPBTC9vGCGKBg3weE9qu26+lY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWIaVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4rA//eGRjvpeRYofc8f3dUY7SDjkyOwKi+lr6Os0jcIHMrkTKaAzb\r\n20HLx2c5XtbclaVpiu5emo98FcTFUgcqP/j8sfNZtmqIs54tM3IDo8WBGeRB\r\n7DqGMwaBeAEkxA1/l3+drGCyf/h6iTKy+LbuUVO9NzaqCecTHiB/3Pw31TYr\r\nR189Z8dluTvRsktgY9h0QlcrByouL84x1eIuoWb/0qpnTlz5rLg+XsGGqZ5C\r\ngvVwBBTBMcY6vggGxKFrrXiE+fSUuhzUZqbYgrDuJteXIEAjhdOej4X6t3t+\r\nPRlj7unHLZKzdACUGUYrMxFNudJb2ZJF+OL48VDfVtkgj+oklYdms7E1lZDy\r\nk6ZjMbWqhtUFn96+uouYGWQv28s2/n0SMp91C7lHGrgJZ1uaqmeaEvTqicfJ\r\nN1h0AHyyhvrV0QRbtazNzEqRIYr+bdwy/Dkwb5o5A9mrPUBWof4r2Sfcv43H\r\nvt7y6ehk1iejKKPCy0+uuJ5KxXVI3InA661dvujDq8VhonD9er/0yLH/Y4au\r\nzskr44HEgrxah6ceS5R52XL9bV33sHQuV1667VnjG0BH6tdSW8yhyO6KXJlA\r\nWU7aQm6PCHt4SnJpWfyw/xZjeq0GkYy8h3o923ILUxWRiZvkQTzR7qHYA2uY\r\nqzMIVICfnSLJ88H43jvI2tXDJpdb3+WNj8k=\r\n=dF5p\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2000-61729.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"0.59.2000-61729","@fluidframework/sequence":"0.59.2000-61729","@fluidframework/merge-tree":"0.59.2000-61729","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.2000-61729"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.1000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.2000-61729","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.2000-61729","@fluidframework/eslint-config-fluid":"^0.28.1000-61189","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^0.58.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2000-61729_1649968789269_0.24539831944264612","host":"s3://npm-registry-packages"}},"0.59.1000-61898":{"name":"@fluidframework/dds-interceptions","version":"0.59.1000-61898","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.1000-61898","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d9b51ae119de1d9c7f518f04a34f46fa5b338ed5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.1000-61898.tgz","fileCount":70,"integrity":"sha512-gIKj/L/gtqOYEHaT+wY8mlLQCkOB5BIXhVgCaxBMW/V+RqmLnbTHi+EBdEEUSoNMygWPE/hYuHXw2IBZ0rPy1g==","signatures":[{"sig":"MEUCIQCcAi+t822XaRgx/762a5RJUIxWryINd4SPso0vYNIzpgIgDCGv02a/OxYAY1os1ioACMoqOjSMIOpBGhemm4YkBig=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWf0DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpo2Q/+KGU6M7knd03ehHW4k932p672G40/bHYshqjWyFXKJ6C6hbKT\r\n77Bppb4PAMDIY/OV0zdIYkezcwBXCBHAkZPWLzyk2NH62d+1yefRMmW6dtZu\r\nbHON9DhbwRdmEPeKWD+9bemU5X1QYPl8V7cctrYgTqQvHXM0Hlm0x/yhNLg3\r\nMWZVd1Y/uEjpRgH3x0KYp2FgIWFKd55c4wXES/gHDjM7YWMxoIXl7JED1lva\r\nxH14AvZ9OKYcwZII/jjvArYU42rfvhDv7Gjvu47H4veMY1ETJ5ekr+Bffzji\r\nnRNQyjd/FZIVGPqHtyf/eqRupYHv4EKYx5k0o3XJ7U+63JwRVa2waBml82nE\r\n751nZS7jJXOL9x+6jHKrxEdc4g0fBwuRHCf6RFPCYm+FWLDiOznpZcBrDiM1\r\nowgf8Xxor4yKjWCefyXeOha4h9FoifoelaVZr3CSUqZOHibruIyhtRXzQvF0\r\nzEUyHBGtfk513Yzbbtm6MlCaw7iKDFwSm13Ja4KAsgktC9OXMcGH2LzlwhKR\r\nNZ5ysHWEHuignxbRfGiGciDlnnbxLWIiL//eulMQBQ6PokxoeW7vLx/vZ7aq\r\n4R1/4X6Wr2l8GE03l6sH+XlXR9KPG7ySm5l1lMOvuC5vv3aj9THz6/XKtl3+\r\npX9Pa0ElsPXHEArbKjgSBGzK5nZ3IT3y7AI=\r\n=fXHw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.1000-61898.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"0.59.1000-61898","@fluidframework/sequence":"0.59.1000-61898","@fluidframework/merge-tree":"0.59.1000-61898","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.1000-61898"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.1000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.1000-61898","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.1000-61898","@fluidframework/eslint-config-fluid":"^0.28.1000-61189","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^0.58.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.1000-61898_1650064642884_0.938711189838306","host":"s3://npm-registry-packages"}},"0.59.1000":{"name":"@fluidframework/dds-interceptions","version":"0.59.1000","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.1000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"da17b8036f611e02fa9ea5ae5942db2137a9a9a0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.1000.tgz","fileCount":70,"integrity":"sha512-IqMJjbrgS8bGXq1v1wXJ5O/W+lufn8e9NGcNxTjYpg1IA5rHDT01FaaDhEylR/7Jx5LGFPhryBw/W0kh5XRSzw==","signatures":[{"sig":"MEUCIQCNnBcgghbe67WsZbkrvbV44EfQ7CeRlKFCDHCNlpIDngIgAosf950ACeeu+dSnOggE4uVYn6frMxFEWR0OfEQaabc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWnHGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmovHQ/9GsJGtK19vWSNkgKa9NfVLyhjiZ5G2E9msZEmGgQphB31gr2e\r\ngHQJWZLMopM4fVLROTV1hFoJ76N4WXeQLaxbSYjYrvZfaSZRbrc2nqEAvRXW\r\ngnRMIE0Mqe8RZCDTPGpUhyEHvvQ8mI63sYNgvh687DuQ1l97lmWSfa/VOOva\r\nJflvRBzUWHp6XtFqmJHmBjlDIusZnynklSADrcyLjQIX7gMWPDaU/r/Ry5Cq\r\ntezaW/NDngWwIUPXG9qsAM/6+tCXdbS0FY5Owt1paF4NKZeuMrH+4jbd/ljy\r\nKqoQajHPP79OusvOe/3Jn5XQuKdJVtmZcNeVpA/G4ieijEpp7RPi5VcuWB44\r\nTn/Aak0h7X6Lr+ZCxSo3VyrdIpk+VcbKBgHTMEZ/JmeP24/yxAk7TpPL16BX\r\n6FBsL5wlflQvLfiwAPqyt2C04ayctwRH9zXBW0lZR40GQC1XJmo5w4iyXaVi\r\nof/JKr9JKIWSGb9TZSL3v7eoq8pc1BzQ+Ul/yQvGlLVbfCMmB5AQtTLFWGji\r\n5VwbSrIkUn/BEc2Emf1SQErAFhRNPpOoAEhOWa/NhjfyCDCTWuNlOOVi1ZhQ\r\nWw6X7DdTrsqBuuR2rg97xOX94PnIwxk8X0jppafGaYsKUJlzK9j6aVt/yWvL\r\n1RwoNRyR2gPUbfGapE+UDouGHh+C2eBTsdg=\r\n=lUBq\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.1000.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.59.1000","@fluidframework/sequence":"^0.59.1000","@fluidframework/merge-tree":"^0.59.1000","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.1000"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.1000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.1000","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.1000","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^0.58.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.1000_1650094534414_0.054181540732876066","host":"s3://npm-registry-packages"}},"0.59.1001-62246":{"name":"@fluidframework/dds-interceptions","version":"0.59.1001-62246","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.1001-62246","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c4fdc5740e569bc829cae15802bf44298ab997fa","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.1001-62246.tgz","fileCount":70,"integrity":"sha512-vzuThUqdjYBXKziM0+21PGagHZsaYOpQQMs7XdFe+ZFXsbglWnndIgQzhLN3pisy0BGXGon7wYEBhPm7JI5Edw==","signatures":[{"sig":"MEUCIQD9VftOYpQPvNf/m/8a63ZACzxsUpDiMJyqfJ8EWszsvQIgDmOYCdN6lEo4tdb55JAeoWq7QUz0jdAPcTOL/FgNqOs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145843,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXbe1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoFoA//bNwNx4h4Cr3hjVy3f8FSAvT8LpBdkSRHGGe0Tuz6mcQF5yQk\r\nBQ+9fK3JgpwkmwMx7aqNsyGwdDspU34+5R5BnCi22Lqk0IzOOV27LXH/6xkl\r\n6RM+8RWWtiAGjj2iJrjgFVBVDspyc1NVE43vHsH6WT4aose2CWmPDQXiCcl7\r\nguzs8i/nJIFdo3o2GeosZcN/Ngb9+1GwCO/klC6lgZzwfnbRCTxjiw+Y4WkK\r\nLjEjUwL3n1qyJYsLaCb81M/L8Z7e6k3GuDiZV4V8H5J0bWzwMec4HJFxqzbl\r\nVWvcmLFoNoovakZqQWt1m9RF6N8yToLDDhZ64thVQB/apzS0juDziuZaZjxJ\r\nTAuutR3jMko5dtSCprkntJiPiXD6EBaC7rHmjL5pGc7GvAUhaCut1l+Iaayc\r\nGBZlvUt4OJTDrs8cnuox/kKds+xRNdxR8jYeAPxrZc5QBhjoW4cQbPgsgwNe\r\nausrm0OLKnbiPuSy9Ca7sO09ji4PO52S3N9zd80+CWZDDlYVRR4ZbD2nJods\r\nCY7+9igbrjOpxiZJuxpnabi+9sHPaHFwdihBActqWSE0bP9ElNnnG6w7nOnd\r\nSZCkuYuSvvunUxGRBxWNJR0x/yprBPZOy51LynDUdkBw5injkJH/Tg04U8pC\r\nd+pvskbHD8hXR2p1ZbA+ET2vEfypgWY+ULY=\r\n=+V54\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.1001-62246.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"0.59.1001-62246","@fluidframework/sequence":"0.59.1001-62246","@fluidframework/merge-tree":"0.59.1001-62246","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.1001-62246"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.1000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.1001-62246","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.1001-62246","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^0.58.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.1001-62246_1650309044867_0.6263562327315926","host":"s3://npm-registry-packages"}},"0.59.2000-63294":{"name":"@fluidframework/dds-interceptions","version":"0.59.2000-63294","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2000-63294","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ca03392fb65570c67bc015ecc1b0eb35cf566a22","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2000-63294.tgz","fileCount":70,"integrity":"sha512-1s+EI4la5qNQb5s28UhvxlNmokBEePCZeb9zviV1iJ3wmKBcu6qI5H/MylbVpF4PLYNL63WyKtb03QgEJoVuZw==","signatures":[{"sig":"MEUCIQDjRyRWVXONy+gM/K3iGvw1gTR4PXeW55iYDj5igR3AYAIgZOoldxtmmWG8DXnYWDIAED09J+Qru5PEILMLYPTrscc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYxn+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLow//S72n3HJaiqt6fOn3LgE2R6BLzEyrGXt1gEX4oaBW8zLy3gOm\r\nV7EOkLKtz28dU8cb/eg3KC3JdknRkCGXaIKJebVoLveCVLJmFu0UCR2im6h1\r\nJJ2braFpy2/MJY6zfOr4w7r4gnha79nCGyzTQZDoTPbOREq5rEDeRQBs+f73\r\npZdiIcAhCOi8UsVWLo0SnC/g8D2q6wcb9DOb7EFB+qL8/QaK9FFP7zeyADQz\r\n+h2Ma0M+UmiGr4pUJPYW3LLt+hwIRbZbsjOBQQ6rJKgLpwAVwe3FuVOiLwdJ\r\n+J3z+5sf5mo9wVvdZ2ae8X7mqUevNhnoDLX91yELFtigAKlX5wa5WaaKujpC\r\n5ueD5Wtml146s2NJKUcE3KcyIvz8w+NHfdB+VbtJQM8aP8/Zumyoh34zhy87\r\nxmtFRCYMIBZegRn+BQ9d3sfQmykBNJOjoGjnKEiJtuJlKe7jE14ZWe0sPyjG\r\nULePxt4am+ww1NgHyD4zQj6jHp0mHfmBkJaYMk0ENVU8g45m2q3hKucgSEAr\r\nA5Wwvhvshha+eSWgokr4YMLFDBMLGOqszuK7zdVBR+prggQ2iwLhlDWLPXzZ\r\nlVTXBUefnrrHahKz0fbXFLggaKgHwWHcw+rK4XmBV/p+2thc/ut1d6iBdsi7\r\n9EYeRxLh8FxgbxfTedYJDFAEgVZSpuIzDeU=\r\n=8Mqj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2000-63294.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"0.59.2000-63294","@fluidframework/sequence":"0.59.2000-63294","@fluidframework/merge-tree":"0.59.2000-63294","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.2000-63294"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.2000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.2000-63294","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.2000-63294","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.1000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2000-63294_1650661886677_0.42214264608425034","host":"s3://npm-registry-packages"}},"0.59.2000":{"name":"@fluidframework/dds-interceptions","version":"0.59.2000","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fede6aabd0ed5cb58e801cfa493e10f8d52f0def","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2000.tgz","fileCount":70,"integrity":"sha512-c0j/FyU1J6SX9IQf5ieusl+vLFC0vBqpHC2Aw6Mn6p6hMhZMz5ynJTvgAeFsx89gYIz5fDsmstgKK2grd+oq4A==","signatures":[{"sig":"MEQCIAP4mR0g1z4OZ3nlaUX5woDboitYL8KzNO3LS8zZuAntAiBHqa4EDDPDInhrOb3Z6Mg5IBGdX3bHvN/fo3fca0ZcSg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiabcWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2hA//ct980o40t9nHqnS3yC4bo9HiNeEt9ZlkMEdsTiDwUdUYl5CL\r\nMS8yFbWFVEW/uunCi4zonhVXzCHAEd5CNSE+/mE8rmhKQuqJa3Jazme+OfqL\r\npnShXh2UmE7Bfg0bZGQCU3CGGRayzz/ATrj7b9qTWWf2Bzj4NGnEfhEiyC2B\r\nTNhYEjVUC8jOuJwsqV4O/+QrI1yNfSVse/3YBf1JHiETD6nmmzwytOWObvmE\r\nBLoeoKNCNMntXj++nKC/3GJ2VS9SL34WwyPAY+YNEDgVgvBiln7FjTYcJ8p/\r\nKMsS4ANvmUFL7D4aO9TP3FFejA9l54MwWhIC6nkYKDL40anvuGmNXPEY1biR\r\n9RPsoH7f4q2675+O04V7waGTTDZbYVHZuC8fCxSqsN68EzYEa7CCKlm9C9bU\r\nKWBTF1uPQIG+wne0w+Qr3XpfiwUuUGsN+5r3a118f9cfjUpySE3euwJCi7lr\r\ndLxVG0t8SWLWObbsnYa8NY2KO5dglq9vSbHz0smkrf16QeS+CSbwhtyc52oe\r\nIp8C+YN0A/FsKYrBc0f16da5514hVaDccUI5/zkLHSZaZiHuGv2C4PLomYCj\r\nbhqSjxl6kY+JeSqHle2dCPz2ipMPTHPiZcGFbZAM6PZdvrCjQhN36kIhLMFo\r\n44M9a1HO7R0m6D9yDP1MPV1xPNgCY8DQn44=\r\n=do2T\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2000.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.59.2000","@fluidframework/sequence":"^0.59.2000","@fluidframework/merge-tree":"^0.59.2000","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.2000"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.2000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.2000","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.2000","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.1000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2000_1651095317925_0.2506015327293112","host":"s3://npm-registry-packages"}},"0.59.2001":{"name":"@fluidframework/dds-interceptions","version":"0.59.2001","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2001","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"51059dbbeb05efb72c59da11dedde8b93624a712","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2001.tgz","fileCount":70,"integrity":"sha512-TBnRuJxy6HVggVmSX+oh5vEVhvXW8nD2WSWWdDdA/raO5vP5uwAXFrVsv9sea5nyEMRREe6tZt81jEEiEUSc5A==","signatures":[{"sig":"MEUCIHT6M00LlBJQR1Pw1NutrTMztCGuZgOoZKYa3eKueuoKAiEAmehrCfFhHaMyIDJmgGwciQigj+F58epnnErYMs0cvck=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJicaDnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoy6A//QHemtM5HIBrSE4FFSGcAGLMEsijWfkCMGEqrYeXEwNj3j9dG\r\nH0RDFEFHEODssv6m2nPBGA8vbQLa2U63Ykl1dBxMTT+W8ETAFWQENOtuyX12\r\n1l8TLmDA0pdvwnwFJ+U4Ah193O0k4ulfRZXmdA+1X8al3aebC9heEurbcqUQ\r\n4aT10hBDfuaoAG5uns1eiwfcpYby91GCkkE3VIbcDY1lRjr4dNqwBsR0SPdk\r\nReuVRgcKtnqq4cjUCJkhajtIYCYSI8NmyH6x0XKsWeQITfy1ydJNHRy56S6/\r\n3rKcPwKELN4Qk9Fg3gvRdDPjX0uwvQKEBeTWKB9Ra7qM5oqesDJLmXMF73My\r\nK4lvHsZ0ppgcGnnTX8uzh/j0X45EHlnxVnplm/O//a+Zfy0tOpaNFy7Uo3oT\r\nyYENDuqq6qQYFICcLxJYDnfoX/i/6q5wdju1ZVuSbG0d/9Jq53m5qWiLQiW+\r\nQcx70BNaYsHUw963lX9l3hyq9MWUF2Y2fnG9UsMIAz9T22Sc75AtqNMGQ3MS\r\nce1AH3O5zheLW1E4Dew/2ULTl2pw1QJL4htab6THt7P9scFvG66IH1dkrQ7b\r\n93cnno/z12A7SVXxrB6Jl9RU5plD5WLb4dvXeLngBABXi6yDyak5BciHJGM5\r\nOgcjdIhmJ4R2OkQ4aDMUFUS7TWU6kSKzycw=\r\n=cfvF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2001.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.16","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.1","dependencies":{"@fluidframework/map":"^0.59.2001","@fluidframework/sequence":"^0.59.2001","@fluidframework/merge-tree":"^0.59.2001","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.2001"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.2000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.2001","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.2001","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.1000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2001_1651613927198_0.598388081305834","host":"s3://npm-registry-packages"}},"0.59.3000-66610":{"name":"@fluidframework/dds-interceptions","version":"0.59.3000-66610","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.3000-66610","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7193ad0bd14546191bdadd493a2ba6dbb0244ca5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.3000-66610.tgz","fileCount":70,"integrity":"sha512-0DlqifjorvP9ZNQb1Due2i+SAmhVZe9nNMyiAONwsuWMRHnl7qgcY+PDVdbNza49fOWWFFTm5l48Glg5PigttQ==","signatures":[{"sig":"MEQCICIPr36wOKJw8RccfT1RSOwH3JW9e5qWf2TKwFX9nOjmAiAMGU2Oo+nUVgfYUUzhtohBm0kTG/DmVGRaevbQvgFDKw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146197,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifnoDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpPHxAAg9k4wlPwCZuXep0wW+tp9pSzRv8rtLFuje2Yl64Vt+XR6Ce7\r\nNlXnDwBU2/mJnilyfDzNS59RDuAVHQfesmznIKex7eDXbLLgD9DGmZlGdtUD\r\nNX0m7Zlrrn8DbiHJama43SqxRLutycaarQczaUW67VFWulB5zeCYxIhlCMj+\r\nQV7p71+UbXy8vwFiKcLQUadFl44MyjOXKt8eNdlnPX6ZYETNxA24qbHzlNyB\r\n/drcTfn93kz/EmsPRsZK0fm3Kei6CekSGiKtjxX7QtP8lnhmH6oj5LzY9tK9\r\nHRtLNvS8PCQWX/WnQ6IDkKY1p3m9Hapg4TNR1No5s+p1o20HdXML7Lhwf/ya\r\nFYW9G1CDE9aBeoNNfyOs1Xd8vY6NAAibJf1ZHlEkvtvpTU7Z5rFHx2XtEr8s\r\n+YEZIHiuML3NX9/THbXmeFrPxcfEMFxZ4j8gSdAEoBHcEUQIG/IJCtQ/UGVc\r\nhRGKUaoF8iOHhYZu11ixGNcpAOwmNDE+3jZ8ZpYWBiY1eDHuVJcssjdnJlSA\r\nAaKi4N5mZmfheWd/X6/2eaONoYN6LQtRlQ0f3vqdANkUllsMUcYfLV/4WcJp\r\nIo+hgZLm1oTy1qoN/wnq7BqVtv0EBZCOLdn8ogx6rgAcpAV/aMIdNvWmp9nY\r\nhJJv04ZcN+Nwr3ISr9HSGSmrPE6mIZHNNBc=\r\n=F7KU\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.3000-66610.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.2","dependencies":{"@fluidframework/map":"0.59.3000-66610","@fluidframework/sequence":"0.59.3000-66610","@fluidframework/merge-tree":"0.59.3000-66610","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.3000-66610"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.3000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.66048","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.3000-66610","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.3000-66610","@fluidframework/eslint-config-fluid":"^0.28.2000-0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.2000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.3000-66610_1652455939342_0.9000760503975951","host":"s3://npm-registry-packages"}},"0.59.3000-67119":{"name":"@fluidframework/dds-interceptions","version":"0.59.3000-67119","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.3000-67119","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0cf73e398d1614d44b4624bfd502f998f94e2ac6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.3000-67119.tgz","fileCount":70,"integrity":"sha512-/gxaeH3h895R8rO0rjFyDt21TN5Om93+1pKW+GyiUDxpBR0qWKRn0zqgq1jg9QLL/904KO2ieEAo+L/QPz/YOQ==","signatures":[{"sig":"MEYCIQClLx/1UVE8pB2zn/FZJQ3BzbU0AAcKcxq+zHR0GVuJHQIhAMq9rgqcsUnq62ufoKZyCbeZf6cPmrUC+QC80iulWlQ3","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146197,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJig9cIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoYzQ/+LdLYfn9hff3xkzbvthZ8ctz0fZXlu12hUfP0x1cF1WQMFna8\r\ntWBTnv0l1+YEwonFZhNOpH3QT5vxFEosl96Cja5MFGrabYtgh2uKXEVAsGfK\r\ndcYJshblJxLwEQ+tSk9ndR+kayid22cXuuYIKNms74RTYWTrsUs5stDLVXwC\r\nae6MEXib3l3qKLPH21ZiOA60SB9bA1C3r0y+m5YWrL0ispyuV2s8vUl+C714\r\nz95WlIsuVqjIoWthqYELd8ZVMNU/PBJWbWPQOwaTVzhOsLPnUL9XmJos7dAe\r\nYqux+/pQCPHzV++qfdQmghh+846od8hM2Tsduh795z934QVmn4V9TuZrJFmT\r\naqTd0H8VbfxicLTKV8ZxwJRcIlv/VaiybwtqYceUrWCyZsp4ygpIkfV77qvy\r\nubmMS0qo0BehufNBKydSLacLfrDP4119D024EBb6tRBN/qJ51ZuJABT8bnEl\r\nE1Sd1qswmX5XDnBJ36+fwVucgrpAKcvZekiivjgXMS783qA4F6aIHK7MHL+Q\r\nDYXDcbCHqaKU5PTjrspu7WymQANJpZf/6p1gefsKpM4n56hILDR8fuXGi9WG\r\nvkskIJDtf60Ko5B3Xxy6EAcWIOzKQkGlha4N0sH070xnrARXpsotaaA0y5Hv\r\nDGcO9Q8GuAW6mOzfez30Vdmr6vI7tyilYvE=\r\n=LLtm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.3000-67119.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.2","dependencies":{"@fluidframework/map":"0.59.3000-67119","@fluidframework/sequence":"0.59.3000-67119","@fluidframework/merge-tree":"0.59.3000-67119","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.3000-67119"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.3000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.66793","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.3000-67119","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.3000-67119","@fluidframework/eslint-config-fluid":"^0.28.2000-0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.2000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.3000-67119_1652807432032_0.4621947565826592","host":"s3://npm-registry-packages"}},"0.59.3000":{"name":"@fluidframework/dds-interceptions","version":"0.59.3000","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.3000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f81131da657f3bf1538a4510174ca135342d33c6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.3000.tgz","fileCount":70,"integrity":"sha512-qtGZ1UoCgllju+dISv5FNfF49tOnIvnr19I2ZCGPPwtdjxJqgpWsFvSc5GZMzX9IMk/Ja8Awmp0oyGRv47EaWA==","signatures":[{"sig":"MEYCIQClRBwSc5XIeJcNbX/ZgG7eS03fD6qLxyP9Vo7U9y41EgIhALS3mAGaZI3qa2Y0947kkPbFc/joQ0tt487RV2RpVhxL","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihTDSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo1pg//Tsl16eVxf4Gk+CGwF/SYekKorKBxzWv25ewF5SyIwpU8Vme7\r\nwAytqQXDSZJOukq59VkNY0SqryWglF4SUYpl+F1z3ddPSF7Z6qy2w0AUZ+5l\r\nLEw1LeqnSuacB/3SJU/jffiOJ7r+tQouJY55NWIz11uuaqcRQRMGXRSYttlz\r\nn4vu/gONIL6iQ5WMXDVhUkaTvC3W4hyfqBTqYoCPeC7U/uY27qCDa81UQQ88\r\nxw88jMNWR1V6yEMwBew1qBEl7CuqM2QKv/bZkjWglzH8ngeV7ln/Q4PAFwld\r\nzMUHtV8LrYHuYTPXzSpQPxC12cHlVyOEkKl/9XIv3ajv7IxVorLISAfwxrMO\r\nadaXgJQgagGjElWvwilJ6mUdUqm/nzi8uWgEkBUvD8PJkwZwdBr0p9Ny0UdB\r\nAyoyer+RuoHzr24ApBfJE6otv61GWSQ8LXX8G8SRYp5z3vE4kSM+Pl04wSjK\r\n4GqRS7J6dQDwKTqPuYGS2yVu0lA7aTGEEy00eT8yGbvSPTiuu+JFuHe8oq4O\r\ng/Qm7CnlEQANjYdQxODTp6TCQEY4M8KG72M/PgB/s05zXUJiKQF7GbQvPHvR\r\nayHpJirL5wKOolD5plIEJgZxCAsmLnkr9JoYmtmRC+9IyT6z79WPk3yaSdW+\r\nLs4RhPZTEMYhgQw5vmKbtPmHUv4nfvn4tss=\r\n=tfYM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.3000.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.3000","@fluidframework/sequence":"^0.59.3000","@fluidframework/merge-tree":"^0.59.3000","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.3000"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.3000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.66793","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.3000","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.3000","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.2000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.3000_1652895954777_0.08881222492206642","host":"s3://npm-registry-packages"}},"0.59.1001":{"name":"@fluidframework/dds-interceptions","version":"0.59.1001","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.1001","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ce3a0efdf7a0d18889b8572a653b20dd1182c75c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.1001.tgz","fileCount":70,"integrity":"sha512-3yGogFj1sNMfuMILitwTT5ms/RzuIcIq1XTt4EGWCelc8dRNBbofQvJxObZW3cYguTQcTwVK9AQ1cI8wyr+CLQ==","signatures":[{"sig":"MEUCICFeO93H+3H/lZRU7o97cUdFHjQyQPb/brU7HnY38LauAiEAqfnAk2pdeG+HzjxFgpNScnM8Pytyx5I3JgRKl+k8PuU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihqvuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcSg/8DGXBGEr0SqNXQgRYVqrr2dN68Zg+cyKMU+scITokXpeAqZiS\r\nzsKPZzw3cae5+QrtbQZ0iPlC6bcKR2TRoPNNxqFVs8dB1o/2rDDO8bNF0Qvw\r\nbU60/pHARfoKl97xH5FymNUXFbHtw5aInn0HtxcSbTS4NAfxTmcDVentZEi1\r\np3GBHwFR17t/zzozXGHte5Eqy7jrEi5c/yfzWiilkgnV/+mj+RkWP1XunQPS\r\nuc1cq2PzhtXnGGGhSXsY3TzbtKMiBd6P60C2zsc0mVclrm48lDLp6xeHd/cg\r\nodVTGTimXcRXhzUcrSU9/rnkMxrJqBaxRVZjsgA667a8nH7w2qg/gbjXPgpl\r\nU/TvR20FffxJKAkX3RBT4ZmkuarY1i9Olbe0+3+u5iikYucNAQi7xvYS1odO\r\nt0y3vohc/lxdJLPci+W6sfg4VEFSmPBG76HH+vS50J8oy5D6da6Jqs6RM94z\r\npna1EC+XBuxVjZQeH1t3fPxIWUGYY1thTKlhC0nR1whZOQAW4FKzqgptzgZ1\r\nkCdv4HHydRH/zgj0qflrJNaM8XLro9sWiDpnmIgrfdFCrNJ8ZkEXmQOBWyqo\r\nxj/1FcO++8ON/vx4qjbreTVlgRQScFW6NfdEiatlQ1RT4JVuuomLTmh1IUYV\r\n9Vzus9d9XWIef3lXwLR1zSt6+nHort1T9Ow=\r\n=sian\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.1001.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","build:commonjs":"npm run tsc && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.1001","@fluidframework/sequence":"^0.59.1001","@fluidframework/merge-tree":"^0.59.1001","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.1001"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.1000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-react":"~7.28.0","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-no-null":"~1.0.2","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.16.1","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.1001","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.1001","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^0.58.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.1001_1652993006701_0.2683116546896418","host":"s3://npm-registry-packages"}},"0.59.2002":{"name":"@fluidframework/dds-interceptions","version":"0.59.2002","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2002","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"42e769b2e57ece3a5ec0d26b26da901599578a2b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2002.tgz","fileCount":70,"integrity":"sha512-F0dqUDTrT8P3Wo8ADZ6bu4T4cIipG7TB+qDjYvPai4Dkl1eE3UG/NbSOw6ei01dx1XfHUT+tuGe9moFc3ulnOA==","signatures":[{"sig":"MEUCIQCs9LPZ5RiBY16xcbNZMV26dqY6zu46rGqa2XT2QlMTxQIgTNiF6xc8wn/xVrtCeV15MtcxwBxiVPkOazLHeFYl0yk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihskFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp/rg//c8JCe/7e1uYld9gBD1lApIedea9lhjB2gME1PwlhGvkpSe1v\r\n7yRp7flTDaG+KzoDd3N4OzKajxo4LfrvdlA8IIRBtQRCANH6DLw3NTaW+vUF\r\n5CN8f2TDMb+fXrizYjqE910rOabmwMQAHaO+ehngDaldN/aw04lg1VCgN6XD\r\njcQvOpDILWr39fjn1eaOqnbfEn3Dc5jqpCTo75uv8JhVlGeyYqVlOcQN1SA4\r\nbYMOZKxbhksYS+85bUwWFnhCATAXN85vl7HGoXCmlb1a3IjYcy+xZAdxlb1e\r\nxWrfpBUubgoz53La50mhxZMRbBxa1HtzFwF4bu5JSXCbJBFEN3VkGPOkdB5v\r\n7YnQA0QBezKrB/ddnYdhv4waV44v3F8Pe2BdPLffZqy7X1PqcDuflGi9LNxA\r\noS7+tgODbGw0gC76hzpALAu2P4YRXeBzXNXKpIogYc6lFZlJ35fm+d/kpEtB\r\nTBU9c10y2DiOF6RbofyUyRoVXTrCm2b8Vz70ndXvxDrK4w8Gwn/9Rr5ILAyX\r\nr6zjszjwP9u6ggmU7Tnxu+ifzqCabrON1aS5hS50Ru765WECP9gxgaxUuKkO\r\nP8XJWtU9QZlB7z9INSCEt8JEQDWAQV99fI/BrFQZ97Re5iWt6kDqSpDQ9IVS\r\nHFFLHopmFZBFPBE162IlDHWnxqr1MqFwP6E=\r\n=S4a0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2002.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.2002","@fluidframework/sequence":"^0.59.2002","@fluidframework/merge-tree":"^0.59.2002","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.2002"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.2000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.2002","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.2002","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.1000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2002_1653000453398_0.3172736013129147","host":"s3://npm-registry-packages"}},"0.59.2003":{"name":"@fluidframework/dds-interceptions","version":"0.59.2003","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2003","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"642196c5d19c364d2c012fbfc174d07d75166d87","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2003.tgz","fileCount":70,"integrity":"sha512-sW8p2rPa5YLALuwuZpCPlU9JXE1+67wXXTzFtHaElO939cT/7ZKJfUS/cgokMcZW2dVYJCTjej8ufUYRNyCozQ==","signatures":[{"sig":"MEUCIBn7z3dzm4Z5w22v48Ruhn4hvYxSTjlk3K9+5Rp/yFTWAiEA4Fav4SPMy58fQ+wwJiUGsKq0JVfypPzD4pyS2a5kJ/8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijpN7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqY8hAAiLx1mga4hVzr6Mo95zq1jcv2IHOIFEpn84PGoEoAjbbKnd56\r\np4Ja6ckyklmuzkKpfCArxJZ+1BmMO1Lo9UlOIyszsIrLKqgDY0p20AqzAYDF\r\nEZaWvVpXmRtefB3Y/q9mFxNuLmK72Gyh0IAw+5PFvVL1BlF9TrqY8yM0CM1Z\r\nY/owf9pC9+3PUbQRF/hEB31XTAZUnVcBhlzmVgULoeccn3Whfr2L0xRNuHV6\r\neWgrs3eq/+o+eXzg9wG3FewHX2w5U4rhZ7XkQO7P31VEEZwFn6D0pbd1AtuH\r\npbOQEYcxVmLqiOm2Opa1mw/R4t1ArtjYBE02BLAWiypUKqlJ5uYVdKqZRA6F\r\nj3nr+Hc54i4MfN9sgwdTZDEt56HOUZulHX79pljWzE1QA/yi+8gHf8q4o4DM\r\nxkhaJjqb4eboZUIF6llLwPi9GHsFLke0ZZkJN24IPP4ct0HlJdO/6kltMl4X\r\niDA9cKm8FRA98yzmORENVjfatTl4QPOmEqiWsUwJQN5pt5cgJEZPuUWuTOIs\r\nt75Jk+Vvv1m0ML8g2qYFqaRb76ZZOWBcaY8nVu0TX/Z5MxZZYy4SRcHWG2dH\r\nNHlDMr5APKcg+O2Y8TBu2B7bFsHaHj7DR68cQ6stbQoXEFLmp9yJQXKPowBF\r\n62Y7N69Hy5eBa4WkV3mg//1XPAAKjunu9As=\r\n=d7++\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2003.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.2003","@fluidframework/sequence":"^0.59.2003","@fluidframework/merge-tree":"^0.59.2003","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.2003"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.2000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.2003","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.2003","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.1000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2003_1653511035358_0.6717044553852556","host":"s3://npm-registry-packages"}},"0.59.3001":{"name":"@fluidframework/dds-interceptions","version":"0.59.3001","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.3001","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"da4a276df9083a9aa1a12b5f43609b8fd8eed3ec","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.3001.tgz","fileCount":70,"integrity":"sha512-n+DLBmBz1ZJapHtnERntMhY43wdQIYkR8JODjZ/E+CjAb4VJ642ZZ5i4FGCbvfSTZGOZubAEhS7nFVyTGDVdOg==","signatures":[{"sig":"MEQCIHsTnnyOxSPPe16qYXn99cqTSpDL9qVsMlbmBvrQTHoaAiAfR7H9CKt86PumSUSZz82Ay7LC0x1o5LLZdHRu+6QghQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijpX5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrw9RAAgGxyJasWyzceAqjWBBPP0JG4uu01HWMg6HjEyHzKmdSfJcwn\r\n8Z4hC81A1qcaX/MYQ1aDH2JOaFG3+RRPQ3b3gTaeceNRH2hrTNkUXgNTFNGV\r\nVmhdBbgN+jaGnTRMrXH3bj78RPS+I/ZEsMP2fzzg99g/CBBt4zM8RGSounoO\r\nE/0OkPgifBcnoeoU3LDu+wQjC841/Nb9SgAJ9y/dQYqj6VDMMy7ss08vAjgv\r\nsCXSwTWKTgXF5vMdvznSSvHBvnS56kt0VirmZwGcLe0gxMBhROv0jks+zTfR\r\nnmQJ6Vzf1fHTKibceNnalrJCNWlwsRWMus0OXK94D6WH9Y4lRE0Rc3rcLrFn\r\nnEeb0wRf0iuIvlZnn6J+bC42/dIbJoG78f1y4hlByZwDthDyciYqVsLuPOE+\r\nKRjuuiyY7S7H2MBZqK1wYxStU32eBzJipqnS3yLxBxz9/aoosRadL7ieSU5x\r\nCqFkfE1mYeGz2hwX25UQdX9L/m2XU/SBQibgyFnJyqCnMtWuHg/vevAz4jqB\r\nw1CS7lHusv8Y8RRlBAtTGqg763t6thwxkGVZ19//14RJarLBz7vQnGYAhcVV\r\n736oTqdLfwSe0WFdzniiimqNHjSHtYIwbrXGh2JqePwX73jB+M6QS6UNCh7X\r\nPDkh00pTxtKeLDGU+8uASnMtI48UOfr/Yjw=\r\n=blQz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.3001.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.3001","@fluidframework/sequence":"^0.59.3001","@fluidframework/merge-tree":"^0.59.3001","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.3001"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.3001"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.66793","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.3001","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.3001","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.3001_1653511673359_0.2801315618658582","host":"s3://npm-registry-packages"}},"0.59.3002":{"name":"@fluidframework/dds-interceptions","version":"0.59.3002","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.3002","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"23f26ecdfefc1b5687df5054a059db95b5c453e7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.3002.tgz","fileCount":70,"integrity":"sha512-hRnC8ehdYKvsHRwnZQcOwdZb2D1nI1X6X3UmwTy98H+HTwInQhP1/Lcd+SfsEgTS08PlEocYkRUHOX4g9WjPMg==","signatures":[{"sig":"MEQCIDLSUYVxDjC1hp+2WEWL3BTmlVvtkaAHpd1loIw6b+53AiBhOScspxSwkfr/Cc7h9q/HbDm6GGvXtm466QcY3Gde3Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJij7lDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoXsRAAmnWjIscgZxKbbFq2bt7L27RToMhS7Rcnce6zo62uLojLsOt6\r\nU/yKP34UMImx6yO5XuJ80mI5Ox4KeWZ1IzLKDKppddCHh+34Onvwo/PyGntE\r\nOMhZKSu9rtTaLrG3L9Y0qXkhGFjozvijFUcGPFSPKrgrBU66Q5cVqkCHIILu\r\nDny05hdG3GT2TJNwxOQK4gaxTWD/pGmjd9CrHefCOS6MsQqziNWVBlCvgSuy\r\nLCUcPPrpIG2WBno8z83rjx2lHy4aMjC/JcxSqd1RHkKkCW2pTjE4sVYTflq7\r\n4H4VTCBU2iwboy+f0l53iiuoq4qf1Ex/6LE9J/EWoaZ1vBhcldIMTst3cy5j\r\n+EBdRdZRp7h9TEJPcWdoKM/1N4f9XDJGhofDZDoBuxH611at9gxivLfnKkyt\r\nDQc0PU42dVHxQaAy1ngAFR8rWF1doexUslN9xZyW9yAXEdHslf7e5SuVrNRt\r\nKT/b9/CbZEkoG4RWgSz6nOXx/QDEkIK/h2N6ngdnr8cUvFQYkFppqzrDLyP4\r\nTAc/5lZK0JS6ZVlMbTvVoi5lunS2PTPnqVzr+1DKrm6yiUssSye0StdUDtjx\r\nm+Wr0dxyhHhMrtP40IOYWLJZiYiJuo7wza6cUf2e6CjmBfq9Ylt8ZZ6efNuR\r\nxOXvgfznkb2aWCEoMWFttCWtVYMOQJTpQSQ=\r\n=0nUi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.3002.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.3002","@fluidframework/sequence":"^0.59.3002","@fluidframework/merge-tree":"^0.59.3002","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.3002"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.3001"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.66793","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.3002","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.3002","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.3002_1653586243717_0.8135835064584898","host":"s3://npm-registry-packages"}},"0.59.3003":{"name":"@fluidframework/dds-interceptions","version":"0.59.3003","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.3003","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"01a26fc095887404cdfed3f65e339ac3535986c3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.3003.tgz","fileCount":70,"integrity":"sha512-DCz+EBgeHDMfG5wT/UMfsQkh3ZwSG+Q8pSSpISJR4ytNkq3keM5Pw6/XWTF0GO4vZB+tIzhYm43/SKtAxntJFQ==","signatures":[{"sig":"MEUCIQDizgQjHseoUlbG/lzsJYBjjoIsCiRDJYz64G/fIOgFsgIgEvCcl24b5MF680WRj1EouDapxE/yLaeaPWqtajjtZ/4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJikT+3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrflxAAheoXrY00dxSQrsQl35a9AKQOLVJ25ulgNmA9CzmqBI366+jH\r\ni5nbVPX6O9oAL3z7iCIMGmHpXrNJkA71F5DZYN68tkTl6RAM9zgGv/A2UViz\r\nPzxvF9wVg8Pua4gVKGjJ+0iNLC1GWUyJ3x1wODbe8zs0GaCDJNgrWdifHiS8\r\nrvyL0F7ebfzS+ZHEHlcD0/95M7wAnhaLDIVaxiDkS17INNgo7MtuEOX/QRPl\r\nSvDXk5pnvrUTalheaTL1s+eKZWC6KxC7swXlEP9xSt2DvU7K96jc77eDG10P\r\n5Ek9ab1usEsiEfad7eVXobunxrG2sLb+fFacxM7ZxZXgrFJs4QGjZ/GBs8+8\r\nHYjXasTnvr1r2gBQMCkgPQfeBUNxLsdeNP1m4Z2vGEeqZlpByGnoI+DEOECb\r\nbHJAe+lKa7uA54PT1UaV/Mc3GpgHKfDS9Qcg02XsisxMX2lZDzQOGq8ACpDN\r\nuewLVHRKT+G2Zjsx5qyam8r54a+xRXJrDv6HFUDXWeq7DuVDJNo8abJfqo2V\r\nvwkO9I2F6o9V6Uu2YL12gYTO4Bj7tl8W4uauwlTfaZV2Bzyan7bSiK23C6ne\r\nk4Z/8zybJsXE42ny74raVLOjDV52cDzYELCfqKD/rSOgq+I0oXmSwraICGbG\r\nZH0XM62KAB+eEEQGEY7ff7ClLAEgxIugt6s=\r\n=FPJ2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.3003.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.3003","@fluidframework/sequence":"^0.59.3003","@fluidframework/merge-tree":"^0.59.3003","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.3003"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.3001"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.66793","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.3003","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.3003","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.3003_1653686199130_0.9108344330825213","host":"s3://npm-registry-packages"}},"0.59.4000-71128":{"name":"@fluidframework/dds-interceptions","version":"0.59.4000-71128","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.4000-71128","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2b03cb8736990a2e4f84dc24fc9783b7a12754d4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.4000-71128.tgz","fileCount":70,"integrity":"sha512-/y839ZnHbX+ItazNpt0yNjQh0i0odiyXemwFXsbHJv0kdbd5AdubhFXeCXHXlfr6+YDUkad4Y4naR0hWBmUEcg==","signatures":[{"sig":"MEQCIF/Ps9M3SmpgrjhPkC0xQc77m3EDJcMJEol0qRCgRvNXAiBY4w3zW/AoqokvBR5Ae5VDhI0xXgdseRmiLhFDzrAvNQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146280,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimQglACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpPxBAAjORBLDkUSr3fkxxd0H/Zs3nqpvCBMLEK75axWf+WGHVH0tUu\r\nHTUrhoXlE0Sb+NPuTomPqZ0A6wLIjwSU78hZWM58lopk2NcZS/TETROW1jxV\r\nLORXhp94jtuh7TGmi2twGrOyY7g9bZanSO0i9SfGfw9j04P1SAlhY5953F4+\r\nXo1+g8kfFqf2pjTk68wVE3LJkk2VJ/82kpmOqyyporynd+FXpxRx4oaYdR0k\r\nFLjywIJTUXeD0NpiJTQ2I3nuk0RwbkkI3VtiQAkYDA+Nrkgz3J338V3p5HCC\r\nQ8kCtO0DAXFb3YFX8mq5uRe3ztOW/tAJwXuaPX1a8TQXGvqnm9qBTTVZaH2c\r\nfAakO/OA1VqI3r/L9oRrp332vyZTo6K9RZaiysWXDLO8QSrGJaupmi9/gLtX\r\n+wmVrpYVtXQOTWKIlXh2OZKR6U8oI0ZLDniSbj2OveYP3NayrktBbk1AFM4w\r\nN2N3rm6pUsHC4a1e1NUKJHSmIAIephwugPggtf2q8VgQNF3wOac3VPcP3xe3\r\nss/jWAMFP5LQYhj/SDGrvUWUibMZJXVPTImkKA6kG0U5AsdF7y/ipaZQ03/J\r\nrRKHS/gxqYz0gsjmarGTAYgegiKbB1+84SgWa56J/szulQpiNBKyrZ1DL+zZ\r\ncp7mFnRh5hngJazAj8r9E+nG3bY8MYAT5C0=\r\n=YOFN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.4000-71128.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"0.59.4000-71128","@fluidframework/sequence":"0.59.4000-71128","@fluidframework/merge-tree":"0.59.4000-71128","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.4000-71128"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.4000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-jsdoc":"~39.3.0","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.70857","@fluidframework/build-common":"^0.23.0","eslint-plugin-unused-imports":"~2.0.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.4000-71128","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.4000-71128","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.4000-71128_1654196261570_0.7018443930265936","host":"s3://npm-registry-packages"}},"0.59.4000-71130":{"name":"@fluidframework/dds-interceptions","version":"0.59.4000-71130","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.4000-71130","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"614043d13e25aed17b6b8ee149a6cb5a56cddd1b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.4000-71130.tgz","fileCount":70,"integrity":"sha512-jlvZtM5eJUVvsHGPRCsMzGFwKhr/2JUVOssLtfowTfcHZxebiAE4E/ZQK57RbK3vIhOJGiVVaB4A0R36LhMXJQ==","signatures":[{"sig":"MEUCIQDn+4pWplWXHochEiYQav6RDAAy0ouGuZP0i6tVqKxI4AIgdCaTZ35OlRdjwe9m9tn8CXztTBMft0sOaIC+YxJb5ws=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146280,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimQsSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrgQQ//cuYT/Nkm9JdAkH4nC7XQgQ7eOSDt1/0LXg+23GiSKRjExxcj\r\nxbmuo8zs9fjRjH47KTufDL4oj0j8LZ2UufwYTMQVKTFXoqocHP8sUen8+crO\r\n62Jf6nGiXjPMtbUqZd6EeLXaXUIOJ/o7A189JUS7Zdn+aUPMbGNWE4p1hzk0\r\nTbej1MARCD5cmNFYTOP/Sv3/f7ih0OgkJJ/GTgZRz2lZceShBvy0Tld7AuzX\r\nvNS73potrtyG40fE3zyOqpySiQ8hdvY8Wl2pi7cgaTBNADjgrLE9TamTgJog\r\nlzSZ9H48n4HnlsRnSRopJtZ+slsofFIZxWh4nkHxleHvt7O/apQriZKVlaWG\r\nPZrX//DTR39C6zqAsjFn6955Q3wht2TRsPNJaJJ5Uc2dCnkJfnoQ97Gnspy1\r\nPuUP5oin40Eq40FURQ3bAkK1XvDUTxOKwcmJ56BQB7CCjS+2SNfqdT46D3Hc\r\n4kdjrDb9GrlfImDskd8IYLIl4/k67kKtP4l8Fpfffux/8+Ft9doLLG+y+BXw\r\nbIH6esNH6MxXjKgoHpcGlm+cOgDIyfe7JME0LjWiroicU1z3ezNlbzX7Ao0m\r\n2aWhiSlnM5PmgzMihGUu+SEIk1HD4QsghzoCKDf/iHKOFrR0Ml3qxNsl3x/c\r\nEcPuwUVToKLEdEEfKTdNMBLbKBKOmCIVE3I=\r\n=UKUG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.4000-71130.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"0.59.4000-71130","@fluidframework/sequence":"0.59.4000-71130","@fluidframework/merge-tree":"0.59.4000-71130","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"0.59.4000-71130"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.4000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-jsdoc":"~39.3.0","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.70857","@fluidframework/build-common":"^0.23.0","eslint-plugin-unused-imports":"~2.0.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"0.59.4000-71130","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"0.59.4000-71130","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.4000-71130_1654197010411_0.8056115389525498","host":"s3://npm-registry-packages"}},"0.59.4000":{"name":"@fluidframework/dds-interceptions","version":"0.59.4000","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.4000","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"93cdf49b830e9eca98d4823b0b5445463b26d8e5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.4000.tgz","fileCount":70,"integrity":"sha512-9k29OWZqRSnr0KuqEMupewepzz1MLAnpy6AbXOFnPUptINFpJfVMwSMsG0alR8mJPTSO5LW4pSPtG0hEKPweRg==","signatures":[{"sig":"MEQCIHw9UPJcR6DrTQF11yIwU8hfzFvR33vQee58CuA4QrqcAiBktibL3HY1EmN7zgLry+1N/d8rg/z8NVMcjuLvVSVQWg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146194,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimq2KACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCvA/8Do6zyYDBpKj970e18aqOV7iOQGeHkcPpncTMSLI/JCND544s\r\nRo3R89CJEqgtfz307qR8WaL/pIZqcHpFYAC2tJ9snJzDkDlNbaHFnyzO9rkm\r\nJohgdSPG26zBlPjcDwNPbtfXcVDo0ajvWg81SwkOB8RHbazMdfnXhlfxXlUG\r\nnbkvcuSnllo7e75Zq8IL+JazPT0d/SSuKt7Fz2RSeawWWvNNiFRCeOzuzIZ5\r\nY6HGYzR38TD8BOUUnd58VCZUCxf1Bmp6d6r+BCzpHZRQgsA1Rhlr4cbSr673\r\nqwy9XDQYAfS1RqdPmElJFcMF4hsv/WkfwLq/lPAS4dTOSduZrJfNBofFrJmJ\r\nZPWTaCF3W0b3I/Lpo85ulsheYjJmhuUvyWsTakWd5qeqezTldO1LkLSolFKo\r\nUdqpN+gols+2tdiIwxqsAtMTCdnlAR794kya+L5K6bS4s/CINjfphlNI0LUK\r\nzawLDdWYOqIdRN8gyanF9kq2YvmipShyeDDhcC/rv87KjwC3ndcKaPENWHuB\r\nQZ8yjrDudO7is/FSUM2jZwNwjzIcwapoHwQKwbcowmkY0ivRDrhDwezrfrau\r\naCu15cztpGS/kAeyJchdmcpp7pvGvw754+iwi3tUJ634QTTCzh8mdXHD/1hB\r\nh3DrCj5EGYsNErQkx2t28FGuZCN4mrqKbbc=\r\n=Wmj/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.4000.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.4000","@fluidframework/sequence":"^0.59.4000","@fluidframework/merge-tree":"^0.59.4000","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.4000"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.4000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-jsdoc":"~39.3.0","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.70857","@fluidframework/build-common":"^0.23.0","eslint-plugin-unused-imports":"~2.0.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.4000","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.4000","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.4000_1654304138084_0.7078859423640118","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@fluidframework/dds-interceptions","version":"1.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.0.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"62ee60ccb6339985e29886c2278f328b67b90c5b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.0.0.tgz","fileCount":70,"integrity":"sha512-3aVvm9zKHOhrTe80aO5IpIrCIRL+lfE3eBvuRA0bSGYUwiS1oR3Gkp1eThSSaLmVPSbj952HYl77nOOZMbze8w==","signatures":[{"sig":"MEUCIQCAVy2hFtRcIEB/dxrC6/HqHIrUJgArBkGeD4iefvhL7wIgazMp5bF0g4E6f/tTWWEVVf2HNHS7NXRdBHMjOOc/Bu8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145614,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJioOIqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrxJRAAj/yresVxdz3+nk5g8oO3Ih3x7DE+XVNTLq3HG1Wfna656Zsp\r\nu17gdceAbppJZFwBwXx9NHgnyoHLUFWhjZJq+bzI6S54ce44yxhUVC0EfAnA\r\nAa8p2BmEWwMswBhwcyHAGwNbPwHh2WznF9CHaGx1Cf8TbS3yRCxXk7ffR970\r\nzHkRGWvk05uj4h5JsqABKsKw2Tl1VlyPEgjiZV6LRftrfRvaKAl34lQGmY5Q\r\nCmfUBpqGKQ0hEqXNyKsB/UnOpYtFgLQHyPdsm0GxKAbWTrzZfD4qu251ndz0\r\nOnYE8uYv8lMPp+NeCaTrwxCn4Bc1o3LjV4Fgnxzmqg6z/UzG6JuBoMlHA6rP\r\n6NZWuL1hIZzIMF7XsT2VF7/ylZnGjN7nA56uUwjEWRWNK7sS9XPx2IPlbcWV\r\nka68d7LQP8fzcJz7JxEy7bVAydJazTTu7EV2IQIalDwWj8cwlYvfbDMl6pWl\r\nj3klwnW7ZiXL6NOcxsK7v5kbJZMpMVpAcdF7+Z0Wwuefujv3PLif0GcGxInT\r\nX+EqkTdVrJKEGbTuwF2UUdR8zatjDmeNEkqYGMohP218q4lqjuHu8qzEpcbP\r\ni7QSDgZ8CVoGd9o+/ROi24zHcCS1R/Fyz901q71NDAMjIm4DJoiToPquujeF\r\n1VywgtWW8jzQNm0mCjPSYfPvv6TiFwJDT5I=\r\n=c40N\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^1.0.0","@fluidframework/sequence":"^1.0.0","@fluidframework/merge-tree":"^1.0.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.0.0"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.71273","@fluidframework/build-common":"^0.23.0","@fluidframework/mocha-test-setup":"^1.0.0","@fluidframework/test-runtime-utils":"^1.0.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.0.0_1654710826502_0.6015778482660152","host":"s3://npm-registry-packages"}},"0.59.4001":{"name":"@fluidframework/dds-interceptions","version":"0.59.4001","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.4001","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6ceb246c336472710dd3037d5c3424c233671736","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.4001.tgz","fileCount":70,"integrity":"sha512-HUs25vI7CHEvJ0kEWELZs7yCc1ADy/iSZwjOmwLnVRY73wgAjfIW4LB+8c5noPip85Npg/ozfl5igoAUifCchw==","signatures":[{"sig":"MEQCIH8pqP8VueYj/Klvdq5gOaF2erMq4pjA+QH+a0JG3+uDAiBhNtN12g6QarhYx7Msa1PdwmlDdDWDqIn5LfKU/TKlDw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146194,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJioONMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8DA//bKIJ5jmkI0X2BQi1HysePdZ81r/IKM5gJNEK+Y5Shci+MjJl\r\nwxpBNQ1RpRgMr4QJctOIrwLfpEGvEYfRkjdsF3nuBPtbSNQV2qs/+fk7jnl3\r\nm4oXWpRG0AGrVSReF0Uhx3D3ryzGpZaVbbyp4M/SfIbWkneNNUN+4HBG6Ru/\r\nziP6OyjLdnIyGRmGByb6/VRPiWw/KwGcdBeDghvX5NV1jSK0br/D1HSl1vsa\r\nNTmFkelTP4z3bDiJ5TzsTWSdxzeJmZBw3vJ/prLG79hZ6ry4xMLWeSraoC9P\r\no80O/wFjjZbc8DymcrHMTDtOE7KBfPSzngSZ5v72WDgQEQDxq9RFcCrl+iZb\r\nhTcVaSRdMHkyRrAPvawiiVU4E/bRk/mpTj5tN8eE+eAATYeoEEM+BbNTnnvz\r\nrW997fV3FvY9flDjQ/1KLbvKPvpZGuCpmjDA7IYXaqlNPlkDwhJlUaLam6Ts\r\nd1pbz9jBEKsqkkTYem9A443F/37cdXYb3QbAHjNUUMRco7wwHNsVRcKnhmK3\r\nQw6MhbfMPQDqfW9QyE4gra4rsBhNGJ9ydvpqrGqNquFGnNkTN4eQyZxHubfy\r\nsCofzCpblmpeV91hBAfmmjbTcd51jSqNZWn6JjREcUa/EHL+CsmLXPVZob6a\r\nvH9kCHvBDOlbqNx90XK6kTyM7i5iSgmM4Eg=\r\n=fQEl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.4001.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.4001","@fluidframework/sequence":"^0.59.4001","@fluidframework/merge-tree":"^0.59.4001","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.4001"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.4001"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-jsdoc":"~39.3.0","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.70857","@fluidframework/build-common":"^0.23.0","eslint-plugin-unused-imports":"~2.0.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.4001","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.4001","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.4000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.4001_1654711115891_0.07305691838111783","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@fluidframework/dds-interceptions","version":"1.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.0.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"582302c080839104d40317fa340a63031166eeba","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.0.1.tgz","fileCount":70,"integrity":"sha512-V+XN4+aOVqrEv9M0+HxC9Qq9lwrgLj40LpNK7s2SWGCtERcVIPzNEeCKYnpjGbL5TJ6cfHCDuybr/STBreBKlA==","signatures":[{"sig":"MEYCIQDEGa51gUUFA5kCxi/OxvzbIHrmw4Czekt3OANRBMm7QwIhAOofsQeAxuDBTOzXU/L3hCbmXAQS/NpeD4D6KHP3xbwx","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145614,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqm2SACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrglhAAgkVUN5C3LopYB0fSnmoqQLNrjom3bkBNqQbPeXunk8/qdkMH\r\n8rgEGJN1PVZ6Z2QPBUflq3GPPQm4nMGbsd2wt0Y1lK3t1xNAfCHWOnna/K4y\r\nMH3/b+1gQlVh4h7YiFNLCSTxdKS8oFod/Yy0zQ7NQnzI5YZh90PcobpfOoGE\r\naNczRnKiHwo53J7NXVrUqx6tJQ4M3mH2bgI3AoDdu/X7+QVMgoPqfh6Mq6y7\r\nHhkgqp9MJXWpPQ1U2JD8dOqTrhSEvFNZyIuISr01m0V/maBuA8TNFoid3GRw\r\nKxE1IkNk4wOKna55FztxmimtKecWo1mqN5Q7s5mL5BZHxn5mnFLJx+3IW6QS\r\nXBIOi3f4QZQfMj3ucnJiKVP6u3wRbZ97GbWC7WDmWU9ea3vdabvrtnL08xjB\r\naXXtNj6Fd8PJM+hBwdluwf5P3uIv8mJQQXTYL74SApwyTz3haVm7P5cgPQTf\r\njV/B1abSKje1Jv7hm6TI6Y7SVN8HZBzPY2G3XQNVJTzQpIDW2OU4Xb3OqSnm\r\nLCUhjRGQ4knwEwzvze+bhsQGCJ125eHNH0mOIyMXuCmgx1L8xAEp/oJckJ0f\r\nWbI39jm0rF92rAqilGkEtD9OKbOpqMpL8qwXvJu2DnSISG1cu59wXg3K3rs4\r\n/R5k0u1+0KoiU1BdbJUp4hM+SbpcI2TgmV8=\r\n=Ri9E\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^1.0.1","@fluidframework/sequence":"^1.0.1","@fluidframework/merge-tree":"^1.0.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.0.1"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.71273","@fluidframework/build-common":"^0.23.0","@fluidframework/mocha-test-setup":"^1.0.1","@fluidframework/test-runtime-utils":"^1.0.1","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.0.1_1655336338534_0.6091701281993165","host":"s3://npm-registry-packages"}},"1.1.0-75972":{"name":"@fluidframework/dds-interceptions","version":"1.1.0-75972","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.1.0-75972","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cc05fad0a4053bc27b13962925cef67b873b49e0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.1.0-75972.tgz","fileCount":70,"integrity":"sha512-APK5AU7cLdnx0KAuozCyc8VGsta73GQ9M/EPs6n39Fn2J2nyzKWobTyQZlO3ZZTEggaKb7CSdTuu6an6cbLaYQ==","signatures":[{"sig":"MEUCIG0JvEMI2mdB6scjWmS0/BBu2N6AaZqlThqlnsrP+veCAiEAwo5cEnLNTf/KhP0lTtBKZeoFdsYvtPoS+vuwlqC2xbA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145695,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJitQ1FACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjyhAAggCyE8aauxrWLaF/OioZDmsIscvJX3qFtLfOWXH+0gxEFhRc\r\n2zP6stuwlEHHlWR/OKRh1PZijK8qrX/pGXM8K0/fsj2NN3dYo6pD6LnNs2aB\r\ngrWIfLmWRq4EtqyPPhAHRXijDsD55H+erk2k/at7odXAQNVTwlAOJ75zwBmv\r\n5LsyktqFEaVDY1yXiWoryqTfJIhjaVb7rw6qHFzcjQRPyaAyHox1wQVmH5i7\r\nHsnc+z6rL8C/0MHty0IStbMpQN3T0xvLd973VQBh9ZoIfD9qVeX7dgIvCkXG\r\nO4L/KN8BUXiRsBDMIuMtN4Ek5rbNIe7i0we9tNESCpVIIcDXPo9YJJkmm+a1\r\nVv2EycqDrpxacgsf9P7mHh/3A+SY9/7WbAISdo26dv7VS96ydlaH5lrc7naK\r\njpb5fzVWp+gqrXbYddPft3Fbrh1Jtw/FzOZ0fBzYFirBWUCxxcmEJ7eNU/EP\r\n7HxyUJWwEZq34nk9dSbjayiKgYTUVMJc39kzqZqcDSTCBAmx3wG0QCcnRA/r\r\nrCM86gFl97JL3N9Ekj5T3mFRITtdexsu/ROnr0gelaMhlgORDoyt2G1jkqEk\r\nLZ1LBODGOPUTsj8CICn/OuFhFgsaf03xgCJQQh9+vr0nWoS6BnlVIcoRMwWU\r\ng2WILsEF/kbOPCFKTjNhS5LH/re9xAH9VOs=\r\n=Kxet\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.1.0-75972.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"1.1.0-75972","@fluidframework/sequence":"1.1.0-75972","@fluidframework/merge-tree":"1.1.0-75972","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.1.0-75972"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.71273","@fluidframework/build-common":"^0.24.0-0","@fluidframework/mocha-test-setup":"1.1.0-75972","@fluidframework/test-runtime-utils":"1.1.0-75972","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.1.0-75972_1656032581412_0.24983286698250007","host":"s3://npm-registry-packages"}},"1.1.0-76254":{"name":"@fluidframework/dds-interceptions","version":"1.1.0-76254","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.1.0-76254","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a722ded796cc49c865186bf2cd5b698f29c87d52","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.1.0-76254.tgz","fileCount":70,"integrity":"sha512-wk2KxayRC50OvNdppFA12Dw/UMPRno+nU4vjc3GHjquCZ8CwN4y+XvbJVKJVe4dKa6+vbzp4tOYymw6A5WDChQ==","signatures":[{"sig":"MEYCIQCFhALA7M5lebrJ0BPhBPmvcEMYDJUF6j169HxTzkG05wIhAMAZcTGptO9vDY4n8gCQ+RS1mZJtpDVZY2jdhlQysoBk","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145695,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJitiLzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRoQ//QGF/rkshAidNGH2T/+6ke5tH/zsNznpiQZo8vpFWztWD7WfN\r\na1YVsGXrEy0stUo0RpG/ne8o0v7UO26t77HI90qOKl3l4nty19qTyFuJONym\r\ngLdGvZpgzSVeCSAeOFVZaH5rYn7ENflRZss7aCXPnq6RT83kTUI9rHNtLNPO\r\nsdAwbnwO4uwEsLVNZu9Dy+Ecb8Cf6UOWQimPAdePcRUEbuPBPN5g8vOU3Y6f\r\nV9yIcibjuOHhLC8hOPy5X4+gjuz7r5iXe5JeFrhKqUq5zyfTQWIXQZmfkQW3\r\nena49yjNahQYhllrle7QKraTpyc24SXMC/rNAoEvwyGvOokqEU9AGNkfPJpx\r\n0mlbUQWZ0YlHnKh7fORKIisuTDh/vqV1I5vBA2vITKXqB8BlInb6nI2Gd1nz\r\ntvrMM1Ij1W74QvtnnT3lu2Vfdjbre7+kGH4Tp1qsSCFGbw2/zp8yyOGhLwKm\r\nR5rHK7LMPZISD0RCiY/uHFr4q7C40tQANRBiPQ7YGGXe2xrU639aFFeOE3pC\r\nIs8qpLSp5iyYG1aBQ6NA4aK2aYrL2cJamFXBLHA5WjN1xOADNIPzMMCYNcBM\r\nmTi/02uSikDOShKYozJc2YHILuLb9RTqV3U/03sR0nDF4OTDueKNCbUIQC3u\r\nUAwlvwf/hVI3VPyBc4z2HP/dHY0Wo/uAbwU=\r\n=X0Ws\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.1.0-76254.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"1.1.0-76254","@fluidframework/sequence":"1.1.0-76254","@fluidframework/merge-tree":"1.1.0-76254","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.1.0-76254"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0-0","@fluidframework/mocha-test-setup":"1.1.0-76254","@fluidframework/test-runtime-utils":"1.1.0-76254","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.1.0-76254_1656103667388_0.5820512766034809","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@fluidframework/dds-interceptions","version":"1.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.1.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0bd7bf6c97619cdbc34a4f65498ccc5024c0fba9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.1.0.tgz","fileCount":70,"integrity":"sha512-Ch/3zg01QWXTe6k51eA5iFZ6lV9PSJ/cPTtZOCAugT3fToj+V6oMLRFoT5NKQ4/8xMsCGUf7r4nx7JkG5N+aSA==","signatures":[{"sig":"MEUCIDJZsWbwXozBUtPwKTpRdYAEQ51RtEL2qNFO76BuBAFpAiEA1+pMCqqPCuRppA0aHZS5kCW8ClvdkL2wB7617egFGgA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJitoWMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpOUxAAlLiQElbTTwAHwSOBCczS8hlRqSM2NA1F+FkZuUm4GHeyxpiQ\r\nAvx6IF1IMO99ctQRFNLCLJq6aSpZeBwtdscnH/aQDKeM144ayq6E1jGnPzBD\r\nxT9YwLuGI2A6FNWe4jB0TYqMgCakJHTatpAFYBeclYdcPNyMstcagQbREm1L\r\nFCzVmAEb25ZwwW8ky7JJp7I1zOankfFNPnsbEkAhNb1Q0OOZfJCIQ/afWTU0\r\nppmcWKkl5gk5WetKBPTyBkp1YfKbxNECO6ofJJ5wxMpAV+byadZrpPQcyp2m\r\nJ/mjtcWlQgIg+8BZmXOQNacofSUlJCEhkIX2UBGQdCJMwJ9UsxYpImvvNFUP\r\nUelmbF/wlMlsFoN2jS9a3GvE+ORCIHw5/K09YcHUPNIggOxReKvO+TAgQqvP\r\ndjhq2KU1nsvl6gznEyVVeiuJ/hfWvsFYat4t4J07YVdgKuJuUSGzcLAyWwf1\r\nWOthlf48fl/uXQvGwu438Y3QY9cWNjB8ALl7Xb000nDv3wPTPZa0rdQC51qV\r\nlXwwJEaFu1STa6tAE+zF7ljJK6nJ6DVagqs3+EEPQW2HCK2U0H1O+BgTdozR\r\n5l62+EXGMovHsJENvG5nyN+QsrVhmKK/gDfC6AukdKN276Rff/KJDM1PQs+k\r\n2Rn1DA7lJcg1kVfdlLYyDq/SgfSmC1lOzlQ=\r\n=cL4w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^1.1.0","@fluidframework/sequence":"^1.1.0","@fluidframework/merge-tree":"^1.1.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.1.0"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.1.0","@fluidframework/test-runtime-utils":"^1.1.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.1.0_1656128908428_0.4735789595853699","host":"s3://npm-registry-packages"}},"0.59.4002":{"name":"@fluidframework/dds-interceptions","version":"0.59.4002","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.4002","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"30b3079b13e0451bee92f4edec39a12092c8d6d7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.4002.tgz","fileCount":70,"integrity":"sha512-XaT4EsjKUfrfLCqoQ+kMFLbz6QQcVsUkpsxh5Yj54V/vDgVb31mHvwo5VEZnsGMOm0PjK4tl9BvKhDp4a9VHGA==","signatures":[{"sig":"MEUCIAsKwFylDfSvZ+KhI8MZ/Po3De0bM5YEBOSXGgf4xyy0AiEAhfioKZvLvtpspliZWKTAJvSSZtgxrWgr1DBcsmnxQgk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146194,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiu2pbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQFg//ehsLelH0VUW86LgbV6N4K/LW06vysfMXcmux7dPox3IzWpW/\r\npD66h8u/s0SCGLI4DL3BE5RLKRvZYMbDgybPs8dIeH1YG1LK07RYBiE4YwUG\r\nXgogGY0LnF7hOWJHluG8oWBOzjSmsII72xLHIpilnQXZYCzDSVRb+GJ29w02\r\n4fdD5JPJH3QoywZ6q4oZhj4oZgZetqPAR9BrK+GQ4w209hYVY8BcbxVACsn4\r\nzV9j2tk7QIojEwRql+XjrMgO+e9webLHHxx3kyuE5xLJZSnqTpy+Pd28qZ6M\r\ng9IpOfQFhDFX6euJHHv5DR19IiIIxNdwtOyfnmwGB9SsmLvqe6cSFKNoiUXk\r\nQIxOtmmn7yoPJVRF2or7l7BWk4QOGYKUorXzi6lY800oS1mP+Mw3ir9bxW29\r\nUAUDhSeyYhxoBZJbDfI1rPSUNOwoj8VFK1kMr2KdBZvbECS1LR32Y3vHL0ku\r\nHnhL1tVTYFjoLkiLWNnkj9x/MtHJ+IdK5iRLxed8ImDcwIqvFUd1EFW7Iwb8\r\nqwyRBum6MO3rKQ1QyRX0dcH3GPkj82CP9LoIVSwvonVODhCfyauBNY54q7yY\r\ni0xTOhYo35LEtVyQBy7U3rK8WYX5M+f0IFBGYioNTIoSrm5+ODsnO/D/K5DU\r\nMrmsDJADEFXU437WeqXUR1iULi86zLQkR0c=\r\n=yuo6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.4002.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"^0.59.4002","@fluidframework/sequence":"^0.59.4002","@fluidframework/merge-tree":"^0.59.4002","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.4002"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.4002"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-jsdoc":"~39.3.0","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.70857","@fluidframework/build-common":"^0.23.0","eslint-plugin-unused-imports":"~2.0.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.4002","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.4002","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.4001"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.4002_1656449627689_0.25649093751890684","host":"s3://npm-registry-packages"}},"1.2.0-77818":{"name":"@fluidframework/dds-interceptions","version":"1.2.0-77818","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.0-77818","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d933ea36179b837d6d0c6392c5ece82eee221800","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.0-77818.tgz","fileCount":70,"integrity":"sha512-qdfztvJqd2pCZao01uiPOCYP2hZXAm6Sd1WkJiWLHAjxWdHRJgw66qbTYPMWiL7grgD4VNR0bhLcQAfmpHP/yw==","signatures":[{"sig":"MEQCIB5AQwc//PeKkr5D/bX4YehDY1M7GxTSp07+0MEIhEzpAiAN4Abv9wKiX1aiOTMqhl6+gHZoBBJcs2ccrjv6VXnFsg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivjpnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfPw//XgtJqWotzsWHluNbz5MNOyfZjEVUMX2/G9HOrcXflvgLETPG\r\nfSyp8ru7VuWmdC8la+dP4KIe7/zkQhPENGySCCyvWrR2TiZ7tSdUj/WhtRyF\r\n8Qw8jT23gOmFMOKVXeaBR3drWzsRCzK63/16xb7yHYjNLjmGxlAQsSzFL+yK\r\nfh99ugP9DFhR9FS2Hi3W0jBXG4oeh7dWhJ+ssgL8I0qoCwbc5ymNf2h7IbIH\r\nwFAjjbAh4i+9pMGr5cpboPlPYmurexl4EFXtP5mdICirGddJdor6kp3vd54C\r\ne5gbSJDuBJC72JHpV/p7gbl2xwCFbT/whFapoaXd/JDJicEijLZgYIJsEZTn\r\n55BNndRi6hZ9SZX0oWZFA9YQCPP1K24YqTHajb8xH8/LRL9VFhn/4VaKuW13\r\nKSDSD3fcHnNZ9WBG1Q4mwM1AxLceF50kpD9ywG78DakOJ29GsX22DdACszyn\r\nkW+iXAfL+trV51n9Yk5iMRD1Bn1OVA/l0o7z02b9WCyxaShPGuV3J7hxHjcy\r\nSbUGES0XQhBV2kTLclcJ4wwckKa5S+tCJJoxY/yEQcFoADr3lH2fmzsgfLud\r\nYyI2KbxCBbYBqOhnkkQRAbJPo8WEGsT6UhagGii9QvJ2FussOHL5vOyA2YxM\r\nNnlDqI4lh7mQVB9slQChrqPpYJxu/k8gG5o=\r\n=PB99\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.0-77818.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.19.3","dependencies":{"@fluidframework/map":"1.2.0-77818","@fluidframework/sequence":"1.2.0-77818","@fluidframework/merge-tree":"1.2.0-77818","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.2.0-77818"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.2.0-77818","@fluidframework/test-runtime-utils":"1.2.0-77818","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.0-77818_1656633959207_0.07223800438922501","host":"s3://npm-registry-packages"}},"1.2.0-78837":{"name":"@fluidframework/dds-interceptions","version":"1.2.0-78837","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.0-78837","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ed49583a6923f1b0ab29e034680fd66513b09be0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.0-78837.tgz","fileCount":70,"integrity":"sha512-QoppQJO+2OK50JTdpHJydKkNVTb6WcPWwdq8O/SVTjex7aWOjbY12FRJfqQI3dwYSW+RFzpPEtHUv83c9Qf7Iw==","signatures":[{"sig":"MEUCIF9TaM4hlPkNLUX7K92LfTDBonKrPUvxESW120Wg9CI+AiEAuzjohnp8OvxECytc9yZfUMREUOWiC6NdDAAw4Yv5s2g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJix3MEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJxg//fi1uU/rrYyQ/H6lG0vPa5VokpmxVm31BgUfH2TQeUSmYfMrW\r\nBoWOFyKLYIMjeorXRMn/5PstOxRC9hxhsJCUNz53wBOfrpnQBZNASrEpDBLu\r\nWpHup/GlKdBLH+Idq/ObRkHtq4jtjBnqomhnhUZucqjoIWLY5qYluLMVztoy\r\nTtbjjZdZRf46ZBICXE8WPLg4fcPtY1Iz1cFa1wi73tkjUS92D6z4ZscQkMb/\r\n+LxegdG1csWpZr37ROe13Ov4bbgYpbPqvowKDCUcW7cS+WYaAKej4BiXxAoA\r\nrJQoXW6v8Sgrk0MHwDuRAqeatelRLw1tbU29nX4QZpTECkENfrMQLXsiT6TU\r\nZuSINaI++3/Lps2Pp6Wv5b3OoINp1oPGuqcbc+oXbgtY6KhExXDSowq58qHJ\r\n/J/InAWBv5PgTXS4wvc4IBGXM/holVf6qZs4Eswg6Scarb5oi2SJzERGpguB\r\nhGsVOd3jKu58FwNKE25Jz5RHIk0rruBXGXN1YiCrheYO3ZxDPsiYWje31g6n\r\nl6O+V1BrERvjhedqJudL6GVkfKn4nXzJDbKLrIz/qQLzJUvePJ0AE8QTgZSL\r\nPbduBMlSHwl/aDb5rrt99nDR6MhglOWpN/ChSk5XWQZw+sysgbC7SAQvoU4J\r\ngIsbjVCtFDJScxjL0WWHju6HcN0G5D/PjrQ=\r\n=49nq\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.0-78837.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"1.2.0-78837","@fluidframework/sequence":"1.2.0-78837","@fluidframework/merge-tree":"1.2.0-78837","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.2.0-78837"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.2.0-78837","@fluidframework/test-runtime-utils":"1.2.0-78837","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.0-78837_1657238276546_0.575412674272112","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@fluidframework/dds-interceptions","version":"1.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"273dfd89283710bcb4e6239a5b7b948aaf1e17ec","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.0.tgz","fileCount":70,"integrity":"sha512-tVvKwwJnkV9SO2OR0SvQsarCoNG1oTWKGkyVGA3NMHc8HjdE6FJ2TXuKmW/LJ08lUAFEQN3LkVLbEXgI4qCL2A==","signatures":[{"sig":"MEYCIQDFMH7LwvTKNHZrhzFkJYB/mQacap2UNrkSQKyYvqqTgwIhAKbR9BwWMioJJaOFZ6RqlYtPvjw/Xi2RTWf36snYpq8p","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJix4AKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7XA/+MTHlF2XMLba05gaBg1alDl9EVRmYRqSTd/jMphuhOoC8f2qe\r\n4/WGBWmzPQytI6bSIUPN9PFmEK4/Iuu+Vn0HcZOKfB79g5I8IUMgohJUntOh\r\n7rX8q86Uwznzih7r+0pXOmlhkyoin6V/vbUy8rXD2kLKqjRPPA8SU/q+pXu4\r\nGN2H2boM1CTStLoi9xTxodlm8YFSyOee5DbEs79KOnY0hRBLNqwX+kmy95uE\r\n9EtbakIupRBBqVv0qo1cS62Rra7FFWOEq6Lp3znGRticfoEKlBGZZl72Hn7z\r\nGmKy1cA8ltZDeGSXDqg1byI70qkaL3a/JEAAprZ+6yizc9bGsPzkYtJBOs4j\r\n/AEzXDsg/gsVXrNqE/PsP/bTs4Vj0re5/U7FigFgzc8oobC+lVFmvmyy6Hbu\r\nmGoYMJQByIt9mQS21KnZWtGcZ4W3EUbRX5a+Sz3VPT7cET0g0Fro5hVvHstr\r\nDLjH+bu1TUvzNgz1Ku9n/GQxshydowmHkpkJal7AVBaMNloKrDWSRB4gtGpt\r\nHTdUqsDo8uAKL7odsqzuGkvn9eQOjeRhwavp4NUrs/AeNt/gObwNjIhmg2MZ\r\n7McfJNalMjRnHFvjkqoSBTDuVWQcoAKtZhLvLcDLnXJ3XLhtjnffnPZg//Ci\r\n4M5mutePMyH6pTMf6FRHtrePfoqLHt6JiQ0=\r\n=n2ks\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.2.0","@fluidframework/sequence":"^1.2.0","@fluidframework/merge-tree":"^1.2.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.0"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.0","@fluidframework/test-runtime-utils":"^1.2.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.0_1657241610120_0.40374161272691333","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@fluidframework/dds-interceptions","version":"1.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.1.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a7e01bebacdb5e8059dcd1f62668c597e4edfbd7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.1.1.tgz","fileCount":70,"integrity":"sha512-qRTVHpesfNAcUlh+GGwJcNjpYnWNd/KP6kWRgHTUV9Db7fOlZmtbM5CNMxERJ2sj6XUH5A3ZexkPyOqbTCYzkA==","signatures":[{"sig":"MEYCIQDnlBZ8+I6f29BvK3jLTvkax9Zs7cdnlp4HOTo8k43teAIhAP3wvceFAMBIQxa8IUqFqgm8fDo1cGt9gTwDntmIWmfm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiz1DYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGmA//dBC8SIxA2xzvAWrWIukhVFyBm2hQFvz+DmbmGcNQTBxgGwqb\r\n5Onv+U62QZlULutkNXOPpzTE3albL+NTtgKBS+RWHcYx40wKV7ZOyXeH4pVW\r\nDv9oJsP8zHpUE4K/OiBQa25RlhF2iOspNcUoevU2SemqKiRKI8lpDDMY/lQQ\r\nSqxp9v8at1WgA78bVyJ2qhRzF5j8NR0tPrl6+fXNFrZyWdIaCI8Sj/R080To\r\n1oqbcgj3ZCd836VivLivJ89GhUWdZK/vQfwF6XVA6zy/l/fWJa/P12Uf10Lu\r\n59Zv6bX0jx3EDUC2VargOAOh1c7WxdWIZhy/IUI8NkzDXP8nB58uOHEjpoje\r\nRLjmy/4CJGwuo+oAv2z+1KdRXxI9ra8jfJsPdCiqJNILLapCBADw1HEj4ls3\r\nP4pJDqY73jUWxxpiuf+sro+IDusdj7/5pO8mLbpgHsY5uhN2QxNMjt8VBr+Y\r\nmBcFT+zkeiZAghvxNZ4Rv0mOqzVvg7VLoprwhBPRKWnUsAHggNacZNaYH1Aj\r\noRTixfPewdCWvQ96yVIFeMfQ9+neV5G1WVwVEY3u8O96/pBc/wYRFsGt85TN\r\nRPkiF15XgSAyskuJ6DBsIW6WCzQOByNtTKRXgQGOKHTFZrbv+eT+2yhzpJkd\r\nakyH7hqTwaxv5Dz8haD59lEJdh56HHIOaz4=\r\n=TYqT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.1.1","@fluidframework/sequence":"^1.1.1","@fluidframework/merge-tree":"^1.1.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.1.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.1.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.1.1","@fluidframework/test-runtime-utils":"^1.1.1","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.1.1_1657753815984_0.1966266886350274","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"@fluidframework/dds-interceptions","version":"1.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1fcb43dd1b10e1a73be35e5be663ca292d215974","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.1.tgz","fileCount":70,"integrity":"sha512-HarZynQR0l99gIqjnWTDnXY5+m7mNQax0dtS2TwFnqsLulxYx3hoBzJaUU9g9YuUmlEBxLtA/taRH3MyaguIgA==","signatures":[{"sig":"MEYCIQCs7j2zrQNbhqE984jmfX13YVhZ8T9+vsh2nhINX7O+2wIhAMbP4gnYkm2LYtdqaQbluaJKRiHNfFpi7kcY16qmsisx","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiz1GDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrCow/+NlQf7oLxX4C5jLY3qvQqSWGdw+0pRtjLR62pIceSPYqza2yw\r\nAkwxnrAUVd7+F6s+mVi/q4TxqaYPO0WnVZpRnYQKto8QoKQfJwS7gsJJIkUR\r\nhHf9tSMVpV7gfAvilTSnBguP4HorN+R9K44tg8wDNHC4Ozd5aAd9L9MzaoJs\r\nB22X3ECqYSDt6DDdiHT5lL8/m0J+sWKQDqibaAfvxSw+aOZhTOuQscfDTPhb\r\nOttm5+7dkuoLzpZh9YBONoGzuBr/gLa7LjsJIAr1Drbl/fDLhjFw9AVr3DaG\r\niqiFcwM3k2AYEnl4HP4Izt0g0h0xbNVYFiAdX8f7V87B7KQpIoqdHAb0ONyE\r\nwYg28lcyGsyUiLjnz2VNColJhLQbKlr2xwgKO36IKCaxU3T/A0HRp2tG9Aou\r\nPGsMPCNkyuOfYgRhIj/y2DL6q4hXIU/w+lXxZNXzdb1khWzuScF7Z/ipAd9T\r\nXKSwJARzVLAnoknc9DmPZkHw8HlZKKyN2HrcsNyUs+tnS2AY+INIodykVNiG\r\nBKAl7zLKvZZxwdUzU+1qo4AMap12qCtlmJ5FtQ/JNOaBhGkMXr5uffzo69eL\r\ncFuXLsoiqKsiaKn2oPVN+RM6fqneC9ujsWe7lnqdkDZ1u1WhSYWwMJKfXCCQ\r\nYtRkgwQNSZTIPObFmkmH6PeWEGPIrrv3FD4=\r\n=NASX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.2.1","@fluidframework/sequence":"^1.2.1","@fluidframework/merge-tree":"^1.2.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.1"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.1","@fluidframework/test-runtime-utils":"^1.2.1","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.1_1657753987245_0.5900318781435037","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@fluidframework/dds-interceptions","version":"1.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.0.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9ad48639f45a05ee64180bd5b67ce409cc2e4243","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.0.2.tgz","fileCount":70,"integrity":"sha512-jTBZxf/X97Hkkofe71eNMqjqz7ExTGM6L3eKsNf+YqkrbbdG6ZG/twp8iLWV7UJkCSuld0Hm+IEyEl9C716rIw==","signatures":[{"sig":"MEUCIF+/u74Rfcn6or7ZL4atgyaU1hZSWr1J8E7DzZ6Mu87HAiEA3DOivAYA66zLj8euTIjda3eIllHS9hIz2CWajkAkAy0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145614,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1WPzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp2bg//RN0G6eDlXzVuCV6wBmASrOppe3Ba/R46PTr4p15hLtfGbufN\r\nTIp6fRAK7y6k1WmaHcO2TvJP+J78FzUQFRO61AT378ENjeFrMEtu5Og/tK0C\r\ni+ea77YQw9cGdxt/AIRy2iHlVww3WOB+bF87IFT1tYcFomzSXnUO7u0ye/N7\r\noMcOe5XXlHIxcdN8CSPHMmgLq3KU3GAgNiirzJJuzECqagj2R1mia8GHKZOU\r\n8IxKMrhPMNUkBeq9HhMy8DlxfeBM4CWZGs8dK6RT+Z3caUqsgYwsnAIw+Hqu\r\nj0V6SX5gh+EV7D0Wuv1fDvfRoig3G7zAlf9lA5MCtP7aE4QEW54ho6PovHFT\r\nCh53xu2xrQZbxKXWJd2X/HfG7OZjKfITtIL5bDa7uC7slPfeifOXLBKZlBMe\r\nHDZn2QOz7HdEHGtd8QwpJr4aSj7pvhHvofEQiwQ7c73L5SbneYTi47iWJGqY\r\nUq1H3/K8FbAelxks86jdHfEt6CGgOrdHewFd5ttorC6OVK1OsbeBhDNwkN5o\r\nJtJpAkuMgi62H5jvfSUwgLENlwg4s+8RV/2EQKLusj8v4/FDzyNdmSZy3qAL\r\nwI5WnEPP94GnqZwx4yYxEHmnTm9fz9KsyofbXYlmiWz4bXy+H7aT+PTCo2Wl\r\nDW39D2UwOtNHgM3bmxZAgN6ntITQf46tLSs=\r\n=1+DP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.0.2","@fluidframework/sequence":"^1.0.2","@fluidframework/merge-tree":"^1.0.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.0.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.71273","@fluidframework/build-common":"^0.23.0","@fluidframework/mocha-test-setup":"^1.0.2","@fluidframework/test-runtime-utils":"^1.0.2","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.3000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.0.2_1658151923253_0.9835348587551758","host":"s3://npm-registry-packages"}},"1.1.2":{"name":"@fluidframework/dds-interceptions","version":"1.1.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.1.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3c98149f8274e0261fd56f65a1fa74cc9696479c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.1.2.tgz","fileCount":70,"integrity":"sha512-XmBT3rWW4wMpyMtPYHq8UxrFUVBdOnqQ97f9lNoA32jn0ztBwbZTH9KEQ6I2AYJEHqPngaQc4o/qpnr3xkSlHw==","signatures":[{"sig":"MEUCIAyxceYekBTHnyQJShSUUUtZaGVgxwWXL/TQtpjBP7xwAiEAwL6xMFy4NAAAJrz29zuxNq0OGUQBT8JphSjklIr3nPc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1WQ0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqayw//dHiB8WlOhlfp/NBBTHt0CzLwhKlbzRafPjNckhdWSO9rGThX\r\ntkZ5jb7qhvtHj84wrr1dDBaEAhAHqHNhV9CPoN9YkTqcT/82hXKmHiqdSCL4\r\nNhlAo7VChbBE4h09fNvefvla2Oy9jzFtg/g7YSnak2Z39MTZay4GR+N9q//S\r\nR/aNFL4PN1HOxk5GeTufsegani+7yhf0MJeASw1uKDZqO0UGDspbatCeKCTm\r\nhZiMc6QlIzs3xfL6aH2eyVmfryX0WIAbdjElAF0jS0hT1Mb0XaB5p4qwU+Mp\r\n65QviXE6Yj9+/eEKtV8Mub5tdo05cO2hI5fWzXhZ9xFAD21V3RNmoZVSSnTE\r\nh6VKMflWgOkrr60Mu50os7DfEpzKBs2Hsmch1fLoDuMqU3qzZqnml032Ai7Z\r\nhGvGh+8WDpLcUpwOSlNEYrb2PJPjXND78bIQU+ATiajXytlCA4dmwdqniYS4\r\n0/EorM50erUKWt+B3RItZYhE7JBMgDUzDm06HrDhpypb7oKY++oveCufq4A6\r\nWgZOBopH51lwvzrxVDRje6U2XHLMrKNWnYbh2RueTL4R/nzEp8nDuKRqUS2M\r\nPzsL9aVm+e/DboK7QzglyFovQra7V9PKFfHC4AwOzJvVs8S7A5ESrtONEUfi\r\nSIqIf9cXdOCNqD1Mu/7w0lDR00bQqDafDB8=\r\n=udL4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.1.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.1.2","@fluidframework/sequence":"^1.1.2","@fluidframework/merge-tree":"^1.1.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.1.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.1.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.1.2","@fluidframework/test-runtime-utils":"^1.1.2","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.1.2_1658151988705_0.5080068014921988","host":"s3://npm-registry-packages"}},"1.2.2":{"name":"@fluidframework/dds-interceptions","version":"1.2.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c3394c8f69696a4e107d7c5286feca3d1ec10931","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.2.tgz","fileCount":70,"integrity":"sha512-KtRfhmVj9w3gH0C3fA2YJlNdLVBR9F/twB2wqMml6gP41yZvrcz6OvXr43m83My7aYZW7Q1ZR5UDwSuSsTd+yg==","signatures":[{"sig":"MEQCICWPrHurRPK/awNE6CkenScpcKtPoUniswYyJF9gvzK3AiBpJRsu1oW8/xmovgXhoKhUnrVGOI5QKBQAwE9KuyyIoQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1WRbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpflA//X9UBx/qFXfXXa1o70G9hk1zY2nJUOnisimjRNlqBop4WUpRW\r\nsj2DDohrkK1VyAWAOe/hJqubfrrzBTjTsYb4ZuWIlB0ZKwNre5tHninZ6aBH\r\nRbJ2oNHZaUtUEEKx/aGGA6nxAVnhMlrkJ6gRmkGu38J4WChGlBqb66ETugu9\r\nl1bChrQvXXFkk2U8ZMq6Vl39MwOcrzGea569WRNM9952jvf5rB5opYmVvx5A\r\nwINjo3BYjEums8rRpg5jXluTneMAwRfDHghfYnlx2/OVgcmF5VWu6Dfo7j6A\r\nwvM9Am38AiKmhhkgtBSK1PZW1lS396gMlyukPDKwaIscyBs4TFjAzkjl1rO2\r\nWAU1K6Bol0n5nP3mtbIuenyT04uF9ZcsR4AUMZ8aO78qxB/nUp6A59CJ/mT/\r\n21i5NN4+mT9RyJtJIbx09/YGiqorR3Yt46fV+O7zQyZQr2zZmxJ0NBUZfvq/\r\n8k+hRnB1oZCO2OjFa/la9KrFjwfEsEEsFlnEq+WHywIKJaxPipmiX4VeZMp6\r\npMyHUM5hnXqzbFpng+MrwNcP7wEZntABanPwyGDtDezEm+LU6Wy84s8/ZrTx\r\n3/xnG0XOi2oS5emX9z88OyV5+BsuSzFQ01Jt3Wf5BQW8LGpYO2FrI0n5b1kV\r\nNFT8XoJT/CPX/Ehpiqj4JZPFhP9LSV3MpLE=\r\n=T5nM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.2.2","@fluidframework/sequence":"^1.2.2","@fluidframework/merge-tree":"^1.2.2","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.2"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.2","@fluidframework/test-runtime-utils":"^1.2.2","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.2_1658152027440_0.7271795096608575","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.81589":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.81589","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.81589","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"97be990f5b4269618e6c04aa072d9f583fe2bff6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.81589.tgz","fileCount":70,"integrity":"sha512-iRH641hVBxuP5RQvVrcTxoz73/KrwegWRBIyymcUvRyzHP8oL8bMIYa2y5h/yuVs6WFFkCyHTJ8VOtRrIbO8pg==","signatures":[{"sig":"MEQCIEX+88ZmHpXoa9n6PM6DX7Lw9M/CePZ3TWvsGwCOvu0KAiAY+FzwxgEjQA6idzNfC413/39Ov7D5GsBZ6eFLV+w6Lg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2r23ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq0Ng/9Gtq8kpcJfER2wpuBX0RXYzftFALg9W8JEOYBLxpLQPJPF5LB\r\nifffRjRSHwYVXWALpBRVVYtKuK0VfAjy4DY796rjlFdzOOj40zjeP0gG66Xr\r\ns1STkdT8v6NUL+bimGzTebZiKnH59Ey/w9QlATOEsXIp3EsQbxN6fmEaZuxe\r\neRmUMr/jXj3eQhPqmJDzInmEhA5ge8Ub7iyLuA4n5chmJnxASauS09Na98GR\r\ni9eUgo049kSfhlYjoIq3bEheqOQMdFqUBxKOK9WgjPhva8wphwAwfNiolBC4\r\nv9n4jdgUAX/mR7SH/jBfp/W+zfOw7weIqxPppbR4ELxlV516BQEkJ0XYU2I6\r\nPy1YJPyf1vJb1Yg3He0QX8PE1kNdnugGUfNzMsms9Ek2JB3N2so75HmP+TwA\r\n/EPMrbxbLg/yN8/dEdltzydKzcuwQNKjiV9bpL00p0nKj+TZDjZbtcKC2s6t\r\ne74236qyPJb+6cpG/+rsz35LHP4h5XPYIPwZhBgHSIrJXFys3h6aeDrIucYP\r\nbZ68pb7y7cLE5Pi5D4qWFnpRfCLGDAVQ1fc8eOrNVkpbbK4gHmVFtFSTzAGM\r\nGPUdQuWrBTRZL5EtXLjaWXpq0Rnj1/Z6uMspebtsvO2EV4hK+y1qqg5bu2/y\r\nsaZaHjbUSrPhKgFrZzyM2a++Rf9JepUkH5Q=\r\n=AS3S\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.81589.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.81589","@fluidframework/sequence":"2.0.0-internal.1.0.0.81589","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.81589","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.81589"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.0-0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.81589","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.81589","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.81589_1658502582982_0.8866007664537714","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.81601":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.81601","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.81601","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ad76028c5285635efe78a5157ed8123a319b0e08","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.81601.tgz","fileCount":70,"integrity":"sha512-6+/ImAMDIcbftFd/gFoB5UGSSpqvZoHrx6D5C4yTeEgckZ2k3uyFOJETSG/t9KdgHuNjC97WtZCMc+QhQeRRVw==","signatures":[{"sig":"MEUCIQDc+Wo2OcM3mfBCCYJw6dzQzZ2SDogGfPTMTXCX2ODKEwIgRPfSWiwtlUiII4VAnRbDQryTHu2Xus7YEq414vGM2gQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2sfkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqAkg//U+IxEbubXAzwOyouKHz1+mKlI9OltIuyOLkiwcG8WfYXX4to\r\nK5x4d5bmCWiGDL/qyKn73KqUExbXPfe/FGK6N8nrQ+h/zLOkLJIFFJYoBJJM\r\nQK3y3BAD88+6kqfnSxxMwKG3F6wWANK34/KUdlfDN2fmvT5UPox5/aY6V7nC\r\nK3zPT+uZXuy7dSva4sVnh0rOo4NLAGPCTFCwtdOejBTul2szO6Mp2u2nv5po\r\ne5FNTipsd8dTobLnE3crDq5r45eIJN8JXIatPIO0HY57rNOa4xoAbC7r6IZ3\r\nWuLssWUMPktxNVwrfZcKoFvaKNZf6xzZZBhxRttrqoYK663xp8tahUTAAMTW\r\nhcF+lfUMMF7YVHe8Lirr0/KHExaBbfDeUZN8p0K5GQ/I/roi3lB9GicwAcnN\r\nkIV8lRHo0EV805OsGf/eOSsrKNBCVyjzkbAAOS2NuU0o1g/z13fcTSjRhUkA\r\n2cUHFDuLPL3GyljYaOXA9EBEaTpRlboB0XLBTTky6zU+SoTCAsIn5G6ODYEw\r\nS04fb409wO3iMxPc46ncKGne035kc0iiNIJeKCutEEG9vgMdrpGuCmiJR0Dr\r\ntBx4wJa4L16dtOyB2hq3sM/G9QXoontKoRIdROUxZj3UaxLdf1hGV1Q5dh8l\r\npq88iWvs6tNV4p8icywdqoWC6ceBZ6BjsXY=\r\n=1rmT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.81601.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.81601","@fluidframework/sequence":"2.0.0-internal.1.0.0.81601","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.81601","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.81601"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.0-0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.81601","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.81601","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.81601_1658505188527_0.7671992615697356","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.82159":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.82159","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.82159","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"142de7a98cb4a59c8f3fcb9c768a92e34a66b053","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.82159.tgz","fileCount":70,"integrity":"sha512-2rceES1VjG8396nkkGY0y+kLwjTLj0IpBDsvvK6rsdyqsPcQt3l/3FphOGM6zf7Y7SOSceK8pK58NQDrDLMT+A==","signatures":[{"sig":"MEUCIQCMfPMYi/e4w61Z9MlDCyzw9CnQBqQwvXDg5dcA9T4tuwIgfouU5Ww5lhiSkXmNGNCIxsAueRW6YFBAUM9SPD5jKds=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3/yVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpmsxAAkfIr3ey1K/yj6vXZTh3JMh6+4hQgSBVaupKbZOdz/hsTLBdf\r\nNmQLejpfabt3/nL0rrCmjdQQrGn4uf01HAjacqxeKPsGMUxPrpP9NVN9GjMx\r\nkRhZOkS1Ct1mxz5ETzpCoU5gf6a4DAS+xQA9sLtMX2fo5TXlM8+0n+szDnrj\r\nmQ5ggI2QeWJ15LaV5AWaNx8B1VXaWjczF4i5B2hLR3iHqnj9Jn7zrRbL9+tc\r\nZRC4R/TPOp9u0E+yFPkyVMWURlm4rohkFEfX8roRq9BSZLOUAI8g9TmwO/AZ\r\neKtfAIIxbWjXd2T0hw90fLmMNQpoZJRHhikMZ533lAbL3T6Q6iKCFiu/gbwh\r\nO8FBDj7G/a6bPcesQuGDjZBYrYMkxp46DySBgw9gfH9IZTWwBdNvG3F9oAZP\r\nu8EQCfhyAj3mV6pSsiT3i5+RX9tOWli2Mk+jzWRBlySW3OA/UM/4+oXFvNXN\r\nEi5nKEhIEbppmgPDBxH56K78E6/E5oM3a3Fvzmwr+tvuqpSwLESQLI3v1h0A\r\npTvrVQ/eccn+7ySGmqsvXkTU3fZ17wVt/700FPnRnrGiWD9qF0udGJ4W2CHH\r\nCaEIjks1tvmbtD046Pn5Xu3iUwwYdgR3SLcETaNftXbiZ5Lx5X3Mq7RdvvkL\r\n2zPxunvAVChk+rOzp91LQuCdOCQpHjWAW/U=\r\n=msii\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.82159.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.82159","@fluidframework/sequence":"2.0.0-internal.1.0.0.82159","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.82159","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.82159"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.0-0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.82159","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.82159","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.82159_1658846357460_0.7017161433644052","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.82628":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.82628","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.82628","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"34274b129761e59089277cc1d0acfb68266523c5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.82628.tgz","fileCount":70,"integrity":"sha512-6ki/DZ8f5Yn0E+UvIjUT7DDFiXghw7nrDntxO1vhHyXHL+Yfwdm7Au95fFtS7iIQfk/nGwKC3oZDAm6QwfbZEQ==","signatures":[{"sig":"MEQCIE6vVhcPsbeCbM1rGrYkEMASNTPTXjcOIpShr8n4+JSPAiACMtmuWM9q9T/4jXtR3+LveN9RpAgrcek9e60+aiNXTg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4r4UACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBiRAAl2jIfqB0Z79Hcl4MGkIMmDGNGxcVSEyNJbRwLbTBM0dRi7Av\r\n8i3mZngqSjo2IXLWDUHSsKT1dGjkVFECxPgDJIojCYN5tO+X1GabalrGLOr6\r\nzUxYeKCHeRIRLpGdZr9bNyz3Q2Q+TxSpkryup6IaxURrgy2OdwzRNU+tndY6\r\n+hwHEypvF7h94CL1wgERr3OIw1jxvSO1h7nxBLtLliOUpnFb5Wm1ZXI4scvr\r\nli8jdN5kteRhyvAk/LlfMPTq6jzej5yRExfhekiGPw+QqI4A0VClmLuIkAGL\r\nlcXxCqGTRW2Xb7XM1pw5QmXQHgvnRWdRBl1aJTUaEN8Q8xB7dmRRIWtZeGC5\r\nYJGemYrKqdXoNlQVvtjPkeyfRkc8Qqk7fFyv7QUij2O3cG1Ew+vco5XzXs+H\r\niDZR3FYGSPhP7+ByQntDhHqZaQYTdkZ53vKCL45wmwrRBSsyQJvpBD0XdaWf\r\nAm3rGoLC55jha3WfWo7bCvsjWwY41cHW9fsjc1X8pXXj3Sj1iPqIpPX42xDq\r\nQWeXV4ROdFlnKhhFDKafRtMqi7QnTiYFpTBeGInJ4lqgb44ntth5c995rpNw\r\nAF700u+7e+xLb7sQr5md3+ZbqZg5CvgmXbch0iNPEsxOyTJjVoSsMUuenC5J\r\nl1mKckzxNnuWSA/0FSCB5MSHhMmxlE7wk7I=\r\n=fnsX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.82628.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.82628","@fluidframework/sequence":"2.0.0-internal.1.0.0.82628","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.82628","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.82628"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.0-0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.82628","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.82628","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.82628_1659026964740_0.30255832599702326","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.82693":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.82693","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.82693","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5d67e5b4fe94b572902855ee2163e35aaff7f84d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.82693.tgz","fileCount":70,"integrity":"sha512-HCfkmXwXFUvdB01Gz6qs6/VLO0wDlICLUMTjGt3WCfMXSI98iJDMS3gTpGW0RLnFbf2KkzlN8L8/mYTml/GSZg==","signatures":[{"sig":"MEUCIGat5sgyC/ia9AiP9x/ruP56v4G1QvCuthCprl/yU603AiEA5a7MvAbP+xyVZSlCTcW06UGyuLX3buTWpqA5jhqs+Y4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4uhlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpPqBAAgUehKPbRg7z+ggDUldl3lyM/W2JN8OBDQgSFOWg9jgY4UR34\r\n27vkXp1DtJpKGZOxZy6ayGQplgP67YK4okGw16hi0t60LYAtFF1byChMOoV4\r\nX2khzURWUtk+De+8NyqN9y/kUDztZezyWl1YcDB6XOXaLgF4/e+QjK2IVJ2e\r\ntIdYSmBRh3pzdtpqs6MMR/u4cnEZ12+u8x4d/bWXPGUtnU7AJ4NHWvNYMuhq\r\n/xh2DApe1Y9m+XE58yqsq02wNFIKRDBMplhl6NLrU244mHbqzac55gH7AfZo\r\nbrTc5ziNM2SygMuz4MqdeybnF6tcWg8PNedJAU4VkhpIRbpPnWpoIU9p8AZz\r\nIxSHqB6TyPlKHdO0YhiWTLk5yMv9kTJcnXuwJ/Qf/z6N9ikIS14YPCvY5Sqa\r\nI9HPfUwPnY83DehFdDNxPs8Unp2DaUDCu0x+hFf+mBFXmfraWtP0njX6Hk6t\r\nPUhmS9TIqw9r0BWMC1pkmFeSG16oi7WqBw1RTP+zazAsVOXP5hxr7qzdN5hF\r\n+neajsWECiK6vqdCG4rcv6qL+chTyp4q3TYbRW2hkJF6F+xpoGSDmQWhweJF\r\nkmUHlZk1gX/iiP+FbGHCzh8I5qrvrg9/cxFRYR26fHJB+4Zk20w3g2YthqH3\r\nO6wE7+ZYJ6ha4KVM863KRYJhjU81wvhJkos=\r\n=fzkd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.82693.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.82693","@fluidframework/sequence":"2.0.0-internal.1.0.0.82693","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.82693","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.82693"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.0-0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.82693","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.82693","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.82693_1659037797475_0.8974613551565422","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.83139":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.83139","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.83139","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"de84702f9490e9376debb1cfd1cd2ade8148bab4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.83139.tgz","fileCount":70,"integrity":"sha512-9hDvHrFB3KgYFv73Ebgq3I+u0KNEOSeC7hpWhi2UDptqctK5MPJVOocy8sApDJDuKnK0yQHaUI7zyWMDlcKu9A==","signatures":[{"sig":"MEYCIQDCIK83A98JWgjyDGJddBPQXvMYJloqPBSmZ01TKiLJcwIhAOkfeXsToipUlUNiHMNuv4NQaEH0E4xbJlGQthDDfwOG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6EXxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmovdxAAiCpO2rwR2zDDcbhzmBEWtU7CtHx1khUPThRcpCyn1VuRGRAW\r\nteXSkqanvLxFwe4bXuB7SggAUz6mCcqXlVFxS+kWClSTnXCEn0EC4+PLXK84\r\n+AgXXNeR/f8ZpeGSbdx264yZO832x5Wc7ONqQGHUBzTaZ7AW/8njFTcIDeKY\r\n4/tgYOqq5i+LkmpaicM7+PT+fGjhY7ENXBG+N4IKRCzme2mJha0kB9Be5Uv7\r\n2z7Y7BTUuc1WJeHmCg2r6P3MTQt1yaNVwlN5BORiwDpbWKf6zkWOmpRyFnXP\r\nkOlO+vj+wYXBy7MY10Toptm80KwPhS71InlMn64NNeiedJsbjvQhpWN4vkux\r\no6CsaNHbITaDSeyHpjST0DpUpVwyj1bR6HlP1TMl9reYIOl5yF5V2kyHa5ZD\r\nH3TVFmaurhjUWWVkFUBOzX8oz1dLyS7QWutceIa5I374vES3iX/SIAGEQUB8\r\nF+/I+A+PeiBiKE+9PEk9fwf3f9hIYqNax5L3KM0SSQckiNnwYtRG9dsA2ZH4\r\nJMH/TKn1YhzAHdGcevpRqPBjf9UMQW2UDJlRWnHdxRE72OaAMkB6ttHm6sbJ\r\nahsVtqY7BQVpmdRShEUmJr0DEXnjLvMFIgGUaU+jYYDQ00hQUnLWeLZSt5JJ\r\nbZHdh+65lhwT3nQjZaGGcI/i0sxoFlQu6ks=\r\n=pmBT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.83139.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.83139","@fluidframework/sequence":"2.0.0-internal.1.0.0.83139","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.83139","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.83139"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.0-0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.83139","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.83139","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.83139_1659389425108_0.3417177281925925","host":"s3://npm-registry-packages"}},"1.2.3-83900":{"name":"@fluidframework/dds-interceptions","version":"1.2.3-83900","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.3-83900","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ab9773c9f834104504abdaa6eb86c4b7fb4d00b6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.3-83900.tgz","fileCount":70,"integrity":"sha512-eW8Ii2ADMzHJBfxIhOyTIaWIo/Vd5qobVXEMQQE8nslKOVCtAfp5qXnrWW22VTHXx5ZgmantZTuyk6k+1CU/vQ==","signatures":[{"sig":"MEYCIQDocmSbugcJPXfsyTCgmksL8O+gBaGAaHX82O8BrJ0F+AIhAIdttE/c9sFIOfN29KT/mdW3retEhnGRwjT3bbOqj5th","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7CWWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrq0Q//ThjZA6tBy+7b8TN1DsKPDWdJccBU7oCA95gtkPXK4WTpyiTy\r\nEYN29d0qqXRHWIUcjgwe/motY3V1cAwORX/Uoo2bpyldzOD2lEQFaRThZJoY\r\nACQcSIZGQIfxspYDNI1YP05+zGj1yJMWCG55HoEtemdcUDesggchD57ZDKvy\r\n4iU528P/jYCXpG8ZaQ5BRr9HN//JtI83M2jqKyNIzSfseKeSepgxM1ULJole\r\nGFP81xLjCppkDEk3zwADTgrhQf+cQ5rRQ0xnVJ1X6VYGB6zACFZHXP5LXZpL\r\n8ZgtXQQA6sjKNsSoMAsW/rRFuiI+GMJw3o28nuTkMFs+uar3v9WtSHjXKpgU\r\n/A0wuPkGoxWyDofEa7QU6IqFIIaV8Kvty0efvMhIU45XZofXSVfERsiRiIYK\r\ngx/na+/i+BTuV4rGDSgQkMNDkWvrU1ShE66QnIZrQbzUpCUq0u15iDG5D0qS\r\nlbhRe2FCZcrIFvL73dRqKDABUd0vaHolukVM2NV3FzscQ/AN3liwNMGcxPUF\r\nnyohVqky8uZeHe2B3bMe6Pyoc2I6X0E0yy1x/2Kn2qMdJfd/YE95wQo+xSwJ\r\nM9oiiFASg0kq5AEsWaC8YJSGRu1bOd6GjPgMFb4dJsF90yNuBldgxvPNhfrc\r\nA6vy8UG+qGpDRuils3pjk6zm/bMV9rUiIkU=\r\n=Dbt7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.3-83900.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"1.2.3-83900","@fluidframework/sequence":"1.2.3-83900","@fluidframework/merge-tree":"1.2.3-83900","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.2.3-83900"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.2.3-83900","@fluidframework/test-runtime-utils":"1.2.3-83900","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.3-83900_1659643286468_0.936958312504949","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0.84253":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0.84253","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0.84253","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"70e3fd54a61a5952f0a0cccf5018a0f5e3602ea1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.84253.tgz","fileCount":70,"integrity":"sha512-T3SNTBOuaw6tgSDn/NjY7hJ9r+Wn6/j/dhuHtohrUQfV1dvv4gV5Szi28uXIP/Jsbkt4PaMsgnOc4227z+52xw==","signatures":[{"sig":"MEUCID00qrYNKesqiVCK8BEn06+vbF8YYWMHpnfiRj8QxdSEAiEA1XN8NgdikkrCCvKg2KufgJHh8Zue2paAl1quhi5hJkY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8WQ6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqWhA//cPbKIshGfZSxyqWALzPqigMzzcT5pioZWpe1/avB7bS+2o6d\r\n8ZVK63iKiyaontH7kopWwZOvTVgrK6686rtXaOsMJ3xFGd09InKz/FJAq/tD\r\nnuwXZGEmPmyMXEVoOPhVxgBImgJHBO2Imm84Y1k5r/QLHi4HLRZs+9mKTf52\r\nuREEWdeH7QTrAxOekPowYfAhkQnbtAdJQjxsNBFPWEda6xny/SnQAcY5fbdL\r\ndxgDO9eW+IMqP0+K9aJojHfzHwUisfNBne9P4jIIgMd/SA4sgpWtIbTIpURe\r\nwGdlMA/wMccSvgMdXbCNx0nmLXRVpIlwsFHSMaYfWTTrtni4a5HKYi2syaIh\r\nKU5zsf2cH/F98NS58y4LeYg9rZ4kDVhyDkSZ3xPYQHzkFxXUTqjhrr/CyQhu\r\nZZuBfEN1K+vD5h6XZ3gd6BmV5MTbxuDiqwFPpBRzz2jcAGMW4mxs2eBsEzxq\r\nZjhaemHw716l4AAGHu5xg5Oone7IIDUz7fLxaB9Wj1dDKpStri9o+mlH1gir\r\naoSFpmbPtEz7spg89t6epAPpOsELPx/9dwBB5jqBWgXV3VW4VMXt5Cid0WBO\r\n227/lqQhtPqygjN6xVwyCEBxX8i9JF0FTppWqhK3WwCUn7QJXjUVCwF4ueRj\r\n9y3eqQaIMVZFULDGjDIZmrTmEfk8o8y+GC8=\r\n=Uzym\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.84253.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.0.0.84253","@fluidframework/sequence":"2.0.0-internal.1.0.0.84253","@fluidframework/merge-tree":"2.0.0-internal.1.0.0.84253","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"2.0.0-internal.1.0.0.84253"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.0.0.84253","@fluidframework/test-runtime-utils":"2.0.0-internal.1.0.0.84253","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0.84253_1659987001877_0.3878855797739118","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"21b76aee46243357d080a9e37bc33ed4d7f6f7c6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.0.tgz","fileCount":70,"integrity":"sha512-NHZWzyIxXFPlVtPDh8NWDbAPMdDtkbBxzG8dMwqBxGLBowrLsi4CUZMQ1iiXoGMwXeiSHZZqWeee9o9JQOXkrA==","signatures":[{"sig":"MEQCIBL8Xjyu81rbsVIMjKxY08O9sWlLVbV+o5j3hO0hUR38AiAkL27YnMtPz7gCxlHgQCr65LUvkTxyamfj1YJ2/vzcJA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8bXbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmopzw/+JEEprXqiHJ3g37+Vd9VNX+XLo4infYoD+UBujiG9Fgpw1KTq\r\n3nb0x5OS9/3h9RVn0b36DJL0mwA4vQlVRmk0GWdttBkiTB5T3j0nZqKKwf2q\r\nZGA7f4DvQ7aP8uyY8qkzemUcK9m++dHqvMTaDUaVYjapjkDqEK+fEg5NTLBg\r\nMuolIGSc7nwdqUXGD7PrWj620tVNhxYXjsMDqGCJCEpMvWOB1/B0gcixDM8O\r\np4I1KCUlwzJ+AdNnnEMSbWh33VX/HwSKF5rZUBMj5JPTj9uIjrbeDgpI51ZH\r\nU2bYQUMa2W0xKbtd6hQYM7I806gbgoXbG8NwJAtB7NUqEg/hdYqIq9jxyZTJ\r\nbuFqFuMX98/hgxebKe9jRF59PlbzVFB5Ur0gCHlwm5HZyQThSaFGl+zohiQp\r\nk1qK5OtEBUtWeaSqm1DMvvBS62dcDHcus8imYonEeizZ2zVVO7YhHvA2kmyn\r\nd9zniwNjPdGKKmBwf8zUR5+p+xDajNS1hEuTih6BBXZ2GyNWdL+o1jyQXK6T\r\nFtNUXiKtP5qVtzmfuUPZUI4XiiC2Vbms10FlPdHuBo/trEVc+kRvbXmG8CMX\r\nc90rKx4EpNxrYyRT6fy4L0qf9sdBs0DXxY0o0ztVx9qDgT5SUrrgFhMRHfSK\r\nZyuoz3A7pRoKyohO3d5eX9fjxeAPvkjG4rU=\r\n=KP/r\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.0.0","@fluidframework/sequence":"^2.0.0-internal.1.0.0","@fluidframework/merge-tree":"^2.0.0-internal.1.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.0.0","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.0.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.0_1660007899374_0.6111993801354811","host":"s3://npm-registry-packages"}},"1.2.3-84921":{"name":"@fluidframework/dds-interceptions","version":"1.2.3-84921","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.3-84921","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6ac6e37c48b45f1fc5dab257df884e1f6bdd2162","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.3-84921.tgz","fileCount":70,"integrity":"sha512-D95Qe7nLf+HRcyVRhwDGJtW+z06jmTX8m1MFxfX88I4PyRNidAi5dyNNvHuS22uCnmnUtCUP6dqsoILjmoYdkA==","signatures":[{"sig":"MEQCIGW/RrWb2S7D5PEijgZH8tWwN0Pe98Q7etvI3XapKxhlAiAydZC8lNlt1/seTqwWKXNmayf2OpBsRQPmi5+4d+rYsA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9XT1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmog3xAAn0gpn1FGK0AKudcDERSO5ACg7NOQH6l2ZeURBeKQ2Ub+bVRI\r\nB6Dq06zfVBwwngrxERnOFSy8tGxbEpfHLy1jif2XzEYE5Rq1yI85p0B19o54\r\ncsTdnC8R+0EbEOpws1RnjUwSzSBRjNR8BkbQXrnhohMjg7VNNREktnGrHjCT\r\nC0yQWj7pt0X2V4mMgAfCFga35cJyMe9HLfWyl0/HKCqOgYDcLbhAFDgQi5cd\r\n3txki4WcUFIbMRZI9hRfzRoW/2m7Fw5drbu1Uv2tzxObxqv7fqENnP6YAebH\r\ng3WSHxabiuHM0lZ4wWUzLb+B1OACu5rq3xZJncqIKBz+8odVJsc6+VtZjDWG\r\nykt0zJlNubiegS8dg6En+d3vKKTnC3/Bb5cwMMr2DRQqXyv+3mKN76A/DAdq\r\nPvlLMO0nII3k1DBq4HAIdnC81fmprW69P85AeyIoxp8EzDghpVCwIX+8zrol\r\nHIR0HA0PhmYJybVuZs9xt9yenadEoh7/t0XluqXZy0VCfHkOcTZjv+ikTNRC\r\nL6uVv1ziKfnkG+9UbbcE+vumo/hYNIJRc7aL5z8nTVAp8D4XXxLrGnjuuElt\r\n9X2p/6FrhiYYCkAlXFz9+EjYBtZF1kaeASQgbBSeLOppG0i1vHx+QXATObbC\r\nNVPrfwmhKBRPf7MgrL/HTHRFkGZ9n73Y9JQ=\r\n=FsYh\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.3-84921.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"1.2.3-84921","@fluidframework/sequence":"1.2.3-84921","@fluidframework/merge-tree":"1.2.3-84921","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.2.3-84921"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.2.3-84921","@fluidframework/test-runtime-utils":"1.2.3-84921","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.3-84921_1660253428959_0.634085407717468","host":"s3://npm-registry-packages"}},"1.2.3":{"name":"@fluidframework/dds-interceptions","version":"1.2.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b14d2d283808e6455dfebc8d605e98cef6f2a128","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.3.tgz","fileCount":70,"integrity":"sha512-CI5/5HPtsi/kwy5dCErYuyzTsFKxGkN9Etbigllikvzf9PQH0tGdKopXjxNhYmkt6Xr8wII7MBCX6Utm6JkeYQ==","signatures":[{"sig":"MEYCIQDpjqwzGnHrYuMEarHkx+RT8+0dDC2hwWhKJXoSqnUtngIhAPX4372cpuSLe1IpxqiK3THPNsEbRvmwMpoxh/nCpkce","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9YWDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsvhAAlTQbGRW+0huZq9eUPrmq3eUSPWw5DX02pCFiZ0qK1rPkeelh\r\n8PrAm4BdNz1dmaAiDUHdhKBvkyIkM9jFEXwqiSiX6NBbvSXhe8RvYP8Yhb5O\r\nUrYD314Gr8jW53LIQv5grR9xjBtaNHtfbYuBcqJ469YyaxfzDV98jlO/VIEA\r\nMqh04uzYtKYX0z0p+TuSb/rn4cUOH2zBtchMmIfBC04P5O9Ze/7dcBEF3EBB\r\nbZ4yjy2S1OjRtMJMFVj+wVouDTn7NqaM0+21pv1sInH+1opXoyFtgzJVoqw3\r\nBCfKWZLbVBZ+G0OZAeh5utmZIxSRzoYwpl4rZMK8KROcrXTmX2EcIjdQbJBV\r\n3C6XUNuKnz6qMTncbz7pj/QmWmeenD1YcGxb0rnRqUZ/LDxFQfmYfAk/K4Jx\r\nS8SxPYAwbkcSV2M4Kmet4H4oS2Kg3EfECU3co5c4cwH1f+VdSztfoqXxIBS9\r\nK16lYRc8jM50hwe9OL8+J5CuwQc2a6R4LnlZoN5DoZ+vuz5U4is7r1pqzw0A\r\n23Ax6FXfi2bcCO+sB+LvFYH/Wn7bO+Uxihu5LE9MsMegrwEDHLMA5ufL5K8M\r\nN9TnONenRV4jHIPD1iqdDrsRac9lE/DmEpflx/RxwyHZX58hj3oHGXfXxUp9\r\nJDSFFnqd7gytn6bqKq+NNUQ/PaycZ1oCt0Q=\r\n=jcZH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.2.3","@fluidframework/sequence":"^1.2.3","@fluidframework/merge-tree":"^1.2.3","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.3"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.3","@fluidframework/test-runtime-utils":"^1.2.3","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.3_1660257667533_0.7039962711087355","host":"s3://npm-registry-packages"}},"1.2.4":{"name":"@fluidframework/dds-interceptions","version":"1.2.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6ac5def091878090bee8fca2527acd9e3148e9d1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.4.tgz","fileCount":70,"integrity":"sha512-0unnql8NhJ6b7VWjZy4483Ay3qSkYJGWDJd0BJ02QxuHtIBH/Upkni2nO3ibTZCA2XaJbe/rpwfMZAooXJW9XQ==","signatures":[{"sig":"MEYCIQC7frYTayQOEDCewM73D4xN4obRrArDjBv8aKrUypo80gIhANCWHdMj7Bt2QMSB/hwVVcZZnMou+NfBF06ag7xRv4+i","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBtaSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpVfw//UUCfCH6LTxhxVkFVvKZb3I8LgmzDPz+Xpo1FEt1nFU+ifGx4\r\nRoeVTk//fMf7ihVzcVejqIXwJZPZqnquCqjC15qBvRQ/KsOvjcuRGIGD3HN7\r\nDTrbqFwY5NyZSB9oXT/RlwTN8Q1wQdk5CmUYxmi+OIcTsoXYF8xtRqHFegkj\r\nttmSPg/W3gPXdiDyYvUDbTgNiQKL0zpYmb8WDatKoAdX6P1GugqKb+OeKyVb\r\nnWdX//SkRPqI8JGmq8xlCqH3pebB7HSWGMElRC0naQR0MzDZ7BoGE8F7UfVV\r\n1Nh8rwfivqsmiNR8Tre+AhWRDPEtUPuvrLtJT0t2lPgIggUy85aohyOgaJiu\r\nId56zzX3538dPux/TSG0BiUU834TQHOfMPLIRxaW7D8cwETtoazM8IKbYZ5/\r\nKpr1QadaYRjj+U2LDo8ptNOKUy20fDWN4l8UgpYT8MDEjR53IL0MrH4ET02t\r\ni3HLBqNvZLUq43Ei4PL2ak7ttO5rFpt0s4mwcLX3a6sngTNNnpGP4ABtsAba\r\nYGZeOnn2OD8z3nsRuA8CWLMNRGZ1xBDu7ohyJFpOzKrnqNDIha7R+p3ghrHy\r\n5prnOULThH+yw7ua59QuE0MVS/FxaILz7ZfTPMxipClcU/MG6bR0wNKHvWh9\r\nKKKgXr1TZ4Qp+GVa+L21EbjpJOfkK+Igd1E=\r\n=dIMO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.2.4","@fluidframework/sequence":"^1.2.4","@fluidframework/merge-tree":"^1.2.4","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.4","@fluidframework/test-runtime-utils":"^1.2.4","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.4_1661392530610_0.2326831643344307","host":"s3://npm-registry-packages"}},"1.2.5":{"name":"@fluidframework/dds-interceptions","version":"1.2.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.5","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c833e2ab712d4e362311213125dc9dee567d142b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.5.tgz","fileCount":70,"integrity":"sha512-GSUkmafa2ztLB3VifLylKKIbgLsApRym2qu/IyfcFWnoA5hjSWZ1XYwt5tkYWxiN9vtABf38UVvgvQj4MxQsBQ==","signatures":[{"sig":"MEYCIQDTIFy1LP5AF2DqkoNaokKFJFRMq93h+R8DxebeOsv9pAIhALf23ICzHBW0QlwfvNVCpafnETQ6kDziF2jpG3PaCCFn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjD/L7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoLIg//TAMfyyi6DQFRmqkLFzYrtBza5+/Ne1UVtkGqtxG7GYnfa1yw\r\nz6oM1JxQeV1BSh9BWr0MDxrR5dW67Df5mVH853wB5/ucHfjcUE7brWh3b0ux\r\nCTHq/LIo2w/LADTh/9hO0u4oC1Tz7arE1Z4Qy//uWKOGp2KAh5kg50IX31OJ\r\neZc+TUoRDejXdSxM8JPyq9lEXF+lAtYsHBSLnqvHR5Mg0sWlPXMDmuqqkIGN\r\nnznkhav+ackRq5K98llYehSrMo3K9PXMP1JYtdRP6M8tRZoua7jlF9ufUQpc\r\ngpyjq8e+owjWNPc4l+CPP9fllR2FNRXibYno8OMxtHR2yImlLHY5WGYiCiJV\r\n0wgZdhMbchSBuxssEgFtF4NslCIa8Z5Y2LzcxpwqPnUgS2i7DBgFd5uMdRBL\r\nzgicswzgSgtGkE8tksjFsJEXmEPmf033B5CZ/qy9xuRkzjD6qpm6ckg0MdPx\r\n30aSjMDQ13n+KUyCzJQ4BdDX9LnKmGuHqenXbrYEzVHgJI6iaGJt8EVhc56t\r\nCy2GOgzVCS0unuXPHZ+yxA6/YiwfIwWJ6rP53S8FrrNhyjD4T0fh98RnNn5j\r\nTxizVgFehI/5h0AI5E2bEpThZjMeYB4IzAXKCTm/k5+omT+4fubGbFSmMb0t\r\npzHN6IieBqm1o8Ld5kHBdr6DJTlRKv3Hvqw=\r\n=9iP8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^1.2.5","@fluidframework/sequence":"^1.2.5","@fluidframework/merge-tree":"^1.2.5","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.5"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.5","@fluidframework/test-runtime-utils":"^1.2.5","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.5_1661989627560_0.27249650246701473","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.1.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"461afb524fdde941eb5b841f1e8db214f30cc3a0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.1.0.tgz","fileCount":71,"integrity":"sha512-fyjK2wjp9c5Dmw58YWuSDUqTe16OrTh3fpXqbaHXy+InGD3LmomAUQ8rNjqvBBS9dNjOJW6fHipkXTeeKmXlaw==","signatures":[{"sig":"MEUCIQDm5qlYXooMc7z/c6F+0vb7omkMVFt4N9Us6/qSn0WbcAIgG/oTklk6qxSYGNAWJ0n47EJ/u2ZR+SFEAadF29p+JFs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEmH0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpv5w/+OB6spfNswZ3n426+RdiMyBXNDqMqJEgbhsHC7TLqnQ/hGeZc\r\nLpk4JtjztszGh/9yzdGcY7zN4HBkwWUfweDu+/bR6jo1ELXbsjOKLHYCrcYf\r\ngX7YJfqszF7EPLPNvsBIGx7H2cl/O5EuQ3tc8LiG9OrL+6Mf2ZTHQ0sCBvxu\r\n4k2n0TP8voyGwaBJq13ThkPsV4hF0m2/M0cBBhDAVlPS6OmLHZvN7ETq9HBM\r\nzfUGkryOrFjtmQlf3VeFIhooy/8eZCIean9YgXKrcsgkzrUJijx1NS5Qkq2u\r\nWBD1+y78bB1KzEC5MItL9zj3zZjyox41mpRMNJc26O3G1LKz+aKUVguyFihb\r\nQKZURDU9THIywgFSKljPPb8rFIhotG2VBC/ztvg3+wdIPeXur54PnIBPO+mM\r\nlbl1Dk1S+2ZVOMYLa62FhXJ6Ro9d+q/GQv5G6cLJsFrMcB5Fbp6pR34r5Qvq\r\nP90MuANt1VXrPXPG/re1Dem/U3sgJhUHAfsBwQ2gt3CDb2GmJOqBao07n5M1\r\n08EzcChxX3d64Mf2xlJQ+EXfUi0CULTFmiUgdGbMZP6GPFnvGF3nyfgpxeOp\r\nNJWCj2gVyx6vxIiw1tGKfEFdzNarXAbNEqYrpdnwTDqtqCBpc+AgLBrqnVW8\r\ncT0sJJFi98F89nw3JnDEMrKnWHeKzETsIck=\r\n=6NMx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.1.0","@fluidframework/sequence":"^2.0.0-internal.1.1.0","@fluidframework/merge-tree":"^2.0.0-internal.1.1.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.1.0","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.1.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.1.0_1662149108219_0.7703812680915836","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.1.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7d95ca61c0caa94a441527a64672729b19f96c44","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.1.1.tgz","fileCount":71,"integrity":"sha512-b/5Ylc61IMZDGybIsz5i2OENrr8zZMZJo6N2JBBogeLLUJy7NGL1fYt31/oP++CBXvXQe5UF+gqk5PhIRHLkVQ==","signatures":[{"sig":"MEUCIFQ9APS0vicI2tzSxLVHsbOH3xqGp9xW4LzM/nxDKJTCAiEAoD9ZTJz+D8Ph5sMVbePlUiV8fu9m1IOxNcDMkBWIfxY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjG7LDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQNg/8Cizcaa6KvU3lBaz5Yt56z8gUa+cTm/1TXIzX6tRUQ7CJpOzi\r\nkm7P6Cqbw/nhzggUsYZj+Gf9QlWiVpbvIjxrWQJRns+hDKRYJxoLMNRoE+CJ\r\nMe8Hmae9xgWi9QALkf6/hTWkSuzPCUs+8Ufne98WzTqDnS1LXfyj6yJXone9\r\n8NIkm7yKiEm7PUYlznHDglvj9HTYhPVeRFlzyn4zXt0VIf+LGFH64bIq6xZ7\r\nDBlujkPO8qUoP6gYIyxfDTVmZmFxKFNbSRDHTHYxiSherPbNQ5tIeu1rAxxO\r\nKCVbXEp9HmQE5D/gGPrZXZlFMakXz5u5patRiIkc/CNo5KQ2wU36m/JcAOLV\r\n5vxKVcW27jb+1IQ+NfLLEBn5F6oErpaZRWELzWFv4L7rlRnSrxWx1a5iinqG\r\nNKrTHz4mih1EQXInAaVi9hLTbfEfLHqVnNf7i97s576VvESsm61AVImzQB4c\r\nW+rnnQgZlRqXdhJAIGvG9nLlq4cxCBPTk2zv+QE0k2ozZCeNWdiEqJOnRghS\r\nRf7J0VhK1dnmIjns6Oq+cZR82sl1tKyRc/9nvNGQI50iv5xRHwgZaQMXGM8G\r\npB6VQ1fnV4u9/yWS2Zc5OJ50nQSj+3l5g7/sLKPXmAU5AV05VqI+oLV/0cDt\r\nuqaEKVPYFloShq/0s/pGNXBdTuOcUPid/K0=\r\n=Nn+2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.1.1","@fluidframework/sequence":"^2.0.0-internal.1.1.1","@fluidframework/merge-tree":"^2.0.0-internal.1.1.1","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.1.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.1.1","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.1.1","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.1.1_1662759618829_0.5353054776132762","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.2.0.93071":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.2.0.93071","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.2.0.93071","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"399868678f9b440a5aa0409285ed0d77949be31c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.2.0.93071.tgz","fileCount":71,"integrity":"sha512-Pc06okuVgs9g57EkSzmHpJciqFMN6wRVavloFIsB5mpb94L47TlrxgmtGvq8M6KfWJT5k2r4XeH9XKB+CJF8yQ==","signatures":[{"sig":"MEQCICeoak3CrEfxdrgtNDyHN/QcCokja8nEJN8/JQ3Wf6Z1AiBBaP36XGLQ+QZMgItpveBwyu2vMXhGS+PzehStaNHrhw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146241,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIj6TACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrYyBAApG/UqqMwN02i5G+30p8GfLswOAgLhHuPIDH1WPxuBtj6oWti\r\nzpi6W0DUS46eOfypXOxPAofqRAvQmcs3C22X4P33uIC0D6qq/szZhiMeU2FN\r\nNBfn5yDFbYQ5kYeUWU1a3VMDQZJJbVP/DXjlYBdY3G4bX0zHMX5pyeRADvCU\r\n+jLmacwbXVRUn2VLu8rfkYOws/ekBWrpsYquDXonZs9ToODposgxZs4+2jw6\r\nqqqW6CzTO73Wnv0i9j5i8MaVQsmLbuCvJbnsUoo6dWkuv39JaUcR34kBWAmQ\r\nm1S1lQ4WEMnvoY1FwMdLrQzXnHptvylORPPwBzddN6LLBgg0enTOOpoi00uQ\r\nSjZ+5mtvl4iELAt/KD//sdqzfifJI8YrAtFXUyw/m1NCpObUhklVKgAdtFoj\r\n/NWGS0TO99axf1/IkOZhDMZnTB0CrM8ItcNqv+Vk0aUvLc34SK5DysDFPrzN\r\nCHKPft+7/JQNCXqFlwhx9jADnDX0hOsCZ9kn1GFJpaJ2ob/phegPBp4DQCyb\r\nErTT1ZlLK3SiDF+5gYeoid31/z2rURAO5xCey7+sV8NFz5MgHO5rdcuRKn9S\r\n3wSihp3rWuIWKqZzLS6upjXUwEGyR435uVPV2VcR8LXDMsTGgtF3nZggWVaa\r\nH8amPGq3GvbK1DPfDRCvv1JWsx7yA3MdMl8=\r\n=D+sz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.2.0.93071.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"2.0.0-internal.1.2.0.93071","@fluidframework/sequence":"2.0.0-internal.1.2.0.93071","@fluidframework/merge-tree":"2.0.0-internal.1.2.0.93071","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"2.0.0-internal.1.2.0.93071"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"2.0.0-internal.1.2.0.93071","@fluidframework/test-runtime-utils":"2.0.0-internal.1.2.0.93071","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.2.0.93071_1663188627476_0.3132776913690678","host":"s3://npm-registry-packages"}},"1.2.6-93452":{"name":"@fluidframework/dds-interceptions","version":"1.2.6-93452","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.6-93452","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0fe73044a6189b73a1849593472760d6390a13d2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.6-93452.tgz","fileCount":70,"integrity":"sha512-mMmXMCZWbhP9MPHYStdqEHzXiEovH18A5/pudC3fkij/CJ6QRu71CObC5tQ0teMWSnIPGUl2+4fkC6OLnv3WUg==","signatures":[{"sig":"MEQCIGEysK0jmpKSuGyKEu+3EMwqFDX/M5BxSIsc7SFArbnCAiAX9VLWHVzu8EisaOWSbQ4fLavxlz5bL4JqP6m7BB9Qtg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjI5DWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrfgw/9H/oZC1Olj9sip7cSoPUbuCn7d4mhJ/X7HU8QvFkh+pJIO9vE\r\nLBYp0DSO0fDJqZfcYiaJbyXjN7VGiEH0/BmCCdltJee0vgkXDrUyk2vBldvx\r\nY+oSTK6VO2E4kxXD2DKHeDTy58upBkw7h7AAzc5/QgcoCI8H8LDtpg8MX7Vw\r\nUk0A5QIf1D8T7jBEykWVkRRptVnUmYaU4jU1WsMi4v/kj0QwaSHo6a0SElzM\r\nSG3WZ25/Jlv70PJfIXSosVj1TUu2qtE0C4oNrQORFKWsXh9xUjuuyc5VeEJv\r\nn3nePrc/qXDyecp90QVbJN4WDRG+VnG2PiDETA7FA/gURkUs1W+kEwKeT2eY\r\n8ocrdnS/a0JuuvQoQsHQ9NOr9EpgxN2vv+VsVp5wEhtl1j8g3hLqhA2aqM+9\r\n4FJvZincI21FmN1lTo/9scCFpebxPg4e3P0F0uZh4g6I2gMlVMPO14mRcdyl\r\n26mZ9pqYFt95qehbtjTtpGWrwN2MPp4uK/f8KEbKuK0sj8KA6JA5Go4+KQVs\r\n/fkKma2bIDC0wpDhEoTUCycdh+BkFEKB/rzS0whTrjU5GKDIb78kties3x+S\r\n7Yr1QTGTJNjBtbeeB3eKl9W+WFgM1C4h3vJPtHL2aH2O+g/7/VNnSbOOIuwH\r\nWZ4kW5Jc2Z2C2EcYMCc9LC4TElKVrEmLq0g=\r\n=yTRn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.6-93452.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"1.2.6-93452","@fluidframework/sequence":"1.2.6-93452","@fluidframework/merge-tree":"1.2.6-93452","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.2.6-93452"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.2.6-93452","@fluidframework/test-runtime-utils":"1.2.6-93452","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.6-93452_1663275222245_0.6959527167619233","host":"s3://npm-registry-packages"}},"0.59.2004":{"name":"@fluidframework/dds-interceptions","version":"0.59.2004","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.2004","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0d9b6fb0060c126ad0e0508dc26b9360c2cb943f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.2004.tgz","fileCount":70,"integrity":"sha512-aB5i3UcpRAmNGfeFlcAqcgsAAyP2pWSOCvC7PUSEuLTSDd4Im+W6vS9RSlKSIcBcCF7BNHEVpKuk/PCBSSZxmg==","signatures":[{"sig":"MEUCIQCMZYrNDviTlld1761YOBOa0yUfxZgXtQWR9feEqC18QAIgazoq3kaVNjagrxBo4SL2acDYQnFLhTHRRKKUrRi/vJQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjI6XYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo9hw//WdYGJ1F33kzjvvtbj5vKgFn67TrUnYN0tGKU4jPstv1AMt8b\r\npebKrmBFb8b4IdZMrdbTEaPz1JlnvgPvqQSPqMilW2yMTeFH+DopER+bUMRn\r\nqWpp0h+SPB85QGQ5M95nOjclNLU7RkKWLlzmW8eXUrqAsRE3ZFX19APbLfvT\r\nl1wHrLG99umn/bnBuRgCngNw9EO3kCt/4ncMNX9XjzmvLhfDsOfD0ob4JLXC\r\nQ8kEJOxd67/hGyx8LeDr3gtrLwIXD/ocZ1URB1j7CdzjTJ/TLalWocst5DWs\r\nE8pLCRVjMJPj6FRtK+qslbS7Sc4lbTH78OpWIK9/6vg5FIq8SUa5sQxsqiKI\r\n3U2Ml4KWQj3LONruLQMAVSOye/Q1jDgvOmDXQ+YKyg02won5oblbUpAFidMQ\r\nEB1ao8Q7e5GeCchNjla9YFWbivbtnnLEGN4aJ8S2VcLK1SYODG3Ro/8v92W1\r\nT+H0d5+mG5iCbcf4TL3DUvbHcp7cjSZPCd4le8aopBdjezwJeQYOgQz3CUaP\r\nK+VxaCDMOTP2FwP5UDq36twc94//wIvB/jrHfjZcgGf00KMTZfAGRzDmRUl6\r\nylhHXGcQ313v4wHVADUkVVBmROzay8DelOBewfb+ISaxrjDsNxMKaTf2idez\r\nl0+HXpiCGH/nBd0fFj1Dm3OgSEOx15vlQ+U=\r\n=AkBm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.2004.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^0.59.2004","@fluidframework/sequence":"^0.59.2004","@fluidframework/merge-tree":"^0.59.2004","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.2004"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"0.59.2000"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^8.4.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.1.3","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^8.2.2","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-common":"^0.23.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.2004","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.2004","@fluidframework/eslint-config-fluid":"^0.28.1000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.1000"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.2004_1663280600263_0.4496213756867711","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.1.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.1.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.1.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cffaeebca3d74c73d65db7a85ee9111b5892e4f4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.1.2.tgz","fileCount":71,"integrity":"sha512-Q9Souhr+jlg+TWvzvJ1rIedjOK+/QP3KuuqXy4s0Iz0mQDBDKtTHGYv9OypDzgiI0PfJ3766eg1zSzsBkAZaQg==","signatures":[{"sig":"MEYCIQD4W8krk2R0HV+6mMd2u3q7EOmu/LXq5BPSOEPEOjk0OwIhAI1LXe0b+9lcJuYChpD1l9BTMCnY+MZptVO1LTS84Waa","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjI8ArACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLUw/+KwpoLERj+uIa4HWrC88mvNVqmvpIj0Lc7H1ui/bHjyTVruw5\r\nmTmAVLw4T8nfSl4wGuGPKws5O40KIWCKmi8wJokzFvSs2k6rGkXQYg72EmjB\r\n5alz3ADnDSf/PN++pFgdfUvEL+it/Ae7HHXDgSkFc4ZqFnAcyEuY8DemlaWP\r\nNByf0tPodipDAZuOhGKLOWCLAX6BJkpbNGoG6PhFegHqt6F5hPHr4EA8uLEe\r\nbKEhTnv/kqwbOSiTzQvE+1zNGg9qWR7cIP27yFq4mxjp+cW3n4ekG56BJSrX\r\nw97TdKthU+3nzlaSdQ7VoKoUqPESMCy2q1RSymjnvIeyZXH7IWn/AEATw7Me\r\nzKIPlqPwwjTkrFCnTYhEWcwdw/T5ZdYdBnkh7IvQMJgLjA2/szHZYfKHiTNZ\r\ndeo65uoFK3hbIaqP4L7+u96MRUg3Jjgyptqkznm9497c9kdTfWUKhtSxEpIQ\r\nUjiCv7Llo5iCRobEgiWaCdVZLNlBEK2nIUHSCgVXEtQV2mJD6alyiSjM97DY\r\nT5An4l2fvyZWEX2/gfsU+yKtAEABjzmdkCKRIAe9bpGNc5yD620SX8qx0pLl\r\nYUIqNRIOA9Z/6PJhAyvAczlJl236Xb+SGZ1qhSIvwzOHfZD9qjvSAT/msxRu\r\nL7TNk8GFKJDTqSyLB0tDgO78O5ygJZGqS/s=\r\n=xeVl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.1.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.1.2","@fluidframework/sequence":"^2.0.0-internal.1.1.2","@fluidframework/merge-tree":"^2.0.0-internal.1.1.2","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.1.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.1.2","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.1.2","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.1.2_1663287339629_0.11970617887472601","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.0.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"14c57b8be9ff72ab11c036b2853ed7bf600348e6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.0.1.tgz","fileCount":70,"integrity":"sha512-qlFqMUMkuIg0kec5g86wP449TBotYFZ/fgIsHydL583fZBwHnFi082EHVE3r+KqkskOVfo5rwVOCJv0sqY2FOw==","signatures":[{"sig":"MEYCIQCVzTznSQxiwt6rGGw1TZDXUmPjnP3tsK7p4YMvYHXEgAIhAOdYdJg0lkumLiIT4eV0EC2krtuu5pUbsVjw8qLH19jR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjLPFDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrinA//QPoUYwCa1VWDmrH7t0bHnsSiWbqzl/VHDArx/AlpSfvE7WQm\r\nnGnoPABD+W2+OFxKJhTG07hB1fo2Nkp39mBjT1p1p0jAixQTYKrus6tvx0yK\r\nhBdUbLIqgLMdLVNx1K7X1YInw9xGraxquuhoCHGP7trBNKm1FyJdtWpfZKme\r\nBxSFwPSOGHfn8lqVlHP1C1DeXCSXl3WnDnfMyWdsnQuOk4QR97++27zrQHOE\r\n1rNsh4fmDfs0uo6FqchomQeWWW5GTXyLLCx6JWiK+3wY/EplFAhmIipdsxa6\r\nnAcAEDNyfCoj4fauvfbd/AaBQm98h4NDa/scx+a+kUPxgnzO9xvXS0ydpR3/\r\nBOzCijOKHF2cbtX03Jigff4jzE1vXL8I0rQBfHgKYcs4wrz0QBElgIif7a/w\r\nDpacdVk0Vb12pavDpW+PN0PybDZSQm9Dx/fx6INLbUhU+y1ATyLWwmAL05H4\r\ncnD5qDggn9iFLbAnB30bdtzzK1A4r/I2cd2p2GfCSvzca/aqAr98DJKTyQdl\r\naNei26fagr2XUyxZwfjY+7/8uE1GTnJIU0a561mRVCIz5U8t4xEQHSfL0jF6\r\na1PKk+C4C+l9k7l/dqNGzRZeCaIi0r0zPtUF+FdsZqBXUO+S53B0a4StjynU\r\n2Mi6uH0P58+NP7uz25USnyQHldddRQqbsbc=\r\n=ZSs2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.0","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.0.1","@fluidframework/sequence":"^2.0.0-internal.1.0.1","@fluidframework/merge-tree":"^2.0.0-internal.1.0.1","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.0.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.0.1","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.0.1","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.0.1_1663889730814_0.668343550132376","host":"s3://npm-registry-packages"}},"1.2.6":{"name":"@fluidframework/dds-interceptions","version":"1.2.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.6","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"87d2e3cc2f82aa7ac56810f2e85ce1f6f1db8707","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.6.tgz","fileCount":70,"integrity":"sha512-EsUiCkzQ/aS7WFvYEGIrgMUCnGd5bK2DBDklrL12/o/2myxU0DbQUX1w3+Ecfmjs2Si/0SCZPDpESBpAM6QzxQ==","signatures":[{"sig":"MEYCIQDckEc6wwDs87/B3LdWRlfd6qeHgQ0/zR3T8uKuni1+1wIhAML7CceGQhZMGv1sm+aVzCWbkiNLNhCzk5AoHDOMtWIo","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjLfRuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqgSQ//YiQBQOOeRlZ5IPB7rV+5J4aOSZ1KV/EHx1j/3fd7Z8nR76ca\r\nUWJ1ZdBAa3WlrR6AOygGRIyIlsQHEeRr/2FlCA2PO6XBJmjBHyQxxWEIVOcP\r\n3/taz3u0C2R9OXTgAbseSKsJqWm5Sd4ZEC7X5nV3kctOClOyKHWui5AdKWUt\r\nwktvuoKECBYNI7me2VAgo6FZLNwi8BQf5MMDOkRFo0LEihWvhvWd3z+AhaAV\r\nJH+lXroGCi7axIkCRVlYUlCJAHEmMDeHWsQe6D5hSl/4w4FLZ1LExgRe9nab\r\nxeA6QGmu7+I6x3QmRmHwhstb/cHVByeXN20JqkZBLQTKuRy5yFliQhEwc/1B\r\n7/x/IQfvGCpw1P//BcIo/BmFumLQb+tEoTl9LZM6IKVkKtpE4KQSdzyKKEuS\r\nsqe4t/41rtlZNMAnggItpbCqGl46uRrRqZWoYgsWHZ9OjjpRtSNzVWKL8M4y\r\nDfOkOBKJwPgcgzziHkVy0GlbzxUroG1uf2fQSCHagShapn0q3xSAPBuCg5k5\r\nznvIibgMHXR69RaQQnR8GFVf2f7uc4NXC3/FsD4J2yT/t81GmDRzlCd4/aa2\r\nIOiH4iA1G+g+mKVnXOcaD84JNx9x8ZJ2XhJmXPpd7q2H5ssjdwX+4jn49rhE\r\nvUb4GKdyJ8rJkzusVU5eCcsU9r039DhVihg=\r\n=WJA5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^1.2.6","@fluidframework/sequence":"^1.2.6","@fluidframework/merge-tree":"^1.2.6","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.6"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.6","@fluidframework/test-runtime-utils":"^1.2.6","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.6_1663956078734_0.1979296860788171","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.1.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.1.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.1.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b245ef3ff6cf490d3979e417a0fc852b6450fde2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.1.3.tgz","fileCount":71,"integrity":"sha512-NWz063tBZ+DQzNPMxGyEUPFcYtJh8IiT37aJpzt0okT1KTgqqwFUT16uA7DvbtxNFHZsLV43RV49MEVm8nQ6Jw==","signatures":[{"sig":"MEUCIF/hJwRUrdkxECyl51giVO5JRFbvQAfWmvbyNixW/LvlAiEArJzhLjRZiU4OduFRsmQWn7ERnXEjb2GTLbY/m69dVIE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjLiqLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmolpQ/5AcqdoJ/gI7v+CDMFuQaW3pni9SCzNw4VWTVXz+WqsRxFyodV\r\nP8TG5n9R6D7NJlVpixs3x+H6Php5g/Mxuk7hrLMdKkSpg0M9OFRQ4w5N8yAm\r\nYaTHAF+Lp6bzEx6fVA02sipPaYvmE+eX0eT8yvJMICwzFhW7JxjlKGg3wHzQ\r\nnp2KiS1DZnDGohkU1qPb3Wa1iT4gEsF7pRyauhfR55aph0RgDLy2B7/hkwH9\r\n1CUgvApKdK8r38af1LhmZmfaL9YtDdawy1hDUkXVIeXVzme5n3rHDSbuIhx6\r\ngUmEUKeeuIpBCcB3bAQqhCWWc1xxLXKiKXW4MiHGzFnJpJH3rF+4pZ186O4E\r\n4Wlc1U3gNSRrh7KgddELaWl21472yOwQauO8fDWaLFio+gtaGREoMc9ln5C/\r\nBqr/urauSBTBRjJsE/7xAVLlgm/tdX7iZnYrn0+qeCoZ+GU6T6X1FTkQhXCq\r\nxAhXaejXSIlxAUf2Dc5sQJuo4Ptz+k+GEEeAa6UhgYNdoHvpndQpPSkyKO2i\r\n23Eoq7MrPcbpi//9eooK9Rhsebcdrl7rDuIYDYxzMz7vEvRwAB11k3RV9/pq\r\naglUXhfm2LFurtyNyL7sbfeR61UCcvO426b3FWBAfIg4lFhkK8wR+doHeAg4\r\npVggAuuxsZRGvATMwjomLLx/teaHsZeEMrw=\r\n=bUaJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.1.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.1.3","@fluidframework/sequence":"^2.0.0-internal.1.1.3","@fluidframework/merge-tree":"^2.0.0-internal.1.1.3","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.1.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.1.3","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.1.3","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.1.3_1663969930834_0.1520592373845906","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.2.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"40e2f66b01e88865d3c01fdba5224588d795c08a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.2.0.tgz","fileCount":71,"integrity":"sha512-MXWy8EG5cqAAP5GztI3hWWzPdNMgjDi1UmJse9Zkp4CEqa2dBbQUd+0li6/S9G2D8Zbl6G71rX+CAYPEGmwTIQ==","signatures":[{"sig":"MEUCIDTVFZQl1iW38vuMGjE8lkgidFaoAKqlVJcOMC/vI7v0AiEAoumWVrJdATLDxfSDXwINgVX+bD8t41uuO0l06naO45M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMgfqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmriJhAAiNjA1pobKhw5mhMTzGOdxwti2SqO0u8t9WNnXtPCtjBqhxZm\r\nNo6qVsVWauWVRgMJTXJZxrgz8sprwhCY5CKq1lFTbtVElKWfgqPI3dnaueHG\r\nCWp3/EGaVCgGxwvYJhT38evBWR8U7TM3QiH0qgd+dZ9eXToDtotkm9asSGez\r\nsQcK2GTTGc6Idh/NgA2ATFQ20FcTIrotpDgRlOtKvaeMW86D5AkAJiU6E4Al\r\naPT9bleR7pbE2kNWzX8+rX03ZSDGg0jzsqj8D4TkeY7rVoAab3vwAxk5+D2i\r\nloN8zx1KtymGpmmLECug68K2QnI8SkOWtJIV4sTJ3oC87vUePuiAJMpRa/72\r\ngXwsuHQJ1LzN7Nu8C47D+atSUfx4bLJtlkvQBirS8xDgS+ZKWIRRQEs3Fg7u\r\nqbq6e1ZTpmuqJXZNbm+6lnIVfxgSMP8pwQHbTMaPCLE6zcUaIYV7gXiZeQ8r\r\nbJJN5qORElMCSHET+1cwiaRYEOM5cdFLNKZqYUgp6m0dd4nuvWgVHi13kLqX\r\n95WcQxaNsgWYE7G6D740LOAF9H47xPUH6hcAxJ/ZmlyB+tigJI7XqjOxZA+r\r\n2Hzdz5C6Hnqe/mXIU38l3h/PQVqjZswV9fcQFdn3yjb2w7PtZJkFGw3xKQWs\r\nECg10IqqhvUXX21yI8mHpU9SF4yBDUBTUts=\r\n=M8Zw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.2.0","@fluidframework/sequence":"^2.0.0-internal.1.2.0","@fluidframework/merge-tree":"^2.0.0-internal.1.2.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.2.0","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.2.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.2.0_1664223210319_0.02348382529296056","host":"s3://npm-registry-packages"}},"1.2.7":{"name":"@fluidframework/dds-interceptions","version":"1.2.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.7","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4f692007dcc6915a217350db846d26ec06687fa6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.7.tgz","fileCount":70,"integrity":"sha512-zJXntvHWwiRJanGdPC22ZCUspBbu1sw7uxLnU5UCHa1ybU5770BsseguRKEKuCGl6lHq3e0HX6xLrJ7OhxAtIg==","signatures":[{"sig":"MEUCIQCkaRjCVLgqqaBkHKoSIF6i1CSUfAjujYhNQwlTrhCtwAIgVqeURISYHsT04GQPzGcSaeGQ/rLQDOMlhkfyqg2mrh0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjM4mfACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrc2w/+OieOiYcrZ3/aNWjhOm5Bo6GSPOBaDA0j8UoZUIyTOjDiWqN7\r\nVV8dx0H5hKNh0rQKcOzJKNW4ss44iXVUOBK60nlAUCl57UBa3KGrWrQfAfJ5\r\nt2eV7Nc498RMkzXOoz7pUEQi7GzpdtL6VfSfG/+DaFxnJRvgRtW/lLitPsUn\r\n7B4VUDst+q5iTmjyfehUlZ1+B4uYvBu5hKu735IeUhnatlGSetQIPxj2P/PG\r\nbE6gqJeJ7WgTGxEOGQROxwDGneYub/fWWTpb0R7u1BjpJTanKJVKVlLE20GI\r\nZZSggxb5JvOAdVKLVddlFn8IUl2WA2Op9/lJAbd5krgHpxDPsD2JfGeeYkGU\r\nvfCGkG89VourXvt2YdRtLmQCqJZOd1rdYOMYvmZg6UfCmmCyuyf5spxyfmIP\r\nRk72iOVc+rClvGx5yPFkqMOBisqioezseRQFf0Rdk35oHKtwYR2xX4wNLTQW\r\n5AB48LCjkkaubGWrJkRA5DKsGVdwcsw8Ujj9ck8Cg5d9uDP4iK+u17kmbJLg\r\nqeObQogIwV8j7f+0b4qxPXMbN+NkObalqoBIXcBwCkXguEdfNtNN10Coo29i\r\nMRP3gSh0rIZD0QjDnlxzioo0xVwpcBuw3BfHt6MvFJ6fW0VeqwSaVRLxda8t\r\nhmvPuAM/AyfsQjtRqlK9QK3RlcONmvw7EKQ=\r\n=duuf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^1.2.7","@fluidframework/sequence":"^1.2.7","@fluidframework/merge-tree":"^1.2.7","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.7"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.7","@fluidframework/test-runtime-utils":"^1.2.7","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.7_1664321951028_0.95395554960204","host":"s3://npm-registry-packages"}},"0.59.4003":{"name":"@fluidframework/dds-interceptions","version":"0.59.4003","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@0.59.4003","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6e20eb7a9ce44c400b637efaa3ba2103296f93f4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-0.59.4003.tgz","fileCount":70,"integrity":"sha512-h3F+JXONbRbjBVQ4lrYq7jIJAZyomgVRhWt+2GJtR86dcamRVajheQIJvkT3ypwg6d0B8q8smAI35BO6LnDwMg==","signatures":[{"sig":"MEUCIQC3JaWJ2E+sAdf6entU1i4ogmc9/X9FsZPcLWuxc44DdwIgPusk1jn9OY9fEd9r333LIf04WDo6L5/eM0XEO9LNkpU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146194,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjM5J0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpppRAAoz/hL5pkNeOzNq4xGGxwnhZfb8jEYUe6+GnFoDIDGWvb03ZR\r\njq5ZhqTjgvtr5BE+H1YpFiX+JzhAo5O6DeSsQjCoZZcn41hm0JowtmIdXwdp\r\nZ9QOF9dfgEhiYd69BYqujQF/lHm6I/xos/Z75GCyws5lQKtChDrZXmMBK8bm\r\nZUOquVXoxC7/PyI0HP2aJbLXnTUJshbqbN06Bp4pblIwzXWs1813/jHf1ZG+\r\nMFE6tGabqUT1vT2qe8Zep2ipbFWIVVnaa60uHjdUq/2bypokpGV+qzXjOSct\r\n7Bu1zwLxYwzHhzg0sibWqKbh0iVZxYz8wuCB2LZYN3oe0smdAT+SsSBlvnEd\r\nBmSliOoe11t5LtJaZnA0zfKLONsd2LynL3iP0FFSLBdXN/WONauou+CrNLwq\r\n3axraBbsurtUI8hr70J718GIaqGvlvSdsEL+Qo51Y3pzV49yj7kKnNPRl1yR\r\nL6hIDNZT+Gi5ZDZM1TSfdo0VV6319nNrqkpYz3q44WRx6PGIYSUek7o0FJ9d\r\nALMCss1A1Vy6kmq5gt0JHGJQcVMCJd5B4imf8fJf8aM/gErgII1X2H51EQIi\r\nGEvwYtBSLfv8Cax4DYJmcBbA54y7yZq5zsaLGZtNWuarvidiGZJkRT0uDrWY\r\n/R2kfzcFPIbXbaeQbMTTOStqpt1SyA42PMA=\r\n=ft7C\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-0.59.4003.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^0.59.4003","@fluidframework/sequence":"^0.59.4003","@fluidframework/merge-tree":"^0.59.4003","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^0.59.4003"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"0.59.4003"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","eslint-plugin-jest":"~26.1.3","eslint-plugin-jsdoc":"~39.3.0","eslint-plugin-mocha":"~10.0.3","eslint-plugin-react":"~7.28.0","eslint-plugin-tsdoc":"~0.2.14","eslint-plugin-import":"~2.25.4","typescript-formatter":"7.1.0","eslint-plugin-promise":"~6.0.0","eslint-plugin-unicorn":"~40.0.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@typescript-eslint/parser":"~5.9.0","eslint-plugin-editorconfig":"~3.2.0","@fluidframework/build-tools":"^0.2.70857","@fluidframework/build-common":"^0.23.0","eslint-plugin-unused-imports":"~2.0.0","eslint-plugin-eslint-comments":"~3.2.0","@fluidframework/mocha-test-setup":"^0.59.4003","@typescript-eslint/eslint-plugin":"~5.9.0","@fluidframework/test-runtime-utils":"^0.59.4003","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@0.59.4002"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_0.59.4003_1664324211987_0.14998335066540558","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.1.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.1.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.1.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"19f41540b579b7ea5fae844f56294406576f2a2d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.1.4.tgz","fileCount":71,"integrity":"sha512-weWEELkuQrmSYnEhN+f++W0xG3ol6+d8GBQZRGEl4jiQVCxmdXm0kwCr+YD92S9x8sNxoSMicyEEmKRQA8s8GA==","signatures":[{"sig":"MEQCIAWXU5oOgIYIEh3vHckFJeeog+8m9Pci4uIyc4vTDSfUAiBMF2yaenMQJhGF9516C5yf/O6WpObQDVYfhFNJMWZcnA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjM5UjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1GA/+ImkIlQC2/xMqYy4CbmCQbZalysa5bKDYthogg7Puz6Ro1yj0\r\nMecT8mO5RIjZG6B6dMz9sXPO3b3M+NAtGBerpv5CYuuPt0ChnakQ1bo9AbQr\r\nr3Y3S2M8WDe+fGsSHPXhlCYCDT4FAbp4T0vrsQzzuXuumwQvYiGalukIa6V3\r\n//fh2ceQA41bNoa/6OhpEH//oqwfaEhmtBqhHItYEUkTWCrN5JUG9VOnAtmj\r\nt/gJFXZyuhQIc1doQ5xzYFaHtU0B6TixYNDeoyOp9VTxJ3GNOQuZQDlsoniw\r\n+y+5zbYvjg5QworYIcnI/FYNnI+wmGTcxgSUu0WMrFLOD/sKgp5GkJej8RdG\r\nIHe6ubghs7mjyGjJtbdtC/x7lad/8bc8iLpDcpBRT8QB6UBzLwVP6oE1SSyy\r\nBjMCYZjJqSpqxC478ZWK8n6tlo+YAP1M/fMroHMY1DiauTGSRriXPu9fBH/d\r\nedmg2uHlZHBBS2b+nF7z5vZAAilVO5IOzNCHcdfX7hwpo0xLSOxY1UN20HjQ\r\nbjg2/4HDs3YjE5vQblpoksheVhQEmKeUEwmjZJS2M+bLUr2MPjQ8KlKfF2wv\r\ny3OGq56etRdbgJ+n8QQfESLjxrlJybM5WkXZkGOZknXvzaTLpgvrGRv7fNb4\r\n3w4zEWsw4g9ClCw21rcmrGXhgSxc6bVSUtE=\r\n=ApGK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.1.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.1.4","@fluidframework/sequence":"^2.0.0-internal.1.1.4","@fluidframework/merge-tree":"^2.0.0-internal.1.1.4","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.1.4"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.3.1000","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.1.4","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.1.4","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.1.4_1664324899405_0.23489457215490117","host":"s3://npm-registry-packages"}},"2.0.0-dev.1.3.0.96595":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.1.3.0.96595","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.1.3.0.96595","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8c53dbd284624adfc8c3963d2107e5acfc7ebc44","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.1.3.0.96595.tgz","fileCount":71,"integrity":"sha512-/Fiko//NiTX7DHV4bBOSk4dfzTqVMSfgWEd6TiQThuhyX2XptmQSXco9BOwYy47+eJAen2rQxNaf10qPNo0kKw==","signatures":[{"sig":"MEUCIQCZ7Q9CGP/fqili8yGxNnChHZV+DbDate1pOY4H/VnMcgIgIK8xtK5gHiDCEgi82W+r4QU4u9McoqNY8/W1x19gc/g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjN0t7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmraqw/8Dlr5M+i/JCozqf4RB8o/N+qFR6mergRZJif+pSBeBuXgdfYy\r\nQDkg+LtykNh57rHudn324IC9YjKI+Tx9a9NDrvcNaDAOHO89HfrZfwgHbp7Z\r\n87IGDN6T7seT4Tfx6JgDn5QaHraIcIEvAj1PIdA8NDT88toe1fzYjlEeP8iO\r\nFDp/522LrlEofUNOHPNlRnf3OAkClauaodlgfMAkyQ4RZBhWKaD8zqeNkJ7D\r\nCCnu2ANlX3iUg7hbZ9uTE+EkCaQEU+fqoPohcCsMJ510etQNTWFepg3Ek4gg\r\nMjn1/i/N9lvLPj3ZBruXCB0XjETZIKB79TWXsjONyjKPeMJ/VIC0cXBCQJcC\r\nq+o/gycQIq7vZIZ8YLu8lsmJs/gHIKWSEK89zsYFCMW6X4E060dAUfoGZmH+\r\nedmTjw2ss56nbBBhjxVWIW3VROQKOfaRMglNwrVQ1R0yGamPyhhqTLHFbLy7\r\n9KVS5azMDyhG1jpNwRc+CRx4A5nmaQcKfFEaAdyyRerG+twzIwc+KDeHy8OD\r\nVgxbjzPFQOP7vPbrzJv51KN+qwcc69+SHfTExJ4bU6/Dxwdr+/Adz4A+8vs5\r\nl0fkZcer/QmKHkIuajNk4dyu8OJ5PGs99ku14Jpf5WfY47VdkgRCu08s0Sbq\r\nCQ3YgzNYL6hc7ZvCVIWowyXK07IqwumY5VQ=\r\n=2GPy\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.1.3.0.96595.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"2.0.0-dev.1.3.0.96595","@fluidframework/sequence":"2.0.0-dev.1.3.0.96595","@fluidframework/merge-tree":"2.0.0-dev.1.3.0.96595","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"2.0.0-dev.1.3.0.96595"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.6000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.1.3.0.96595","@fluidframework/test-runtime-utils":"2.0.0-dev.1.3.0.96595","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.1.3.0.96595_1664568187196_0.8559733254958253","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.2.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.2.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b74c4ef107afec945693e0d4160e13ab77c531ce","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.2.1.tgz","fileCount":71,"integrity":"sha512-TOq58UXE3B6N4+VxNO0foUgnRKlLG0FXnSwybYyP/xSGMIz96DvD71JUNqzxYaV3XAvs/M4ypoLvBMr4oPrfRA==","signatures":[{"sig":"MEUCIEOd745h0b0IOrK5P7Z2AkVhga6r3Hg/r6T/Eho2bopUAiEA8LrQbpOqKxAwJ9WQTFE0djPsjoBPZpiCxF51N78nA6o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjO3UEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+Gg/+P77sWXskW2b4izMnDe0BovN2G7ILV0fo7uIwR3xsd1BIawiY\r\n3bMnWpziKDnrj3i/DtjJBbzuf449sIyMTYe601Nw2No9OEtZsOBA3/wOxu02\r\nLipvKIQVx8AbWXJu8uUmzQEjSsWdPhFm+NGv3SG152rF62jmqVI5GpxDqspQ\r\nJtglhYtvN6vDLPj5qelLsZn7Wkg7Vp4S0zivIdQIVjoKIlozW3P2UoK7TwmR\r\nCUYd1rXXk/GHIoEoTSy91MLOS+lZ2Eh/L4QCuZrpvQKL0iLKPoVeuiwRS22q\r\nQVp0xKDbMn7ehfLbWvvlYnNy8VfnAWUkqxF3n+oJZzTB3Xo0bvRapafXtH79\r\ngGi3D9dupXRh+t7RWI6ZBZPBkeQJ9yCL6ZuvnODkTQ6N0PdjReCg1nRXY4fH\r\npQnHQ8coQSwjJfdqAs63fWNs9aeXqKUbBppzbM89D78t+fidXQn96PWR3uxO\r\nuio+KPrRzunpNfBGjzeOHYOv9GPEBVyinZQKVnc4uXJQgIdZhCvBY88p54oy\r\nvqWW2eTGLY2fHb+m5LvNMJwNFyQ4/eiAQTxsqskCgcvBGoyEYGgZGT9dcnNI\r\n/7v0j9VloSEx0S1ht3zSmVUlwb2MoLqlNSierQrMABK33aEueNjQJZ5dPrQV\r\nKf4u6Cw6jI79A/wbDwnpXngXPqkiPZTAwks=\r\n=yNZA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.2.1","@fluidframework/sequence":"^2.0.0-internal.1.2.1","@fluidframework/merge-tree":"^2.0.0-internal.1.2.1","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.2.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.2.1","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.2.1","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.2.1_1664840964252_0.8748336396456255","host":"s3://npm-registry-packages"}},"1.3.0-97515":{"name":"@fluidframework/dds-interceptions","version":"1.3.0-97515","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.0-97515","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"79ec848f51f725940c7605c8c635ffeb208026fd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.0-97515.tgz","fileCount":70,"integrity":"sha512-KSd6l1s+Sbrmo69fWNTiqz2/0q+hX8r3kSJwXsk46t4k4BnGGRWwELhZVVaL+uyXCwCArRUH2mQtnanSHEXrWQ==","signatures":[{"sig":"MEUCIA7IXRzl8tqhBZPM1ttgFuLnykaYWUoswIIl4CmA/wK+AiEA/uEqwGWwiC4Q5WqKe5mqer/EKCrPRkgCypHcq9ubYHM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPL2aACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqX8Q/9FrjyUCzUrgc4Sda8xzxIVcA6xucfGOdbKLMpwcWb2I1/wDoj\r\nhhNy6r0eVFHd6O1WplSe+LxYk05ZlQsju9MsyQvjzEzVCqZJl/EFqXQAgQ3l\r\n9DrTE71fdOiB2v55hvyrwDMkIEQyqLfLrsaJH3LurT8Dw6V9LCYzo7sxcBXt\r\n+54ti+mXDdN+3HqJLjHC/twOaOc7x9XHCP82rSoOb40RVkuYE1FdStsXIYqm\r\ngM0el5+7u2QH1XuBHaJ/AfCLQw1kn+NgLzxBVgrIx4Rp2vngaGcUp5AO5YdU\r\nYwuvw1g/l/U7oIEw5vCvHjleRCTYyTZPfEh6KlShNvFIV3QvQh/F0V5CDhjQ\r\nF6DSf4F48qjxy+Tlvsr08wIc0gT1c9v2BLQJ25cAwg+mdttErvGoawHDd5oV\r\ndLu2SWTy/aEliIQDTfZ3C7pDa4kk4p97OxMN90KZb/4bwLngGVjl3DluTgjP\r\n+hFene8CWr6wWN+zQUe6QEOkW/K2kePE2MsVuHcf0y5F9obbFsxkWE/ZWDRi\r\nf6uF85ZHoCb2QZe0aiiq6uE7CUYs27WSRiAAnaNgG2Yq2tWJnz+9kYrDmXMF\r\naaeYibl24ooQS+UeMWIdmITuWW/sZKC4az4fxvkWELue+fh6XQpbxz9mm/9E\r\nDWA8KNRUslVgvxgtAt98U85E+nggtXxLRcs=\r\n=ar9u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.0-97515.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"1.3.0-97515","@fluidframework/sequence":"1.3.0-97515","@fluidframework/merge-tree":"1.3.0-97515","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.3.0-97515"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.3.0-97515","@fluidframework/test-runtime-utils":"1.3.0-97515","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.0-97515_1664925082293_0.45513905326503834","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.2.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.2.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.2.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4b574641d4ddc215ea244f52902919bb1af1c7e2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.2.2.tgz","fileCount":71,"integrity":"sha512-YzS5SSyrOsX+UI8F5sXnozo3bEs6mxGNo9fCh70/BeF52hLKgQSCO4iaY5nbGsZoslDa6b4dlQ3twvc9VGVn7w==","signatures":[{"sig":"MEYCIQCGK3G0bBFrhTjD59mNHm3VqVERTf0e5mefHDg+EK4wgAIhAI3drBCrejtvfTeOvajBGyMxVbDHrTYterFuxHPNLq6q","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPNcMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmou/A/+N5ayYcb1tXwSqdner/N/WPUSA6lvWku3igS2FPZWvODJJbA1\r\nUg9oRBGoUHfuh77e8m6k2z6q6NyfocrhRtdVuUHxijsikxBXU+WsCxHQ/r94\r\ncLTNSjFfaGR3WPdkhCZjmKfR4C8ybQZlXfLRq7P9JgsM0wTmYgLU4O8cQFnj\r\niAEvJZvTMLH4qeifKv0OK+y4++pn+xUQzdsjngwiZ5BVeNYu1+f6Ncj+tdno\r\nmhPNpo+3bRu6ikE9UQYHFrtkdEWrIVSQMpmeHmiKzQun3qkSf6p0as6ACkw6\r\nd9bmUO++wqbKG7mcLwUBfWpaGpCFdS6EFlUzq3n/d/l5nQgji5spRnct1oW+\r\n5+0oSLiWKemlqhXx14un7snCJ9/lkRYewzfwSA0ER3pm37jlp9HtnkxW6cWq\r\nID1/cacrlcKLTmOSfY8/zN1VzFS05/IWgPMGt/JZx4A1/2oQNRxqsBh8UnM5\r\nvS76HYwibSmhCMqYMpRj9jKawdzjugCM2BOM3a1chfNreRVnZ0vKb7ISyPVZ\r\nOKuz0VHYxTyZIByi8JxJRTItzOYhyY1g7h+jxI6wUOuybIwi1G6rc7yBb+EL\r\nyxOyzldeSJ9iSSUf6fTjLlTnmSHE+hGTEwn3rliGFzEraxcrM+hIbGN2Gt6/\r\nWDrZT4PI2wjVZcOLolc3hZK8/+YrljpNj1U=\r\n=b6k7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.2.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.2.2","@fluidframework/sequence":"^2.0.0-internal.1.2.2","@fluidframework/merge-tree":"^2.0.0-internal.1.2.2","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.2.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.2.2","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.2.2","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.2.2_1664931595873_0.12791533843085112","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cd078bb7073b7788ff3d100c5e52c4fe5afc6c12","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.0.tgz","fileCount":71,"integrity":"sha512-SptcAyY/LgDOxqvrkwU7B0N9M6LOjlEJIEDzescPpQMzc4Dq08NfrrvmnJM/GcVs+hPgN79InHuYfJsS3SmqWw==","signatures":[{"sig":"MEYCIQCpKMUwBFo1P9G5X7605vQFDUd6o61mw8ev0Qq5BrS65AIhAN8kXPnxMCp8YYv6JrhvaDiNaQjsheZdh5553T3VP5KF","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjP2FvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoMAg/+JTMWgJnRCJWE1Pby5N0HiqVwNkxfpjywYy8mXmrNVWCWy8Qy\r\nOn0++MwgkZWsnDbA8IDH/QHSUE7cSUEYtT3tIjl/+38bWVXIsVlW0lK9DN2q\r\nThhvDyUqxWNpRGenWE8OXx8dB8KX64y6oiLNSBAssDGV3y8ih5FVWUB0eAjK\r\nPJc5sqDu8TEchftxbnRJzGAr2ZfA2HDWraDt26V2CIdrxGHYNsWTIVP0jQO6\r\nvyilIv7CCSLNwq0YPB1mcZxuImc8tU8mgYOVdYtAJA5aSCtlY73BGaDk/mEn\r\nufalNWMQy6wgiRtw/gQojuAXxKu9oHI5U4BLNDNbjPDcLzwMZS67fFye/ifp\r\nbbZoYOHf8Po5zr9k/bCGtoaYpKbGsHWjcbH5jUOGbi+HNrz+Rwh/r3OCWivF\r\nl2nvWIAuRIoRiltqPAucbUPrFtkGSBHH/s2roZQ+gj4ovD2ynAGYqA0VL1Fp\r\nJK5Pr63S0Wfgrf4FdYSnn84/73lISSUZSfmYbd5u0Nj+f4g/lR6rpJsvOPxR\r\nyd54W2Cv3UpoAVI08qpFcB8Zu6osviYFgiXDZC5vXbuJFA82ngJHrUT/qc1/\r\nd+61WTFUHfs3BM2vrq0MJWAznjcERVij9jXQJ7WZvujrVOpP9GFNuAIjy7M3\r\n7kx73cLjFxqOLwBgBgro16AbRX9izVrXLMo=\r\n=jvL1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.4.0","@fluidframework/sequence":"^2.0.0-internal.1.4.0","@fluidframework/merge-tree":"^2.0.0-internal.1.4.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.4.0","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.4.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.0_1665098094852_0.0028180265358921375","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d1383fd35cd3523245d443befc918e6e65206b39","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.1.tgz","fileCount":71,"integrity":"sha512-8MKh5wpfZ53kI1IWzVi8Jt6ebkloatFhJRmGU6TLsElNUHA6HKEm32tOpfA6ZRn4luHCnbR8wONzuokqVuDXAw==","signatures":[{"sig":"MEUCIQCTfM07VMmMyx9E0LqfWvMS6chJV0+3eARWsuZ4rEnY4AIgFinF9NpO+8Iv6ACX4KDuosrvTPAYytdPQ6JYrnqIIsI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjRIs6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrWkhAApANcaH/G6ZISjpnjgimd5lEtNsw5fOmuxFdO52HLri6iN9aC\r\nRP2WCrjoJHhlt07dg36Wvc1o7S5sUeE3jNy2NqJdKsihHUCKj588fj6i3tw3\r\n1QL5hFzS6n7xUXIK29AWALG5D7Z6UInbuXANFSUycDBfXbXO3Cc7nyp7b8PH\r\nkQkbvdEYPcCWa6Osy3umnoyhn/5HXSkHhR2QX11ceYA8JLTX84PlTsPQbGiQ\r\nv44FWlJYyVmmQfE9+j5hamEWRuQqr8QFk3hMKr5KIkIrIiHvsX3gS508UjuJ\r\n5rYr6YEyYVg9XWyHw461+032TOQ8S40t9BtYtkWERTzW+XDT7EGNSoMP0Ixn\r\nWbbyTWe/kt+4hI7dZ+2IdGwZ/CoG8OU0Tg06f2o4RxNdSNCuWjDezGEH4nne\r\njjqPRw4KIxmcRbPqNVOz1sEIC9B/v6mdgWKCuDY1ccnRcjIDr4JTUZT0N3DM\r\nn6XalLxSkslwkddSXRp1NxUVnm5bkqdf3CClRwDL/0ID9Q7q3Q0lnXtuKe5S\r\nw+Vpa9gWNCa46n6hJsXAQ7rSG8EVZH4wDvmhsVj3HR73q2+Jv7bxSL5ARL21\r\nTPApNdezJ/wH4paVeqw6O6YnSwXKX2zb5lf2hInsxCHUPsCVHHdp8J5RzrHv\r\nk6cOLqUPepXTfXeSdcfJrmw6h/hvX1rGAd8=\r\n=srSh\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.4.1","@fluidframework/sequence":"^2.0.0-internal.1.4.1","@fluidframework/merge-tree":"^2.0.0-internal.1.4.1","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.4.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.4.1","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.4.1","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.1_1665436474041_0.7445596032211075","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.2","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a9d029daa88a052e33440291561700e953f7ab83","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.2.tgz","fileCount":71,"integrity":"sha512-bpvVtxuGoZn0ATWSRaZOQSD0JD+GVw64JRPXI7xETgDsY//utIFh0FPIjvAeEJ5/sO/L853ogrE+AwemsV/WaQ==","signatures":[{"sig":"MEUCIHI7h4KCkwA/Puho3fOBIhLmgfQUsNuiL4c20aElDCDLAiEAyBJ36eXfmdxtxEr9tcFxhbexUdc27aUROr1xRtTazUM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjR1VdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrG4Q//eeDuyUrlrRnzW/pB3iOJVO0PFr/t8UkpJjvIKT59cM17vqr3\r\nNUOUKfPe6M6H5DHW+gnyJRXmjNnonG/w7scbkvJ7w52vJ0Ilv9bn5RvXs9hp\r\n5gMTn9BPBhps17VDTp/PIUQg9qJOYfymCRpcyy0EIs0we3OGFLoGndLBeWXo\r\ngoTK2qwOSft3Jd6zQh/4JjMrmnwBQbmQErGL4KXvhFqukVIzw01b5Vfpc+ms\r\nyO/C5WvnhDIIXGyZPZNtPSAi8puqnzhT+PaAGKn5FBClF0z47y9kXwVTZ1yp\r\nfO/iYXP0GNOZF3KAIs2FEB/MTG1qupN1gsvV7NOIGkl/C4y9ta1XXJ7YJuDW\r\n4vx3G59vGI8tKtWBkIEUGjdKkQ+7DUSbwtlWIEqro1+vgAwpyxDtz50Mig+h\r\nMO5G80/MBvGnk7J8fDgnnlbgdQGv0fnz4yn2m3yiOTk5InhrBWSCCuP0yZOO\r\nmkmB5wC6IB+eWyF3VQb3SB+HCVxEmdHzCWdorEXLNCco85Rr9+c3ZLGrFuw6\r\nfY/SfZG2M9GWXEQ1x9bWn8LUOGLGl1verH+M1dgb7bZbUGfw9t9JHT3pbZIU\r\n5p1S7le1EFqDYLrS/ax9Wrx2+lbqEvLxKYvwN3fKipEYq3FA+jZuiK7BPmSk\r\n9qQ9JmHdM6I1J/x/fdl05UBLnQmrWwG0/5A=\r\n=ejAd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.4.2","@fluidframework/sequence":"^2.0.0-internal.1.4.2","@fluidframework/merge-tree":"^2.0.0-internal.1.4.2","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.4.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.4.2","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.4.2","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.2_1665619292909_0.24841217586191067","host":"s3://npm-registry-packages"}},"1.3.0-100520":{"name":"@fluidframework/dds-interceptions","version":"1.3.0-100520","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.0-100520","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fa32bfae4fb9ed4cb73364436736ab0f4f364925","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.0-100520.tgz","fileCount":70,"integrity":"sha512-QYzJEx99puky4wCvIJP+HYf7kWXf4ONkaxsGbluUSFVjaxBIP8ZKufRRvbD0bmyQdMJUL1otxnJZ1av/AbpuAw==","signatures":[{"sig":"MEUCIEwvNTxGlWEk6zfqotD4PDTxIgBl5yWwA1G5dBhgiOsgAiEA5H8z+e/mYatD01Zqc1J3nNHjihBTFOspbTaf1vdlbL8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjSas6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp0WRAAi3kxGL8teaUh1DW9GsUxsfs9Uw68YoIn3yV988bmHVhR+OnE\r\n4orC+NXxhkD0XADJusynEcqIycmE7QDAroJLt52i7oC37xAX4GhuhySo/5M3\r\ndtOyV+fDwLMPzfLVDBY4RsX/ccqNYe1/PCJkydQGkd4yGt9m+pyQ+cZzNC2e\r\n9roZCF1yuUcimHx55crKt01MMv9V9VF8tgUj1Zg3gWaYuTN1Fi+Ci9whptsN\r\neqxVQFjj98goHCviC2j5ksjW/oZHixgK1xP2fLLbeRgAyIUAYRtgcl+czkWv\r\nhDJUef8ejJT1VOyrogKWIjiuGcAVwXpYPlCQ7o2Wjdu8kDnDKQGtlNJtWvdW\r\nKyQpvqWEPoZL4xe5KtE8jSwGqqJ2NjiIYb0xO4eFMBcLtcUWZHGVMAFcSm7j\r\nslxU25TjnFiKrAqGE6oMBmZNzGP4u4yjUWu5iqdFDhb6/kLzJjfhVjaGZWj0\r\nuEKxtmoohJXHAumxcGq9J0Zu9kEteSCr4MjacszTP7ZGz4FvOK01yYx6s+Dn\r\nctv8CTy39j6Qt5UDJE8HUjv6xprA+ChgPs1OMeItyKN7lvHni4CnGhvare9i\r\nE22VeKAmPUqV3bSvc01PZ0ZXzITiHeYaYFGy/q6+QWyP/iTJrakpFM1xix/p\r\n+LcpfQdCdjE/PhP3Sor3jfiy0hFAuXAp4xo=\r\n=OKb5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.0-100520.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"1.3.0-100520","@fluidframework/sequence":"1.3.0-100520","@fluidframework/merge-tree":"1.3.0-100520","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.3.0-100520"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.3.0-100520","@fluidframework/test-runtime-utils":"1.3.0-100520","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.0-100520_1665772346555_0.5843054671018362","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.0.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"de259d9831e25aaa9ae141e2321d77fd94673b37","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.0.0.tgz","fileCount":71,"integrity":"sha512-HD5p0euF747m55+Su9rhQTmKi47dWyur4m9d+qujW3YVkJr7ou48P+W9ouYrLoCijg/KTt6gLH0LSa/NYRonoA==","signatures":[{"sig":"MEUCIFAe9A5guRLF3LhhdXEhCOP0O1TZBJNDieRNAh3aa0k3AiEAyAhvMjBBTGTmzUhp4iFkcVzyxAS8W1dpmCSpSdH4QlM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146410,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjThU3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpt/Q/9GBzQgaUE8Bp6bRvtOYzMDJxhUIEjwNbqb29QYTw1l/vbRr9+\r\nvSZH6MgatIk9xXdxSqCS3ChkMrtPFnqsdtm+2+13T3I9UB9xDp2bmP6m54/o\r\nPutD+0zJNWARG6o0NV8+WyMjmwnzXBI59kV5/fH368Lp8phLYmwjOA+JAIkp\r\n7P/plE3vzI95AFBZq+Mnlx0nWiDMQGKT+ZudreYuXbC2wwbOS4/A4MAj6wyd\r\n80xn2hCIrQYbYVv36+c50CJCDjACh1x4MBtnwq4BbGFX6EMs0N6OoSgWprhB\r\nhTGVOAwBENvggVWu3FmLn5DOmr+hk/K/dWuK4Oj45FsRleGW1cp3CMcsfJp/\r\noGQ4kHCeiISlbX1Fig6YD6XKiS8BVXxWzjycGTqhWsugum2nCp+3ehQMYaJ3\r\nzwDL9uXqB+hf/SN/tBWKyYppBrQfknrpr41GWS//aSbkG59R7RebKRKD9Ta0\r\nOlQdWmYzZfeEzn6Ja/Txyic0bLeknQmu5WKs8ih1iOABS+PPaI6ZNPh6Jw8s\r\nMGh6eljho3gPnizUswJcDsWQLcmSj1OOSI/0B9H3x/aeDJ73jZBlIbtQeAJn\r\nx+ZqHdE4igNdDpas3u0kX7MOIjdcwl0fNbjm9prS6fg85z9COPodIr7GOjYR\r\ncwHEaI2MBoz70AhboHfSq4MJMV6MrObpz+Y=\r\n=qeOn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.2.0.0","@fluidframework/sequence":"^2.0.0-internal.2.0.0","@fluidframework/merge-tree":"^2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.6000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":"^2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@>=2.0.0-internal.1.4.0 <2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.0.0_1666061623585_0.05115445247941475","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.3","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6de90056759df899fa17cb7e0b1f83771a459723","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.3.tgz","fileCount":71,"integrity":"sha512-inV6pmrsRbV85v0kHByaODIdBDiQz9UEnvZ6BqFlVbLrLXgQKuFYd1+nF8a/j2YFYVd+2UAtfusWmKst4w5YxQ==","signatures":[{"sig":"MEQCICo96KQWMPkt/NpsEGXRh14xA0eMEdl6aVNhe0jDCwDbAiB1uhUcoT++rNzLuL3w1kqZuobGlm0X9y31k7B2kXmbUA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTytWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqM3w/9GY0cXLWcAKGLS/bT0ONSFNLD82KoUgZgPpAx8jGxRrEavnsi\r\nAxc74ZgqRIaHTg0zjVo+7FKX8FotnIqHYofe4Ym+OCRxx/Z4RQP/sFwud7JZ\r\ntPpYu9lSJdSvIDokOh6p0dFlUurbC2VxLtrzpNcLIrzK55rqtDLTZF2TuffS\r\nXr+YSyybWtfGWyT4o38hzpUJA5yfCAoONmR6ZjcVdVOi8n1IWmzpH86lUeFG\r\nkvbHU3CgVr8r1BeR0ZXQiy/HJGzzqTWt6+4NF/AATn0SwHK+zgFtJLMhSG8+\r\n18EOMe6HVx/YEcjJiVpX9bi91OvnDvkox/HH5qhccrbXNuz4DcFpJDbMCdYb\r\nPHgNuxUu+oaTch8JbwoAOp6u5DbBAKfOBu1J8XLXTjUKlFJZMExLXyG2YJ2j\r\nPfxU+5l+OJGZdLz7bGwNFMfHCIhoN0RDvCn/UQhxsdt4R4P+AyTPeIxebR1X\r\nh6CX4WBvqyPWBrKoVlKB/XwvSemwsMq63AGmrnDXfmR5bjWBJcRIG42ATAv4\r\n8QEGxz3FjMAQdGIMtfMYVgd/xsO6WuCc/X1Asv3IzEs0dZEGojrzVvqgGXZR\r\noNb21RE3l7fMre6BtnNzYWtkkHNiey/h1CHbphaerNRgywI9RO4kOnnnouaZ\r\n8tokkyMXGzMF+f9o1gWcYJ4uru5xA8WOpdU=\r\n=ES/u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.1.4.3","@fluidframework/sequence":"^2.0.0-internal.1.4.3","@fluidframework/merge-tree":"^2.0.0-internal.1.4.3","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"^2.0.0-internal.1.4.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.1.4.3","@fluidframework/test-runtime-utils":"^2.0.0-internal.1.4.3","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.3_1666132822644_0.037666603940267995","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@fluidframework/dds-interceptions","version":"1.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.0","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1c8582e97f6cd47b9ba91d5c1625f227fb9faf82","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.0.tgz","fileCount":70,"integrity":"sha512-ITv6LgsvfDCYc7h5Jt9Uh0PxQSLJBM5sUc2CN+EM/GAxFxdalR/EFCOFOOfuei+vFfxWkzl5Q8adJbiGy24Yvw==","signatures":[{"sig":"MEQCICVPMAE2PAzclYFOR554g4wxRrTpTlimPqikyRFwPE0HAiAuhMZVApqULnOUD9uSQP80oIUGNBfcpI7tJkvcoMnbmg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUCAvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqObg//SXtLoI12NuXVLAGNwIQ1cO+h/JBoC1R4TxH+DADJ2pHxG0m1\r\noiMttNhLKkFRJyRXqy8+JKIN3VJIla3X+PcJJRZYQ2wdUot9sEINK3APlBCZ\r\nkAKzGoB2OM6z1z/O4UkbPa9IG7AxXtwuOACnRrHX8+Ib7I4IZta6erxFykzd\r\n/RqeF0WVTGqF+NvjwfCebzImEJzU9sbyyc/t4nbKiv/7jP46f7yz5wpJw0+w\r\naOye3FFnsrcrmVlwwa4mz8Eym9Tco8loqfCv/awpPStjSUXc4e/4DmY+HnmN\r\n2bllMv//nWV3uWR7OxE7R6oDxIqIyNVVPVelqeZ6TRZ+b0Tb2nGlLaVsoAnV\r\nw2LLW5o9EoWfiAYO08JzrGdMgOj3pfTowI8n6HBYjdUzUwLr288vZSa234J0\r\nVXnDnIYMHRkC+qaTYVjJdXC75RMfNmHsx6wFlmFkGkLDpOtEsALH6Lyfumwj\r\nI6UverYlMaICogiCgNepu5AF3NFzh7ezl0okbhWnVMnOINIvrVw/7dtnN+1b\r\no628hCaUZnWK3lS4U0uR6sCSf6jjjMqk9dYUN1zUpBeu5pnZoi/yJlIe6Ak0\r\nFBnUvPGLn8tLhTDUsi3Z0HRNm+j+dEtE6W4USW3uKVuRt6UUTJFzyQ/zE4v0\r\nuQeUQ899HQKtgCuQf+/5ulfpjsMtqmQXj6c=\r\n=oR21\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":"^1.3.0","@fluidframework/sequence":"^1.3.0","@fluidframework/merge-tree":"^1.3.0","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.3.0"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.0","@fluidframework/test-runtime-utils":"^1.3.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.0_1666195503815_0.02468050492870355","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.4","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"842cb97edac0b0b1666b4de76e837c6e75291948","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.4.tgz","fileCount":71,"integrity":"sha512-wlf0nv3qrpyRjbPEqApPlIs9xDzaXLq3U7aodNr3Dk0UgZ5PyepqsaF4187HnBg2rdet0RRMh/UlIt7O1huB1g==","signatures":[{"sig":"MEUCIQCrL+/BoDkPmWKXETd7ErZPl/VSwgClEgymGEdBDOZeSgIgQ5FyQh4AkQUkrbAoiSm2kWV9A7F4/7Tjqpp5fbNk0PA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUO32ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrb0Q//Wq1JDhpzAgnf60XpV6OqYnawgEpfVkjnSI0VyJ63Z0PsAywO\r\nX9kAEKO4FrA09qeo/pznM+sSWfTqB2mXt9q/A+ghL60bs+0fkbnWdOgHFxet\r\nJ+shVObV2xOp0bXRuMDxmCf9tIGhn1Rv8D9FwZd3UsASb7pIxeVpeq6NTYoj\r\n134HSNaeAc+NGmacgLAJ9E5r7dphru3EdqF0s0NroN0qg4HDo4upZQVKle1m\r\nnaiBZgO8HLETEvQTfWEUWtPTd7J7+lrUUDLOvyJw5I2FqO7A/ZLDaf8AZY4x\r\nQpuisxllhEdTF+jWlITU9p90/CLJqs0VvF/LdYbuPweBGaGyAVzhze1mP25W\r\naFvxJLVfX+YUhrBCV1ra/F3cDnvDL9V5YdTPlrirWl43vXjipX7L8HnUeMZn\r\nLTeunjCpPlwt9Uz8FVJnpYJ/sJWfMLILZlhK01sWETFjHjNNLq+kU7XJ+gEU\r\neOT9faEo07YiquQ8nF81jc1BPWqfW95BkgzNv9NDaBj5Enp0NN4NWCpw+J22\r\n1mUnvgQI8e+gkji6uoy1kDDVOUNFfTc9DOKJA4RQQtlN+z9uesBLDFvym10Q\r\nfjfKVEiTFYX1zYQdcEthL5rZ/1c+EODusYYJIjjXNH4Pu4XJuU7wOk3gKIMH\r\nThCmMedA15/30r5tmDj8wkXWek04NR+w0+Y=\r\n=43sN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.1.4.4 <2.0.0-internal.2.0.0","@fluidframework/sequence":">=2.0.0-internal.1.4.4 <2.0.0-internal.2.0.0","@fluidframework/merge-tree":">=2.0.0-internal.1.4.4 <2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.1.4.4 <2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.1.4.4 <2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.1.4.4 <2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.4_1666248182205_0.2519006178632206","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.0.1","maintainers":[{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cda0de697f2b7e043426792f82f3640789d1acb8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.0.1.tgz","fileCount":71,"integrity":"sha512-PL0LWgj/L8gVExhdpNLnlqFOhNNnEO2wJbfuv5JUVu5ps6R6go/uX41h0/CwF82OAqAiwM+C30zDsa3Ywj9gqA==","signatures":[{"sig":"MEUCIGi/WyuBbIYeY3kZcLCuamKmqJKrrT/dGNDRAcGAFjvwAiEApVRKp15T35TZ1VXhbDP+E6zSl0c5dw+yM+6E3ctt+F8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146538,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUZ6jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmohfw//TBLBHg375z4BhLakjPrJaMgj9pWRyh2/4ihA+IvRlQgFJaLw\r\n16z7FVD8DXCI5bEtaq0nYrswkTgBhcwjbI/CUbFNa13/hkA49O7udpi2uwiN\r\nTd1UbuNkCRYeoOeZBdUmVhRNE1n6TjRdaROj/PIcDC9RPh70bJexUVya65h/\r\ng1CAlF5xvNffQWHjfsJWtI0NgfpMMYNWuPZ1s1EY6g9gBsDM201Emnwwg1NC\r\n4q0HY8MGa4z854+LaSEE/qfjQCATpc6MQJC9N0zcwYQ8z3BH7Mpsb/qWe555\r\n/JxwcxHAZWVkpFdyclWn2EnHGr4R+1HzUapRJME7JylCufSEoA6vRWn7S1T/\r\nEhT5+6jZpn5THgZmwzy5xnoYSXFRtrXVqXXLY7cMqyoC96C7lSSANIIAJu5x\r\nmVTkarHd5mbiIXM5IL6bld8/vlKr2S2gPz/AudkPZtnTL22MozfpivLaYnUH\r\niciEsxGG0Q+iNlJ8yVtpdRhk1ro/Zoq4kWS3vLDICkRUrBbApfjP2B6Kl8gx\r\nZu1d8ydj4Y5JsRPYN2sY6aoO8K4KfkncQoknO8RMeaLym71/a01L30Didrkn\r\n36AHlV3A26NHCcx/qiUHEtccd9HkjR108dkrdZ4ZYf7hpsJHowY1yKc4X1Pb\r\nffJ8IjaUOpezgZWNUlx8oMuGUoeepnVhsYM=\r\n=XO/i\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"curtisman","email":"curtism@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.0.1 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.0.1 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.0.1 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.0.1 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.0.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.6000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.0.1 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.0.1 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.0.1_1666293411524_0.9481629741732209","host":"s3://npm-registry-packages"}},"2.0.0-dev.1.4.5.105745":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.1.4.5.105745","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.1.4.5.105745","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e43efcf5bfa4cce72bbb87aecc9c11a8a2ab545a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.1.4.5.105745.tgz","fileCount":71,"integrity":"sha512-4rfyoWyFuAbOA6Dqo5oK3+Y7K/SO5vKkf1sjRnkZVBtXYmedsTdV8l9EBKqC3AvDdd+h3eUDrMpSSviBVcZN4A==","signatures":[{"sig":"MEYCIQCg0CGHK4zmhmfGuBgUnDOdyEa/q7y7PEX9VWV1FGVoogIhAOGSxDLhaPYaSXR3XMDaW65QuT7/SpDIXWJWkZ/JnVdb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146394,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYsm+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr0yg//fX5F6o5PrcdL2yqxXJ5lcUgnggYZu5yeFhH+hc2CrEAL6Jvg\r\n5AByYZ2/LHG8kB3haNQjnYxnwtMVhLyY2lE5Mj+Zhyszau7KHeCkORvhQvYC\r\nVw8C3IbBPtVpK2NRVkfJ0ST8Cts1er5woevHGmRtYDvyI2Bfo490gyI/s9pL\r\njNaOguwFtAS5/LFzavZbOtDtjXb3o3WoelY/OyIvPsUt9+P8j6l4HBj/Amlm\r\njzPt0phz5HbsM78Fk+URYbCH7y//fz859dU/vvru1JrfH3foib4zB+ToTPxB\r\n65A7Jnwyp0/BpTSWQ0ie9sKfeABdFeuuBduZXFoYFUP0oHuaVKC/+wTUE4HU\r\nMUnyUDsPYaADFPOGjIs1hxvI8V8srvOaKVgOm/CzWqdJWN0AH1NaVyUNai0d\r\nD77Twgi0seHhjJSWZwTn6MX/i0Ox+T34OVcOKi6sKsEr1ibUqINO1BCK/6Km\r\nZlAIZAveu0U3SLrn99N3WXfNmfbQYadNJ3DtVU+yWc0+7WfcrgPDDYn/lsGC\r\nM6qc9A5ukEsd5zWTb39WlioTJ6pp8wqITb6WsYMPI9Y5w5473TM81bkrdBa6\r\n7Z6hlbyB9Te3cmPxmm5GxP2ld0+w3A1mrg6BTOa9JCMl2im7TxKfXG2d5Dr6\r\nkwoJfdBvDHqUTc9bjaEkA53r4slH5oPtDGs=\r\n=vPnu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.1.4.5.105745.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.0","dependencies":{"@fluidframework/map":"2.0.0-dev.1.4.5.105745","@fluidframework/sequence":"2.0.0-dev.1.4.5.105745","@fluidframework/merge-tree":"2.0.0-dev.1.4.5.105745","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"2.0.0-dev.1.4.5.105745"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.1.4.5.105745","@fluidframework/test-runtime-utils":"2.0.0-dev.1.4.5.105745","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.1.4.5.105745_1667418558733_0.04781999794760483","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2b8fa4774b4830b6a3e2bc30b633f56ca8db8320","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.5.tgz","fileCount":71,"integrity":"sha512-1YrEdxfbO4sKVaLRXi9q8Ea57fmUhRYey4DI5w/FtzoGOkfZHBFdwiTLV8TtOQGPVeQ2WEOd0gcJtnD2Cm/eoA==","signatures":[{"sig":"MEYCIQCPsUBDyK9aieVZgodQ5+xdDWyzOIvrj2dPNTqOW1ef1gIhAIeoElhOsijDHUfYNKq4qHNOstHwWJmbEvu3n0kHMY2s","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZBVpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqe3hAAi1SEIf2qnPJ5R927dk91QibnKdfld6sZFyxOKQ0FW5Xv0TH4\r\nmFbcqnjhi8p0OuUd2DKiVfkjNM4ARj/a+MTuR30Hv6+NccSBnk/BXBu+Z8+m\r\n3Uyga+ReKerFaVSNiqEuf3Nl71IOkYn+7W8Z09PV/LxMWbnv8hSFFwq3SJyR\r\nqTVw94h3JX8R1gDotzW9F4VYZn+NfPTxevKWQ/iFHyxq2FLOl/C9w3o24l+D\r\n/z9iouEdb352F7k2iNXtmwO+UJk/pdjJk5umfhpy9xkEuT6xkKssNFJUL2On\r\nvUNIhXQR8djYCQ96muYrFlTMiWcJ0VhM24XNmG5Jky9P2ytlZTW/Res6Cwfu\r\nTuKeH8m8HKwf8ALMN2NT3CwbrDPWzuQqvOqCVekH4NLbyCy/OYF4ayla32Ny\r\nudwxyhGNixV95wIC0VTDuuuGzuGvlfvDw0iE1eqOLCnza2pocds51WC24HIa\r\nd1Qz0u5DzmfFzpCO8RRhNMgODf9Fcjqp8hwqVOPKzHDJGgo2croppfDXVdjJ\r\n9yVFIcNvWN8/nvFIsUaYxjyULmVdADKvxSHk6gCUfUhkZsLdnO5By1nKsOky\r\nPt/Sr2rk7e5LILEtUQmK9osPEcrU5NcH6J+Zn5lrNQcQBhgdjN4VHMpQigWR\r\nGjyld1nkOkOFfEr9FiTI42InfL6lqHEr9AU=\r\n=bZfg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.1.4.5 <2.0.0-internal.2.0.0","@fluidframework/sequence":">=2.0.0-internal.1.4.5 <2.0.0-internal.2.0.0","@fluidframework/merge-tree":">=2.0.0-internal.1.4.5 <2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.1.4.5 <2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.1.4.5 <2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.1.4.5 <2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.5_1667503465388_0.028861602630483096","host":"s3://npm-registry-packages"}},"2.0.0-dev.1.4.6.106135":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.1.4.6.106135","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.1.4.6.106135","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2b64854567fb9d66f9a582de2e8190167a17b332","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.1.4.6.106135.tgz","fileCount":71,"integrity":"sha512-o+qH6hwo6uosf/g3M/iE6QHOAH2Jo4iYwSUeV72Gg+1OuRERcMxjqoyjYxG/NdhOVKFKyoYupV+LHbL5w4mdtw==","signatures":[{"sig":"MEUCIQCxDL8ubDlCKXqPLzwqTTsw36muq+iuWVzoiEGRSaB9vAIgTD+y25VN+S7AJkjLywylAD1qIf9EtD0sEr6x7ORQWw4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146394,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZDj6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkGg//XXI94jiBtl7Ni8nlDg7MhZEg95267J1sV6Au/YD5kzdWf+xD\r\n4JWsLx6Onxf7cr98ZjkmDLiCia9J9JEpq7DiaE5JrXCNWVvi5FUmIWdUgkqc\r\nSJkvXtOZi+8KORnFbSWn/8rw+Z7k9zqcc5JvWIklG46rPJfPMtkAswHXoZ5f\r\nL0YtBfbXSHAvRDTRgv8kywPs5JGFWLiVrX1GINtpnjiSqimiW1WF125LEsNa\r\nJadbz5U6zCwdW6s6Iv/KQQ0sw0lhqP5q4Ll1oS1nLv4AEOdqWODehK0biZNd\r\ncxu86MZh8R86ie1ndfHdUE0/EbW+N+B1sVevLWLsVnJVY7w0xGnV+BsGsLg6\r\nZtDNF9lwD8a3u6PjL9utVTvtBBHMJp9+XPYrlinoB8zWnswqYjP9AOxpiXG4\r\nY7GF92jtYkI8ymCqCVLEraVOzC573KvKMw5fjzm8PyO3atShIem4BfTQd6mJ\r\nK/9Jco0AP6Ux5fj4rAlpiP7u3/BK0Werv8vGMhJdfBTPR27G/JSceBMvGdDY\r\nHRTsUl6QvbXxc/X4gz4xC0BgCudgfTGFnU0N1OPkLXo4pACo4S0hDlvsIJfn\r\n9hYAsaqf29MOcaXHfXk7NlfQ8gTmhOzIMj7OnlA6l96E1XgCO565WWSFrv8P\r\nuBlhyQWlIYnKheQADpewY8H0ErP62Hb3ST8=\r\n=bBYL\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.1.4.6.106135.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.0","dependencies":{"@fluidframework/map":"2.0.0-dev.1.4.6.106135","@fluidframework/sequence":"2.0.0-dev.1.4.6.106135","@fluidframework/merge-tree":"2.0.0-dev.1.4.6.106135","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":"2.0.0-dev.1.4.6.106135"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.1.4.6.106135","@fluidframework/test-runtime-utils":"2.0.0-dev.1.4.6.106135","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.1.4.6.106135_1667512569904_0.43245792490544477","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.6":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a0251cb6e177b35a2e5d411fa115743a353e2453","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.6.tgz","fileCount":71,"integrity":"sha512-9/kcSwVNQHfNJixaloemtbr0yKoqMWLRSvNzKa2I4Nak9DkEsEdeF+HHUfY5n2Lf+LFVjQrFFJxxWly3Z+EIyQ==","signatures":[{"sig":"MEYCIQCJCBp9LIgC/RQmrUKkpFPozgVADYYKwk7j3zmuoClveQIhAKChqpH8VeN5utfM+4WjhOaUCUnruYWW8nWgG4OBPbSb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZEMsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqDxAAj1XH+VGG75vmcjgNp+s3aZYzQHn734Iicrm4ktBkqm03a7DG\r\n7+wmMy5QxtButqQHY98qPIPrbVZFJYaH+EAvatVHkDe8g6yksmleOWMjlyZE\r\niYolam8+D3lSPtMiiD2poqgkPs4xnz+DduiP2/NPemJ66yQObXlMscZs8zQC\r\nmhoHEyEVeh97C2JJ5yYRCGCP5+2m34rkLS0J8W1zDkX+Wf976UCkuRxWIN23\r\nIeeTNPcvCW0axFFiwR3EwdKHy85zmc+Rq8L4ug1rTTEjdCrtgMLA4cj2cprN\r\ny5z+VlSGGXsFpb5Z09uzzkpxwkKFKu9EvHGOlXHg9UqKa3TRtF7XY5F618zN\r\nLEvB8W8yzWfyi4A4aivp8rObC4U5ODvCoTIyMON5glhXEcuqOmbRzJMu1hNt\r\n42ULhAkc4Q01ecFYTHfusaleZeVqLogJHZnZM8DIJg9pTjuxk8uCmjirIre2\r\n+h45J6MgBaCX2aLQiMpgEnPoGEHXcaWnWr9qbfALv7ICHPod+RKD4wzFXH2U\r\n2ztsnsooNsAqePbxy+B1wQrx5bW4Umcx5GLSNLxmePx4eSZ5t8oGLFNWK6JZ\r\nELsGhll9dHU/IyCv/YpgSgSyVpiI/Ygax5ntontxRSD9Oiu5wZjHo0G9miDF\r\nx8H97lD3JfzgSxGhMUNiyfHTeZtOPWOorzs=\r\n=kp/i\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.1.4.6 <2.0.0-internal.2.0.0","@fluidframework/sequence":">=2.0.0-internal.1.4.6 <2.0.0-internal.2.0.0","@fluidframework/merge-tree":">=2.0.0-internal.1.4.6 <2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.1.4.6 <2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.1.4.6 <2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.1.4.6 <2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.6_1667515179812_0.08988884056437008","host":"s3://npm-registry-packages"}},"1.4.0-106438":{"name":"@fluidframework/dds-interceptions","version":"1.4.0-106438","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.4.0-106438","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8d66955d6a3e6fff130536e47022c19385307e85","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.4.0-106438.tgz","fileCount":70,"integrity":"sha512-7lWJu5cgydwV0ixV1rsT7cAAkZlkuxyxjCfSvoX6qWlDMJYKpU1+TNfl9bQdXyV1siIgfjVf8d+Sx253+QImhw==","signatures":[{"sig":"MEUCIQCQbhMlVBEjqbWmPiFlMh0vxo2ARAxQUueCHg4x5fDC3AIgBsPRDZPr3yWCRZxSBKivs/Q/zw9na0cu4ANOi/mZQ6c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZYvKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqJJg/5AEZBEtxn6rnveBCoxN/knJ1VsJ4qLCk1rzZzNk3vA+KrI5l2\r\nNy+GJNFgfv6xP1UV6KJPDBOYjFCRq4u9hURaVAKnySY0OHNuj0BkfA2Pa0hd\r\nHS7QKCXIaB4CwX73Gg8sGPAafLTCX9Wrx2yktHfPHGCxnXyJgSCqzcfcNN7U\r\nKVgJLhz2o8ojXWRfkcEP+ytZAyzJUtkRXCFNvt809INA6NAw7L3+78QkU+9v\r\nYVQ0pAsMz5zWgGyLkkCjZvAqbLsqJQhqgODYPMfFvij9x9Gbgb5f9+GlJsaw\r\nCWcM3CxVscZ5SfSF3lk05WiXu09nJr+WZiCeznkNi4TJmqpN4EQfwtIh7dFB\r\n1Uxf9d3Udv5xQU1N1Ajl0N/H1tr/M7o4cCPt5FIXyJ6cZoFXtxk5SzCvC2hC\r\n3DMht6BFnoArUf7XfJAR2D27dpBJiQM3+QwDkuG7B1Wz8WKJkyrbkHB1z35/\r\nK9js++8UUxLSrW+HEu9QMiYFFeg4QvhsdtoHKDm96jp2U3Ov4A3JASbe5WiG\r\nYPzbvBz+X3BzIMeV8TA+ywDdFKo4RrANGXLJlroio02KkAHlEG4Ad//Mo5BW\r\nZhqjFtTXRAefjwdIkv9mT971kLhjTaf30FvgYz01YmJfkwBrgJBtYnVuUoJB\r\n867FxpCTn1o8yfUWBkI1DuuG4SMxZRghJHE=\r\n=DvV1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.4.0-106438.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":"1.4.0-106438","@fluidframework/sequence":"1.4.0-106438","@fluidframework/merge-tree":"1.4.0-106438","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.4.0-106438"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.4.0-106438","@fluidframework/test-runtime-utils":"1.4.0-106438","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.4.0-106438_1667599306037_0.7462114296075271","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e59ac130a899ad5fa0903df7d6a9ab2238debd08","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.0.2.tgz","fileCount":71,"integrity":"sha512-VQay2QJ53tnO2Q0+Xcg3ptcAn2CBe8goc+R/PNopeF2XEPffLl72/Kd/5o6n69GAKidAPooc8Dsaw1KAsZNBcQ==","signatures":[{"sig":"MEQCIHMca6736UFZKaDhjiMU/AVOfFYzLvTAPMg8UPgV+LEXAiACZLLLjCkf8hcCR6e/0B8gnnM0ZPEJxn0m07OD+WD+5A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146539,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZZlgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoM/A//due/lpn6mUAE6ddiUlK3olc6tkBiKhawiJ2HRP9DCaF84YLu\r\n7D8RQTmDhP35rV+4pVq56oKXZU9A6As9369+zey6WGGjiN7Ff11r5IY7hdCo\r\ngUBJTeIF6wKVrEB6E4GuOCklSuWWPHfNE6pXzLKtbeVZT2v33XrkVcWw6H4b\r\nb139c9MmvlBNA7V+duJciIKa+ubS8HqWaXXMJS5rFhSiqo/UFMt3UcF1iLHl\r\nK/gO0vlYTtCJ+KQti54VZuWEZUcKcgKYssFs8ov7gLa9yMhVlxHf/cW1Cabp\r\nR+FLReachQ2oZXB2GiCt+3Syk/vQQSOCdwVWJQWEMpzj67T00JXEz21o1UOo\r\nRrn0cK8s13vF8dtKGgfHFKe1cf5qjaMYBfB8guPka8vHSCvGfCBq3201JkIz\r\nnQiNVizzm2ziuxL35XEGYticIqucE8GrrT9F2hAFAObWY7jZRICXXy2JBLfX\r\n5cEKgapRMntzWHrvyLtjQ7A0gmlXReVSvJC5COGD/6Tr/0IbDI46TtXnju7L\r\nWcxHFoIyPym9PlRDZTXtHV70eJCHTbEkab8T9heIJORk0+vuURmLhU1k5oIi\r\n3JTyZr5P+bdEEms6kvlSBEupR5FucKmpN9hcfY0x3FEXbe6fYAtObKLgLRXN\r\naZ6jIYn2C9xJGNsOmjDR8wgc0ZRp1EycSZM=\r\n=zYFB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.0.2 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.0.2 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.0.2 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.0.2 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.0.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.6000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.0.2 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.0.2 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.0.2_1667602784375_0.9912390397549928","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d54f044d6c471889e22de87d21475371e39c2ecc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.0.3.tgz","fileCount":71,"integrity":"sha512-AL2+sQESn8sNcjWCnHXQnIPUVBQ9qWM4QFWsExzI3DUYIl8h+j8AmWrYHLiwJtMosrxSycM7JOTXqJEvYoNpFw==","signatures":[{"sig":"MEUCIQD6fAxHAGfLeX6D6Zl+iMyCoBfQ8sM6JM8Y6qUqTvCLZQIgDGMxvS6gT2+mKALDy85mSC9xq9+G/0DqTcDG5DPTRPw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146539,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbUeXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmompw//ZTEL3AtqDobibg2k5lX0RZyfs5u9AkjsIuhj0YFMCdqMR75R\r\nG/pxnJ9Vv+cjKTbw7yKLOLT7m3mIgDEx8Ulw0+COSjbUVKFBw34Zl35AhZjn\r\nBAF85jsO0Epoc4rshT6StuGNelf62XAwbPaqii2ebvXJ4vuc+2wgtW+oANP+\r\nt+5q00oRJHCc0+8dRQjZx1/ckry8hx+Y7UdKOVPmnznIxB6+Cr0e8cg2tYsd\r\n7lBXu4xKrqQpawyyABdfra9Y9xum9k96gIpSCOt0s33O4naut4pOjndQow4v\r\nnk0z5sZdM5QDKe4U/bZc4udG69NH4l1h9rjwoVozCOH7tp7N6g4DfYhjYIP8\r\nATmwYGiQ58b+jgWLmvDWJtxAT96bZv8qEac/xXAnil2JD4KcmzxfY90qNvqn\r\nrFHve70dSITPAlmt5WF9nppqUMlMfvvFPAs5JP/mxdJJiQoTIYKPZkvbz1Fx\r\nVDyVs6R4afPKO2DdlnQkvFIHp5vKwWExUOlRjTRxq6Q1H1nRpnSZAtWQOxPS\r\nKs8PkMmBJsz0qS7bFfWU41nb5FGTumbjHY67o/UEk/OnA98TdJc6yhlUUWqQ\r\nKLmOHKLwS2isumiq1Mz0mV61GBWc2uon50BBeAsoYckaQ9BzsUSEM/2CQsQM\r\n7qbPq5pdk2umXqvct+3OgRXz2Q4pzEt2QcE=\r\n=yt5y\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.0.3 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.0.3 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.0.3 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.0.3 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.0.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.6000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.0.3 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.0.3 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.0.3_1668106134963_0.9359279429957581","host":"s3://npm-registry-packages"}},"1.4.0-108057":{"name":"@fluidframework/dds-interceptions","version":"1.4.0-108057","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.4.0-108057","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0f371980cf2ccbca62c814f02e456832835abd92","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.4.0-108057.tgz","fileCount":70,"integrity":"sha512-KISUJD7GpNJvR/p4/VQkFXPYxtKbo8S0eHulQAZReth1IeqBVj6ZBlY59SIZo6QYuoE50VqEz7V42LpGMR3JKw==","signatures":[{"sig":"MEQCIBmWMaqVwdB/Hr06BHziKNfk4vwRskU3Z/TBIT+BfMRlAiB2K6zSTvWfsybJw/mTDN6At9n60bodgn0OjsEQOATTHQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbdDgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcZQ/+KNNG8pU9TZ9WR/PYVljd1xJxjoDHfiZB7haK5VDsyvPMpo/L\r\nbQk8lPFbHXFgWaBiXzi4touqgajTv/WDF7oZe5i6fDSUK6YtafL66ESz8kaC\r\n42/depHNeHQlNIiENE1OjKvz0vQZqMI15beI25QVA1l2n67ULz7SrMVwxYN3\r\nlqwWJcY92TXSYOU/bKIfmRcDJbG4drj5FmFWcqh6dusq2+I1m/Gk004a6fuD\r\n7+k3zp1212iEdWkxBt3MjNWyZf6kR8QWUEpo+pv0y0xbcUEz5zhSN317/6Dr\r\n2+XZZSda/mTComDsDKstusljcyzYTzP9YA3lylHOQ+9clOrETPa2Wmah+Svo\r\ndtr4bl39PHb13DG19hgTSAycycQu4kfLkulklPmFOriObiPVEBkSlzH44ej1\r\ncICdkmbB1TUjD4WftR/QbnGZO2PW7PBpwA/j3hRgO6emi5HyAVvnx76RaNXi\r\n/l7sBAcTCLVBs4pedIFWKQ3JBa4Dw078CrR0h5O3KF7jfnllcAzgARIQaUed\r\n+tfNYRJhEbo+5xSdNsEejHngKSG0oj0zaHnzRUYhq6ov6v88QwMRmD64+4XT\r\nJ1/3e8zxluzYo01jxlfviMVDLguF+XPOb7pJ3NfIev7fs0FyOxj1VgHIUBHW\r\nrvuiu5cfmxqZcPGs09bNdTRwTdrkT1m+LKA=\r\n=cEGN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.4.0-108057.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":"1.4.0-108057","@fluidframework/sequence":"1.4.0-108057","@fluidframework/merge-tree":"1.4.0-108057","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.4.0-108057"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.4.0-108057","@fluidframework/test-runtime-utils":"1.4.0-108057","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.4.0-108057_1668141280064_0.16931036185010906","host":"s3://npm-registry-packages"}},"1.3.1":{"name":"@fluidframework/dds-interceptions","version":"1.3.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8d2e917e8633a0c4f9ceaed88ca9714d40a73333","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.1.tgz","fileCount":70,"integrity":"sha512-fMvRnQSqIEFsyU3RRZW542nu6nic4suOJ9NNaobUIIiz+Xfy8qTlLGpC/e4nLxPLvxFuympg5ZJY2QdEHrQYAw==","signatures":[{"sig":"MEQCIDuwsR3GQxICaccxyh6zSZCufQjjK537jATCjb2Uxm7qAiAx3nsAaDMOxgdKpuM6kWKddlOhBrd4bobkl0rNR/cWwg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbrH5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMMBAAk5w7FEbRn7rQlLWs6LJs1X/G9111ocDrjzdX2zI7HChJM+kP\r\nUvkmAMobhEZAo1MepE1qz6bSoEcJOfO2MNoOHhepv8mUwypsg5v63RQV96TV\r\nhiv0wHeP5OExtIMFMQoYk6UiLcRuqd0fGze7ryEYHLEsKUc3AZO1Qv/TXWMx\r\njNha8sOXPDP/AoJ2QeAE9XCa3dfnB4fc7RR2HrZqyBXNtchX8uvBBEWtQu+6\r\n741g8zc9W21E4cDS2H7jFXwOr4r1m1JWjHFTKp54YLvFcWXXw5cbrPl7Obgt\r\nAUa/OJPfOPfZRVTES8Q3hld1Et9i1oC5zFLrZUvZX/frSoAoZWn0v88AFExg\r\n6yRXK2heFRs0Bi1ipsWJOfgSYsLBGYo10GmrPg+EX7ONkwZxltu6y+jKSt5/\r\nt2xw1VoDGEL7KaevYAdGoyoAPg7U15WhU6nb4P7+lmVSaBo476m494jeg3xS\r\nFOJOssyqGsUdej4xCer9L0SkK5fsQzWnpfCX/Bqcnm4QtLFk2+oPtyrpv9w1\r\nFodPx9jN6zoNNB4V1FLYCuXUGbzG5UNLxW7h8iYIND3PRBLDGgTjOBI2l7xJ\r\nEz5Z/75h3WIqATh5xc1DeYR+IBySh88mtwQeI+TqCz53F3VWJiMMU5QSZouO\r\nFakcX2jNIzYG0E5LzINEs0jXv1gxNckGNrY=\r\n=3Hoj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":"^1.3.1","@fluidframework/sequence":"^1.3.1","@fluidframework/merge-tree":"^1.3.1","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.3.1"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.1","@fluidframework/test-runtime-utils":"^1.3.1","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.1_1668198905026_0.6603327365873284","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.1.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5110b8f97494f2abac8d4a6440bb6bb9f7d1c0e9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.1.0.tgz","fileCount":71,"integrity":"sha512-G5BcJ0V2PPZ2p/ST+vkErJvxYxfTwc5IFOz+5xswv+xZp00mqko1lsUJzRBV/11JB5ZnzZLa+qFi39Er0qQAFQ==","signatures":[{"sig":"MEUCIQCmOGF+8qmG9YqVpXbUdRxYHOks6NkM+FgycI9rIO7i2wIgSVGy61kCgu2Rh68Zbh5eVDov3F7m7oZk0nM7T3z720U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcpOAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqwMRAAhVbHKl7cRUsaYqQJUwigiSCm/T3c6y4lWxW+xbpbtagk7ysc\r\ns1U6oSK+kQiYkhQLcDegy6y9FX68/RCd6nMXzAdLFKMGk5ZHkp4LVCebHwwx\r\n7Op0Ocns2IJH4BI7VjRnecKPY/WHQFTyPdfQ7cJ9uLxGzGMo4SuXGQPQ5C87\r\nyIbXecYNHspHTyZSssLAsUIz0KSu6r75MSxoICNEyzDijKvIIyI0VzqaHg5a\r\n9dRqGqnylwhJBtioFjtCWaDO2ou13KrJyBHGJLxv/BHYbV9BQ8+z6ebjqNqP\r\nmeTnM7cXcz6cwaARJZxLqT+roKf8ykVADSwIlziJsfNcyTDB/vRHPXVSuBkW\r\n0QLEZbrddjLctMLRKC3pVAPrEGTcUMpjkjHwwapr/+CoTkshFAVBFv/HsG9K\r\n3ROv72jqMOSWocizrpc5Z0diLOI7QSvDdZV/UKZ0THrNs9SypWVDSXZTWe0e\r\nBXZDjPP6U3UEa8BI1G7S55+ua3ost6Nq+D7rnDxAEei8tOW5hzxn1yGW3EzS\r\nskfJRTc6QqWfP4fQmAVBIUFxiwnu4gFlDT2f6WmVn7wOrLTw2kmfHMpdPMc/\r\nE6KZr2BI9u07aa7VRsQ2QmhXtxBCMcT32tE1D+MypTta8Ny20p7nQeSJn/tq\r\nUQyLdgZIKrmfMB1MMMQqEtaYYLUd3pXDgB4=\r\n=nVo/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.1.0 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.1.0 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.1.0 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.1.0 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.5.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.5.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.1.0 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.1.0 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.1.0_1668453248653_0.6697698139691752","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.7":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.7","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f406d94b2f0ff873b95c42bd88af62098b97bd9e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.7.tgz","fileCount":71,"integrity":"sha512-ERMSArK5dUg6kXF9X08lv+QcyubCv4OwE0H09ZCf9pZnf8beaiw/25HWeEkK8mRbj31pEEMG+iGUw/QuvapSBg==","signatures":[{"sig":"MEYCIQDsZICVur7frRMC2QLC0fpkl6fphkdZoabfwbHKzRdHOQIhALKLYpRoG43OKzjFSJTejrHFP6tllpg6/SX8q71uFoex","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje9YkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqbkg//dT71vPHu+syO5D8/Ip3LgLbuaO4rYCL8t2XNlaQdqVG0dMHm\r\nwhL2nP/ps+CAwUcFGVoHYimYMqc+SaG79tqAA2+c42xB6fLtDGAMARbN8qYu\r\nZll4Ey3yuL/VxdCFtVfsOj/XxZnSiqyJmUQzcBbjBUtIJLyFXLFTHlDZEYgu\r\noBp4wOUKa/7x8Kz6HO3CDqJX6yMdVKmkKyuNB/xvNuk//aP9i2gsYyYQi29F\r\nnfAjJKYUFOZLGWGX9AnE8bviVYCV8ba8rfNSAgg6+aFL8WZDpLztqKqrHHfi\r\nPxmR/6BmHcL7TapJobHheenHFcliDS0GwzPEJp0P6XL+ojHCG70jgHrJbOJ7\r\nrVcuCEPHlaAp1XuYOhkZVdbpktlofD0WqeoW7Vcn0M3lRuRqGyGA8VB2pKI9\r\n67dsIe7eWWa15pSWGInym4fDd5iTkBJ3FRVBx4QlYYadM74x5nmFSTxicoHp\r\nZQf35SQl2j37WDJoVLw8/FfiIYL3H5fLTdXWCN1fLqkJ21a7w+b4ECLCIYCc\r\nRX5O6G6EcuP5GuzLLFpBi6sSKrvoGvPBLEl8IURC68QDFsQz/JQY+w6N+/YO\r\n55czANc6jIpE1vOs/FIOhFd28Ctj+462p0vp3X/k0asJwr3eE/RV0/8QHMlt\r\niNyF3R8GpDujI3KRyFREISJniIEDzh8rnio=\r\n=cX2V\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.1.4.7 <2.0.0-internal.2.0.0","@fluidframework/sequence":">=2.0.0-internal.1.4.7 <2.0.0-internal.2.0.0","@fluidframework/merge-tree":">=2.0.0-internal.1.4.7 <2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.1.4.7 <2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.1.4.7 <2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.1.4.7 <2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.7_1669060132709_0.5194994048722623","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.0.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.0.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.0.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9c54f2b6749a04fe0d08de0487c3f8c7f67a8f45","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.0.4.tgz","fileCount":71,"integrity":"sha512-LLupt+8V7JkkfELYniMrBdScrZ8APMudyrnyKSzYUMKzopcJ+x8HmR5ROBdgM7jgLRxVCO1nD25AfyqtFsafRA==","signatures":[{"sig":"MEUCIQD1My5vxB4l+ZDJUl1UMflynMv/6BMuk92lRfh+DCNjqQIgKXVNEO8ylql6qVARHSDtadlj6e56Igf+clsulcZB6/s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146539,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfAPVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpe1A//dUF0E1or4Wp+fpr0NiRfoIbSRYKlAaDom+PafA+MWYywVWda\r\nUH5Sc2xABbjunANzu5vIXv/KYfR6edFcqvOnAb08mXyOslMi98Sf+cc5S0lA\r\nhxWK5Mx1y/Q0uVlcSHAUxfqipGkz618N2fu5E53COUDNkrBM1Kq3q42L/Ssl\r\nE33aDSHm5T4v+XTAFE1qrlKaMqHaT0ZsjqcyrjmquIZgjagF5MY9+y2aR4aT\r\nFwU/VHskL3WTXfaKJIVHFSRog0UArKrmkG7JAV2EuddrlrFGYV64nlkWSTNU\r\n/jVrDcm9BjzgmA2sSxt5o34/rBYHcJUG87StA+VRSMbl2dMcQ2rd23Xe4yDh\r\nZHrAncBipBsOGEravz/y8Gesddt59NSFD7R91rTVIwPctFkSwTvabx9UNiZd\r\nEKDQxQ2YL733jpBLXp31sVdwJpbvYiVEf7cerabpgbTnTK4q2iDtR4U4+2q1\r\ndM/Oeg0KmsHs6SlIOOLTs2O7vEUAmhUr4+/40wp8rN+OZVR7iegt+xv5qb1a\r\nDmbdSy8ynvyr3itHn/G0v5v2PDY9HE6oMfdarc0WnrLeXiOD0Ssb9/VjaInA\r\nJOFgSiOl+pElJI3Zck0GRZtiVhPZZwn9Uc8/uIZws7fym/Z0QqgJEx+UmXLw\r\nvxZ6A/M29hdiWp8jQRrsiIRXbRjp0tCDVeo=\r\n=LUDB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.0.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.0.4 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.0.4 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.0.4 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.0.4 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.0.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.6000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.0.4 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.0.4 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.0.4_1669071828795_0.8392910901764383","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.1.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d827dba477a50508783931439085c6511d59d18a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.1.1.tgz","fileCount":71,"integrity":"sha512-mEywFIzP1OY7y4XXaqMmc4QUAg/E3CO7FsPuqQbZRVhx9Rd8JGrLPSmVVhOw1Jg4sgrtMHcQmlVATWBCgAfyVA==","signatures":[{"sig":"MEUCIQChRiwEZBtmyqTX2OcTSedjl0EaCqogedlc5wbSr6XMtgIgWiKFpNKuh6GZwlVXoC8mfLzPp+whJLHiUxr4I4bQUv8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfARrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrRIw/+KfDVMQgXB3sU+9tCHRR/aesrn3jno17RvwZhNF3hGo09uMBH\r\nNrvldjo4vwiusmhitCoP1iBjAeNiGokN+jbYlZxktbbfz01eU7G77s/eNRtn\r\neDz+i5NTe0F9TnQOeZUdnPqfaBCx0InP36kG963OsOU5nggr1Yi1mQT1XV6n\r\n6snm5lwhHHyaqbzj/bSz/3qHI8yAYDvsPGaDLKLkvQO4GICymsMf+lJW87oN\r\nIqT1D6Bz0pzazPVRpz20CkG24nKGWu+LmhFBGkgsf67VnirGCOm2itvXhOAW\r\nxMXNjdfijTI+K6+6MwuBBmRX4ZkA77Uu1Lxn8celmBpzJrnHoFI1NRiYsaWz\r\nQVznQJ6VzFIsM3lysstwaZc/s7DvSIRJVgI5OO+Xh9kilLwF717EWsShowpD\r\nJjtwL2pROcmRSY6AFGn6T4jeNxziiTYa+wR41osP3S0pRSNBZ7+QRQH2Sm3u\r\nWn5/JI+SKDx/yZeq1ULv5KRiEfKqIr3n4YtNjBU3N0vJ2hqj1O/xb/h9Z5Jf\r\nFo0meMsb6rO4QNu/7GO/0jNOXKCQ0TVIl34z4qwrIs0SRW5TYeOh3aJziJcf\r\n9rA1/4KnuuPQh5tQruIYMVadpvtLdcbuyR/RBfmP/XdiZTRPXEY1TCNr50Mm\r\nzBdFeq09QiIDr5cGuyWia7I3ytYrpoHyY+Y=\r\n=EDA2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.1.1 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.1.1 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.1.1 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.1.1 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.5.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.5.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.1.1 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.1.1 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.1.1_1669071979528_0.6871031039478828","host":"s3://npm-registry-packages"}},"2.0.0-dev.2.2.0.111723":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.2.2.0.111723","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.2.2.0.111723","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ec8c01eb605f1b364be3b585083c04745a5e9051","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.2.2.0.111723.tgz","fileCount":72,"integrity":"sha512-O+B6rUKNx6RtEo3+PPsB8oFFmuNJunarcwJ35CvTAMPOjOcbJQ2x4GMCkLyEUX5R/NQxEoXkLUk436hnU2lQQw==","signatures":[{"sig":"MEYCIQDgahFboHU5QvZMo9C7mx+bI/29lJR1OSIqgjeDMxQoZwIhAJEf6gnj4YZ+F5dTC3OEkoY46L1K4BrwjX1sAVpKZ4me","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjhNQdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqoSA//fAoIia4HL6zMZY2CPVpTmO4dIKnzC3+NRqutpPbDxwF0Rd8B\r\nnJxfB3+mZVWraAtm86gQIrX/3xOyQoamrjdV+Dlr5l/+aSgVb3CazwZUakP9\r\nk2ZBvoOIZ6iB1T7caG8ggOJ5hX4uSudMC/X1QNY9AkdmoNWGcBmYfQmMIRmr\r\n1q+vCucrVvXNy/omC0sZtIth2xlVlD1ZI9/h5+RQXCCuTCfEVXEA12NvKufa\r\ncuKOA19Dp0ea9K+sN+flimm5iKAOA/gGk7awYps8A4F/Y9MMDP4Khv+QkzS6\r\nNwjsbW741xs6LuPqXEnitBSPNJG3tdGYayz4xSZqWrovdkbEs8J9Zeb0Gh1M\r\na7RK1zsgJL1Oj/ms/u8yb9a/STdliIwQ+/+Wi06qYN8Apn7L8eZcXeXfWsNO\r\n0cO9Dt7ZN/J6QLxwGDMQt8Ac+t6t8mF4yuW+kowcToiRqLEvcMuEbGfDIKxa\r\n4xjoQbcf5MIJOW1KeOSB6N143jOGAd93u0TqD1IlVD95cxO3ynT5slBsv6Zv\r\np/0bClDTBuoTsK+xypl6RF9/qdSGw0kTHCj3re+lBkMsXf/c8DFZPM3clvpJ\r\n8LaB5+bNvVWhQZHl2iYgkJyI1rYblO6e2vXm8rAVwzdT5tJvMnk5h0KwBlkf\r\nLM82ublhZR2P5tqGZTsD4PhvRoTJVDrmfFQ=\r\n=sFQE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.2.2.0.111723.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-dev.2.2.0.111723 <2.0.0-dev.3.0.0","@fluidframework/sequence":">=2.0.0-dev.2.2.0.111723 <2.0.0-dev.3.0.0","@fluidframework/merge-tree":">=2.0.0-dev.2.2.0.111723 <2.0.0-dev.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-dev.2.2.0.111723 <2.0.0-dev.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.2.0","baselineRange":">=2.0.0-internal.2.1.0 <2.0.0-internal.2.2.0","baselineVersion":"2.0.0-internal.2.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.6.0-109663","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.6.0-109663","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-dev.2.2.0.111723 <2.0.0-dev.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-dev.2.2.0.111723 <2.0.0-dev.3.0.0","@fluidframework/eslint-config-fluid":"^1.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.2.2.0.111723_1669649436849_0.9724791612075949","host":"s3://npm-registry-packages"}},"1.4.0-111997":{"name":"@fluidframework/dds-interceptions","version":"1.4.0-111997","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.4.0-111997","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0c7df8cb8b423f6e24c4806410727765a5d62fdd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.4.0-111997.tgz","fileCount":70,"integrity":"sha512-lz6Msl4FcfnHAdKhXGxH+NNVQ/yKS7fWE32wnV48vwgDiJtxWILwTaI+SunvhEqW+bjIozVD39MyhNgvLwHvzg==","signatures":[{"sig":"MEUCIAYU42noqAFqgFEgcYtxREHJXSeNp2+Mi6EII4YKjNYFAiEA+bUaJ9otdIa9j0wdwt84vHbauCzSawL2pogY/cj9U94=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjhiErACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUkg//ekEg/beRdI6nbYwZBDvGBSlbZ/IvNL0TYaaHiFKZq1Z287YN\r\naADaqkVYaq8dTPXrNBVp6mXXGfrY3+dLVq0B0ASJfxEVfry0eTuU28xq6niR\r\n6E2ezpGVieALSVtjev7bxLBY9tKRLQGox1/ytQkanxON85vHwEBRZcMvgCin\r\nU1F8ZQOnQ+zUr6RWAfc+ivg/g5YjJf7QhTaZp3sfGyL1f3OdjlGAj+RrXXwd\r\n3iB2I7SAR/+UJD07XsLL8FoTubW5oFYlMydFlxTdBkaK8iaWr3WCChHZx0xf\r\nLn/0h9N4eJyeBpQBWY4ZWkza5GqyXDfZE0N5BgPznUXW4dMj6Dbwi6Xkef11\r\nnMNL59foZ9w/Qg2Ovz1prA8ouNviUCYxVGHFSw+V5DRqKPRJHQqqQfq1qB3s\r\nJ/DPSJN5KdF8nNiGUPAJ1Lz23uI7cstrE+0LdHvqDqhkCUobfQPv5LkH1hq5\r\n7NG7pKMiSjFPpJIsi+OA0P75XiXoG90BRKqiFTYCTcCICtZMM8AQ6HGFS4IB\r\nDTiGKxZIXk653P4KTqwpgAQeOprhpnqcmJB3UH10yIlfwjU88qGfx9VoIm+R\r\nEAn+F8tEXv6XZGEgPdsUZqU9YihzerVecRtEG0CmQlycNj/pXP7RTWVkoiYM\r\nkEdY7zgpVT2LkY/QGaYY2LIWtTuDuILw0qg=\r\n=OD7J\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.4.0-111997.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":"1.4.0-111997","@fluidframework/sequence":"1.4.0-111997","@fluidframework/merge-tree":"1.4.0-111997","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.4.0-111997"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.4.0-111997","@fluidframework/test-runtime-utils":"1.4.0-111997","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.4.0-111997_1669734699161_0.16417362617639553","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.8":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.8","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.8","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"dd2572c01bf4e0ee6e9c7afecb0144c5598d1f21","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.8.tgz","fileCount":71,"integrity":"sha512-xomJJU9NPH++U+pH8MDcTTgvV2ypMjHOuW3lEuwGeFCZs6KnRfTSCnNX9Xce1FsicP1T7tnbYaRKrMqTGT3Jrw==","signatures":[{"sig":"MEQCIHPzeWWSR9venfJdaKegvIua+nYoqgU0dw25kyI1yfmzAiBeSRPUg16j9qbeBDkbeW12fUo6tDkpGf0r0K8MoJP88g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiUcTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrroA//YYQ5Oo/2cV7/IKldwzu36Zn8Me4Bhu/osISvHcium6MTMbf+\r\nN6hhu2d1JTJQTZmjvU5NV0mI1nE/9gRL2EFAHA4gp5/nEqez0misA6QA7DCS\r\nqsBVWGN9wsaKYRyLQE1vLcmTTI0FCPembJcsmRdJ/UvcNzzleL9+uIfcmrA+\r\nye9zdigepZlpIou7164dvmFoZzxtEVaoxDhkwhOuWqc5Jy0xaLg8l1xDYLWm\r\nXyKHjoOfnqrMq550anr+G+69tqYICPGBxCaGGAGlpU2q/SWHn2rCaihX6g+x\r\nT+S63wHNw0d+4eDNSrVi0DFTD9esQeFo3zMHyDTkbkbyajrYOHSULbqSAkYW\r\nu4rbBXH3+xx0G1WlmSHOsp4iW2np35c1An1u0htQGJ9DRl/CKl8eDAl8Vivs\r\nQOSwosibygvyCWrqmdry8v4SjxT6UTIhBNGVbNAskdSe4JqJR0s1qcb0Ogbz\r\nqgoHd+0sZbdIRVeY4HLTlduTIr/SRDVTCmjjP9+oljxx1gz+1/E5Wpf7b7ZM\r\njAkEisj0FM2w2H5ztmrCRouGlvvBOF0NkZi1c1SZO+b3gfc0/8kIlQHRns/b\r\nX+iHgu1LUOmoYYZEKcgRxlsdgZiRJOMnagjRIzOIdJWZM51RxINSw2TwY6Ed\r\nicNdnZnR86Gza1XGRs29olbcxjOzGdKFyy4=\r\n=2zO8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.1.4.8 <2.0.0-internal.2.0.0","@fluidframework/sequence":">=2.0.0-internal.1.4.8 <2.0.0-internal.2.0.0","@fluidframework/merge-tree":">=2.0.0-internal.1.4.8 <2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.1.4.8 <2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.1.4.8 <2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.1.4.8 <2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.8_1669941011632_0.1079727732621858","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.1.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.1.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.1.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9c78425c71380d8477556640ee3772693f72d4dd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.1.2.tgz","fileCount":71,"integrity":"sha512-mLUeJVOK+Ewk9vXpRtJWzt9Uxy2/GSiC1fzhAQBWeyMoYiLzqE6WOJDI/TmIE9k4CcTzMiwDrIf9mcZK1pCoNQ==","signatures":[{"sig":"MEUCICRl8NV4RJsRX5yL9cqavsssZnh5ne6fR7cvoozJ9eQqAiEAzrdZbvivsDKdA2yShpD/OFb8AejFXi7DC+Sz8ywm5+A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148148,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiUh9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrAlBAAgt3ZqAwzBNyfV/ZCF9B1P0yrkrsRdvH1goXzAps+7+3pRyQg\r\npsfsTEgaEIIBeqFMUUk/7L3H1XUHB6BwR8Ie9Z4WOhvYeeBMSqdbXR5xS1T7\r\nfkHlzE2pMkSLr/bCNndvgTgh7KPjihypmLgk6PIkbkksM1R3ddCCTAdNtk1e\r\ntoiP72FrHRzMzDs5aHzE9eIQgRJJDaiLCLE///OxHInwTYLNDx+EM8IGwNZV\r\nKUFcgWpc79XB33/PYWf770H1y7hMOdOCaDs7QK3IX4yXx+ZNcPc1JKBbfp7Q\r\nIk0MY3Pjh7Z0pWQXJaph2lkzEW4KdZWi8kOtcz/B49SOprGenW7TQlkhrcxc\r\nfABnsx7WHA+ATyPpdwTnlvOdGVzFAE5djXkjZyXMpZ65SOk3Jjy1ItP5RZjo\r\nLQlQu/4JYrz7z+/L/Fvo00RYoQKfaAp+92CLbQBbEFwnEJmbrKX4cCzeoGqf\r\ntKDrlniUy6LH7dSjg3NaKes4McHefXKY6rP9JUeO0e3BqH1C14lQdoM94AW/\r\nSBwOvORYaSTObdpyH4eU7qTMsyjxGPi0e5mwq8Ve0RqlgEGIH+0ihP+e+5SR\r\nsjztJXpMHf8k9ptSjnrygRr3F2ZrHBLKAUpQGMa0EBhb/gxe1TDaQ8jrVka8\r\nOcqryOdhj+TMeJGYHZf2NyVU5Rjx3Oagq5c=\r\n=ykV0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.1.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.1.2 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.1.2 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.1.2 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.1.2 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.1.2","baselineRange":"2.0.0-internal.2.1.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.6.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.6.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.1.2 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.1.2 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.1.2_1669941373163_0.7254192166793798","host":"s3://npm-registry-packages"}},"1.3.2-112998":{"name":"@fluidframework/dds-interceptions","version":"1.3.2-112998","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.2-112998","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2e21d7d9f1817efba496def9df6bd21ee8ab3156","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.2-112998.tgz","fileCount":70,"integrity":"sha512-wT27geO9fiC2Kuw0QAMwxpppoboTfAyQqxwJpm8ydPjTSzzCf3VM2cSOx8y7T37KZ4W0DrlElsgCqC3NjDj6HQ==","signatures":[{"sig":"MEYCIQClhotQfCbKFdJFgVa2FAOCFlNCaaQ/0ameGtqgEH96/QIhAMLgofxAGPbhc70iUiE8uFdbWOVeF6CsjACkDel8Pe+J","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145714,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiU+VACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrbXA//TJsyK5Lsmpl9nP7HBrkl5OMzeAhFaiP8p5n2NsIT78b0Wynw\r\nlyLJplauGI952PZ26qv96oA51W80P9Nm0tAcBneaz6EdoNa7HpIeIvCrzRaq\r\niNu8YpqNSHVR0YoXk+rwyrriFhBJiWAksKt/OlQOBNyRYa1w7Zhs/+hv7T8U\r\nupB0Bz2aYjHmQg3D99ep8Cu65di6u0npM0QX3/G28qxwmTvLU21AyehQ0TzD\r\nD6gP1ioo8AyPjkTaRsjySqDvmiCOUZ1A365zoZJbgM501kOBcJD6AAU1GMG/\r\ns/Hc97h/iERjxKZSkEj4Sjz90RNrlOeahbdM57+5DJesB2PV+W+sYpXD0NFr\r\nneSVqxHpbDtLGUVPcn9ErRRWM1bSG+fC3EPHIXJ0HMO4FfeTvJvwEowEFbEq\r\n4E+1wpNURuJy+uju59qlV7240/KQFIn1UltTGaipqb1X+bRxorthMoBwH3zV\r\nt1624u8KBApf+DpfGb5hpg5q5MpTBTi0lDv3808G2ufDLUtBgZmOGgCJPFef\r\nQJjNqXE34SgrfTQVpJt+QLOed5lmsptFuDlcUB8GOJO8v8Lx4iqjgG3i6uxM\r\n7GIGssD58Fkbi1o5nuJg++qnM4UqhR88ziGZMskTATLOKo7LyoFwfX0nXBdV\r\nnHHx+qdnn8yCc42Co0+D1lXxDoWuOjqCO2k=\r\n=2f3F\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.2-112998.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":"1.3.2-112998","@fluidframework/sequence":"1.3.2-112998","@fluidframework/merge-tree":"1.3.2-112998","@fluidframework/common-utils":"^0.32.2-112764","@fluidframework/runtime-definitions":"1.3.2-112998"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.3.2-112998","@fluidframework/test-runtime-utils":"1.3.2-112998","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.2-112998_1669943188787_0.4950497012903017","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.2.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"538b08c71eb79c31aa729e5c4cd488c37999d25d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.2.0.tgz","fileCount":72,"integrity":"sha512-IFIvT/5P8Y6TYm3KbLhNiyCwjIJEMp53QfB7fobchmblHor7/rqoXhAI5BPwwld3+q33BcSBK/bx/x6T3uQXvw==","signatures":[{"sig":"MEQCIC0/LmADUW9iEEvnQxcXLLgnSKK/Zuos/BLJLL600rXvAiAie1kzVLGliqmxRgc1YD2HQ073BULrpC3+OiAjcrWVGg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148665,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk5AKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmofXg//ZenwT0YgXRO/0+Rc2PJdPIK8WdaA/WH9A4pgivoA2dNjhTbQ\r\nfeXztfVw8h0nxU2BFk2GtADpzq3FnHi+JFyp0km/3Aed5UwHVQ9rKDACwyjB\r\nVP4OYRwDrClg69yR9lN//8tyHHrx8UQLOmNjnhBvUNiNG922orAlzZw00+l/\r\nXAAy97atffQAx+U2oKr2IztycGdimcG9LuS1//p1o+bgjTLFEvys5qIp4DM7\r\nEXqsTEgmGbYWgDvqZllQ1u7qz5w4aduPvh0X74J4BmgCAkmuikkXK84UoV01\r\nXOydpkdNCxgFRZ4pkJvyx/Eq9/CP6PdqIfWemEYDZoAR7Wu+69ao1Vr36rcu\r\n3antxBRV2u6yAeMKKH3bO7Oa8OykXMBcnMzGRvrFsyVfz5oAtun1gOQ57Qgx\r\no9Isw8OiSaz0ue8Pw8nF00Dep2Rjqr3C9hzt+qosLbYLwcY57KITKPcYEWAF\r\n/xGdBmZ8jDWC+mgFn1c6vZphM2StcSHpw/j37c8GePd8Cv/zKeveq9Sip2jW\r\nf5/hEQIzAx61niacoNOhJsCfDRsGGg+SMTz2Ho132uzkoMq1ew3jbhJZ3iX2\r\nVXDdl8QlEkcSpvy1m+p2ZaUE87YAvQRM9aCQuwsqghLSx6MOn73VzutVRmWN\r\nAjTibkaVIWSAKFGY8FLMCSIVbA8ebeaswkg=\r\n=XY1F\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.2.0 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.2.0 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.2.0 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.2.0 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.2.0","baselineRange":">=2.0.0-internal.2.1.0 <2.0.0-internal.2.2.0","baselineVersion":"2.0.0-internal.2.1.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.7.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.7.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.2.0 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.2.0 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.2.0_1670615050669_0.8272657200884892","host":"s3://npm-registry-packages"}},"2.0.0-dev.2.3.0.115467":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.2.3.0.115467","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.2.3.0.115467","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c3481b8c612e2758fc4138c0598f878771bd4234","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.2.3.0.115467.tgz","fileCount":72,"integrity":"sha512-NYnPHFaR0f+dTGz0i/EG1Py2srK0GSgzwZtytkRef35zzsi+wG4Axj/6j9okqbOQFx53bfplxScaN8DEVTXqfA==","signatures":[{"sig":"MEQCIDIzbglNFNAyQgMHIKVX2/WzK+cS2Zn+96wDzE5tLNShAiAfkNDj4Rz3A0Q8Tif3i/4Yo3YHmaqkEvhlnP0fFplTVA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148663,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmQezACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsIQ/9HEoyyTYOSpAyLc95i7Uwt34fRmhG+4errw+37RNnQomrKGX5\r\nLf2+2AAbnaXnexoIPciahpycFWoomMDN0lJYTbsE+LeJYUwO3GmnO3Kl0jhc\r\nom2W/y4HjySTwClADAbOLmzzgS8cb0GyHVwAN0m4cTClYXgh+eE8HuXnLJqp\r\nPMYxkqgPaC9AHCB1uPbwRVz8YpmnSWOX562FeFcu8QwxRMKvXC3gxFUKiBPi\r\nzKQVeHNJ6vAL4eRblx7p3ypUR+4mO0/+RzLMhJWM7ZUjU8QbU4YneXTWtMSP\r\nMt5m+FOXhr8nIwB2caSUHsqIZD35iRpvGPeD12cdwBWOueuT9yHkg5lnWurz\r\n3jfM1T0/hb5SN/twFASuhfogm0c8aHLtnltkX7waT9fm9tQXx0io/60JElae\r\nFdKcjfDO3JoyjPOQM8HBZ8ocEyAQfPsFm0dT5f6K1IlhxWJ4IibCMhWHbe2j\r\nG6nKp0Q/b25iisqtTJiomDMGxgwu47Le0vpvyU49hxdbcTTx1dNz8X6/1JBK\r\n3A19D9E523iH4Ee+FtcHwEtcilohxAOnak5HrbjOjtC73TOeL7Vf7gWVE7tY\r\nWvLlq1mGwSxzoAQuyT0wGQb7VjrevFVZqObGgbo1d972aD6fEuOdxqM91lzL\r\nCcy0oDdejT4VcTc9/wPdG07kqxwi47zC+d0=\r\n=b5vQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.2.3.0.115467.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-dev.2.3.0.115467 <2.0.0-dev.3.0.0","@fluidframework/sequence":">=2.0.0-dev.2.3.0.115467 <2.0.0-dev.3.0.0","@fluidframework/merge-tree":">=2.0.0-dev.2.3.0.115467 <2.0.0-dev.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-dev.2.3.0.115467 <2.0.0-dev.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.3.0","baselineRange":">=2.0.0-internal.2.2.0 <2.0.0-internal.2.3.0","baselineVersion":"2.0.0-internal.2.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.7.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.7.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-dev.2.3.0.115467 <2.0.0-dev.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-dev.2.3.0.115467 <2.0.0-dev.3.0.0","@fluidframework/eslint-config-fluid":"^1.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.2.3.0.115467_1670973362980_0.7779890009971382","host":"s3://npm-registry-packages"}},"1.4.0-115997":{"name":"@fluidframework/dds-interceptions","version":"1.4.0-115997","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.4.0-115997","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"64f29de3a338d033d4955461fef53860253873aa","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.4.0-115997.tgz","fileCount":70,"integrity":"sha512-sd1UH5w4NE7YzS8pkWiTVK0A05K8ksxgmXkcd+zkVlNiWXjWlQaZJsGCgTSfZbZDVIabo1x2vXVougncVl9tjQ==","signatures":[{"sig":"MEYCIQD5H6BInst3+9SaPwlNmsVijamJPpacahDxROKIQtKXywIhAPHOMAkXpKfK2RVzfXSX7LQY+Rfx4iVHU+v21H0wcjqK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145815,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm2enACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo6JA//VpOiEqsnNjbu1rPrfz39rP7busQiBq5xbKSqPHpXdWannmbi\r\nlXWyMXZ6pH5yrOVukF3S5IzFkNoSEdf/TArenIiygu4w40MqW/MznSqBwEct\r\n2HAkBXhxhDxrVyyOhKjQ8oDZkOLAyJcUwm5Wm8ZRcOAf1n6aNHqOo3ynx9Pe\r\n51W78q6UanDi77hDuYz5Q44QBo+A0CbIlPiiKwCQZiyXnH1te95iKt5Hcdeh\r\n6kTf+VZLvkLwd5KWHvXmL/45jxqLVrZkFDBr6Hg+8sfqnyihWtTmVG6vFbcT\r\nx8YIbjaeC++il+Vbb4soRDdEwcVLVd1FOrm41CPZuRxSaU8DAusIWT6GJQXF\r\n+xbRCH1Y2yir/7SN34JwMba/dqoUXlAWVxvqQ7+CWrfjYEiDOVIC+UZOR3nQ\r\nbHY/INYhYHKuox+z+YRY50YNSm2pfA+cZcjySbt9e2hBoQBZfNe2gbSipiu2\r\ncbDaXjJJPsbADpFq0yUOijMXxuLKZ8ncZ1+jcavfnkTWjd4hiY9caHUIplm6\r\npoDVFUOyJdMnNSci0TwRfQ/baJn3h7Fro2xKwdGBYcWXUr5tRiXmnAqDMXQt\r\ncPAXUtNxqCLhH93uCbQPb0j5zDFNza4UGDCngytSt2J3ELvXBowawG36UKlA\r\noKz/PRQYcZX98HEr4p9O2ZqHDrsO2/vMhlc=\r\n=R4FH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.4.0-115997.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir . --no-generateInName","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"1.4.0-115997","@fluidframework/sequence":"1.4.0-115997","@fluidframework/merge-tree":"1.4.0-115997","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.4.0-115997"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.4.0","baselineRange":"~1.3.0","baselineVersion":"1.3.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.6.0-110101","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.4.0-115997","@fluidframework/test-runtime-utils":"1.4.0-115997","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.3.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.4.0-115997_1671128999207_0.3243270024289686","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.2.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.2.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1d9cf188a7b3e477134f40ebd41a7a179599e2f3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.2.1.tgz","fileCount":72,"integrity":"sha512-ZcxDzp6L8ZPVjSdGer4qQuP5WwEGqEymL9KqIRWcLsA1ttluS6HwmveCf4+qt9nk02bG88+WOIbmXbApunYLzg==","signatures":[{"sig":"MEQCIHjk0HaKdRVz/I8yt96oLVZaQRXSTkT9zov9BiSdCq4JAiBMwbt4hz+2CoOclIQ3/P+VNFINw60M2+UmvNE2in+oGA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148594,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuMlKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJ0BAAmq7BvaWSrSwgU1zFTgc0qf7vFUDkjHrGnSYVdK2auJWcSCiy\r\nBG7b8j5WU0oCZaZBpWmTnMqSfTMfIGAJQWEh9+s3D7dyLTSoEEHo/VwZWrqr\r\nOayEJm64Su/dTZuPSOI1nyrRdYK9Xz+K2l+hZjpZsUJmcd2Jb/IxDPKGOBl9\r\nDv9+UiPOgAc2AmZG02uWitK6cIwfzmnIOg+pRe6DcpVb47WTL+6leVRWkpAd\r\n98YX2nXN9sBKEXL22UvtE6RuiznX+kl6gyCqG1kEo/ayXZm6SZa/Su01u6q5\r\nCdwQbQFZwCC09p/X4K5fPke6UNe9YVV6kqVcelnmFCHeur7L6qv8fX2RusW9\r\nhTXDeJKAvlrsQ7tKXIcItTlUWsYwG1bbR2ATMJTjbfbw1JpuYNgbYvPfreE6\r\nQtFBkliO/K+bH+Jvrfvf4ypsXT6UkceB5hiHssFZd8yUJJYnFRTA3l97zgvY\r\na6nAhFUJV9UwDiqKwNiOT2kimXzQIApaJTI1GoykaFMHUqG9wZdj7Ai1YgjN\r\ncxoeb39M8leCVMpKkUnd7IFdv3O2rV+bLoJL3YIW8AX8HLDNswewfLjYU+4D\r\n33KQqoXKC3n1qx5q3Ec9O30w1znPYqZTHk2NDdDxq0xXMHkuHAtVKwaKddtx\r\npj/VLHAm8Uq3y/6g30viPpp/9NmxF3Z5os0=\r\n=yF/t\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.2.1 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.2.1 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.2.1 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.2.1 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.2.0","baselineRange":"2.0.0-internal.2.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.7.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.7.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.2.1 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.2.1 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^1.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.2.1_1673054538569_0.2308097349877407","host":"s3://npm-registry-packages"}},"1.3.3":{"name":"@fluidframework/dds-interceptions","version":"1.3.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b333180882a3ebf536d6fa6f8c6a432b8ce24037","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.3.tgz","fileCount":70,"integrity":"sha512-cdpIBBwJ2I0bNq8Q0JAwrl7in9f6AmyQSUc87Mh4pmHj/iqTaYj4YdvGtFUN7tGH7Zq9jODXKiVnYrA2cpMPow==","signatures":[{"sig":"MEYCIQCTvyZn6cvkYGWbRD+fO6tn2eN/CzSwllxf8tX0mLBi5gIhAJUW6qHkFHNAN2WAz9bqBmhz5GPoH8V0H4GuFNU9r3O8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwF0uACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrHUw//Uq3Z8AvdMBEDYuKN49WiJByrGu5g0w16+4jXVyQXKXpFJMkZ\r\nLetUuJ/9T8Lm+evl0LSq0qz9XiIfdgjJI+YJTKb7bztSpWy5akHt18Z2+4Sj\r\nW5TkAcu4JVd2PYH5iRGlrjp7/Xh/ZM5U/WsjLI93/lj6mTT/z43Z4qZZe35O\r\nbKCJQssUY+jXLuEGruqpWyoHZwP8jeuaNSZjrRyA6CGkr9oa53kShO4oD1FC\r\nr68i4vU51jXWQiDdEPpb2CljhIPn+uMyi7cg+24TALI1710t6g5Q3a947UAR\r\n7NLApTd2qUL26DqPG0r8X48sZko6tOrOURNpttqvnbm6pD1jowofXaFVDBul\r\nK7kidpwLJGgY/D+EPetdt3HcaqlsaL45u1SVtb53MmYVXBml/8ZD1eNAh9RH\r\nQNucYwesGWd2KVpDpM4pGEMo6nyaIHBHPO++GXdS99X62kzFNczaiP+H6Ih9\r\nzqhEm011nvBIw9V//qZxXc2EYdIC1WGScdfSiAWsgN4jybg5p6GnmYMVI1Xk\r\nvPCd9QCAjDDOQKBZBgWDAeURBKWgWbmYYbzm5vULLFUEioX2MLCDaoPmj9wY\r\nR4eitL3NSdJ2Juaf8FaVCfUDxGW/B1N/5LHlj5RgNRGSBBfRuc7rQLwl4YUl\r\n7MWE1Bqko9g6+HvoYyPeZyRBp5lUxrXUl9w=\r\n=nBgP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"^1.3.3","@fluidframework/sequence":"^1.3.3","@fluidframework/merge-tree":"^1.3.3","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"^1.3.3"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.3","@fluidframework/test-runtime-utils":"^1.3.3","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.3_1673551150116_0.5933382173180748","host":"s3://npm-registry-packages"}},"1.4.0-121020":{"name":"@fluidframework/dds-interceptions","version":"1.4.0-121020","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.4.0-121020","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8a264983e0e2965bb29960397ccc9b52fe2af82c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.4.0-121020.tgz","fileCount":70,"integrity":"sha512-D5lw62FURwIcNjrPmXbJ6IlxyYn+akpY+/fYBGcqOHTmzHOWmLwO/HX0rGm4zht7IVYCABCu77IIYwsllHj/gQ==","signatures":[{"sig":"MEUCIA3pAC10E9Or7GLRPqJNE7+k2R9hMJwZLiCSrx96iVNSAiEAiv6dDqvEBlkLd8a/jurD0IWWIzOWysIXb6Ovy4zHe4Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145815,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjx05ZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqNOA/9Gat+RXziWHXyogb+NXOxm6McLSeupQ3scmBj1sYvUmV9Hz8u\r\nQksNvU3HylTtDfYQit+MWhWldDJC15OvnwehCezLBmOd0pjS5NQCUIinoZDd\r\nIZ/6IMKANuusvxS17PZ74Vkxd521tbRQJV/Aehc8cPau6MWoar85YhpJuShd\r\n2yfuw136BRNZWVbpNRXeYh5aFyylCZjIJPlJDgRXcM31HWm/fdebswjBwgQA\r\nAzd4Mrn6lsuMqD4WiijDPOdAzq0u/bueCLJj4LR9+v0r/2qn4auydeDR2MO1\r\nBVdYKNCeR1t9NQUEiTdvA8sypSKFnliN0RzZAhRBv12zaQDZP5Zxk2XeNvMm\r\n5L/bLu87JYX+2HRza0Au1TRh0rkAC/UepQ6W2aQophYxBzM3bDOogOtclczR\r\nzDzA46vEFURwtE+/fW7Zwx65Mo5Hmt4xd/bHfe6BjCD3orALR2n6ugJHFjco\r\na4iMlzdRR16sjBZ1VovExWTi3uHDAwVS7cp2OmQ7WmuxWs4ubtfuaK99K474\r\n5huJ9fCYm+2wApk3DCIYUNbyyUZ7o1RLUTOSBS4znM4VuJ9i/bZ2S1Zyr921\r\nM/UZ0NqYprZ2WAGIZnI3552Vg8kl76WYmIA5wr8v3ciWYpdaia3uEOcAk+Cc\r\nUZIQqchFL7jPOHeSYiFhsLbAkuIPpFdcnqU=\r\n=hMxS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.4.0-121020.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir . --no-generateInName","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"1.4.0-121020","@fluidframework/sequence":"1.4.0-121020","@fluidframework/merge-tree":"1.4.0-121020","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"1.4.0-121020"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.4.0","baselineRange":"~1.3.0","baselineVersion":"1.3.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.6.0-110101","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.4.0-121020","@fluidframework/test-runtime-utils":"1.4.0-121020","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.3.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.4.0-121020_1674006105175_0.8780004938794197","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.3.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.3.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"873e68eb77138630d77344931369ae48f14d985b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.3.0.tgz","fileCount":72,"integrity":"sha512-kMnzfkXIrR3yeQL6EPCqd6pgmq0MnFkR6pryDNbtbExQkm3aukZ8uysCtfyLhuazb15mmavEVwGshSqUapDHWA==","signatures":[{"sig":"MEUCIAyw2OxU2QXB+ZBR6+rnKNRR4f/glDMs3WpMAlPyLfmHAiEA1vgAxZ+PUW2fvtzIkP+7v/eD+lBhpSv8OlzZ+FqfHCw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148673,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjx05zACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqcuQ//YlpX32PkUkXBY1WaQHtS5xaIKskZw/LjcIA2k5vS3xrFdr/u\r\nuy4Kbg84cf13GiMA1gfmYw/nSDte9EzVOt6fYK1etuK7hnevCArIOhHig3G8\r\nB703yNlBt05+oVGOPl9JH3j5Z5gqvPAhAuXVNu9uK/SvZlDkS1mn1LJqd3ir\r\nZmKs8wZ0q2/MUUoMI//a15iAoG8etLcVa9FQN4S5dLgnSoyWAySSHn9hFohn\r\nXXnNrR1ykdGW8yQVf6a6Z5eh4vvnIjjmKccFgUn0ZuvR1D9U3BLdxXSYrYn5\r\n7GHAaJyARjkXnJMb3F/QMFYS323t0pAA6xKVffv59uIu7aV+9j3MyQLnAXoa\r\n8WXolyNCdXV1EmI6e9UT/CTNpV4m2qTi8siaUypsvX9hg2rrsodvhZk9D4fU\r\n+hCinWmhc49UN3qFRMkzhPD4iRWUyqt/xSL4n8PkZDEs7XwXV3GhtETmYwqq\r\nr+cCvybLUe1yBhWmeVZshLmv80Zn0MY/3WWyBsDcinsLdW7LPQ/mmhcWvnxn\r\n8zFwxd9ZpX5cbTnjtOTPMuH7F9TefWrM973YcB+rfzUp/C89dNN10Jjzdffp\r\njzyEpmhO9qRICM9zKFm7SJ70vFt301VWbsv1IvtoO8Bb+DceCmsMOFUBGxAJ\r\n/10+FEyPee6H/Pl/EmhWvFoIvTq3fkVZ8cI=\r\n=VI/Q\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.3.0 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.3.0 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.3.0 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.3.0 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.3.0","baselineRange":">=2.0.0-internal.2.2.0 <2.0.0-internal.2.3.0","baselineVersion":"2.0.0-internal.2.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.7.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.7.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.3.0 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.3.0 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.3.0_1674006131266_0.6734997619005725","host":"s3://npm-registry-packages"}},"1.3.4":{"name":"@fluidframework/dds-interceptions","version":"1.3.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"55aa1c87f4ee0ae1fd0b56205a643c521e25f97b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.4.tgz","fileCount":70,"integrity":"sha512-ante29XRWVua5FHp7NTdOXSbE6m+UbQyv4K22FuXacBtNTtRPIaQwU+ltTyiIzzpSFPhhbosvfKjUHBKQ6sjdQ==","signatures":[{"sig":"MEYCIQDpdiFKPXPoJ+ixWPuJK0miVeG7WONrTyfGGwbZTeMhTQIhAMGUIQhQISiLLmxDH91tsV+Cu/aePV7bMD+LVkJsAutH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyEZ+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpS5Q//aBQI+WKixyfUTcyodzn9iLWtNYVss/FvM/LRIB6Evg1oDiBc\r\nTgcHJoL6B6uVBs3zEj0RgylgNEQ6rKoAAA0qgqWiBGa1HtC9V5yl98oXXFUu\r\nl3ZjV2AU0jlnsZ4SRohmifDjzW0FvFMfK6h1oOc08oZI3opUVEg6Y1612oUg\r\n9e/F9yClOYeu+Jb586VmnZp44JCC81avy9NgSCpt2MhQfT9XkvJYwKL/VFcZ\r\nRzlVZoQPxJ/GWT6q6rJHQakM3isBBevY0vxUUyBZVZorOY4QNCfJEwXZVZye\r\nKOFNPQbRdkTWLnwiaUZdKN8dY5YaopzlcSUUmJLdka9T43Rf6xni5wxX/EIU\r\nzTRuuoFxcD76YMKc8O2UNhmUzn5cZx2mEUlGDsg5InLNQuN9VN9GLsFZ5/YA\r\n/0Y08Xi6mvs/Ci3l/3EMajmxwjcNPl2AFdQDoljXgqKoglayPMoMKto4lhK5\r\n/L22Iwwlh2q+cmuer88zi75U6AudEGQEDdJ4pI0Hom0HlCq6K420RY4c9YTZ\r\n2uy/DPJUOXrA3X7b5P22qxlZjolmH8t+Gazt18QP5QFKLr4hwBcKjH8uzWak\r\nERfTvrJTQufebwDO0LnnP/F4vrWJDkag01QmlhqwIa8WIv6lMeLREkQGSSYq\r\nmtgtQsgJJUuBSPh/hDjMD+ph+MsW6UietTI=\r\n=aBOl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"^1.3.4","@fluidframework/sequence":"^1.3.4","@fluidframework/merge-tree":"^1.3.4","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"^1.3.4"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.4","@fluidframework/test-runtime-utils":"^1.3.4","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.4_1674069629833_0.055991312146436156","host":"s3://npm-registry-packages"}},"1.3.5-121405":{"name":"@fluidframework/dds-interceptions","version":"1.3.5-121405","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.5-121405","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2b5e85f9475ead261c6a5dcf0da951f6b5b28d24","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.5-121405.tgz","fileCount":70,"integrity":"sha512-n6s1g+QydzKSTwN0lF1bm+5q6d2skXHL7pCQV/4WW/CRj0WMCWQjZrNIQY4U3Co0DrhViHGMlUQlR2z3RA4yjQ==","signatures":[{"sig":"MEUCIGAyoBtO/zv6fApQ3+BPkYETVJQH6aIJpfm6tipEfjJ2AiEA/XhnjjvcEk1VLvOBEQd7V/luCrT9npJQY5FUMsdO/0I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyIszACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmriog/8COcO7GRskVIJP0T0b6CJETT6lVd2sCb+bKEyrlgjRhiruk9H\r\nVb35+ECfM/jI8luP1wlUU4sbhixBn6R4mKIRr0hzOv+aLOMXbSEhtYuWSA0+\r\n5QGpjU0L73AxkY6akx7EtiMBejsdFk0To3yENIoewkW1arRBjdXly6wm05TO\r\nqdMGEMFCdDdDSGYAafNsfhIOjgxjy+2jeNm8C4DtMlpEcYoeGjwYdm43sksQ\r\nhtAwXPfhZXvOmbcSXT3m5D+g3HoRadT5COiYTu/c/dYw9XxCL8zLcmGWQFUG\r\nsIn7RRWVrx6LvjOM6WJUM3hQfWVDZvUH+Drzhkkp9x9NsU0MW6AcdEEpuYeT\r\nvdHVjlwh46I3Kunfun224fR979PnTUKuKhsmimuKJi7QIDUg36FLZrKZ/Ihd\r\nd5V9/FSrvXGKUymMO0ksS754UxJsYNHwHSxmQBMXt/ps9h76/yhrykBmb3nW\r\nfnR2MBHTpg3bKjOZDJ//10u8RmXteV0iGd8C0KI/1/V3qBprcAqgg6yksEko\r\nopgmMf5QBIrQFiaCXsOceStle/xeqhGI3IGON9XhY/N/9YZAyLLLie5dmuh4\r\niwjBZMcu99BJhbWRUEho6+DOWfrjh51XSLc4+KzamE0mP4i11TfvGTmlMubX\r\nfvwRRI/XMYTHLppQcitI1k7+8I+O/BqEZLE=\r\n=VKeK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.5-121405.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"1.3.5-121405","@fluidframework/sequence":"1.3.5-121405","@fluidframework/merge-tree":"1.3.5-121405","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"1.3.5-121405"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"1.3.5-121405","@fluidframework/test-runtime-utils":"1.3.5-121405","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.5-121405_1674087219627_0.25527581908355823","host":"s3://npm-registry-packages"}},"2.0.0-internal.1.4.9":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.1.4.9","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.1.4.9","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"510457ac18a696b656fab855bcc80a76ca5f765a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.1.4.9.tgz","fileCount":71,"integrity":"sha512-E7ldgj29Lv7JIyOfeZKNs6bRs08phkliOTTwRunZEVMixlAgfBPYvHBGD09CGbDsTFEh34uAx410K5pfPeVRpA==","signatures":[{"sig":"MEUCIQD0kJ6bJSeVI1R1sLGiUws7HFbsW5uUH+x5Yn4QV1lmWgIgGL+3d9IAaOSkFaWmj29yRbWkkzaNmIwivO9UPMJ8LYw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyIyhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqlFw//R/jF/U4K6Xo3r4KyH7gjackBKm91BI083nHH63Ow7EtRgjyn\r\ns4GYtuhjz3DYoFwDEKZQWQ8dzHEUX4cQI5n309r+8XLvf7VHX/d0iGJqrHPo\r\n4h0Y1Yy8m117z77lGZP+FvW8V9r4/qj6CWGyuf83Hp1D8Zw7iQhmAJGLoiYL\r\n1VLDd8trpNWGMUkQtS3uSVzkZzAJozpIZ2+fVUcRZ0CBgpZpfpCS1COUsVdk\r\nUqnOGE3ReCrCUcZQBvjkXQGwwBi5tazbpjGGbo6RsI9LuG06SSA9JRN0LGZt\r\nigEmYrlTUx6DvaZZaRXdttknEcVHn4ztJ7M0jOxAfqd1fTiAN37lrXCo++vy\r\nwhLOkw7D8JKlOYVYgdD7JGTC+tTEpLSUlvub+9qE75aPN0mNCALisBm71ndH\r\nfXINbbiMUljoe/b/5Y82/eogdbAPaaFhHE/RVGtyTWNYKt+fZF9pMLnp55EU\r\ndGYGN/LikUdtySfu2Khux3jFlUKcDsu50BU28pIGmJw6S7tp84+suaRIQlzI\r\nT+DI+J2Cn/1CJwaxZEy6pC9fM/Yx+v0bJQlHm7VvTxS1hB4XbzK5inzIRBm1\r\nsoFFaJ0UvdBK9w4ME9G9xwKYN1IAQYfdffD77fsgwHtXxTX8SFpV4rofyMFh\r\n5apnhbBMj/ZjMfCx7Wv9WiEOynhWuVEM7kM=\r\n=VRob\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.1.4.9.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.1.4.9 <2.0.0-internal.2.0.0","@fluidframework/sequence":">=2.0.0-internal.1.4.9 <2.0.0-internal.2.0.0","@fluidframework/merge-tree":">=2.0.0-internal.1.4.9 <2.0.0-internal.2.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.1.4.9 <2.0.0-internal.2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.4.4000","@fluidframework/build-common":"^1.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.1.4.9 <2.0.0-internal.2.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.1.4.9 <2.0.0-internal.2.0.0","@fluidframework/eslint-config-fluid":"^1.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.1.4.9_1674087585582_0.7133274510449901","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.3.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.3.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.3.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"873bfea1abb3f93af64e2d43179686752194bda7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.3.1.tgz","fileCount":72,"integrity":"sha512-LZj5Co5/aLFXzWEDzAe8r5JdyWBPZ+YymUuwu6POA0+d/8JLhvmSi4rH9mreSfdkUfyLJT66B7deB92DDuLRMg==","signatures":[{"sig":"MEYCIQCGsrTu8nnpV2dupiShFzRaRwJHYvNpf2neuZmpZ840awIhAIk39VUY/cIXPEA22YYSqD81iLm6zr6DUngEjU72QYCe","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148602,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyvjDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4gRAAgK5G5SfmF71X/YgLBcRi5O75hYcNMaMhH9wTHyTXVUadeTYu\r\nkzO8zjAoECo2u9Pmu1CCD1TFIvMRqKSr7Fw2uGKXnO1QFvPqI2DQgm2NoH9v\r\nJeK+uIpDZvqe5mybLtqO37dc9LinyYHc2kcx+i+UBqHRDR/wEBKj5PbKkG9/\r\nmNwGjHz6SxVb37lbH15xSZ5ezjsc9Cx1MC5BD/5tvjaLX6vvieGssWRl6Pj4\r\nt7SFH1B4n3DenENu+DbGq800jb+bc5vbd+OYu5w1tFS94ceIDnh5sp8xqBwM\r\nfNCIW2wslAoRcAMMEJhJW6LxowIrl+wSNPFkV4LDjgAQKgA/XWbbv8WM5g+s\r\nYn/osLCdasI6Ul4zMfw93Oapr6Tw0c7WAdvbXlwGtTbRjOnZ7Gwqd8MSk3Xo\r\nbHCRYXStbcWElvc9vhodlfuas9tkaVOELWqoxrk7PhtytaKXxoNsfY/cKehH\r\nVTPNgyGSqajR53lNTVvWVS3SsFrEOnjm3RTYizCBmFvVEsg65P1CujdZkbTQ\r\n/pyWW5DKGRj+2IPC0ttaimEHYsPoi9DPHvwPMK//XXHYUVdRdeS+a+EcABd7\r\nx6uSfqRqXtg5ZDkGeIBCrjuiHy5MH4y24GSDvlX6mEP92niNx7O+9yDs4BOk\r\n/15Obf4z932G2ncp3n+smzEUF9pxrVtiK8c=\r\n=lhcK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.3.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.3.1","baselineRange":"2.0.0-internal.2.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.7.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.7.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.3.1_1674246338793_0.8505724548541322","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a45b966fb6195e0569cd8a432592c5c20b634fad","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.4.0.tgz","fileCount":72,"integrity":"sha512-J+HPJN3/eAolYk7tkYpYM/cuIbinmnNVQJjaigmKxEXsyVUyqEFeM33YRsRclV6J+JIQ5r2NDdXSGxolTWIYGw==","signatures":[{"sig":"MEUCIQCxxTZLU8kDEE7UCIecZ8XFSaNgd5vdlDtNwBxVK9xY/QIgIZ2qTLkEUvOpHANnHDircOGqCUAPXJjeOEuuu/tbwds=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0askACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4wQ/8Cf5I1xDjnjqR/afqYBsaAvZAvkcaPZn/wlDEx338aH6C1REt\r\nrxUSqccNctpVRQSAcSHfReL675anhIferslX45ESBeY8qf7LN6UpQmx1qPlJ\r\nHlZlfzbFyCM/ImoHFr4LwbSi56ZMYkkpa6DcScQyWT+n8w7/t1DGu5Ylq+Do\r\noeFK/q4I/p7b5IECQuzW+8QA+P25nHKwAu6NcKuiJDUiyLrElXxN+5hf4qlj\r\nbO2xojOVScVef3yGfpJkj3qD/EZddfQwTPrBYMyDBmcDTAysxAGWbHfyJutf\r\n5N7uJSOCJ0hBJLn5hD2uSLOuKLnQrPfOn8w3sgIaNQzLXVg5sfKMkkls5URy\r\n2JTGVq/aKmJulX5F7/E5d99OaYCEcdcbb1oBNV9theJkvDDzLp2PtW0aRV7h\r\nvI/h6dm1/ZyRFhgrKRAsyEuvppxIA2otrBTKwbxoWmvDt2mTjrLc3dcyNOF5\r\nwKhMTcyo++v/4wGUnp6CG52JDgRhaXMhEl0B7VAloTU4bZtCIAf2wj//FZwa\r\ngtXV5ZK6zBLD7h382oT8WFeb+F/bKLMDEyl1ek7EFHiOaPdo6rVPM/Kg5ZfH\r\nT0TMUESm5sEgX2u+AH5xQ6jU9PzcThfvwFfm5RYIPeYGYUZODFBzoOX2ADxQ\r\nSa85+xi0VqZbdwl5IE/NfuK+HyoX5Fyut7Y=\r\n=HCs7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.4.0 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.4.0 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.4.0 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.4.0 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.3.0","baselineRange":">=2.0.0-internal.2.2.0 <2.0.0-internal.2.3.0","baselineVersion":"2.0.0-internal.2.2.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.4.0 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.4.0 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.4.0_1674685220314_0.24289975948732767","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8f1aa544ecefb34f1d7a49d950577c60574137b0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.0.tgz","fileCount":72,"integrity":"sha512-HjZ5wQs3OLln3fhCTSQYatGIPIRPCPvEh6yMkv+9ej9ESKirz1pzfd5uX+i4Om6pR1W2UZtGZnpLfKd7U9OpPw==","signatures":[{"sig":"MEUCIAChajvhwk3a79PSP4MD0LFpd2esM6dowr4o65pg9FBbAiEAs7A55W/fVN8MqROuRrn6y/uln80n4hfznlt6jbA8u58=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj1IL6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpfNQ//Ww54haOQbuPF0QvOAUOr4LnXXLLU7cU46JrNub+mnrdFsaJn\r\nE+/eS15m2H9qHzAUNmCIo6kGV4ZFmkEQ9bOp5HglrsbWACe+2fimrNfauobl\r\nSJnei0Xte4OD18PPS+zrWKFbroLAvsD4ukEXGNfQXeBxysiSvhCyz/5kUgOl\r\nZGchFD/9+XNqd6uz8V33WYzzLqxTG4qJw50E1j9wABAx8f4nBbaCX2GuE6Qa\r\nv+YkylZozxKbTEE+ujatknvCZRCpk5nKJL0gckzONYhP2hDS7hAQjSaJrAXv\r\n3JGJ4ELz4h7g1ysFDTcdOykINgnfDrf8HLhVQlHHllYHRV55jejSIGFbprrT\r\nvsnVncyfSCC8IRdzTONH5lfzhqGur+gK/lLIeXB01a7jmWtPJJF64lTaQ3w6\r\n9X1GnSofqzbpRZSa0OQQj87p/mWtUfyfTZZ682Xx6UjnGb74BX/6EgSMSv92\r\nKNAOwT+QK+g6MEPuKec+RX/r76uWoq1+nHNnhms+aOcg/CUe3Dl0aLC/rDtU\r\nQk0kC/EYU+qxwhxepTsAIrNaCKkj9pvDcDRPQB8ouNqMalgCIcBRQvjeiGS7\r\ncokOiE9Xs/3vrglT18xrBxsG4yuRz1bIh5cIdXkLYLi3fB1y7euDqBkLOhQL\r\nmJdbraVohS0HZVexqUepFoTrlvq1X1rjqc8=\r\n=7li4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.0 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.0 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.0 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.0 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.0","baselineRange":">=2.0.0-internal.2.0.0 <2.0.0-internal.3.0.0","baselineVersion":"2.0.0-internal.2.1.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.0 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.0 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.0_1674871545990_0.7928921420125925","host":"s3://npm-registry-packages"}},"2.0.0-dev.3.1.0.125672":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.3.1.0.125672","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.3.1.0.125672","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7fc4cb6e601a31db8d61dca2fbb52f0534c3b7b6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.3.1.0.125672.tgz","fileCount":72,"integrity":"sha512-g9sKOpRutkWXueDrfu6iL9r77rTVLIsJp35cAGap3j1Myz1DHAV7PEpBqmirO2DyOVTuUDevYP+d1KI/qq9ixQ==","signatures":[{"sig":"MEYCIQCEXl3K7hpkmEl1utYrHVYl7ly3FWNK5g7no2Ilg2axrAIhAJzbw6ViPLOJUAlUph2GA+r2dCtL7bXxZwcrDPDczNSB","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145702,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2UI9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpirw/+MDAeKNNhGfqkv82x5AekmtC0JlgR/z9N2fy2KxZlT/CtQZG+\r\nFns1KJTeKsYIxBc21adK5aTC39KIM1WfStdn7keWfnxDGWNu8NnY7m8lAL4I\r\n9EJiMRuFqvm6kl1zSPCn8kPTZ4KZeUNMMLXioCGoUv6/lGnpyWPGWxXIfghZ\r\nFtXBAbpj/OAu5Ls3wQTJYGy9qLftQvWPemJMGFqM+V672k7dCYd5J2NrjRbI\r\n1A/ObxswW0zUZXyD7/3crlgEK1vVm67vzrJu3zZTx7b/jltMeWvK7FzdJ0V0\r\nFmMGBod46/IdoPUGjqNVd6T/zKWil/XcmvEzvZbvBNOFXtoS4l0tlJOtrnZn\r\nagmw6+OHXhTfhyWLyzpWDDpj9If7R89ELWjRPGQ5hMN5cMem/YbYFs4HCoal\r\n7S1E7vcyk16WeGy/cY+eKiX4cITfWuSymCNBcQjlHqYC1FIrZphMcLodkrqN\r\nTpsM4EbJVkeMlsJ9jh5vWmb+VRrwEwtgZg8t2CfAQD5TIT9Q1VsfLQz4hSKL\r\no1Wey++UyS7+chN/EpyLp7fdxbqRFcV1c5TvWB/782aZ3qpl7kU+nW8/KlSV\r\ndT4KPgvam4wiNkkuIlu+8nKEAye2IEZIavoK4dANhD4lNBfMjStEz3PN8aJj\r\nJqFVtijBXiZ2UskPwvcaIgGeccwDFofxBmM=\r\n=zLCx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.3.1.0.125672.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0","@fluidframework/sequence":">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0","@fluidframework/merge-tree":">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.1.0","baselineRange":">=2.0.0-internal.3.0.0 <2.0.0-internal.3.1.0","baselineVersion":"2.0.0-internal.3.0.0","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.3.1.0.125672_1675182652958_0.28251374012554753","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"240bf0e7f73629874f4eed25ae0047ec48dc6a7a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.1.tgz","fileCount":72,"integrity":"sha512-0Wyy2ZBAusmX4U2gDyxQDm/Xkos4p540X7Dr7pAHdFfekk43MHfKJ+dj57G5TLsx8+vHROwh+wwsEI+WAe+xOw==","signatures":[{"sig":"MEYCIQCWuthTPimatz8wnLLQDnfWGYpjbsfA8gMpf/VmIDW70AIhAMv9qKvNyEh39wXQc3OSg+YAlvLaaq+ctwYG8RR/0wa+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj3aAkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhvRAAi5elQ9GiKzP4wgT+L2MqKd0JUiYC6+1/bVpf1dP0JguzSqDL\r\nmwUVpBnuOYvHbCGc90gUR1Q61MFuAtzdOwFLbsyrLPtEJvWKoMiyALEqJucC\r\nyEkRGSwVb/F+bjqk22CxhDT5zUqLDQySXbwkeC4pM6VFLmSvhNtyGL0gOFUd\r\nrKmtaaRTpgGOS6YqjOC106xWVEPpAArSBmzqXSKrdftz3AYrNVDO/ijCYDlM\r\nCfuSmfnnJzBohKs3CtyHTG9nPRydqr8IZQ56kBidIbnfp4JPNoVD2JbtMOqB\r\nkwoa8as7k0oUH/LRqtPh5M1hWcsP0jP1i5dy89Xz1RoFBYF2FROofJl/XbMh\r\nl6fxQMNLQI43YApfXbeg5spWo+p3PmhPcRNpXNfh235oKTIgnrtFsVRMCR0A\r\nOnatqmQCNkoZFJR4MRF+rxZE4eMRYT7gKtbU64RB0+OMRY3gTL1BLz8PC3HP\r\nIWhdFgdw+xDfeBcr7bMnrHZN1bV6zluLEjZ/LZg0XE7JD+bENNN3Y7mUp8Va\r\nowjX+NeQzHN3KSIK+1Wpd3hUcjVUK3CdkrJUAhCkZWEg8iwpCHqr1eOfyYHz\r\nvtPVvFtozcR00CD3wCThQ8WaV9RvgO0rX9npcjnIvXt3vxqkgkJFW9qh1onP\r\nPcbgjJTH3B3ISwOQtWFjR/ueIN0sY5o5dRU=\r\n=tRY1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.1 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.1 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.1 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.1 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.0","baselineRange":">=2.0.0-internal.2.0.0 <2.0.0-internal.3.0.0","baselineVersion":"2.0.0-internal.2.1.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.1 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.1 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.1_1675468836208_0.36276276015455267","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.1.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cab91c88ace234c834ffef34eb09c44af3f659d8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.1.0.tgz","fileCount":72,"integrity":"sha512-kMkScfi+QkyLVg14LYkKE+2diAcdvuLs4Abf5B3KV5yXTdO9DkpGPGFu9SidFLmQEdkKj+8d5C70k6ewp5DLzQ==","signatures":[{"sig":"MEUCIEwJvY3p24q0IbQGWZK8Pq8jDyjuHGomLhSE/FkLAB0yAiEArTngrucpdPSZi2vwT3tKurmFCCMfF30R8wt6CuxGeGI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5e1LACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoUbw/9HbiHAC1/2GeRA5gQrQg3BwrTUgbq5jFcBtvaguzFsP6GDxca\r\nKB3y7DV7Zx6PX+3k7kAzq2/fKZ6gEAaYmb995E6tQjU+19UlGOY4QGS28tLj\r\nrXcoljRWG7zPn6iuXwEnxeJkpsqNpRJcpkV5depN3MhCK7nqk0MHUPybhChI\r\nQFKqSp5JHt7hU+dnsNxw1Tnn27ubbUuJGASH0vftxhHFmqjTyr1HaZgtM2mk\r\nJCaOVGjOtKQACHAQ2yIFBleXNakTyLC1bUyuYdwp6IfBmpONfjQI0hXta6rB\r\nYs1G8fjATm9AxkSgDc1N4oVhhIsOKRQ+xDKwV0uGnnvERxnjxfoqsWd9lKyP\r\ng6vixdvexj3RqZTODxvx/zSryoC+4wDLm4aQ/hRTFsOn3HUH3Bd6Vstz2SXA\r\nH0kgIuI+vlkmGkFJYeUdlOn1pZTTBHvWu6cdO2O26xlmmUwznoWI28Cn7A/a\r\nHv6OqKYm7hZTVLKc2A+BkCw8ilSA2ydx5JsQXUl08Pvhas/hw5uOIYijvOkp\r\nxM/CCMxnco2tinb3pHOI7DenJiMkjizY1A1dHNuXejBrwo9bupcogkgO8WCR\r\nZFDZmSG47XdA8Yei87UgoLPNnov5E9TyAX2KMXbdEmJQhydtQ9YAyrF9ln2r\r\neLshKVbH9mzABwAoYX8ipBwZVnrHqQbWmAQ=\r\n=H4G9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.1.0 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.1.0 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.1.0 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.1.0 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.1.0","baselineRange":">=2.0.0-internal.3.0.0 <2.0.0-internal.3.1.0","baselineVersion":"2.0.0-internal.3.0.0","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.9.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.9.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.1.0 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.1.0 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.1.0_1676012874817_0.18991750074983527","host":"s3://npm-registry-packages"}},"1.2.8":{"name":"@fluidframework/dds-interceptions","version":"1.2.8","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.2.8","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"dd6ea07cfa07de74f63ce0f3005dfc9d175d5995","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.2.8.tgz","fileCount":70,"integrity":"sha512-AYCbd3kixbgOF9sirmGV95lLfXk3IXDr9NGab0zGhceisZFlC97wNmA3jOLQU8qbPKltsiIHBSpNMyrpecPf3A==","signatures":[{"sig":"MEYCIQCEvCNetmKHhDN5etbkT/E0eL8GAk5XVr4SD7d2RX+rbgIhAIT9IHfyMJgRTrAkBi8rVoRK4DbgaxAnHPRq49tx4fg3","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5o9vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpYyA/+KOsQNOTahSPLExPopAAEvQbR9dooWLD+dVr2BinHn2NYvYON\r\nDItMxZ+qbaW1V+9b2fDROFrCI9cU1EX76Q46KXQfd9wHJXw4mgVC4AXrmT+V\r\n8bZ/mofbOPpx1WgjAgIvFX49bc6A5PrYjKhzbMdH6kjGfek7V2MeGRfhjqUt\r\n/AtQSCnZpe/NhHNpOA0ngsFUmC1mxbn9tpySrHT188qSo85sA10qyjO2t5m4\r\nsxEaHOkTRP3fmM2KHU6kgAIIK0XbfAiJlmmZ0/pM22fOJvphenY90WYyKx+A\r\nuBtkTvuzUWd41IJiNVZ7hUzt20q+47c3Acr5a6fpYcp2W8jEY97/O3MVlHgJ\r\nKZudiQf/7l2TYFrLDrGzVVVU/6AxOQZUyt3yu8K51yn67dfL+U48yprUpgib\r\nulcrVq9FU+MqBVVxtqmrLUjA6XgcbZFD0JYiENflVWQtmmFG6Zw4pXy4h3xq\r\nB/zIDtKENG8fDo0JXyWhFWUWolSaRG6P8QlSL8MLfbzMN6+FPTFbfVPbPE3l\r\nGXAwxc3S+89+EJubBt55v/MUSrUYPowkGc3tauL1+IdUEuM+w357CW6eeIbU\r\nlDZCyWsWW+sa1nczQ1JGpPSt24tDA+MBjDtAkDKSTA3JpPuu0r4skPPtH+o2\r\nBQqOeuZuD9PQhT4b5YFkmrAjZECe2aOf1fo=\r\n=w6PN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.2.8.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"^1.2.8","@fluidframework/sequence":"^1.2.8","@fluidframework/merge-tree":"^1.2.8","@fluidframework/common-utils":"^0.32.1","@fluidframework/runtime-definitions":"^1.2.8"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"1.2.2"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.2.8","@fluidframework/test-runtime-utils":"^1.2.8","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.2.8_1676054383462_0.645786139070337","host":"s3://npm-registry-packages"}},"1.3.5":{"name":"@fluidframework/dds-interceptions","version":"1.3.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5e16eeff80ae2737920040a37a0fd74136770e34","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.5.tgz","fileCount":70,"integrity":"sha512-NjTKXV1Cm7sQJaov6yWGJENx2s7VIyX/2RknVRnoQ/gUKYLlPKEVg9uQy1fjw2KK/Q7RCPZnGQdLm+LvROX8Qg==","signatures":[{"sig":"MEUCIQCOeLT9j8TRgv2k4ggWgYNs3ChH2SxYGfXs7i7rST6PvwIgOXGAVhTGCOhv0sjDNlLJ75+TJZQ2j2l5dkZR7qEF0l0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5pDLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjRhAAnqiC6xz0oKmtu6uEtkrk69ykshXbpsgbrOtYbbQ3fYvesTvJ\r\nI6daaNeJatXQkD4DpqjCb/vyYc4SNw9h5astvgUtzsDYFrs99i758jQyuQUE\r\n0xONvFFdqqhMT9uBQzbYSt34HFW+xQRhsLTtlRQVamggG24OEYDUtxX9Ss5l\r\nNT7V7h9c2UJKJYNeD8bAHT+lrBr2AwM4ufoQy18bHdsBebdRuem5K5mlVNEk\r\nSqsHsgKgwCgtqHpeMc5QzqCIoYF3ZpEUIoU1QWemNt5NW/7r2OmdypaBlOyw\r\nK5SWCvM2j66lmS9F796/Im93NX58nw0df1wl9wh8Cg2ynpRQDseuT7l4QL8b\r\niWee5rEFhVCgnNFgfW+J3lhU8dmfc1I8giUUC1OKikkT6CjiCUnCiWaG+xji\r\nbNBeW0hz0A6fCrNFwZTq1a+/yeIf4p84WlzkDmtd3DRpzfOEOHfKUogRMppT\r\nLV2BMnAdnb4mGNB43ocVJDgZ6QLnfsZuZQzmLQRXdrelDTIHD06L378anzNA\r\nXf906vbSiJ05tR1KlaGyRjiSVwyChe/zFzBmj4OoAx0Hnr83bMmStEmYnOEK\r\nOik3uzZ+5e14WibFemZ6Px84xhIYMaAf0TWkY1ZnB8/vHitPd3Gw24ThgjWi\r\n1MhNkiVTJR2TbHWm9TTLh+LcQMIiQDA0rj4=\r\n=u/3o\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":"^1.3.5","@fluidframework/sequence":"^1.3.5","@fluidframework/merge-tree":"^1.3.5","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"^1.3.5"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.5","@fluidframework/test-runtime-utils":"^1.3.5","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.5_1676054731263_0.9114634214667103","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"4fa6934b360736ce693a1e469e8bc75ef621489d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.2.tgz","fileCount":72,"integrity":"sha512-S4C26cxZBtaCh/TZJkdGlaES68vnaFQE2JWhsc/IbuxW4SOCU3hsroVdCgqf5fdgl/kXQHHYyz9E5kkL2P1JTQ==","signatures":[{"sig":"MEUCIQDcajQjWPs3p7h5nyJ3Z0Dc2lerDSQSozM9HFL7BhglmgIgcvIS4QMW7c/RK9tie/dyF77suh25chmFeqapnAbk0ZI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj68lWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGnBAAnPhZCERvpDShY2TZ6IqiOPT6iAiCJ/BhKMc2v+Y5yOBosT+e\r\nmKiawAJJ9BU9FSZjUwvpAAEVmAweaGKcFqW9PTpkIw+d/zRKO192uqmzEEyH\r\nxRevGJ70khEuX7t3k8OGNtIu//rVEsh7PRU0prHkhiDr4mF49vB9x+vROgIS\r\nYgIWaqib7KIix67+9jHlWlyZxIsmUZtbDY8/S2gpyC50iCzO/JWgE+0AnjdX\r\nH0VmoSozu8ITapY8mN9xsp2W4YOMiXTP9XIWID4tYphvKp4TkhyIcdsPc8qE\r\nyLEELCUkpE1+xZOeJweTxtzFbNK8BD5iEGvwQo7FwRITOMwINeWkJcXgW13O\r\nWW2EEdDdgyx5Fsy9ImKzoa24el9fhk1gReNREb7oEUhi3HqMAstnn/3mtiX/\r\n+nX3Z4NobhAf79YN4goOcdTNCPXLxP7N947y927TB5dT2IYxCjxUDomuj1xL\r\nb0rVGm8m1V0oTpLJAbvi+NTRHp0d5C+35jihRDadWWht5H21DrkjqH6/bt84\r\n5jMC1qmSXHxsREMzvq1UP7rMvlajQK/yH7OfVRB+XRACg7Vjd3MbYg8GHyai\r\nqTPdvDoV0iWytaZaqxXXbhSL/K7ZD5BT7ciKmM0RZUMHkIUZ1fyOwvXCX+P+\r\n3fBMxX+HCm01cXVbYh7PApYXGfqN9K7CdNE=\r\n=xxZB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.17","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.1","baselineRange":"2.0.0-internal.3.0.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.2_1676396886681_0.913617159328936","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.4.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.4.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.4.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2bdbfac805bccfebf1b15a302d89bd3e342baf33","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.4.1.tgz","fileCount":72,"integrity":"sha512-LAH7XlALZNWvuBHMeZn7zH2tEjN01uWC0i2l2awq/aQS+OSwEkY58GdJ9VkIUvZDxJvH9/qMyIzkGTtHMDvmpg==","signatures":[{"sig":"MEUCIQChA9KP2Jqkj5tlUzSiuj4pk+Qe2T2gn0oTm1g+dPu1lwIgaOyehqmWHeWr00H4eHxNvdEw7Mj/gAZbt+b3UTZB5eU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj9/Q/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoi5RAAlF6xhqxcU7kannss10muyx4HPZQ9p0i2qNZ1pudYqNeUgQN5\r\nkTpPyg+1RdtuiD8bJKHn9NNNohp/8UPhCBzFAl6RdnASOWjpqsaYmF5F8C47\r\n0jumqESYESiwVLy/L90bjMrvnIcIX2TqkWd1lcDEli/3tB1DF3MfRxWXxzxk\r\nEMxYqCQtzy+0I9lzFzZB+Xa95YhdGyPdIq5cgndQsOQxshcxPfPtdyYckCna\r\nobw+n533vYpBGjbKhIRPEBajWnFVp5ieGNJvykpXSp6iBzGMvGoUdIdE+p/o\r\nczNGpiv8dUdhnqc2EW5og0fyOXi6rlsenDZjZRTfQBiAGieLX56sxkD5XcdR\r\ncxboKY+TyijiASFPHw1SOAogfXKJR7j+CFv30u+q9QdPa29QOTGfGLHyzv3x\r\n/QSfYz/1wUOqf1ZrFuDYo2ck1G5z6OJ8I0C0m0Fg5NRbqXG5gl8K9k/NM84p\r\nPTimQtWaLfvXGXZ4FNZ+v35NG8TX7IvCiDVkuTcM1rM3uAQsuLEjOXi7EIIw\r\nrd1Di6IkjVIt/44caB40CuZFijKRPqb7KsVkCTi5md0rKsWiwkR8oWDBv1kT\r\nKTudF20n7JYpneRbZCT3uLJUfYBFlZj+7m1JmM02y51Nl+l4LaXGMfFhN39E\r\nl/zG58dHqqnABRUJ5GhSikor6pe7uA8EGJk=\r\n=U/xN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.4.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.4.1 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.4.1 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.4.1 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.4.1 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.4.0","baselineRange":"2.0.0-internal.2.4.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.4.1 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.4.1 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.4.1_1677194303563_0.07417457951537765","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.2.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f433373c0d7bbb0b2623224101df56ae3a084543","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.2.0.tgz","fileCount":72,"integrity":"sha512-SvIY/J9FNiQGXY31WWvW+vc6Pwoec6dBV+frwuh55+a0Y2kQL+SF6BqOrVBG9MzmY85FYZJUIiNDooGUbANhnw==","signatures":[{"sig":"MEUCIHu/i9QRpM/foAnx49uTMymA0lpPuMg1jCG0Ebb+UBN/AiEA1tfo1dGGlwnxLpRitp8lFK26CZQH7aVv1m1Hxm3Smoc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145705,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj+CfFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqvjQ/+JALFgsvMzAEa9Q0T1BPE+kL9AVFWky955KWyhQFMhwQyGkcp\r\nUbBb8rvf0HmQTDSXBNBMvae3FaAdbANMzE2Xin0to2wjqt0sPjuxWZX7TCfX\r\nJa66Yijd5pPGAnsLmQE66yHH2W1DD9eKMEpjG3RxvoiF5K9SYiPSZcu2jjSz\r\nG5dN6UlW2TPgAW+MN2W/rlb/KsLraS/0LaMLYlwZCKFpMR6jx/JhFDbfL7jg\r\nqOWE8HhPTDyz5W/PWTsLNTH9yrQnAM4CZb3JAJjwVTLqYDuH38B5DFRY62Y2\r\ncwMI3VlxRtLFk0SDR23tad/MmZmmJAQa64YlOOq01YruNngFwemWLK5XpSM3\r\nirQMWfvkSKKAvwIiIvuo5vxz2pHSrv7pIwEC0ZqHEA5iFVwgCKReBTFlUo3E\r\ngOmWZBdkf/ll+rO8FsJ4WOP5nU4W++gj0gP9cv9iFsAAApUbzfBSMtG6P3fQ\r\noMb8/GkjfMAGebEk6kKQTyNtRClTCE1XeyNM1SPbvymBCW4aeuA2JIJTete6\r\nwMUSbEiKnRx5hpluTwlq6gX4VxisDPmw2t3HkwFCfyiDvoZ4Dl46mZgnoXWv\r\n0dW6t9b+LjbBG9aIkbLixLE5TIJH2Vyr/UOow86MmGpfoAbvcYUVckshxqR8\r\nopLtUsiTXIm+a/39iVjtMayoh8hR6L1TcEE=\r\n=HYmz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.2.0 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.2.0 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.2.0 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.2.0 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.2.0","baselineRange":">=2.0.0-internal.3.1.0 <2.0.0-internal.3.2.0","baselineVersion":"2.0.0-internal.3.1.0","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.10.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.10.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.2.0 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.2.0 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.2.0_1677207493021_0.4952525692116898","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.2.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.2.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6354c4271bb773e80600695a924d727d8cc48a17","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.2.1.tgz","fileCount":72,"integrity":"sha512-VrjqK8MRa6niPGHsA9vQyStHBWzscWBeKpckCYX4nZ5OZswPuipsKc3u2X6t6q2LELHuIABIJoviaZcaCbykMA==","signatures":[{"sig":"MEUCIH5r8hau2gHYzaspbmF79mZdhIutp85NWthLkE2LvdJwAiEA0KLQ6FiH57r36FJxdiyVd1ePQGN1TtU+fXvLdLT0R4U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145705,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/SgSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwvA//Yk+OrBbV+BARKUx6OvDVjO5QPZw8I5c8NPKuxAMU5NWdG/DU\r\nmo/C2kt6+X/6S4PCKD9Eo0PiABYtgw19RFFRBDUK3GaaAWnnLpq1xn0OXMt/\r\nwNxu+qCSu9hRt1E6X4XE6VDDJwynJOCxMEPMpOD+GklisAMFcvC9yFSh1jCz\r\nGG5W/uO7Js/lDvpbnRUJUY8jDwl1wyEyIFJcpv0A7uX+sGHyiMNYBCkYNmQ1\r\nHuMB+k/+m96q/5rXtxbL2Wy2mbY1HN5A+ty0/QdSOxNzbUDXUvabDD57r/Z9\r\nQQ1DmNiVG5dgBDTRlUKgIlBjqesVZ6FHOpc10EP+D15c69cKQ8W6O0D/5kR0\r\n+HTzMWei9OfePV0qcbR3/JCb+4umuQjIc76Izdi36Mgll4xEqUwSWCbUL9YF\r\nfYl1P0OTb/ZK5JxLxTBYzs+9EnUkj2ni7NWE/DmHLNkHF17YEw5KPHWAMzpT\r\n7XduMT7bpcXJdoJn8yTqDGtTmoWDpMtoAl5FTt5S28C1jtg7cckdayivOwVt\r\nWNyAlhKZkPfo6eL/l/oSDftl0Woq3LBnH9LrGUoLtKx73aUZw6LGUC79XPEd\r\npTHCdunSQOInAH47G7FWanURBtjO/yVsUOT1oCrgNY04WRIGKoIqulQm2dll\r\nNzZekaTAhlrVd+I1BFV0XJhN90tEG5KB/f0=\r\n=Kxoe\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.2.1 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.2.1 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.2.1 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.2.1 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.2.0","baselineRange":">=2.0.0-internal.3.1.0 <2.0.0-internal.3.2.0","baselineVersion":"2.0.0-internal.3.1.0","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.10.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.10.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.2.1 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.2.1 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.2.1_1677535250749_0.6943392659681493","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b2942e1c754f44cb1f81cd93377cb49490ed42b2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.3.tgz","fileCount":72,"integrity":"sha512-UhAI5e76y0tRFxQTcWHJfujT8kDTKZ6mVX8WAdhMFmaU2HJwu4ulziWqaYjSjKFvjeRmHj1HCZ0xJHzbtMHpfA==","signatures":[{"sig":"MEUCIEvxdYAAOOOyVLz1wx9Or+fa4fGLKGUv20XLaaUYbERTAiEAhrgswPBxY2CdDQ3tWplR1c2gU8HJEXVeQG71URZvWJk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/ULeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqINhAAgWixcg94SGBlXkJj6qQ7AygqM9jxKoe5rsz69LGG6Mw3cEo+\r\nMGDnE5SFwA/zoN9Ny7+dlKZwPFj4pt51Yvl6bCX3z5rEMzwM+tYylTWk9kUL\r\nJDJM4I+zC2sF1iUkzCUyEm6V4NGuUYSKGiTu8id9nzb/V/V6R1ZuNIIMG6on\r\nB+iby6L9Ite6yacGflmWeTiQePrkNrAGbcHiBluSga/+9pnvv1AGgq4avqDT\r\nxV14G4L2QTbtWxbQftMAuK8jxIJmu3B2+lBTZhl5TVigZdtfI7w243fWEmZ1\r\nzXpnu3+BLIck91DxT58aMBxMgcrXdcMFJ5ehWB5ng3RLly9YjpmibHoj6eQW\r\noswGN/JKjcXLJyEPfV2t3dMvjnV8XBD9ZBG5mlDox1WLHus97E89p/YsdTAG\r\nzac5EinRCHxcGODTAGvqdoA+4N04V/c1+e1VSDgB5ODed/0gFzwJgoCAMFvY\r\n6EBVy7d+zY8dGrtbg6N6uBGzasbqo6Z1+4bp3TiFoKS/sICZb/J4oWgBZ36X\r\nwWrMXhe76DB7m4pdV0yWCYOvx42Fpi2CqNnwNnoM8PA038Bq2KfhfG+SWWnm\r\nwjOOg4jvBFACzaAAphPjNKKiDgZ9ndD1KE3e63kloHS1HC32M5x2CaRUxKWe\r\nAviyqsWLc1RUjzCawlMiuLCg9WZd62QNOkg=\r\n=CcFQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.3 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.3 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.3 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.3 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.1","baselineRange":"2.0.0-internal.3.0.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.3 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.3 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.3_1677542110074_0.002304867649964626","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.2.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.2.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.2.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c6a0710d925001e277df4eed706052bc4f0920b3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.2.2.tgz","fileCount":72,"integrity":"sha512-1VKcJ6bsC4V/SW689wsDTuPDPAzcDynoDhq4b/7nuKALaM5FwCiab/ZdpzjgQnnzaBPCQouB4CKKU+rCwOjrIw==","signatures":[{"sig":"MEYCIQDKh7lfqvlXTEkivLrNn2myp4/KZH3MoPiOrpNKPR70dgIhAOv/bfhAderbpk0vmZIHsD/b43c1VsidHYIdLvXIawaW","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145705,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/paNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqIQ//YJD9DaLvyLL6dzsKpdoa/s1tjMOCFnkw8sqHDA574Ji/4Q45\r\nHavRg0Hn2l9aA9xCssoQEwoV6b7lMU1xVuA1/8I1Q1b3M2I0vQbVb0sgdbQi\r\njMJcVDt9VmmUXvFwNsBRTwwHF0rNwVM3dsT/IcQ/XBZgniYWKV/hKtiCCL8c\r\nQCF/iUtPBapWyb8PHSUk4z9O1PwIP/2Hww+nuFR34Y6bMAyGpVXp1QSVNBRI\r\nswf32PWiVDOCKhG5ADB0zTj0ajRoZVZIZ7/dg3qZPJhWWc0qX+zwkSj5XmGO\r\ncPX48jCgkTlaibjb64TmL9xpLR4GaEHit9R6JKgz6jeE0wj3kGSrsKidDQdO\r\n4pDvW/46I5OxPZ1q3J7wfGR9nvqCqV+Uz0MBPprXl476l2bYor/Dk8n4/paG\r\n/TefAWkXILr3n43JzRsy2jzZtg7eMhwrbOrpR84MYVYD7+RXQTeGu6Tv0NUo\r\nMGWZyZ0KV6GzPnFgYrFPu1xtS1EJQU9ehvS7swU4RpEXYfA6PS2z7At0nK+Q\r\nV50QG6fB9aYd2ZJSAq8xbMPHPZkZmpuqfrLwRfvbn71LgQsWNb2oTielR47P\r\nBC9LNh2NV3Gcb+KKBCatAO60rvWCwOvV+wp300BwcD3yAQZP85TOrjmmRAvE\r\n7Dw2e0GmdXsuPi+/MSoeFKzpN+J6pky2gv8=\r\n=I4MR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.2.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.2.2 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.2.2 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.2.2 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.2.2 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.2.0","baselineRange":">=2.0.0-internal.3.1.0 <2.0.0-internal.3.2.0","baselineVersion":"2.0.0-internal.3.1.0","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.10.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.10.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.2.2 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.2.2 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.2.2_1677629069109_0.04908104156764592","host":"s3://npm-registry-packages"}},"1.3.6":{"name":"@fluidframework/dds-interceptions","version":"1.3.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"303d2c7b4f5d13cbf19f914bcf74386f8cf9eed5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.6.tgz","fileCount":70,"integrity":"sha512-rF7aMKQUGkDvrusTS2A5apl6zjZjLlnoej9y2tTRHHpW7aSPyLxVpe4+DWpKeq4Tx49z1ijLz6qDGMQPPDsDRw==","signatures":[{"sig":"MEQCIC/G79EpPfck9D6jIfi5zl8lY7MVMK+ScTMhzqk+nHUqAiBO5+vntlyga8NTI6cZBCSqqasyNP7olwiColdeA1PH8w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkCPLPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZSg/+Js2cnmZkgb0u0yXc2w0jatdhV8jCcoQlcTdtf1Qi3eZ/742g\r\n9281cIh9uEd4/3mYpNt5jLf+0WpELX28Uq1MI1o05l/J9vkU6LIUi8j8wd9a\r\n1CcCs8SQ3NfZwalFFQK6ZpC9i0Bb4UlfCOUY40e/zlmr90bOdfrVbs3jPL0e\r\npsgY46CaaxrYUaJfbhqGz6tmz3u7ghcw2EMumRwmfzC1ZHg63IVzU2Ul/b/D\r\n1ISPIqzM6eDswlCNKuTIf98godLqktASP2HafG3mAOuLQZRSpurElNubxthu\r\nrlsJBVavD4wXoYTM2OGQHdwLJVm36h2DCwNienYfYmMK8E2pXphXlRN3a8WN\r\ndfnnyIWNIEVWriOzVyqwF7lir0fhYgCmB2qmQeH6EheF/UYASUpmD1mIkQyz\r\nsvhk8viXXhRQ1xQo+UASSBkvExgRmCN+62ovm75+3MqV6R6xmw14752WMjLn\r\n/vJhSK3mWiK67Y1IdA1hu0zNiKNMDUHB8gKO49/mEo6aSYVG4szYRAB0hZga\r\nm1R/AUe8utsr7Tqxd9TdPVxxDbKgVh8vE/3m4Q6vb4PtCVbGpe8wQizMvKfP\r\nPZ1pihOxQ9GD+kgmirnBVvK/jBSY8r6cRwQlkeOSEH3WqyMJjO417f2a6d7C\r\nKRyQEmrxxWaXrNj8Z6+1736h8vbnrtYN/8I=\r\n=NIu7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":"^1.3.6","@fluidframework/sequence":"^1.3.6","@fluidframework/merge-tree":"^1.3.6","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"^1.3.6"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.6","@fluidframework/test-runtime-utils":"^1.3.6","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.6_1678308047200_0.409499592435667","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b99804c950d8719a350e583e89dab35514ef0a9b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.4.tgz","fileCount":72,"integrity":"sha512-ntJYWZzoAI8q0KzbqILAmR01XENI54UXSRNMb+2aU6SeAKUG/gU//vLf3T73UrSAcmH+Ahjg3g4d/wjGsmDAhw==","signatures":[{"sig":"MEQCICFbNm+tks7o7Itf3N1g55eWNQAzkgQx2nsTJmDpPsz1AiAjXP3SGI+/rqGlRz9VwbKaTAQlvGAZ5TonGE4+2YsGhQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkCoEtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrrnw/+M9TEmpkUiNF2kGKjgBiJJcT3aboJxDmjRulf9iWtmvzIKccS\r\n5SKuCxXiaHPpWijJsAccLLrrvJqY4vsy9FlAqcTnoB/inmSZm61X8lwcxsEd\r\nU+lA5X62vD5e8bmspW7XrbK/31EXugDgN76ztjFdyATUNyKcSVJu8u/HJx7j\r\nEvMHEFnHDF83S/Ssn50hBPAMwqy9eSlkFKjflA7wCiKyuPstYVgu2hJrAYQf\r\nzMwB8EHn5UR/YDJw574DmYpoicKVDzCAAt9GC2jWSrdqtb3icu6mSSTzP2ip\r\n5KTyqSlqR45XBHq90SHrX38++nE/dULLiw3U62hchZgcyVRNiTp7Tt7EqCOi\r\n3gNMBrXkAasYDG7CvzexsvSLVazD9Gq5Mvni5Yfq9QdQeNWd5L/e8KvbxH9V\r\nb51z8pPw6iSrF6AGUNVYo2dyYKgknleSpPfeNaPFIoPoWiSV3QU5bnuy8sap\r\nn01DIMK0hu5BWNBGwmBxwVB+0VC+zQk0rF4STGcT6zEEKbCHloWnhApBEU86\r\nm27tGy6x3vKs+/fnUHJAa1AvarjgTB+vlqGvSKr5ftmQx1NHar7/bHutb3bd\r\nglwZvVHjz8mffx77cBE+X2d3CjeWqMbZXUk25lbnGS6vYmfhdEMtL6s8KjLI\r\na3+GjxwsQt2OrdlM8fLEDx5TIOau22IGLqg=\r\n=2Lel\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.4 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.4 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.4 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.4 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.1","baselineRange":"2.0.0-internal.3.0.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.4 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.4 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.4_1678410029734_0.7817984103415601","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.3.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.3.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c9e087b0b8ae7b4483ffb0db2cd0412e566ea1d2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.3.0.tgz","fileCount":72,"integrity":"sha512-Y03oRsRiXOvRw4r34pcr003TKKm/NjyjvwZAEYTHAXwzzs1kc11TCycWWBz5xuKhfu1m0iai+0uftuvNwprUvA==","signatures":[{"sig":"MEUCIQDRAd65VX0XgwKY6WldobGSYqHvDg1AaOqTOFnvapx4XgIgLihfiRdkIHIi69b22DVb205221fg6kIkTWY//P98rtE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145487,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkC5OSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2bw/+Poybuk5tUva18dLq465pVU21N8oyBmzyHRxDajqiyF4dq1TV\r\nJI70VWOSiw7iE0+7e5row37i6t/DW6R2pWJgaLy4/U88TYPQ6FjWM1iayMR9\r\nsHyeGtr57qQRG0r1t06ug6tLTaGYaArY9ELhO9LeZT4ZgsI8tieb+3imjMIX\r\nTAl2OUbJ2jy0Q7ZnjXi2blmoWS5Xp2eB222loxCjiFtIvWwNKdyqyn+hPv01\r\nMhcY2HsAHlC8r0jnrUpi4OTcJpvDxLG92bl3CGGxm+J3coG7HWYU3bYHWvON\r\ntF2vIb8DrfHW/JfnfKsqfcodlZenEMOEmxn//qAcL9uPryo/kNjdL8PtJyMU\r\nb4n8hyb779NBljP1ABkZxNf4r6ZZQWsFRIgk8BHbuQ5W1Z2q9eSCOCgE+Jl4\r\nKoPgKF7KJGgSLyr0qL66eVowuXGBiLcEXPyUANJk26IcR8J60ZhfoHCAG/vC\r\nzXAP9HYIItL9BWvk1apy0q5PDO4xwI2bSr/UW4ByXrkMZCq8cae83KmOSyw+\r\nvSjc7DWoEqFNznF/Vjoyg3XlZUR8jDVDhAcoGZiO5vIXsOayIRs7RMQtYf0c\r\nNOKTE31KZ+Nr6wo82sso1kXItDimwrcooOOyGdgjgCVUwAkgPRZZIzfAhDlw\r\nN28oHFw3HjVc1uHPipVzdetQHFUOTYPwUS4=\r\n=uQCz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.3.0 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.3.0 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.3.0 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.3.0 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.12.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.12.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.3.0 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.3.0 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.3.0_1678480274022_0.1585837547006137","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.4.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.4.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.4.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2f7ba4e82f04b4a37791dc30454cf82d83ca9c30","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.4.2.tgz","fileCount":72,"integrity":"sha512-Xf1pzOvROQ8fvAfk2A5Dlp4kOE7ZJ/I6njNNaUg6cohKjc3zGiF4v3YIP2II8/jCXjBedWUWBnP4Y0NqpsptiA==","signatures":[{"sig":"MEUCIAJVihUh3e94bl5EIv3ZKfBd7MAA1gy9slhzL3NI2IfaAiEAvKrsSZKOyrgjGlMEbYTP2+D54nRa2+0lI6sc9TeL494=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkC7eIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrG7xAAokB184mNqTBvGtkc4fI9CVzvx1oecjulodv5cDK5vRlAdi3p\r\nIxQcjRs4WOlDNzX8T1+ZqD/i8K8An15kxY4hf0d5xpYXmzGBtyFXS2zE7U4n\r\n53u09PV0Mz3KeqX5hNzieLbwqBf7nWOZtN5qS1FQHK6G8GnRAwD4BsURUNiQ\r\njFALkpEkZYY+4B1e+Dy2HX8dyd9v5rMHUTZxCfwUKApzkkrBue5F/IsutOry\r\nRUv+p/JKsre/g1cMnXgQ+R71aCMwg3GjzQ0selPNXgZ8yOP6q8HkslN1pqez\r\npnyqn/XutPhutbmjusc1al0GUQIoI0Fjmj0XCgc6lb0Khmc+JuDQzSe4pD3H\r\nGDgjcVWteojGIERmezLtE82YDh5kgw1IA7441Mnm75wgsyLraukoQep9dXn4\r\ngFI12p+jT7RXmANB1dCaj+ZDr//J6EaD8x7n73hgUp2iMAJLEXzNzj3HteA5\r\nndP1E+kBpQz7b7uxgTY10GJRIY2Sw+PHhonPpSvIcHKfIgSNc5CXqzJlwF7w\r\nsqV8jviJffYgxrcExx/a1Lh6TAxVU/LRed7bXiT/onD3Ga6TZmHXdJ2LJfUL\r\n9sFrNo5iYmUA++oMQyReMBaJP4WD1/AntWa21L2xdWDI3SmT3qpDlIhLFdmB\r\nIHF1DLyHjE1Rz/vJtqCYZMttjAf2eLq/qc4=\r\n=mhD3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.4.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.4.2 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.4.2 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.4.2 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.4.2 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.4.0","baselineRange":"2.0.0-internal.2.4.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.4.2 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.4.2 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.4.2_1678489480139_0.3835855547976714","host":"s3://npm-registry-packages"}},"2.0.0-internal.2.4.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.2.4.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.2.4.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bd4747176be21ca0b84446f32b29bc6c97f0d32e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.2.4.3.tgz","fileCount":72,"integrity":"sha512-98m/QufDsRv5h068HOYH0h4kTeNVpBzxgr3XbdzePvdp1PHQ4LIOMq1U59wgN0Qpiz2BczSM/+o+QblSz53FYw==","signatures":[{"sig":"MEQCIAkl8sZ3P04VDIRcLidkarjXhSeYq48xlJdulIFIw4BEAiBI1001pCQ3Urfud0JlQ4iecSVz0J3o8z0kenU06/J23Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkE3coACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmriXQ/+IkLDXFmtmjA7aH4dGfiCytQMuXSrx1gwEOYJMh7e3rJeNkmL\r\nHjqTpCqL9VBJDmtRK0hQI8/nLuqN6p9dG9otxWKp1irJmhfr3RjeJg5Lu8Tc\r\nNGIXAm4+BhssIEW9pZq3NzRLSaARPzDgH4yae7KzwZTFRYs2VVYJp6A3tWv9\r\nTj9SoaBWdQS/hYHvrGoadndnq5evFbMzixMFGcyD/trezVxtMUl4X7vbX2pS\r\ncq5raWB0gn6gkgjDIYwBGFYy2sd+J1zN9JB8stfboWz7C15i6DWhR3nKFzTW\r\ndgLEH5jW9Sed4wV3mTCqXWd1xXZXRWnKJAu1QxmXmb7O82Vx2vXTFX6U9wLi\r\nhF3FjW/v8vOT3JImHawAR8VZf4wNKhTp/8hq7kC2A+5UnZC90GLcfPbHd7Gg\r\n0IYBq9D/6JAvfe46jb9qOqQFh0evzRes5nnWFDgHgMrRIeE8yYxaGwKeQAii\r\n9LgADAffnSxkRzauIMEZ5LQqT4njYjkdHzJAREK7Grl6YiveHCnK8JMtO9Cu\r\ne/dj1CmWTTE3O3aK87a8bR/y8hrMXsnFH9w+w6//0DZjj38sF6II/xGb1Xet\r\nlXz5x3diS+1pxRojvLRz8mHwOqP5aUEnFttLy2fv3Ka95b7lMzJwcB0ZpBET\r\nLEmsvJpa0/hqG87bjAO3QHfKplbpkyIsm+Y=\r\n=+pKW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.2.4.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.2.4.3 <2.0.0-internal.3.0.0","@fluidframework/sequence":">=2.0.0-internal.2.4.3 <2.0.0-internal.3.0.0","@fluidframework/merge-tree":">=2.0.0-internal.2.4.3 <2.0.0-internal.3.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.2.4.3 <2.0.0-internal.3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.2.4.0","baselineRange":"2.0.0-internal.2.4.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.2.4.3 <2.0.0-internal.3.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.2.4.3 <2.0.0-internal.3.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.2.4.3_1678997287981_0.8424990899964797","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.3.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.3.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.3.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9db3c09743eb90b3277f7b233c4b9122da32d0ce","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.3.1.tgz","fileCount":72,"integrity":"sha512-GDzxCj0jilVp70EWX7KOj0aU71C1puRgUwDmk7YYj+LrL9JsOJMNKYaKuu/pOfXKebm2UsqyEyVk+UnOJv3f3A==","signatures":[{"sig":"MEQCIAbyGn62+R0MYlOndXWZ0RsF7EBm4OybVTRsWLkz8FSuAiA8CN2L7aZI+P8ikOvkyWsyEQZX8evr5aD9TTz3u4FBJg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145487,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkE6h4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqnvw//ZN8N6378W5Upl28+xTo/ZmvsRlup7Kc++c/CM/njiPKKQ163\r\nHuLzXEQpu68F0E2Hj7S6wLCwOfMy41yBRWc3dBtzsw2GqUGqfEDFSkRQiODO\r\nfkHbyfKhsbzfLl4jdYtcO4sCAbuZTILlb8tFN8HXw7BfSIpKxpp6wvD8oTt5\r\nnCbDgGYi4ikdfUrpl0IZBByyM2e0mBEvSnuPVn5v/+ZJdA4uKHZx1iGR2Dkk\r\nfNGYDUb5cjcwnHfrOwG7KE5iNiKIXyQKEG9X+NMon6SwIc1mBmqvuRzX0LYg\r\nfSbavHRX+503Gs1R8D4TUKTZkpSr1G3wOGFFBckSBUSZAclSu3JDQvOTLd9D\r\nlF1zGDTUFIGM+upgFHPwATtEgY4OiCk42ZzoZVzidW3QIrtT6lp9Id9StSQ3\r\nK+UBXLbubT+Rr9f2aN7uns82cdcy3h0x06wmt311QAlzz9XslhhjnhoBVQ0N\r\nuw/+eC/xSlJXerzTrCFNUpnh6cwidD+EBW84HVDjXv03u8j4jMOWX3qH01BF\r\numwGqHk54QjgZQkWsN8RQ4kzqUiWAJ6/SFgV5r6aO1y1uMq5n4wrtggPp6tX\r\n/6fuETp9C1AcdbJzlXY/eix7MsYolmQUumVE7ZRE8rQ7PUHjUEko+dWwzwEW\r\nUO6+BsRokLi/vO5QfAmgHiOwLi9sN/jy9lk=\r\n=8ix0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.3.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.3.1 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.3.1 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.3.1 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.3.1 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.12.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.12.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.3.1 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.3.1 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.3.1_1679009912136_0.4507326777086862","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.3.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.3.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.3.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"08502c4f2bbcceafd391316540dce51e4b25e9ee","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.3.2.tgz","fileCount":72,"integrity":"sha512-SG7AWb9ftBT79VNlJUX+55XlwgSQ5fDX2ukhe2qpylnFmVB4g7YFg7ZL7N9ZvFL79ibsK4n8MCav4r7KDZgY/A==","signatures":[{"sig":"MEYCIQDTVxRBZXqBwVkC11ZHN8yEtzIeRUkMSgZozDNa+BqVcAIhAMkEunPyh+0GZiSXsQJkqoT6+rOy1ntrjHlga7Z372Kd","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145487,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkGQJLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1Uw//byKfuERWWJOgMLwz3/lnx8J8dlwPnkLmqG8dPX6zcZpSCYuF\r\nv5WoWF47vKj7XuQNGM2/GBTbjvFowlYucKqSLi4UayY7x+ngrrwhGFzXyyIk\r\nmoWXjrGrbjmlU8QhE8/myxrm6cjKIdUwSDLDLs5jgtjPrAFW4BjvAy3qTFLY\r\nKv5EgjVv2Ju0n1FIXvA/tIgVsZdgeGSy0741STNccHnsoRlxeeQHjWYWR6LQ\r\nWFYdCpPmKXp2G/fZuExpnrnMfhVivau42oAFa+hkmKTRkbfAdkI+vihVgEx3\r\nygVPnAvag2DTeyrLtk9BbWCxQuM8BUJrFBWmDp1Wxp/sxDP9T+OC+CuQVMXa\r\nQP6UScgi6uWFRLDeU3L6e006T2tIn6j1jMF2GL6u7v0tYhdIm3YLEEfGK1d4\r\nyG8NY46Q/OK76bKo8sWHs+AP9jJYKEPmvRcozG5+DCuxu3CyOi4sFOynXCyZ\r\nEH1kkyN1e2PKDg6oGNB7FSwahp8ePDmXz5fs4tmPSWhGwHJTIwmQmOh/OZVh\r\nqJi577Of/qx/omZZdo7XjUPfFGqKx0wi1Z8paSq3A1wZ4iAE1apwVIc8icTX\r\nGRXd91J9xf5aKa8VpoWeyACnplbHRhw8rJw8Hq6YqIE0YVNHWP+moUsZ2OsU\r\nbJvQTl9zvHi4astFP0PT9pOEcb9Mosrxnvk=\r\n=IVyS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.3.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.3.2 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.3.2 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.3.2 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.3.2 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.12.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.12.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.3.2 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.3.2 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.3.2_1679360587757_0.12101847034378621","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a869c1178600f5fed595a23784ca3d542934ae11","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.4.0.tgz","fileCount":72,"integrity":"sha512-Gm0sGYJXTiYpzyDOMro/zdemAPtJ6dMiGaR7f0sEgyqc8yzeaBTZSkF4AywxaMy/jCz15+A+p5NIklUDphghfQ==","signatures":[{"sig":"MEYCIQCCi1y494VI492dU8tBD3XFyesXUxeSPi0QxD5b8NRYmgIhAMtXfLb04nruesam/zsyHeQ+OfTX1gXb0If3ypVmarbo","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145307,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG3x7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo0cQ/9GsOndxkou/t09hVevhHGoSMAAx3iEktYy3gn4yZ9lL3m9Dto\r\nLwN/zW/cf3R3R+an+dUO8QqSqD58CwpUfJo4wHNb2A1W/H3RTkHJxN3ZggYS\r\ng/MJVjuFdQ6Y48D3UM7uZgncY+rw6qmzU11Re1tv/916pai615xI8gl3fbqo\r\nitK2OB6Pg66hdjJs3iafJ57QEb36L9kCe9sDAv4N+HlHwYRJ3OfCUmC6UyNR\r\nswms6iNQmb4vRXr80pTboTsQbXaAQ7m1U+oxXXdas1jfRXboSfChaH/IG0vX\r\n/M/TCZVoisUyFMTSDgTaCFc8stUq7MhIjASoztOzogsFiI2XVUQaFbdAwryp\r\n4p+GSkmHQYmKQuA7tCxg1rOAXr0EJAWkTnekHWPvBL0zINhbddOgzGQ7jGCi\r\ns7lWYq6VO1z0Cai8bOjDiDum6evXJmLjeLEzD4aqli3ZYyyQxusK92RJiM4j\r\nUs0142ewJbgazayCeVnt0zUTYhTT2psrm+XECfhy7VzDRAJvMy1NbDJHcJhx\r\n4hdLsMe6x6OnuAsBulFWwJdFPLJpBLXZ1ZSOB8KoQJrw/Xt5QmRIROzpZlem\r\ncN5kGfJQydRHpIUg7j6J/F7gOTwqD2p1fmyKYViBJ0AUt8BV7UZcdhYlerXs\r\nYuK3yyTTHypW22xlUelNr7UthgO30OYpB6M=\r\n=pVmV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.3.4.0.tgz","_integrity":"sha512-Gm0sGYJXTiYpzyDOMro/zdemAPtJ6dMiGaR7f0sEgyqc8yzeaBTZSkF4AywxaMy/jCz15+A+p5NIklUDphghfQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.3","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.19.1","dependencies":{"@fluidframework/map":"^2.0.0-internal.3.4.0","@fluidframework/sequence":"^2.0.0-internal.3.4.0","@fluidframework/merge-tree":"^2.0.0-internal.3.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"^2.0.0-internal.3.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"^2.0.0-internal.3.4.0","@fluidframework/test-runtime-utils":"^2.0.0-internal.3.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.4.0_1679522939623_0.214542405429349","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.4.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.4.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.4.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b3f57827e923e1e9f4d8d0a0d860c62b69f52848","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.4.1.tgz","fileCount":72,"integrity":"sha512-1e0R+fnSPoEVQGFZAoflzKsc8GYignMRLnyCQtl5hW8hX2sbps1bVdjiOjfze9KvQTTzkHgbwkZ2BoX2WlkacQ==","signatures":[{"sig":"MEYCIQDw7g1C43YVwQiWJAkYiYt6PVAeiOBHZ/R1za7dVEvTBQIhANiwyc0yyuiFZ1kuvfHm8Ml/FXHCAX8e083najdolkXS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkHhvNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrU5A/9H8WcKTco/vBotKlLnFdjIHAcXY+stEAXsRfVmOAtmhKGXALe\r\nH2APrkvJlDEdkVKxhI5HZux8QwxZjS2iE10WNFNWK1mi/BFrDZycNQCcEHnB\r\nj8Hy8FR8Wp3LEi9rQGW2LWyzdq52fAS6KcsmKXfZNeI5inzJPnHrVXtGz0nG\r\n5pXFnjpBi/bkbHZs3tlnsi1xoJ0M1PM6Uy/ceyykeSATxTdFl9FsXft8LgF0\r\nzlPjEe3KHbr8sQxw3A/z2Y/0lkd7+YexUQqfuRiZkBhjx8qO2bsfzkCAs6uE\r\nFb4fJN51LVWQzkVGsQJr8fCKVN5U61QKI6j7OJHq7U8uyuZlucVXcJXtyxdB\r\n/QzUx2VeJmH7GBd6HwzZf9kMzobi8A8AH/wc+80Ykqn1m2pZ97JEMfMk22oi\r\nkz9aXND9vUPxyBtS1S7kXZBn8wqEjapG7AD0gLtN1GcquqIaVCEzvtgL8GdX\r\n+kM3k+pCrkKdQSYg6/bpJoZy7ik/uO3vJ98r1WsldyT2sLTOrIRiOBP79YRZ\r\nwA8JZSaWyUp+uld9lLYLeMvYbil6rN1DC+d3kTht/ghmRagHeYj7mzWlBpFN\r\nR61NqL7n+49pTPEQDDgJehrAu10Pp0VEERUISpJZh8SjHlBzEYYiNy3hpevI\r\nwatZlimN83S8KvGamXNDYtwyp3nQ0xL9v9g=\r\n=9xFW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.4.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.3.4.1.tgz","_integrity":"sha512-1e0R+fnSPoEVQGFZAoflzKsc8GYignMRLnyCQtl5hW8hX2sbps1bVdjiOjfze9KvQTTzkHgbwkZ2BoX2WlkacQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.3","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.19.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.4.1 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.4.1 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.4.1 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.4.1 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.4.1 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.4.1 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.4.1_1679694796786_0.36535345577159695","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a10b4168a22744c1fbaad7e9786600126c341c43","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.0.tgz","fileCount":72,"integrity":"sha512-I4+/FjmW3lH4p64k6ggGkE+Qi8GAkLEuGBPeKogDXc3mR+yD9ybc3R2f+CzvhdwUzthI3v3lozk8kn0d2s19RQ==","signatures":[{"sig":"MEUCIQDCOLqE1b97Fn5ysF0Yu2KwRanfTv/wJQ+BSq9izkUVcQIgNmJre0RoMiyZWclCs4Ezyr+f69Lb8QAQLGUSxt2GNZw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkHiMiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo40BAAk0LhoHfvIx1+6CE/KCmdX8VWYMfz7Yp5KNCnm9RrkPW3HXiI\r\nN65QtzXofz2tQa6+KY8n/l8/kTFRX6mawyfXVP5Ajq6tb0PaD4vUO+05PQzK\r\nZ2py9DXWPQFl2PGSjdlel7dZiAcEQ0yFeheUAD+X1kkGYvGufqOWHB/hj6b7\r\nyJss1Dm4O58cjE9Tkuy+DtO6fLUcUNh1NkWtuSpAvJOUTcAUWJm+BGYbONZp\r\nar0TRWSe4zGeNINrIYqyDiwnXPDRVTMw9EhOfyk9qolWRplu6ea8mg/MDoFa\r\n6LD9wd5Tha3f7owU8ToFfiUEnW9MxMtFepdDine3aiEMP++jAy4fL4cf1ygZ\r\nq10bSuGBSTOXDN5SQPVCMthRltXhVMxRaKTYfa9ggin6vgQH0kis1CIQ+XQY\r\nFNDSS0ojo75Vqs+R3uyRC+ICV6rIRJmJ9ePyyYt77tqPjIjal7FD9Soj4rFv\r\n/WwC/2HBq/cIm0oc1j8/I2GYLojFbq3tF1pVVlz+nH/R2DWuIe9ndr76uCf9\r\nUEczOJKf8XH0P6xCYy6YuRDC8ZOEBQNs5ddNPolSfrgcK2Imzo+vRPZ+DldT\r\n+zOWlJ9MEUY3ImDbjOtHBRMSnyL3knsgAWwEmmeMUvla+7ud32GNnm2CjT9Y\r\nVpNw3W3v6Oi0zYkaAxVOmZltRRGvEULu54M=\r\n=gFhV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.0.tgz","_integrity":"sha512-I4+/FjmW3lH4p64k6ggGkE+Qi8GAkLEuGBPeKogDXc3mR+yD9ybc3R2f+CzvhdwUzthI3v3lozk8kn0d2s19RQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.3","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.19.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.0 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.0 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.0 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.0 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.0 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.0 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.0_1679696674411_0.9867230879780742","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d2045e4691641b43b2905dd18897975af645182b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.5.tgz","fileCount":72,"integrity":"sha512-rOJIXoFn+ExgdqyrBpsJQaoIv1znnSnGkgPAVlcpqguUHgCWdrv6fezJ6APB2Rc03YD46kkZTrSXtN5FUKgkKg==","signatures":[{"sig":"MEQCIBWQ/Di10KUV1UNcnFpbUpJr2XUoPHxyLoSzU0RTXX2LAiAYaIuGIffN7jaJ01K4kMUUeZR3E3Y5TDhStBSVPBrrPA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkHjanACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrtmhAApM9eKl5j3j/GQttuO4ynM2tmz3CaMhBxcUE40N0ydbSMaXy5\r\nRakCsTyyVBvM/r6h5VC+z68gJra9sYOOysRRSxE9dl/gzmU9CZJmcU5Dz5rU\r\njvc+ZcedZAUdZcd9FSOXGGXTzuPVwjbGtV5m39eopBjFjbwb/qlomqFSdXUd\r\n62JH2TtXg9U0o1vfhHJ7OYZb5f1cMpbU5uERnIBO/7iHwc95xVoHwuts1pWh\r\nNft0BoLL3jqaUbPAVEIRBy1B32D6Gq3DETUt6i3jqtfCu9FIT4ym/YSeo2ex\r\nykrLdfGGJECCf4Noa8XvHLXdg2kt6NtkxedYyDCADORsDpRWHrPIGFdTtRwy\r\n5LBcACHnJEylAFnVS+hr9TBe0Fg8btS2I8M5B2zXc1voCqMYhwntdrhN9ihO\r\noMW6ZEE+a/dtli1LwaHFSnyKGUT450/nzKGQ3QB8/z73D7PP1noZyXWxunxy\r\nYaHQifQmePFSKbk53QMYtj+/b6VzxbhiXZWPFWcJ5k4Dc/2PRaBWj0VKUMHV\r\noys9i/UpmPiUIe57RVGLMlgJDsuJSR/9NYx4cyvUXXCPsy+aOGoVXERSAMUG\r\ntSsHunSVIHosPwRb2GX39QQEzNUqWwmVAoCfnKcdptsCWbBZG20fuGQQSoxU\r\nAH3zqNWW/EX7H/M8y9/stztuv1sG/VhQ/dE=\r\n=rShh\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.5 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.5 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.5 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.5 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.1","baselineRange":"2.0.0-internal.3.0.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.5 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.5 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.5_1679701671292_0.27893467438444586","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.2.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.2.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.2.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"78642c73e5ea5b03f1c6cec832be42b64c3a91b7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.2.3.tgz","fileCount":72,"integrity":"sha512-Y3VlPo8iuEV1dml2mUhNyahd0rBFFFcyGzKpBjSUY8pyCpdBSWKrUH6lNcjJuuUX9ATShZR+EuTPw5Pwbq/r3g==","signatures":[{"sig":"MEUCIG4Mz0peDWvGz0qPlDCsM3BSqRfgUIDV+OgurR+/V+ggAiEAhr7dTbqO/1vEraxCykVnY5wUM44xnBjG3beEcehSkDU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145705,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIeYkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmomxA/9FFj/DrtZZIGNv+DdSgXhYMuHw7ZRM4LrRAjQGsfYVsWeA5An\r\nc5iLxlu0+Siqf6JRDTlwK6dQFdQNF5/olhD27N+vQEHCeanxUldfaJ9vlsXQ\r\npvEAhnXwAl1R+JZD5DefAAZFnQv9Wyu4CFEpQolkvnhiBZboLPJXYEGbFO8v\r\nt0HDo0xGxqEEp9b3GrP5Gl2WcwRuFgOiYE8cDYskf59ENW4FSkCNdRIDJRxU\r\nhXhFyB1QOU6nVN5zjsRJXtIGxYIs3+n5qGkctx81cjf37Sha5WO13OOBqgY0\r\n1qYthJPP7hDPQOCdrxU8QuYH1B7N0ksxgamykXjj3IBRvgXvXDRSK9zR/UhM\r\nXl8rcXiKHMgzx3hPklbgxVbMv3FjPAj/6RBW9M0sHiyBvhIkQWGxW1RvXyGu\r\ni9PIhPjouKixsVMbSjU5P0i7QmaRWpiw0TseElYtAMjUPFQyMjXgwhMwlnMG\r\n+gQdlGGe3a+3ZMmc5sGFYMVT5aBRXlpGTCO7tSayoASCQVSSlYXCzfbXqJ81\r\nR41pfxsXYMKKBbdlQLRFqzY5JxX4H9QTADdRK4BzTWx9GZ6DutpFBQ/rKdii\r\nFBHqAZd31Js5TMfeuqFIJPTi7QQB74HSH+JZkqqGXGQdL8uD1vlKGKvY090C\r\nikyFg7e9mhAcHzRLxUoJmVYmAm7HNgl5mGI=\r\n=Q4Ab\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.2.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.2.3 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.2.3 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.2.3 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.2.3 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.2.0","baselineRange":">=2.0.0-internal.3.1.0 <2.0.0-internal.3.2.0","baselineVersion":"2.0.0-internal.3.1.0","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.10.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.10.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.2.3 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.2.3 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.2.3_1679943204402_0.6909235724618157","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.3.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.3.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.3.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ad25befb9dcfd433fea4dffc2044d646198b36e5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.3.3.tgz","fileCount":72,"integrity":"sha512-w2FXgNu3R287qLNWP6ADvV4W7BlG6JVKpjndqFBRFuGN6I5bb9YqZ+v0cktu7TdxMIHoJ4Fu7OAXKyq0X+eFGQ==","signatures":[{"sig":"MEQCIBbncmvh1e3Oi79gHyTTBVbopaWkhzAe0GVsbUaM7aMkAiBfpNY22TlGgcB7ShKCwJNP2qBJa5tLwcgnVBORGkCqug==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145487,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIel9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrEEBAAoWg1MgL8C7LJl9VnqGGhGNQtTxjAYmzsZoT1ajUzQRlVg4us\r\n2PZ5uYwBe5df8N05yrYcXxeqIjRKXxcGK/Qefj1bWfScXn+DeYX5F+m8jghA\r\n8NLTv25viaMId6sHqItQAKrqQGxP2CW4BDHzNUfe2S49r6TxSX3h/BGGZZ0N\r\nqudupX4qpW3CrRjPPMDG/NKqF1t9BgYK/rksInbZaASjOQ+Ue1xKlGXeV+U5\r\nEOT3A79Hu1ShzPYrMHp4hKXfQSMpnVWaQi5fCiZms4fgOAWTZS1zbv7Wi7P/\r\ng2+2usguXjNfGPuORhEkkAedgYVgBudYb3UJYhXnZrCuxW4eh4vbh+D9Od6p\r\n4gMeuHsTxceTWvL/EZSh9noWgB93hYKy9+ZWrFQXDf3f11LlWyLZ8KcLSdgA\r\nQ30xTBRoPentqn1YklxrDJ7oDgZW+aENqxNSDMb1KwrQaCRyFCEeiJ1DlQUp\r\nhAzGDHDI172DuSQtYcau3icgixQleNReGdVUoR5cR6+ye0AYI6hxLDAkUESA\r\nU4TmD5wDiMtUU/lukG4SSfsk1KBMt+rUf8x+Y3NZmukFQtgO4yoiwxX1tHfi\r\nbo03MJyrMNHhLdsAyisQsozwoN/OneLKTOXiWiHVRpcBiJDHN3z9MZu4R5nZ\r\nPGNXUB0p3NplJtXSynonT75kf5XbeuxvnMk=\r\n=MqDu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.3.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.3.3 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.3.3 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.3.3 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.3.3 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.12.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.12.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.3.3 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.3.3 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.3.3_1679944061682_0.8482924299109076","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.4.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.4.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.4.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"701e1500eab511a7c0255853a56053bf667a3d82","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.4.2.tgz","fileCount":72,"integrity":"sha512-Y8fBdxlSHQI4QK6khPCenUtY9ZWkwBDPAEKiTMtLwCg6YYD0bAgWWK7w+G6p2SJ0umyjZ1M280byKCQ/1PSNvg==","signatures":[{"sig":"MEQCIGmjW6StSd/i4XN9nTldOX5Qsqf1bTtC7UCLdkf9Tf4RAiAfLVHcLqKzaN6VfRw2DtkJNxspVl14pI/RyJ0CPLxk9w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIepVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGow//ZIxu8t+1CS0nJakypaY5UtBS8643F1wNS5tftI/+pvraFw+s\r\nyzjEBFyH4K5VLdY2h+Wy80GLFaItcp9nkeB2noTeNPPkoNSYxppSEhu26IKW\r\nOzw4+JE03LVuzICA4NKuUsds1QqhkTW+ftpk4WkcKDRDCp1Vq0bEXb8ZCq+t\r\nVxQOv4rTswd5g390pP7elr0FDyTwM8K4xpduGaUuCe/dl/KhnK2C+0SBXw7e\r\nHp/uONC8zRwdpDz/gan7O0v+8nrjY6T9l7qMyGgS5uSuxpw8BAPDZ9Q7xv69\r\ncQ/T/ls/TYihJVrs8f21KNDWPyEjR0URaS8/VMDwVmU7BGbhVFrh+Sa2KS5+\r\nEcWXcgZg1G2g5OgowxaF7WLlviLqu7Y4W9nmn3GwuhuPZt16l7ADeHK4y0a4\r\nTc45rxc3YtJQJrsUEyX6cz1HX+q/P+XVh59Oz8j+14W3JYs+W+eTm6J1FgoG\r\nwI5hXD3yRn6VARX475ymzd/kdhig0QVYsmdQqU1PMN4mxusZADZKfveOwY+F\r\nuQIya6oWcaMqy3wwP7uzLhhm54eYo6wQSDQtnqhyTYRr0TWZsi0l1YAHzAdE\r\nSpFHeFsUNbuTkFesWkcBXXQIDQHRD7hOMIEGLRbXxz6TXSbt9w4cGFhyXoot\r\njk7824oadp+Vqh9MLKhMw82pUByKewgZ8bQ=\r\n=J4b0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.4.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.3.4.2.tgz","_integrity":"sha512-Y8fBdxlSHQI4QK6khPCenUtY9ZWkwBDPAEKiTMtLwCg6YYD0bAgWWK7w+G6p2SJ0umyjZ1M280byKCQ/1PSNvg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.3","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.19.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.4.2 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.4.2 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.4.2 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.4.2 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.4.2 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.4.2 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.4.2_1679944276870_0.7169472573434774","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bcc266fb9c89f8eb54c23c8f8dda6c1de30df411","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.1.tgz","fileCount":72,"integrity":"sha512-LXGO95O/me46c3tVJR6IB/E/bOi0IOyTjR4sL+wr482UKHGiyQJBf/6BdHublLEGVDmecZ7CeCDCPyg8+8dkmQ==","signatures":[{"sig":"MEUCIFPPUiV1ZOZY/n3+ccSBCnvzxX5U/wIoz9bnnGAg4qZiAiEAhhJaIez3T7tA0CnW3MCKIQ4vm3i8CXvCMIEmxSI9560=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIgsfACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoe7A//Wtq0W64UBX4qi7yPTG1L4CMCspGhCiApvVbwA1tGSS7AkpR1\r\nP2MDwGa/B5ac3wG09WEZeNiOLFUJjGQXfG7aJUClgC3SfOn5Vq8xB0dOSzY3\r\nmDVczzPdmLgQHw582jy1wiPg08npPQEJuInZiN8QpkjG7H62MADJfhZ6LnHk\r\nDZ6mAvpC02bPmKdlKk/T8pKOGH1CWYlggpbmYl7bZzmo6H82p3IKq6ANKEXX\r\nVCR3vGZufMLHtOh4r0LfB8oPPgDFyKWgUPx2X2+IfPtABi+QW2pGZwhZYSTj\r\n5VcXv6c5HUAO/YjsC6eOOqJafefE1DuLlqjWz+NFegwhgCudpqOa0pegqHNJ\r\nABYjUmpoC4MZMsXd1ZcBNdrmhECGjYp9Sl5g9KFzKJPmDcscG/650x/QQjtu\r\npnkSLqOcehD2344+eAKHocQctEkrMKozuxHXv2/hZBJARMNQojMZXhzipnBl\r\nekNdD74emWpVZ/79CnYtJQnb6SfB6IAHhV/vp3RBIq1WTtkjjl8OglL9BQSm\r\n19CiA7Mi6CxvXkgIPoTwhDdBCzdnRdQ2hNsJfTWFR2hDb/A2rYSpwNi0uDQq\r\nVIELu8+mw75TSp7XEthDQsznbnz/mj4Yw2gs5vRWh8BEAGII1J+QKx+sZu0s\r\nC6CU3WGNuJ3itRfse71rUa3TFWDWXg98v1E=\r\n=JsFW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.1.tgz","_integrity":"sha512-LXGO95O/me46c3tVJR6IB/E/bOi0IOyTjR4sL+wr482UKHGiyQJBf/6BdHublLEGVDmecZ7CeCDCPyg8+8dkmQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.3","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.19.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.1 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.1 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.1 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.1 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.1 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.1 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.1_1679952671636_0.22145131549746977","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.1.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"56e56e1eb6ab8575c97ff8c29c229099085ad384","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.1.1.tgz","fileCount":72,"integrity":"sha512-VawkndushZMJidClnGHFyE00MIPdeFAGroR+TTHcJFVJ0f3O3H/AjxAT8i/78qObiZJT5WbKP6DUFhBCYgP6Kw==","signatures":[{"sig":"MEYCIQDjjlD8gb/O8Ecq+v93LOI/x3iW3iG92/6PbYFn+/cEywIhAORnYaawEesQygef/K+a3qJqChVW59oQqQXznluHtUfB","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkI5eHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBBg//aCyaS1tYJwW+iTbbvnoO4k/INNB6L5BxoM+TiSZpY51tzoGH\r\nGwVOOeya5DJjdbGdIN2DIPQk/K/2HGDcHsX39IDrmuEaZsXBbT95TR3d9OMP\r\n0qQuvRnfOX/lcd52aI/MoINcvZpPMjRzFxRHVJw0/KrCuxzS50kwrL4r9d5O\r\nLGeBdVyQtBMldcSJWUcRDMIPoOSB/hv2A8HRF2k7i4XJs6KsnkX6iKdxqrIR\r\nQh+Sd3UraGFLSOdb1F8xVMvlB2XHP08mzk9R5gjP2bxge63TNMtaoqbKnIsb\r\nK79zy6mxZmSKUANqXmPX1ZJTkAcjegKa8uA+15uz+D1m67wxtZPtUhucUbhJ\r\ncYciLdOGxitF/D4lvBZV46L8rX1PtWcSvkszaubCS0/rFCM+v1NuWJ8QHD8F\r\nR2SvISWOaErZBr3sEYfYQ39vrKw3bFtmOyKFGsMeLTnlj+u7Q4O0ivnUlwDc\r\n7zIiqVEti5Hm0fv065ANNGsyvqJFXwe+Q3gKjLZCPkAW+zDjMbp+0GS4KaHc\r\nMh5XJPp1QOY2oRNLXuj8pFyx+4NHeWq1FXe/0yJt/isacdWkZGotc8wwpI08\r\n436k4Y6QRbl3/wzi02svkz6jLUhvbqbU2ZksTqPw1JQeDZ1xovxLPrYR3kFI\r\nmHAeKIKExDV5O3gb7v5PioAWkO3TSgrS4XI=\r\n=24Cc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","deprecated":"This version is deprecated. Please use the latest minor for 2.0.0.internal.3.x","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.1.1 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.1.1 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.1.1 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.1.1 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.1.1","baselineRange":">=2.0.0-internal.3.0.0 <2.0.0-internal.3.1.0","baselineVersion":"2.0.0-internal.3.0.1","previousVersionStyle":"~previousMinor"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.9.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.9.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.1.1 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.1.1 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.1.1_1680054151330_0.9746787573187299","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0726a64b97ae5be94b1df888c7e22197bc3af074","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.2.tgz","fileCount":72,"integrity":"sha512-aFeFtDusfXWdk8vLgWRU0VzWyHyxUr8EyB8b1fWjG6DJ26BgRuS5HUWf3KllJm76Hk7SvOhXaFLe2YuVYKf7kg==","signatures":[{"sig":"MEUCIQDLc7NF6WZRzVJnEkR49ESors3P5qFpA3pQySulj/bcVAIgBoaSKCFfbsA/1ZredUTOq2nkXJvAEimXJrOCFUkUcdo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJ4JTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7Vg/+NMIH6L2AAy6QjIg0EBimRyaC7JBmy2jxgVkjOGGBmE03mw4f\r\nFvBgwU8jCkAKFjzbMszHKwuAyA83qzrPfdpsOhukQbqe/h7J1PpULdTrXp5U\r\nmu2qxq/sRnWLg5d67OjclnaPJcSXqiu38oDGCSOnY6c1wpD1GW7x2Qpxbtaz\r\nyxzhIEqhsdmFDUC7vW2d0rwGY9/KKe6STyf54TdsL2OGq8du37jcrcE/gvma\r\nXESOxbUpAytCuJvpi8o/YekoLIG0xmE3xCO19KPc9yzJUnkkMsu+JxU0l/wS\r\n2dox+YqWdUD5fBe2hW1rnoJOLyJ10lH4/aaU5XjgwKQ0k0z6ix3R0tnC6PJZ\r\nzr1VZVJ6JyCDC4bcL1hoy8jMrEn4qrWRnqwzBbO2V15k9ewkI5NAEQ7IC3eD\r\nq0ursXL47UzPDL0tO5gbccp9mU4ffIcfs+HfByZxxXwtV5QHq88A2SLotq4t\r\nRdRnXMxjBIBWQ+DOwBBELbLvlTDA6BeHrr/JedEzXRRfdqTOKi1EFBxW8+7e\r\nrxPbMwbuIHBuTCFMJKDoIOtON5ajVdR8tRKfgkRjdzd0a/2AOoU9rXBjhpRh\r\nBMVfNUwYgsSPr00LjpQjfP9D6GC7k/nAM37jTql8cn9izW0zM49b/L/Qx7EO\r\n5w9glkv4XSDqSn96MwGq0oih3kV1l47Wkz0=\r\n=La9J\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.2.tgz","_integrity":"sha512-aFeFtDusfXWdk8vLgWRU0VzWyHyxUr8EyB8b1fWjG6DJ26BgRuS5HUWf3KllJm76Hk7SvOhXaFLe2YuVYKf7kg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.2 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.2 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.2 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.2 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.2 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.2 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.2_1680310867618_0.7293183735946014","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.0.6":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.0.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.0.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ca57e8431b0fb33e421df617aea14dea6c29885f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.0.6.tgz","fileCount":72,"integrity":"sha512-yY5mJmNWHMcW6lVpNRRtNd9dKvUp9aTDr2pQDfkBYvdmCM8YWbYZqaxd0TlkW5xMaqYE6mzOS6dFDKXPH0Oa9w==","signatures":[{"sig":"MEUCIQDV7wujQq3N7/5JCVwzSNcoELKUzoCdReIDNCKc/vK/7gIgaRD9u7YNSSUXBd0yUhpkIyVBJY1IgPQ3axTcutn4XGI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJ4w9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrwGxAAotOPFVLTegVWQNoFvcasQU0wLCanMNrzxdphkrMjqlERxvG3\r\nqRZKEr0m1fF/1/DboUMjiocEuq31cmQbIdjGgZyNiEFyyV0pzAuqSOUiXjBh\r\nWrGl0n0z/mJdijpJDMv69A8NaNCsSqlHkxE7HWZuT+/b5Cl0bFQ0KEgrtCVP\r\nCeizYjjdt7H+xvF1BGL7Sw89+tG46vm3yKvaOrJ7uixps4qrMhrLJyKSap77\r\ngK1DsUX6+GXBt/dsUMbk2Cogdb72WtfV216rdpvxiGczF3e2egFRgOL0Z98h\r\nVC/PdZaf3LjnTZPdsBjCN+dc+rm+rk936mssJoYpZjlGO9vKdFHQ0d9DXsBV\r\nhZtA1yg/9Xz5V7ZDjiLFVm9eb7X0rBNNeHZobEo9aHQKR1l3Z9imG1HrWEX2\r\nb0aTx5/5KqaNi5Bsg7eLco7y/3jOEClvsm/NOIhuL+gVIYy4UxHjndTXPcNg\r\nWDYMr2sF7HCaIzAYTwY3lJvjLaUq3Qs+rBRVlMjU17LQRsNQp7aQuV2H2uO2\r\nQ0Tu606ZeheGQIFKh1Q73e4ljAIBDLp+HTVjugTSUwDTnCeIOLL/bkSvLuhX\r\nf9C22Jv/TOKuVXdDSO10cnA4/GpPr2atjF8DgWvhNuHpurgNqIW6jgcxud7l\r\nI3Eazdytju9BR1HppSb8BUvy3kBNKlToVR8=\r\n=SnlQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.0.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n```typescript\nfunction createSharedStringWithInterception(\n    sharedString: SharedString,\n    context: IFluidDataStoreContext,\n    propertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n```typescript\nfunction createSharedMapWithInterception(\n    sharedMap: SharedMap,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n    baseDirectory: T,\n    context: IFluidDataStoreContext,\n    setInterceptionCallback: (baseDirectory: IDirectory, subDirectory: IDirectory, key: string, value: any) => void): T;\n```\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n- baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n- subDirectory: This is the directory that the set is called on and which calls the callback.\n- key: They key that set was called with.\n- value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.0.6 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.0.6 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.0.6 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.0.0","@fluidframework/runtime-definitions":">=2.0.0-internal.3.0.6 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{},"version":"2.0.0-internal.3.0.1","baselineRange":"2.0.0-internal.3.0.0","previousVersionStyle":"previousPatch"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.36","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.8.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.8.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.0.6 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.0.6 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.0.6_1680313405271_0.06936247461844913","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.4.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.4.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.4.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c90fed1811e54ea5e54649ad42950448a1e728ec","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.4.3.tgz","fileCount":72,"integrity":"sha512-Jk/p7ngrxs2N4udjhp/TfLS34AG+GzklSdx/4AzPw/88PjWO4NmLCpuqqF+4KDC9b0w6RwuSUUBm1Qf3wQcp4g==","signatures":[{"sig":"MEQCIA2FpDAdvRajpJ94gL41jszzFGbG/nQuW1js/8jATgx6AiA4K2g9HJKwg+uKY5JkjJ3zx9L/+ZdHCIPlgUJv3hBQsA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJ58hACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp5EQ/+IkXwyTBQCCOssXEpTGQv8FLQ1Na0sQb/jTh+Cs5ljIWqHoep\r\nQnQPBg7w2EAkq1KxBKXFMb2pQpq00g30Jwhy9VySCbRf+SslTafYl7GLrzy+\r\niE0fA8mPnRclXSXwsSHNygWvEFlgTNqrxPBuuU+wdOaLtSWYAbOHIQN1WlPZ\r\n2MaDlupJdSNgb3X7Sz6++rPGxYwE44N++0fAeEvYN6FAq9X/YWjFAVLBq/UL\r\nV/fPAEARZz/Iv65fyMcs23jN+habiRVQW//Ocdt/81TyFrnT3LIvFKagcHCb\r\nRmn9PFNDdMhHXjCLmo8TFK5DIggofGj1VXp2lBe3XP2Hso9z8kmQ+jR9hTaG\r\njC4+ZXj8wEpD0Y6LbPG0H2jarPXf0ihtKEQolYxSpO9nMqsMf0UxqELM0mQF\r\nQB3WKWca+oKSxEyOVJX5uqUCPQ5dNQ7HqwQSJeWdzsabqEvUiySRo8QlmmrP\r\nEKV+yeAqUc7Q2AWF9mScn9k0odeArrvykmMoqdcA8FNgBbdBCG2gws23z0xa\r\nHQj0Sd/5RsRa4YAOMx9PJROERcVudYlXN+NX7NbWIxjrIhcwoh2NJ1XBe02B\r\nQEXf7A++ni41Z1MCvl8yGNo3zYLqil8PehzjQdZLPXuiW2O4Fc+juzGRjDXx\r\nv7vJvwLnVOGa+47bWZudmzNXSnHNIJOdJQc=\r\n=+ztG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.4.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.3.4.3.tgz","_integrity":"sha512-Jk/p7ngrxs2N4udjhp/TfLS34AG+GzklSdx/4AzPw/88PjWO4NmLCpuqqF+4KDC9b0w6RwuSUUBm1Qf3wQcp4g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.4.3 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.4.3 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.4.3 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.4.3 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.4.3 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.4.3 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.4.3_1680318241615_0.32360146080595054","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.4.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.4.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.4.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"dd4b8f6f9b85599e2b73c46e00fb07f66d9d50e8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.4.4.tgz","fileCount":72,"integrity":"sha512-DuUGxZjd7ZJ8YdkYPKnh0b1pXyk1UxmiU3tCOkXmlOrWZ3oGFsCmTSr/krqLbPkYlFzJrJapmJgoPtA9FQcBig==","signatures":[{"sig":"MEUCIBEDWEdkmCp4DLENFHeU+vAPlA/E94vG+Nk75DUX51G1AiEA8aEFGlnc1pdEgdLOSd4aC8g86C8ragIjeDI9vxyldBg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLI1KACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrVMA/7BuknMTV1ViPf36DUMBq2KPZX0+mc6nMOGTBRMzT5CEhaOwrY\r\nAnMueD+fZYOaMcdTvVCrnxZZKfuuR9wkcYKsC0mnBgFAMgG2fcTuJAwg2j6Y\r\n3ag7dKrv9UNKRYyBgKJuHZeCpd8R0bmdPFLN8chG+P5uMXAn5Fx9vJeUJwFf\r\njRJtcv7Dff8UTgS50WtNeKvH30cn4ObHyanO3eXF1OjOsvqtc2eECkbD2FPu\r\nIAHZhnegbRlffRnWGF1RFEbYrE0peuQY4fhMI+APQIK24uAfF+Pkqv1I3FdG\r\n7lRP+E19CTwmDozb2rfbAuOpePSicx9RSKqhGrM0aDEGuA01BlVRB1gBIaPz\r\nRjuqrcwMWy73v4YS8zyQ+NyuiWItlpKKkx9g1DXUStbkKiX2RR6KIbOGUDSz\r\n584XumoUzRA6nYOR/U0WDhmPtv2Rnvr/sU2NIcTKZiAsTOWxe05+AAUd9wGu\r\n9xMkVFnHw//vslnRkCKfSnpNFaSWvdyfhQ7BI0DPJ8wsSR4Jo7WntIGuwcvm\r\nlJZYSIuYfdSsdql4rtQX0HEfN40voyPjpsCffB/UVro2eTeDcZmWzJsYJdcc\r\nmyGpzVGst1jYkHpcISdQu8usB9PaEYZg0y6cGNTraSNpGFiG8wohyTi1ffVE\r\n9QD5KWnlvbeCjawwLNuNEqs3FK4WUw2wKSk=\r\n=NRHH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.4.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.3.4.4.tgz","_integrity":"sha512-DuUGxZjd7ZJ8YdkYPKnh0b1pXyk1UxmiU3tCOkXmlOrWZ3oGFsCmTSr/krqLbPkYlFzJrJapmJgoPtA9FQcBig==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.4.4 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.4.4 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.4.4 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.4.4 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.4.4 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.4.4 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.4.4_1680641354474_0.849997905755892","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8ce9bd5397e3030dcb27d0e1bfae8958054191fe","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.3.tgz","fileCount":72,"integrity":"sha512-JQhULLPOBQRwhVR+VWd98EWnKUYmNIicetUw+VzlfGlVg2hiL2TGXg3wKHcMau7gME/jFYXEFqNrN7zrnwWqLQ==","signatures":[{"sig":"MEYCIQC7JIXNBdBYeNQh2OQ/4Lah3eLV1DZWEtzGzG/SUzixQgIhAL4LjImyQgaUj8mhvt4JozVAC58nJJEFIrGBIvTAEmmg","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLKk8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHww//cBZj1F9lVAdPDWG1bU2ZvYux1lyyRpri0YRdt+lXFK7EoVGs\r\nZU4Bem8L/vg+pgMxyg18DQDZ1Vvg37PM0evToi3/PxV24A9FuNegKe4Yrc/B\r\njqfgzwytUsh4JXdvDmOJTH9q+kiLfrtYSetrsthZWHWEnV3iPNlWJFpVxAW4\r\nCHWIPKaCnLRsIdVYc/gQDFSPj4rQqhf/YZprwPt9WUb4NIxUTbcrwECDTLIE\r\nrGnooKp06hAVRdjzj2dcsMXBk3kMIRsMLZngrUNmSgvaWMLLfvpUW5611Ika\r\nCNXF6dShwRY84jZj09cdpXwMwtPTNfmVO7VrMQ78/ABG7wctxW1/fbcx90F5\r\nIz1cgrp+jB9hYhyK0y5Uy+2b1hyzBtGecFPpTRGwXNdR19BKA4CtfUV8nTF6\r\ndpF9YHZsoe7p5YQhsG9hmBbrScKlM/uNcPpuRRm+WW95K6fVcqsr29raZWmk\r\nTOsVey5facQHDMyQqh5+Hdly0Ib8dyGIWVC3gRXMGn0jcGq60Yxwk4wX1d9z\r\nzOOgMIf6uISOSNxzRW5iZE1BcV/Rb0uXC/yZ3fBikEk77TidTWliGzyYR32R\r\nRKm75feeq2jrXSC6cOoOZJyPXPPo/Rsnyj0C4J7w6lNwklAoJqMvU76WvHTx\r\n00wzZzefpGX/CdaeKrPnwL9rdZZ7q3oD9KA=\r\n=klQ4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.3.tgz","_integrity":"sha512-JQhULLPOBQRwhVR+VWd98EWnKUYmNIicetUw+VzlfGlVg2hiL2TGXg3wKHcMau7gME/jFYXEFqNrN7zrnwWqLQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.3 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.3 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.3 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.3 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.3 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.3 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.3_1680648507840_0.5855658324914097","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.1.0.148229":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.1.0.148229","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.1.0.148229","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ed4000962b7a49938abfd7646d037433351b1d43","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.1.0.148229.tgz","fileCount":72,"integrity":"sha512-40a1rxLjFrhy8+G7NoyEq4M+XhvA8DO6nboLjjq4npV/ULVvVRgIOQGlpBqf3CDPGDxRj2MSp2np/+YMX7AyJw==","signatures":[{"sig":"MEQCICOGuZWqJfjMVpr+Lfw5/FB07fhLpEfuS/uBP9syinyjAiBH9JXR/wAe63MrhurYAl9VnsUUsSTsH6V+yumdtfpiKg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145524,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkL0gZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoo9RAAjJh4S3MEEcqHqnIcoe5SVomz5ztPeKIwtSeeH/Gl1kNkDIfp\r\nvC70OJa+YlXP9Q+zcR6io9TsIPUiPiPeiJ+wH59ZzYd2HrNzomRh12pes7QI\r\nwkX5I1hW7R9uhJd6C83zGmm7hePOjRr5MtRXe3VdZPKZMer4jt08jlVGMiSc\r\n0W3mjbezBzRv0zoPvlPBndd7CAq6/Z6pNi0j8tX1XdukLmeuZrUIDM0QlJ8j\r\nd0gwsoWp0xoWxBCBxmhmHDz8TnznW7JD4lXI3BZ8pjhMw7ZNrsZXq/0ODA1Y\r\nHsMhMO5yl8cDdrb7fhvKSr7ouLtVyPFdOYC5etb45hsnYHOKOeg6vv889p/c\r\nZ1eNYbaPLSwhg1ZWOo/vFk89C1dczM1nfC3JVCketL0L0vdCxasTYz9zMNbO\r\nNOi8X8Qj01zgC6cn0B9lvOsRPq0/i7SNzXlWmBUjARmn1AjJwk1cHa/dBvus\r\nn5tAqmitNOVfJRdHM46G3WVIBO5YIxVl6lT92HN8CCwBN2OVH3sgiQJj2HFa\r\nuU1RA0ayQlxarwni2azicX6plUjA3dqFYVtNDF+daSEtz3suDmyhgqZf/0PV\r\nwimZuFHIz6Ue+HBcPLx6qxMpr/+pU/o87+Amgr43z5S8RE61h8AFFIxgAHxD\r\nXLAkLmDA3Nae18YteekS4ybMBhK3/X5BDkY=\r\n=5e+A\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.1.0.148229.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.1.0.148229.tgz","_integrity":"sha512-40a1rxLjFrhy8+G7NoyEq4M+XhvA8DO6nboLjjq4npV/ULVvVRgIOQGlpBqf3CDPGDxRj2MSp2np/+YMX7AyJw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.1.0.148229","@fluidframework/sequence":"2.0.0-dev.4.1.0.148229","@fluidframework/merge-tree":"2.0.0-dev.4.1.0.148229","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.1.0.148229"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.13.1","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.13.1","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.1.0.148229","@fluidframework/test-runtime-utils":"2.0.0-dev.4.1.0.148229","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.1.0.148229_1680820249210_0.7927696979665875","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9d4426646b0e81c9643963c8861888d7ce92b4dc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.4.tgz","fileCount":72,"integrity":"sha512-9thTAM+UHVl6LngG8nndqJ4P+ZQvO1FOHuQwx+wGoy0OpBRc1z0XxG65tZedFjsjsGSuqsqkLRSpmRtfghR6wA==","signatures":[{"sig":"MEYCIQCENDRnZdEQiK7yF87Vol9LEe+SYsz4/yi/Bnao32SlJAIhAM/InER2HlbPPWSDV/HUMdFoZFfHsM9zAWbU4YDIuwAS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkMFHwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrkkA/+KWy1P+S50KQgxxe8DS1ybBiVUzdJMCLc/zuZekbkbkb1am8o\r\nWuRp5qY1gZ2AmoCZi9uCEau5PxVTJAF1u3/cV9rmSY52iDireI34o7UJDNxa\r\nMFeTXhu3ey510RiQJmWL0mk7iePhV/MPtpfNw47YgVIfdpFL204FvZ9th/ba\r\nSn8ebNEAZlbxgAvuMBlh9Lutw+g5pbCcZacAgbeDahvC4FewK0OaOLplNlN1\r\nlycWbnlJ0SrwxCdtaw83ynFCvoiFI2d7PqbMYDSBcUgsneS5aMNibUVKYCyx\r\nABQ7ajyhd30WWqSyMA3PvyBCARgMI1X8dQfeUi8tQI7yhzLdpr7anPb//2/o\r\nQvUM/EFI4UJL5mq2Vd0C0l0T9SMW7uBvGfkK3smiv/HZiiq1G3f0JTiJOl05\r\n0hQZxURaFs0lPYrWAEvnx1vha4CsWNi1IpZAPC+ePnA3MaB+UT/51Ozj1Kcv\r\nD5X/l95Ty2KlrCKfKUO+gzGNWKROOweddTHh6WCy9/MxjIECHr8Aty/ZbHmQ\r\nc4poVLdVF9Z4NCzJnHMHHjSfLhDG+ogWzLLzd9IFuN3JtJalIVqyzPrS7ycd\r\n5bwykqduJ7iso9ZYc7zEKKpQaVJIlmt/9VMqW96/oZDIF/Hn4052ZkpYktSY\r\nj4iBhk71wgySA9kDIcY2QAsP1dNzjLHQgeQ=\r\n=1jSc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.4.tgz","_integrity":"sha512-9thTAM+UHVl6LngG8nndqJ4P+ZQvO1FOHuQwx+wGoy0OpBRc1z0XxG65tZedFjsjsGSuqsqkLRSpmRtfghR6wA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.4 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.4 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.4 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.4 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.4 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.4 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.4_1680888304489_0.42764393794360234","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c234cef91f3772ba4796d5746bf7aeb3ec2894f1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.5.tgz","fileCount":72,"integrity":"sha512-8vvsT4U7mXd3sSE51r9HfGLFs90+iGeEDXLSfPdRGyJQh2phvBP0lRFFe+VlnUfw4x0ir7iYQSW2zs/lf12V2Q==","signatures":[{"sig":"MEQCIE8mr3ub4DoHbyni4v0zRxe/bCA4NfF+tZiSWXl2k6PrAiAeRpbhMAEhzsTIFCUCRWOzTTi1kHOZx+5Tdj557H5giw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkMJEKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqdrRAAmjP66EGjKBNjj06jpKyPBtQqkgPOMeC8KGtDFl+po5l4pcnU\r\nLNuxBpae/s4tpYS9UZ79HScJz/csYtmgkY30P0ifoX2wWXQ7dV2QjacLh1vH\r\n69MmhZlYpV+bJXZ4o9asQdpirh2VilrliyKQ8/D01Jp2J/WKHFk4/91xpOT5\r\ngT9J2g9XPkmvwAFR3ff6dhaXT8kEPs3NECjCtvEVVafwDF9iqQBQEzzW3YSm\r\nCfFgd1BfCXTNbBWx4udaFv6AzKViJOv/Sxgu51oZ6ty3Jh92k0b8MQxGnKUa\r\nTC9IbPHGXYISgx2RRIRHJM6Ev/KoBKDXg5H2XiYFD4GOjo471Prk0Jp/ug3/\r\nm/ouKXX+Z9fVQUlYyqEXsnrMi2ur90Sz30wJvSR00g6VIjsy/dlfgWBv1Vf+\r\niBITZoeZKW5V/Oj+AcnUbnBRx/aZU+aTgbKQQvlIgtjWVqgFaceB52qhU4r+\r\nuXxdlFyjWKXv4ApNres4P5ODKL/1nhuUqv8LrDTC5YhEJQtofEhO1kH+sA0Z\r\nsi5l1EVliSAa4MdVA3iCmyq9ZZtqs2aeIL+1Nj3WSUNpZ79lfwqvr95MJUy5\r\n0+FnA8rveXkPND0OFMrWBHmuGyMmnkTpezAXL3mQvb94RK4spSUCKYHK/bSt\r\nvanCVdPbpVyXoZ5cJyk0GuZC9lY/soQEEZE=\r\n=dGYF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.5.tgz","_integrity":"sha512-8vvsT4U7mXd3sSE51r9HfGLFs90+iGeEDXLSfPdRGyJQh2phvBP0lRFFe+VlnUfw4x0ir7iYQSW2zs/lf12V2Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.5 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.5 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.5 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.5 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.5 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.5 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.5_1680904458422_0.018305552863698837","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.0.6":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.0.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.0.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"091570ca6645be822169d3acce4c0a86ff265be0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.0.6.tgz","fileCount":72,"integrity":"sha512-Awgjkn7tQkq/VptuxH2Cue2aE/vyDBmCaX17aNf+IdrsECZQU6JhwlScwyDbLo9FAzgX5rngdU8vGoAjS3+Zog==","signatures":[{"sig":"MEQCIHlb9PT312LxIDNftGELrCOK6GkdAXxXDp77bwGo67ORAiB8VwSeTyaHrqDbiCwaxDZUz6aq60SsVs+0VW6f+BzAOQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkQfH8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGYBAAgsfvAzlZsdrXMmowq7iX6btPotYz4ukgCx+Rw1sjVYlZiz/u\r\njZKKBX7IZROR4ST7Kcnq8oXnW90JjS9ary1qch+ITmQXj2qaX8sPVLeEoSSf\r\nmbvdAKCnwH6DOXdVO+6DD5on2qXTlC/19kfsZwLGBT1CT9lTi+VCoA/0Y+H6\r\n3qD/7zgNlP5hpp5Q06+ZTQc03NjgLr0ehqGkuaN76OSkpFH5rjG1Sq49bTWf\r\n1iTePYn7eXCM02soFW+AGHuWSDwd3+6Gc8UjznMfk03HGYBiLcuGaxXLvED1\r\nT+MDI/K01K3xlL/kxlNIe5pZCRLCqpCrRub3nF3mRX7NdC6f/ByfFoQEvxgL\r\njdViG2F3ONgP8AZ1rKKd40evBP2O/JvpE5db0T+xA0h55I66QyAB9q7L3rMR\r\nWdIOYmT83n6TiQEX3i7eL5gVoYl6awZGZJdHGr5opOZkkiebACdMPrqvy2dv\r\nnxqm17NuNQBUq7O8Mw8BdlKTjS7btQ0aMe6FnGHGLa9ZKAhoPwPFoVysVTrK\r\noQ0WoISChq2aHlWceKgPkR9d0evl2Yt/x0nPjLuZC5XFEBf9wy0NdKS3qZSW\r\nFRPfqY+QUuWGBR7gwgQuzULfzkqKogwiisHvyZ+pgAUyquMXZ5yn1cku0de5\r\nHg753Xok0vOOrv1vVCU5mnMRyJ6hlfAqU5s=\r\n=TP4n\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.0.6.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.0.6.tgz","_integrity":"sha512-Awgjkn7tQkq/VptuxH2Cue2aE/vyDBmCaX17aNf+IdrsECZQU6JhwlScwyDbLo9FAzgX5rngdU8vGoAjS3+Zog==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.0.6 <2.0.0-internal.5.0.0","@fluidframework/sequence":">=2.0.0-internal.4.0.6 <2.0.0-internal.5.0.0","@fluidframework/merge-tree":">=2.0.0-internal.4.0.6 <2.0.0-internal.5.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.0.6 <2.0.0-internal.5.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.0.6 <2.0.0-internal.5.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.0.6 <2.0.0-internal.5.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.0.6_1682043387823_0.7635598827444825","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.1.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c4f0c7a674594d5e142def1f550d7aa440ff5b27","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.1.0.tgz","fileCount":73,"integrity":"sha512-S23huLHme5YYHx+7s0aNyDyC7RlAU49a7uhFR6Z5zvKup5ghKLv5AKUUaA/LdxU+h5mes4sRWc7+P5Dk1XtjwA==","signatures":[{"sig":"MEQCICEwYmRBZgd6Vz9OSSVm6pjiKjWKJePNbg/HeF/dFf+PAiAH9ZKc2HtB3JxK5LLF/mKgIuqaDm/87LWCgMcwxzxcIQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147570,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkQyrTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbiQ/+O0a3b9s2afB1QVv1gDO2kFcy+BpPju/+nnCNbILvPfwIkqMs\r\na+/OFYIFRa+zlhE/BCd6wnVsGxcYVG0v9/mU41MLCnnOCxGa5K11jjRqgjm9\r\nv++4VsRJjt2F2AyLycWNTpEyxanLLeLdrNbv5HFUc3tAOU1ZxAKh63vSGCZ7\r\nOsZ01vnMvoUcZ9y5r1CJ2gqTvQ+xHAue3UETdxOIgVetF+k9CPC8Kq+De4mX\r\nbTQybh5uWgSF3Dj0ulrm39fue8iWAT9oi+MEC9LxuW0rio5XXeFz4S9e1aSN\r\noUUVvCPm+6pmXlWvz99sF/PXIC8W0pYqAnWhMiqRajie/qIHpm9RVsoriAry\r\nrbeq1XmX9L9KfIfqiTG3J16Zs0E8gncztidKw9IcxqazRXdRJN48lSg9PIZe\r\nQCh6YZthLYqEjltE16L1D/TJyTQaoLvMFQzdj9O9XA3vWKG0gRZfC38vs4we\r\n0nT0QGPVQIZBCKoXy9yJwSct2X8Pm8B0lVRSVy0OlW0lmHEFIu30+zQtNtFF\r\nhPLYr8cMYKLzwTezlTukRpb0JriJ8d5h8y0xb5ZSCngCsnQns8DxtCu02xrf\r\nmTGA0Ei/4rJmQs+CgRw7WcV2q8KFpy2Dcs8DW/J3RDGmUq4xA9x1DHjW2IaW\r\n6iWAVnBML2gdKso4auD7snC4D7KBUv8I1uU=\r\n=zo0q\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.1.0.tgz","_integrity":"sha512-S23huLHme5YYHx+7s0aNyDyC7RlAU49a7uhFR6Z5zvKup5ghKLv5AKUUaA/LdxU+h5mes4sRWc7+P5Dk1XtjwA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.1.0 <2.0.0-internal.4.2.0","@fluidframework/sequence":">=2.0.0-internal.4.1.0 <2.0.0-internal.4.2.0","@fluidframework/merge-tree":">=2.0.0-internal.4.1.0 <2.0.0-internal.4.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.1.0 <2.0.0-internal.4.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.15.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.15.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.1.0 <2.0.0-internal.4.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.1.0 <2.0.0-internal.4.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.1.0_1682123475388_0.34744416902768593","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.2.0.153917":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.2.0.153917","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.2.0.153917","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c6fd2abd082d776b6a5c897f18244a1fa8f0c2b4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.2.0.153917.tgz","fileCount":73,"integrity":"sha512-cDcLqp/VlZytiCm0kHCkDW3p0b1CHBResz9mkuDiYXogVB2JtC1KVnxE84F4orySqsREyX01KKWts2zoqFWy7Q==","signatures":[{"sig":"MEYCIQC+2BSMylYCFTPqQwBoEV9AiAOEjFi9ZAgixlEmXyMUqAIhAKKIeiHjP9TZChtoi8ahkDbtf8AEZvANMh0xe1aeI1oH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkSDFlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrYEA//RifKtpIkktXO56uw7cidN1XU1mozyxOWStnnSNh0JQ2JOZP5\r\n7cVJAcehR1RnuArpyuoGYFQr+rCL6msozvJkSS7NUPu/GbvGU6Cu4jFiGQ3l\r\nCsF4C0nQxSTi0NPkeAVCwbTkLytDFKSMGb63+4mr1e66STaHrqQC1k/FhLJb\r\nKcwoBqskYFKhiLW6Fx9BIp1+5xL6Xs7g9D9FEuS/H+GISLx1tuLRB28SHo5B\r\n7NiK9gfW2ZkCBsoEQzv8666FxflYJZqcfBq9ybzl8s5Xbw5s5Guyj8FPzu26\r\n3tfmPR0S4uyPy/ttp35Y9yF1PdBQZjC6u5T6psTHyQrR0hgJ+vQ6R22MczDD\r\ndA12sFWgdWpV59crWbWGQ/TegVVyE1XCK+CHFYw4/6ojjmLmJSvCYW4r2xox\r\nSzEuByPqXZntr/q8eukKlT4bHA+78MMcuCkbW7elXf9m75MIuE3L7Hk9GgQx\r\nywc2KlY2bS/TyAKsuhn4awNpAK/vxPd2s0OXiH5ui1OM2F2ElTZcu00psEff\r\nNQ6UFDahxnpmwG7SuMQkvkf/qBG7iqc7idfJwp8iBgnfaYoLe82ZyJmWAVnc\r\n1E5IwT6XbAC92k2bbBzxnLqwSEsg9xBQLMn+kaY9I4sNQGbpfwGGQqz2udgZ\r\n1cn1Buvia/aR9TdymgXKV7tfDqsqWgGlsHk=\r\n=7RnC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.2.0.153917.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.2.0.153917.tgz","_integrity":"sha512-cDcLqp/VlZytiCm0kHCkDW3p0b1CHBResz9mkuDiYXogVB2JtC1KVnxE84F4orySqsREyX01KKWts2zoqFWy7Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.2.0.153917","@fluidframework/sequence":"2.0.0-dev.4.2.0.153917","@fluidframework/merge-tree":"2.0.0-dev.4.2.0.153917","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.2.0.153917"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.15.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.15.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.2.0.153917","@fluidframework/test-runtime-utils":"2.0.0-dev.4.2.0.153917","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.2.0.153917_1682452837603_0.6420986052020712","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.1.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8026efb72856af9f0ac292fe89940fc1268df9f1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.1.1.tgz","fileCount":73,"integrity":"sha512-IrTQ+xsztxHlcgNhyppCs45Fsz4ft+iFgzmhADILgUDV/3StHDgvpF43/oSI2uv4mdZr1GVHC70zlW9vJG/H8g==","signatures":[{"sig":"MEUCIQCZO1q4L5h2DX7ol3DSu2IOZCydErKU1QmLszb1oUaNKQIgS9UGU0T+GPPung95H3SQOZTvF9dj2MraOd97enORQ8U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147570,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkSrI7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrCIg//axNYyLPvbBc5UM4k2M6ShfypQwStF2aCneRQB3Yjz5+9MzMa\r\nR2a4TjUmWUr2tCGYoE2LyWlpZu/HSwBvFVCnClz1ugzPFcwFI/rwPYwLlTJQ\r\nKbSg2yGD4C+pp4BvUQBXAlViCGXbD8pdwIJnFbNG/EwA13OLayAqy3rGsHcP\r\n024UQl/jdfPFcU07i/RFwfolUDEjZ875egmdemaXb/qift0gZbST7/DOo2N6\r\nHPpCYAZIuy2x0Rg2GUTgZsQnnUPdGwwNFL5V/msHmwJ3To+QYTbgsSOe1O+w\r\nPnc+CWRku7/lJ4gMxVkf2cObFwHQzPvmVC6HlpLj/+8tWtENqti01BobXeyb\r\nXf+xy8eTcB5hD8/88DaEJAy4Cm2BT+J9rHHH3way9MPxsQG3hHcxe9eUQEA4\r\n3K6sRNjVpnu1JxZb+P9DVLiP97lUYT18FFB2SPobq/gR4pL9+2oA4XsbqSdz\r\nSMdtmH1JLU09Elekjj6cMUmH56J7gV3fbk9+AETFFRJksVK0d95qAJ7LhBXa\r\nxD+DR3z5FA+wan9Inp9GtOyeEy+hp3dQ9sc6qtSwGVMNx5/1GF/wZpThpUEs\r\nPlSnTBtuXSs2b45XqoXMrbuH7wDuW3D8RXMr2wEn9tWD2QZyGLLCMDpJGamE\r\nNk5YxDprTeh5/Ec2wQav4Cgl38Tqv+ZZIWE=\r\n=Up1C\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.1.1.tgz","_integrity":"sha512-IrTQ+xsztxHlcgNhyppCs45Fsz4ft+iFgzmhADILgUDV/3StHDgvpF43/oSI2uv4mdZr1GVHC70zlW9vJG/H8g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.1.1 <2.0.0-internal.4.2.0","@fluidframework/sequence":">=2.0.0-internal.4.1.1 <2.0.0-internal.4.2.0","@fluidframework/merge-tree":">=2.0.0-internal.4.1.1 <2.0.0-internal.4.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.1.1 <2.0.0-internal.4.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.15.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.15.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.1.1 <2.0.0-internal.4.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.1.1 <2.0.0-internal.4.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.1.1_1682616891391_0.8630915498415439","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.1.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.1.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.1.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"sky.jokiel","email":"sky.jokiel@outlook.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"dd37a71f5aaf7d3de24202f5a83072a738e4e511","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.1.2.tgz","fileCount":73,"integrity":"sha512-RGkV5X3BCwZFsZNw2AZ102/7KUyN1wZ46cXH51SdM21O5jE2diD7w6seNtWi9Cq8SZbLoKXruq9Cvzo897a9MA==","signatures":[{"sig":"MEYCIQD4rdqCCRsBj1LVRZ0LqFxi+sWs+CsgiZL9/+H0fzaj6QIhAJVV3/iskXjxTH9JLJjPXK9JDrpj+LFr9qoLXZ/CVDeG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147570,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkUAmCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrN5g/+Kcz7VHnToD+SNwIQTrvw78kyMz/sYxRRqNNWfqnKU53swIcl\r\nwGaoPG572m2Iv5mf312ohDqBIZnixiUlfKmc3LDWKy5lK3TOSV9JiF8qnbeC\r\n+ImPOXkKsZTOgfXjpiHQZki4yED7VvhXxZdZCtuF72r8WkYFwdVBmxOArOmm\r\njfD73YPZjOHfmQHrw5Cy3vI9VDJrDBPK6TkWr5YHlWoCiZwVpxI6Lp5VESrt\r\nmwie6w4PuJ2lpNVrJ+HpArMF+TDHlWDghY7crOkZYUMDvPt6IglpsrsgfjOn\r\nS8BAboWaWvevjjn433RzI84dIi9QGrWEug07wN/gyYY0i4Yw40cdNh9+i+Xg\r\nGgpCzyeUXxGS3T+FxYr9iPrZB6SGBjUJ6B7nbtozcWbU6jdwKQUGQLk6LfnA\r\nxBhhST31ndiZN3InWNLeQ0mgU+kHctumCfcYOiMphtvYJBF1aETuze00Y2uw\r\nUzJxBaQ2IbfdKfHsR+1wSb8Q0hGWlES49XCeg8YGYQMXwTbe/P/ioK19cx8D\r\nF2y1t8wxZolxY2vwobKrKa1JHdYum6zq44P2+1bkpXEtfa3yGW345LBHmZjZ\r\n1BcMCVUmc+HgzR2NPbxwi8xK3zDZMPhSnIiMqjs2EiIMedFbOkkARFkqzhhY\r\ng6PPTOIt+YFyHBkZ5MZBjTzeIWC4Wpg0Q7s=\r\n=IfA8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.1.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.1.2.tgz","_integrity":"sha512-RGkV5X3BCwZFsZNw2AZ102/7KUyN1wZ46cXH51SdM21O5jE2diD7w6seNtWi9Cq8SZbLoKXruq9Cvzo897a9MA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.1.2 <2.0.0-internal.4.2.0","@fluidframework/sequence":">=2.0.0-internal.4.1.2 <2.0.0-internal.4.2.0","@fluidframework/merge-tree":">=2.0.0-internal.4.1.2 <2.0.0-internal.4.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.1.2 <2.0.0-internal.4.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.15.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.15.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.1.2 <2.0.0-internal.4.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.1.2 <2.0.0-internal.4.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.1.2_1682966914114_0.6842936262308064","host":"s3://npm-registry-packages"}},"2.0.0-internal.3.4.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.3.4.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.3.4.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6a2b34d92372b3ab972bfd401088f4bdb9a3e3e0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.3.4.5.tgz","fileCount":72,"integrity":"sha512-wxCono81L9qZMd2GIgUwayodTm8Q9s7aRa7CatIBNZ/QVRNfDl+qjrKtxojLAba+fmRVMqcu7uetTrfwME630Q==","signatures":[{"sig":"MEUCIQD9FcXVS5s2G/3jPISYyQ9w9Yb/cqmJ2J+swVCaBE4gugIgUJcx6VJzpfTCIOewPW2XeE9hnyH1gz+Ho8WVBpb8F2s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkVBQjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrOnQ//VWQINYqP6gTuUsZJnzBXOmU3p7UqMLLrxAkQ82+dLop6dMNR\r\nOevUVJGwstZ7B0COqGPRYDHkpkPyRze/Pv3yWNRXxwdvAiWkLwJo2UvEFO7p\r\n2CIRMuR6rZShQ0xg2wXz2/D+Bo4lpFMxKYS4l5TpE5friEWgCk1ocESAR8OT\r\nnnDv6NVgoqnlGKzAPVcAWwEZ2JAPnLPkKsLS19EvxH9lICSo3C73ImVOpa3N\r\nsUJA96fdNKfiLw8ZoVTdVCSLMdGxUNICFo/Jh7RulCEMXNZGmRp0ef3zSPzw\r\nKQuvfQeuyAz2AXUjB6axpzrc5nJzjJxADJUM6vYIYEiXXACxKCZw85npN8q3\r\nENMxndr2IX8sseUvc7yp+54tnGVfe1yTo5ws/ROwH8568T+nAXRkS/e4pnkH\r\niBq//fMWaOqW8qKx52jeDMbDWFV52r/VZO8zUkkJm4iUuu95QO4sJKOknBKV\r\nl1L5zgE5UmvlguLf4fYmmp/rpfcvvyqG/dom/xo0vs2nId32PZVDwM/xrC6S\r\nw2RFA/bMYfSiimG2evGBKGv07FUggFA279YYuTG1x4nmY0fWFVWVdMDBhiNT\r\nX6JjngVtC7da3TXeLzYcl2ODR7Qg4y61Iz13WALkvx3+K9DfD83478CQ5XkK\r\nM7poAaAzaq8dL4tWAHLwx4aRQE+x1VQy8bs=\r\n=p2FK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.3.4.5.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.3.4.5.tgz","_integrity":"sha512-wxCono81L9qZMd2GIgUwayodTm8Q9s7aRa7CatIBNZ/QVRNfDl+qjrKtxojLAba+fmRVMqcu7uetTrfwME630Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.3.4.5 <2.0.0-internal.4.0.0","@fluidframework/sequence":">=2.0.0-internal.3.4.5 <2.0.0-internal.4.0.0","@fluidframework/merge-tree":">=2.0.0-internal.3.4.5 <2.0.0-internal.4.0.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.3.4.5 <2.0.0-internal.4.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","@fluid-tools/build-cli":"^0.13.0","@microsoft/api-extractor":"^7.34.4","@fluidframework/build-tools":"^0.13.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.3.4.5 <2.0.0-internal.4.0.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.3.4.5 <2.0.0-internal.4.0.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.3.4.5_1683231778860_0.10564309998575871","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.2.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c5adfd17ef5e4cf3908292df7006eed1bc35b746","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.2.0.tgz","fileCount":73,"integrity":"sha512-VTDBE1ZV3QghJTyVzz+V68paF59iJBJu3FlHvun4PlX5ANtqJD64Yyg4oylDQ9keVpdDJMVkxLj6YGdyx+LhBQ==","signatures":[{"sig":"MEUCIBwe57PwKiHxDLLDBkX13pIZVtMW07RVhDsULXj7M9n0AiEAgUcmBkntPl3yo96aDgaLuFGor6LkEfglJ34TFKKqFfg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147570},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.2.0.tgz","_integrity":"sha512-VTDBE1ZV3QghJTyVzz+V68paF59iJBJu3FlHvun4PlX5ANtqJD64Yyg4oylDQ9keVpdDJMVkxLj6YGdyx+LhBQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.2.0 <2.0.0-internal.4.3.0","@fluidframework/sequence":">=2.0.0-internal.4.2.0 <2.0.0-internal.4.3.0","@fluidframework/merge-tree":">=2.0.0-internal.4.2.0 <2.0.0-internal.4.3.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.2.0 <2.0.0-internal.4.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.2.0 <2.0.0-internal.4.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.2.0 <2.0.0-internal.4.3.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.2.0_1683329529968_0.018648343230136755","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.3.0.157531":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.3.0.157531","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.3.0.157531","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"64cb758950ec513e56a5a0ce56870b4b5d8495f0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.3.0.157531.tgz","fileCount":73,"integrity":"sha512-Ntk09moKaqzCbg600oqvaSkaiFQ9Ouse8DoxZmVLAZNbnPGsgdNBEIVcy/yXEkk/QMk56FGgh83V0E2bYMJz/Q==","signatures":[{"sig":"MEUCIQCnPhc6s959BbMaPpz8p4wyk6CqYQH76kUpK0CfUulSzQIgVA4/Lps4IrCNMOYpvQJpdEkGC+nvPae24dDwwMHwJ8M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147454},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.3.0.157531.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.3.0.157531.tgz","_integrity":"sha512-Ntk09moKaqzCbg600oqvaSkaiFQ9Ouse8DoxZmVLAZNbnPGsgdNBEIVcy/yXEkk/QMk56FGgh83V0E2bYMJz/Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.3.0.157531","@fluidframework/sequence":"2.0.0-dev.4.3.0.157531","@fluidframework/merge-tree":"2.0.0-dev.4.3.0.157531","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.3.0.157531"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.3.0.157531","@fluidframework/test-runtime-utils":"2.0.0-dev.4.3.0.157531","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.3.0.157531_1683579120439_0.25961532812072163","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.3.0.158678":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.3.0.158678","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.3.0.158678","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d3f6c07361984e68cbcbea988799c7aa2d0eaf87","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.3.0.158678.tgz","fileCount":64,"integrity":"sha512-bk6YNozpftjUi2SzPMtad5KvCUu/r9CGxQLLq6y4NV6btACbU5mFNY/v8ZaIhBPhEoQwBF4RHyVmda9fJPZTLg==","signatures":[{"sig":"MEUCIQCvVbhVgXKcyStPBVjW/yLqEfWxRXprrg7AxUMsBnuvUAIgXtSYvVDlDvWa2c2EA3hewff1Uc4IGyjLB/Me1sotRU8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.3.0.158678.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.3.0.158678.tgz","_integrity":"sha512-bk6YNozpftjUi2SzPMtad5KvCUu/r9CGxQLLq6y4NV6btACbU5mFNY/v8ZaIhBPhEoQwBF4RHyVmda9fJPZTLg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.3.0.158678","@fluidframework/sequence":"2.0.0-dev.4.3.0.158678","@fluidframework/merge-tree":"2.0.0-dev.4.3.0.158678","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.3.0.158678"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.3.0.158678","@fluidframework/test-runtime-utils":"2.0.0-dev.4.3.0.158678","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.3.0.158678_1683737060446_0.6179459839451751","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.3.0.159619":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.3.0.159619","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.3.0.159619","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7e898052d4c3351b6ec25d19a5f378d8347e4253","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.3.0.159619.tgz","fileCount":64,"integrity":"sha512-3jW3ezcAewNGI5Z4cFMwO7IdcVSLkX0Yg3LsJGrVyVuclN+kK4b34MJvaJhzc6s/zRTyLJKMkIuYBDOQKlY/GQ==","signatures":[{"sig":"MEUCIQC1RRATz++SNVwjSqKvucP7Tek1MI64VBL3490jjjCtsgIgMlAX3ZNpGy2bb5JKq329O+nOucxtUIpEXO5k8V4LcwA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.3.0.159619.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.3.0.159619.tgz","_integrity":"sha512-3jW3ezcAewNGI5Z4cFMwO7IdcVSLkX0Yg3LsJGrVyVuclN+kK4b34MJvaJhzc6s/zRTyLJKMkIuYBDOQKlY/GQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.3.0.159619","@fluidframework/sequence":"2.0.0-dev.4.3.0.159619","@fluidframework/merge-tree":"2.0.0-dev.4.3.0.159619","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.3.0.159619"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.3.0.159619","@fluidframework/test-runtime-utils":"2.0.0-dev.4.3.0.159619","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.3.0.159619_1683837639436_0.8452515718972151","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.2.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.2.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"86d80ccab94d31a92bde0670fb0aaea0d1b3190f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.2.1.tgz","fileCount":73,"integrity":"sha512-5PyqHwXSDTMmQ+prPOzhbfbd5PPvhfDD2giSIewApLc2q2vomBsMuPOk/yeikpEWzYwWqK501qSoBkXt9NFT5w==","signatures":[{"sig":"MEYCIQCnoJGsH2Rat4TD7VJBjuMBj1w1cWOr2zQqlaPWPZD1PgIhAO/bmiRvmACsMdUHpp4H92qSjhgzDRxRdbCXWOoYrgTQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147570},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.2.1.tgz","_integrity":"sha512-5PyqHwXSDTMmQ+prPOzhbfbd5PPvhfDD2giSIewApLc2q2vomBsMuPOk/yeikpEWzYwWqK501qSoBkXt9NFT5w==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0","@fluidframework/sequence":">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0","@fluidframework/merge-tree":">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.2.1_1683840102778_0.44431167075119804","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.3.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.3.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9ec4537c93f9123d90fc14830943ec20daaf9785","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.3.0.tgz","fileCount":64,"integrity":"sha512-aimi1RMcjEexqAmL7vPnM6h2y76+IubzZC7nmw5HUAwiwgQUGPAnE4kDc+vwquF6LC7caYQ89zFP5dgdMfmxwg==","signatures":[{"sig":"MEUCIQCZMGVsxm2NYGHZsc1D9ixvqy+P2Jg4dWF8H37KLPUvHwIgFs3fl2nvkb9ekcAVt516jlPjaHL6vNOlmnZi73ywvJM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144208},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.3.0.tgz","_integrity":"sha512-aimi1RMcjEexqAmL7vPnM6h2y76+IubzZC7nmw5HUAwiwgQUGPAnE4kDc+vwquF6LC7caYQ89zFP5dgdMfmxwg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.3.0 <2.0.0-internal.4.4.0","@fluidframework/sequence":">=2.0.0-internal.4.3.0 <2.0.0-internal.4.4.0","@fluidframework/merge-tree":">=2.0.0-internal.4.3.0 <2.0.0-internal.4.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.3.0 <2.0.0-internal.4.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.3.0 <2.0.0-internal.4.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.3.0 <2.0.0-internal.4.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.3.0_1684435542322_0.8854630798887213","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.161322":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.161322","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.161322","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"16aa18490d7967005e9b34fa5f7de3366fb270b2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.161322.tgz","fileCount":64,"integrity":"sha512-KsfMzju6TDhkq8pNEF05ww9K/HeZbOx3kaQksbQT17bDn2f8XIonWayxh3fKxiaIwYsGre4/tjC6A79VTDIlgQ==","signatures":[{"sig":"MEQCIGQ4GP2rD1ePRJvyEd3YCeXA12e64O12icmjBFlxT+LWAiAn9xn+NebNQyo1HzYZXtiSq+mRqi5dp+1K3GZ6DymxYg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161322.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161322.tgz","_integrity":"sha512-KsfMzju6TDhkq8pNEF05ww9K/HeZbOx3kaQksbQT17bDn2f8XIonWayxh3fKxiaIwYsGre4/tjC6A79VTDIlgQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.161322","@fluidframework/sequence":"2.0.0-dev.4.4.0.161322","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.161322","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.161322"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.161322","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.161322","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.161322_1684436838915_0.1142223483656215","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.161516":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.161516","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.161516","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7ffebe47fac4cf197f6fe07d3fd48748f32dd757","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.161516.tgz","fileCount":64,"integrity":"sha512-nQ2WTFToePGQ+ttaFzdkP+R3b7Hz+RcnHhj+MfpRR8Qow/pIxJwrTBozN5MZSohslDJApYsk9mRDEWtefr3f1A==","signatures":[{"sig":"MEQCIHgWZmZBIWM0vbPMfdIVlGk1Rbcvurt4OWJ9fgS04OiXAiBn8e5YAC2OxjT/6+URA0TOgGfmzIuKjUq+WACh0FCqhA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161516.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161516.tgz","_integrity":"sha512-nQ2WTFToePGQ+ttaFzdkP+R3b7Hz+RcnHhj+MfpRR8Qow/pIxJwrTBozN5MZSohslDJApYsk9mRDEWtefr3f1A==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.161516","@fluidframework/sequence":"2.0.0-dev.4.4.0.161516","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.161516","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.161516"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.161516","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.161516","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.161516_1684459983154_0.8523438536119696","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.161652":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.161652","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.161652","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"313a26b60a1ed6b28c6cfea74abe83a434904e5c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.161652.tgz","fileCount":64,"integrity":"sha512-ZvEz8X8F7OjqC+R4RE0WcmuYbX+yrrzF2ftehefq+R/GmkIFC0/iLhmFe/biScoaOl6UaF/DkeMqFp2nbzWHwg==","signatures":[{"sig":"MEQCICaAyeG+aELa6Kbn34k+fcuL6ZaWdXftFiZyUGnvUKjPAiBzTU2ehAk268TEDf0wYQeMwez6sum6oOSLMGLa8NPeyQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161652.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161652.tgz","_integrity":"sha512-ZvEz8X8F7OjqC+R4RE0WcmuYbX+yrrzF2ftehefq+R/GmkIFC0/iLhmFe/biScoaOl6UaF/DkeMqFp2nbzWHwg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.161652","@fluidframework/sequence":"2.0.0-dev.4.4.0.161652","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.161652","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.161652"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.161652","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.161652","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.161652_1684526394260_0.9485670033179323","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.161784":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.161784","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.161784","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"cf7f7feb6f50147c65883aea717649e0278d8631","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.161784.tgz","fileCount":64,"integrity":"sha512-Cmt45xn0hJT+2Lhyj1bAk0P+PA5y0XZWUCYP376COV/bCQ2gs8Nvcz54NDMNOIk9EiNJE4k+Jn7ew+NaH+xQwA==","signatures":[{"sig":"MEUCIQCYhr3vT2dxDLTS30vVlo8uGY8jMKeRFu5Sv8pq8xB41gIgXCe47BEY44xwb+dalVw8VLv7yvPeTR0he2FyYkf6YRo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161784.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.161784.tgz","_integrity":"sha512-Cmt45xn0hJT+2Lhyj1bAk0P+PA5y0XZWUCYP376COV/bCQ2gs8Nvcz54NDMNOIk9EiNJE4k+Jn7ew+NaH+xQwA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.161784","@fluidframework/sequence":"2.0.0-dev.4.4.0.161784","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.161784","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.161784"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.161784","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.161784","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.161784_1684544115472_0.8890921031063754","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.162089":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.162089","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.162089","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9027d1c1af08cbb1a16de1293349087be5d09962","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.162089.tgz","fileCount":64,"integrity":"sha512-ccFd4xJzKSmmCqSpPBf+oiQnlFsQ0D/6vHMihXio1hi6+GoOp38BtcoyLC7qprxStr/Nkxf6vgfj79GwUv87jQ==","signatures":[{"sig":"MEUCIQDhlA9nEJ28+sqgwoQRwwHlEEbe4tNlrkf8xOKOX4xwAgIgQysFGjeZXprMbawXwDyxsHiL2B9+gslN74ZW1O6a7yc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.162089.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.162089.tgz","_integrity":"sha512-ccFd4xJzKSmmCqSpPBf+oiQnlFsQ0D/6vHMihXio1hi6+GoOp38BtcoyLC7qprxStr/Nkxf6vgfj79GwUv87jQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.162089","@fluidframework/sequence":"2.0.0-dev.4.4.0.162089","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.162089","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.162089"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.162089","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.162089","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.162089_1684861709609_0.23801484078829582","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.162253":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.162253","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.162253","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5eee5bdbcb531f25693727a5b0bacf9b281ec7c1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.162253.tgz","fileCount":64,"integrity":"sha512-6BYXV98+9Hz6wPL5W5JuOCK0sQr4VSAJxyS6DogYtjq1kl20k6lZwMSODqznTyuhScWQMPaKuauz0ZDWuPkBLA==","signatures":[{"sig":"MEYCIQCQUO34bzbldNFag+djkeSdcVC5D6hTs75ttyE9Wwi2AwIhANrUvO8BnTxMLb6bUqtta4pc++kFQWQsckBpGELtGAA6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.162253.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.162253.tgz","_integrity":"sha512-6BYXV98+9Hz6wPL5W5JuOCK0sQr4VSAJxyS6DogYtjq1kl20k6lZwMSODqznTyuhScWQMPaKuauz0ZDWuPkBLA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.162253","@fluidframework/sequence":"2.0.0-dev.4.4.0.162253","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.162253","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.162253"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.162253","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.162253","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.162253_1684912684424_0.8670299120212048","host":"s3://npm-registry-packages"}},"2.0.0-dev.4.4.0.162574":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.4.4.0.162574","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.4.4.0.162574","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"638953cabb8c2d6061d16a539f93bfc053427939","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.4.4.0.162574.tgz","fileCount":64,"integrity":"sha512-3bVkmzAoKBOdeljYZmfkdko310WIwt5YcgJQInU1sk5tYzvdut6XzvLs6jlB8T3CElzAZyBJcsFVsnMbsqfk8Q==","signatures":[{"sig":"MEUCIHx4stJySLr58dLJ7jdq+CF1znzGE+gi77vB4cPkgrnFAiEAlHZlc8akH4t6DgvNNouMaayOeQfb50ZONfknfQaHsIE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144078},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.4.4.0.162574.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.4.4.0.162574.tgz","_integrity":"sha512-3bVkmzAoKBOdeljYZmfkdko310WIwt5YcgJQInU1sk5tYzvdut6XzvLs6jlB8T3CElzAZyBJcsFVsnMbsqfk8Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":"2.0.0-dev.4.4.0.162574","@fluidframework/sequence":"2.0.0-dev.4.4.0.162574","@fluidframework/merge-tree":"2.0.0-dev.4.4.0.162574","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.4.4.0.162574"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":"2.0.0-dev.4.4.0.162574","@fluidframework/test-runtime-utils":"2.0.0-dev.4.4.0.162574","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.4.4.0.162574_1685038896843_0.39287156832641634","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7be7d5db62ef823bd259fff91feef0bff45ef6e6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.4.0.tgz","fileCount":64,"integrity":"sha512-k4x9m7a4K09+U+2acEzsHaEl+GprVl/pJrurUkG6CvTfJJfidvZ4VHKnnwXujgyOkY+cxL+8TRZLelgYueSe1g==","signatures":[{"sig":"MEYCIQC352GQDY1QuOyMaLI848xAsXOQdnxlYDU9tudEAAUYoAIhAJhMooo8WPxe3ocG3e2QfiNN+RvD5906dshgIXujH1Vm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144259},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.4.0.tgz","_integrity":"sha512-k4x9m7a4K09+U+2acEzsHaEl+GprVl/pJrurUkG6CvTfJJfidvZ4VHKnnwXujgyOkY+cxL+8TRZLelgYueSe1g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.4.0 <2.0.0-internal.4.5.0","@fluidframework/sequence":">=2.0.0-internal.4.4.0 <2.0.0-internal.4.5.0","@fluidframework/merge-tree":">=2.0.0-internal.4.4.0 <2.0.0-internal.4.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.4.0 <2.0.0-internal.4.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.4.0 <2.0.0-internal.4.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.4.0 <2.0.0-internal.4.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.4.0_1685987136062_0.12583327752446904","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d572f4ff36b6ca5467b03df33859c666a4b86432","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.0.0.tgz","fileCount":64,"integrity":"sha512-TNWbsuct6P3CSml0Gxyk1r3xkhgrEdonADlv5GXUua4VHohFGcAV73uOzmpUu1x004PoHJtcVMvNNp/GF6Dp/w==","signatures":[{"sig":"MEUCIQCpaQC4YH3k+PNjurhoqUO8uEErBdNTIn3VQBGylc7pBgIgRmr0uFtiqs6g8RoqAEpyqkNKn2qDXNudOzwf2qGR5FE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144310},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.0.0.tgz","_integrity":"sha512-TNWbsuct6P3CSml0Gxyk1r3xkhgrEdonADlv5GXUua4VHohFGcAV73uOzmpUu1x004PoHJtcVMvNNp/GF6Dp/w==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.0.0 <2.0.0-internal.5.1.0","@fluidframework/sequence":">=2.0.0-internal.5.0.0 <2.0.0-internal.5.1.0","@fluidframework/merge-tree":">=2.0.0-internal.5.0.0 <2.0.0-internal.5.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.0.0 <2.0.0-internal.5.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.17.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.17.0","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.0.0 <2.0.0-internal.5.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.0.0 <2.0.0-internal.5.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.0.0_1686012107680_0.05579423496444069","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.3.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.3.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.3.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"96bfa456c19581061d0c281160e871444d8ac975","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.3.1.tgz","fileCount":64,"integrity":"sha512-57KkmsGf7xj5lho3Gz8zQ/9hzMdgyF3LMVFgdzv7G+Z4rGUjJgLBhkSiXufD3hyh2SPB8lrXI8Fj3WaX/h56cQ==","signatures":[{"sig":"MEUCIQD7Zlwmv+OgLjKtWxFk0in/4WbXIiPbh9jMfXuWxFWb1gIgOC6rapx7rBqI0+ZnOmYTyeT88Bk8QZoMaHQLRg7NwXw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144208},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.3.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.3.1.tgz","_integrity":"sha512-57KkmsGf7xj5lho3Gz8zQ/9hzMdgyF3LMVFgdzv7G+Z4rGUjJgLBhkSiXufD3hyh2SPB8lrXI8Fj3WaX/h56cQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0","@fluidframework/sequence":">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0","@fluidframework/merge-tree":">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.3.1_1686629266831_0.6839008084620564","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.4.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.4.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.4.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6d19ad3866063f1d79820dd175cd2a0bf5d4d300","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.4.1.tgz","fileCount":64,"integrity":"sha512-dk/Do96bF8mj86OfNSU2ZSAdVsTD2M1eYNMvIp6AfMmWr6jgkRID8n9v1caf5OGr1RRTyf/lrkaFxdOUIfnrYg==","signatures":[{"sig":"MEUCIEb8TQABp/CGV5kM8dsOkn1rrxkYe3ULx3Ng4N3nCThEAiEA7Ch6wYoFBSwFP3UId0gicsERtQfIbK2Ya099bc+Pd/w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144259},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.4.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.4.1.tgz","_integrity":"sha512-dk/Do96bF8mj86OfNSU2ZSAdVsTD2M1eYNMvIp6AfMmWr6jgkRID8n9v1caf5OGr1RRTyf/lrkaFxdOUIfnrYg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.4.1 <2.0.0-internal.4.5.0","@fluidframework/sequence":">=2.0.0-internal.4.4.1 <2.0.0-internal.4.5.0","@fluidframework/merge-tree":">=2.0.0-internal.4.4.1 <2.0.0-internal.4.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.4.1 <2.0.0-internal.4.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.4.1 <2.0.0-internal.4.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.4.1 <2.0.0-internal.4.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.4.1_1686773521568_0.15725654778916476","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"75b3f9fc97a5d150fbb67f8ce55e82f5c99ddeee","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.0.1.tgz","fileCount":64,"integrity":"sha512-w9KgBw2CbYx8oDGaW40HwTMbZT683jn533N/N/uxyCWY/TVCaDewwhliOYGKaQW0T5RiicyWrc/+l/p2WkvBLA==","signatures":[{"sig":"MEUCIGegtUJlcyKhVtvoAvYYLdlnF/ooWUvH/ocjcDBX5/j4AiEA6n+cD9DupqDhfl2ojghE6j9SSjKmqzjdfeRIRED3my8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144310},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.0.1.tgz","_integrity":"sha512-w9KgBw2CbYx8oDGaW40HwTMbZT683jn533N/N/uxyCWY/TVCaDewwhliOYGKaQW0T5RiicyWrc/+l/p2WkvBLA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.0.1 <2.0.0-internal.5.1.0","@fluidframework/sequence":">=2.0.0-internal.5.0.1 <2.0.0-internal.5.1.0","@fluidframework/merge-tree":">=2.0.0-internal.5.0.1 <2.0.0-internal.5.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.0.1 <2.0.0-internal.5.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.0.1 <2.0.0-internal.5.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.0.1 <2.0.0-internal.5.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.0.1_1686777540159_0.1146355713157805","host":"s3://npm-registry-packages"}},"2.0.0-dev.5.2.0.169897":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.5.2.0.169897","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.5.2.0.169897","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"21cd09e1b51d16d3c6ec2867c2ef225fa5370ae2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.5.2.0.169897.tgz","fileCount":65,"integrity":"sha512-KsGFp+635inEV4Pme2u8Yks/6J63aYBpS16VbCs2q2dmZjsVrPz/ywivsIaW8PQ+GpkZ57rnatB6qVOc/jYJ4g==","signatures":[{"sig":"MEUCIQDYoCdHUBL5trM90LTkYQCRlmaUQeApT3ouj3At7GuTUQIgbGd4iShoK9G81sf5Ytxh0Ax4OG4msy//eCkjKKs0ziA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144364},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.5.2.0.169897.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.5.2.0.169897.tgz","_integrity":"sha512-KsGFp+635inEV4Pme2u8Yks/6J63aYBpS16VbCs2q2dmZjsVrPz/ywivsIaW8PQ+GpkZ57rnatB6qVOc/jYJ4g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":"2.0.0-dev.5.2.0.169897","@fluidframework/sequence":"2.0.0-dev.5.2.0.169897","@fluidframework/merge-tree":"2.0.0-dev.5.2.0.169897","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.5.2.0.169897"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.20.0-169245","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.20.0-169245","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":"2.0.0-dev.5.2.0.169897","@fluidframework/test-runtime-utils":"2.0.0-dev.5.2.0.169897","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.5.2.0.169897_1687362497049_0.4078005653889212","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.1.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2fe2490c3ac09dee9a0d178e21206e1bfb44996e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.1.0.tgz","fileCount":65,"integrity":"sha512-6rN8hyInpRnmhM7Ju2AsmOe3o2c4Yy+Sf6CVmMmLpGFAY6ANN5UUQsEHruI79ANX9iOUAEfYQmBHJnBSI4xpww==","signatures":[{"sig":"MEUCIERcgMm++jnSaJQZnRQqEDxx++RVYb5WwFsBX7j2lAymAiEA/7Sw5xW7Ja67F17VwcAnKCv+0Iy5PG+StlM67wYHrEU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144531},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.1.0.tgz","_integrity":"sha512-6rN8hyInpRnmhM7Ju2AsmOe3o2c4Yy+Sf6CVmMmLpGFAY6ANN5UUQsEHruI79ANX9iOUAEfYQmBHJnBSI4xpww==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0","@fluidframework/sequence":">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0","@fluidframework/merge-tree":">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.19.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.19.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.1.0_1687371841165_0.4024215369732256","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.1.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"02e0eaff72e9dd99201e82d159f696b47e1914b5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.1.1.tgz","fileCount":65,"integrity":"sha512-rOoGLnwwoysTTligQh3dVndOeqFxhauKT3Vh8hzjrVRNvOe4EtuBA4A0kpUGqd/E/crfj8K5p5TilyWPFuNGcg==","signatures":[{"sig":"MEUCIHnxqWPeEzLFre01plXmgT92FqulfrDQVLOpvDhtF3HFAiEAmr/k0UF4VIRcyEMLYXZGFHl3G5+D+1Q/6C3evVGQHkU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144531},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.1.1.tgz","_integrity":"sha512-rOoGLnwwoysTTligQh3dVndOeqFxhauKT3Vh8hzjrVRNvOe4EtuBA4A0kpUGqd/E/crfj8K5p5TilyWPFuNGcg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.1.1 <2.0.0-internal.5.2.0","@fluidframework/sequence":">=2.0.0-internal.5.1.1 <2.0.0-internal.5.2.0","@fluidframework/merge-tree":">=2.0.0-internal.5.1.1 <2.0.0-internal.5.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.1.1 <2.0.0-internal.5.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.19.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.19.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.1.1 <2.0.0-internal.5.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.1.1 <2.0.0-internal.5.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.1.1_1688080934083_0.8310402539049531","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.2.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7bfa01cd221b46254ea7f0a4fafcc0a8a1fd788c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.2.0.tgz","fileCount":65,"integrity":"sha512-K2fh4OYkJjXbJvFXV4UkxNFNTvXba62M72CGDylWuoNGokS1eZmVDCH3lP0gn540PSTSly35Ulq5Bv4aEU/goA==","signatures":[{"sig":"MEUCIGrjDjSp3aVQCUOJXrYVmS4rMM2PAS4Wddy2nDU2L2a2AiEA1dsEoykV1cZgEdhdhhb9gQzzrDXXithq5Tfyglpdo0E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144582},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.2.0.tgz","_integrity":"sha512-K2fh4OYkJjXbJvFXV4UkxNFNTvXba62M72CGDylWuoNGokS1eZmVDCH3lP0gn540PSTSly35Ulq5Bv4aEU/goA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0","@fluidframework/sequence":">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0","@fluidframework/merge-tree":">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.20.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.20.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.2.0_1688584450426_0.2537784763994406","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.3.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.3.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ca00ebe410c6d9bf4dc50483fc3a96b35af17dbb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.3.0.tgz","fileCount":65,"integrity":"sha512-YF4YNRsLlV7QG7C5HeVrdHMAZkHsJ08RjXdEUDfr3Fb/GA+28wJBu0WVu3ecIXwKw7whGF0CxFf95axrmcAMwQ==","signatures":[{"sig":"MEUCIDyziquBs3cxAvgINO77pPpayIansHti8nuEwKfoXU9WAiEAmldRuuO4jZz4baakL8x4Z/FtfEQYtMu8C93iUbp383Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144639},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.3.0.tgz","_integrity":"sha512-YF4YNRsLlV7QG7C5HeVrdHMAZkHsJ08RjXdEUDfr3Fb/GA+28wJBu0WVu3ecIXwKw7whGF0CxFf95axrmcAMwQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.3.0 <2.0.0-internal.5.4.0","@fluidframework/sequence":">=2.0.0-internal.5.3.0 <2.0.0-internal.5.4.0","@fluidframework/merge-tree":">=2.0.0-internal.5.3.0 <2.0.0-internal.5.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.3.0 <2.0.0-internal.5.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.3.0 <2.0.0-internal.5.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.3.0 <2.0.0-internal.5.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.3.0_1689382622323_0.5834888618251006","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.4.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.4.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.4.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bfc47d623afba7bbf2050d67618126f7daf8aec3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.4.2.tgz","fileCount":64,"integrity":"sha512-/sPAWjJnNoQ6uG6MNNLNgXPizXpCHmMQS3WuDxmRjx+tVZ7kgRYyB7E4H6T/G5vcGiLl5WbaP6vNhddi55G12Q==","signatures":[{"sig":"MEUCIBX31PTE+J0qlL5nR3a5chZ2edeZz58oqloMb+O0VvloAiEA0C8NKkg1u24kU8L2t6BZxI20I7zspmxORM3pr/X0EEI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144259},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.4.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.4.2.tgz","_integrity":"sha512-/sPAWjJnNoQ6uG6MNNLNgXPizXpCHmMQS3WuDxmRjx+tVZ7kgRYyB7E4H6T/G5vcGiLl5WbaP6vNhddi55G12Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.4.2 <2.0.0-internal.4.5.0","@fluidframework/sequence":">=2.0.0-internal.4.4.2 <2.0.0-internal.4.5.0","@fluidframework/merge-tree":">=2.0.0-internal.4.4.2 <2.0.0-internal.4.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.4.2 <2.0.0-internal.4.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.4.2 <2.0.0-internal.4.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.4.2 <2.0.0-internal.4.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.4.2_1689973938670_0.9754659892257573","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.3.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.3.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.3.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7ddc25110880b16a2f8c6c581b20c2a637a3d6f9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.3.1.tgz","fileCount":65,"integrity":"sha512-8RdILEUW5PpQzaaLtcW1WIpDDXtlHrIWMMpSdOS4rLU/fXcoWqxcq13veB/oRWD8DuFZhTffYRppyynB0lsveg==","signatures":[{"sig":"MEUCIQCrHdeVHQ7JDYXYYAmPEjTDIfRZM/JljGZI4qYqyut+0gIgRWZLkejAhyC81JVPUkdVyfFqFIuUpujEV3BwHQ/z+ys=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144639},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.3.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.3.1.tgz","_integrity":"sha512-8RdILEUW5PpQzaaLtcW1WIpDDXtlHrIWMMpSdOS4rLU/fXcoWqxcq13veB/oRWD8DuFZhTffYRppyynB0lsveg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0","@fluidframework/sequence":">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0","@fluidframework/merge-tree":">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.3.1_1690224082096_0.2561841774715976","host":"s3://npm-registry-packages"}},"2.0.0-dev.5.3.2.178189":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.5.3.2.178189","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.5.3.2.178189","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"71746610798313d1b90e3c955a5d1d467ba7faae","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.5.3.2.178189.tgz","fileCount":65,"integrity":"sha512-YoIU8iwgMUGjuGi4Kgn/xDpc/X+TxoUmmK4PBNeWWoP1YtI9Rs3g1UxT5qqjqrSNu1eEuLUe9EarmWSYWRst/A==","signatures":[{"sig":"MEYCIQCK0IeDKO5w8YcOY/EC8oMMdK2IZIAwDjRW4BstdnZgmAIhAI9HNjLbANJdOp2fvB/DqI3qi9lhtn7FGAaF19FGnptM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144509},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.5.3.2.178189.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.5.3.2.178189.tgz","_integrity":"sha512-YoIU8iwgMUGjuGi4Kgn/xDpc/X+TxoUmmK4PBNeWWoP1YtI9Rs3g1UxT5qqjqrSNu1eEuLUe9EarmWSYWRst/A==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":"2.0.0-dev.5.3.2.178189","@fluidframework/sequence":"2.0.0-dev.5.3.2.178189","@fluidframework/merge-tree":"2.0.0-dev.5.3.2.178189","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":"2.0.0-dev.5.3.2.178189"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":"2.0.0-dev.5.3.2.178189","@fluidframework/test-runtime-utils":"2.0.0-dev.5.3.2.178189","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.5.3.2.178189_1690310193167_0.42380114065534324","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.4.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.4.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.4.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1fcabb9a24c9597f07d52458d7f941db15e40953","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.4.3.tgz","fileCount":64,"integrity":"sha512-qPfaRmSzjhUp9k43jxXNmBvOxftkINoqt6aKlUOLVGXNHLffZkUN/3e/9Hkc5ZOBt/bFjSAaDvijUgI8nBc8TQ==","signatures":[{"sig":"MEYCIQC9dSpeaxYLCTdVD+SuTP04JZVpV466f/NUMVrhevRXhAIhAIPyIH9+hcNxUYG4oelQLUES0vuPHvys97tFL50dWuZ5","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144259},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.4.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.4.3.tgz","_integrity":"sha512-qPfaRmSzjhUp9k43jxXNmBvOxftkINoqt6aKlUOLVGXNHLffZkUN/3e/9Hkc5ZOBt/bFjSAaDvijUgI8nBc8TQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.4.3 <2.0.0-internal.4.5.0","@fluidframework/sequence":">=2.0.0-internal.4.4.3 <2.0.0-internal.4.5.0","@fluidframework/merge-tree":">=2.0.0-internal.4.4.3 <2.0.0-internal.4.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.4.3 <2.0.0-internal.4.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.4.3 <2.0.0-internal.4.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.4.3 <2.0.0-internal.4.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.4.3_1690486634900_0.9357514101792854","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.3.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.3.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.3.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f99413a5cd042d09bd20bfb468c20bd1d7bc782c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.3.2.tgz","fileCount":65,"integrity":"sha512-kyJma+ivSQtW4OVPyGL7bEbuKnAR774q9uW9dkxd/ZnUWMbps37k9a6MwuT7w8MCVN9pUrQKWVRvNwQrpyrkZw==","signatures":[{"sig":"MEQCIEWl67aPnYoPAk18AWoovcuUcPkPwIhbDtQH4M3GoNiLAiBSmXe5129eIMhCn4plVrfW5FJjURPeodnaxplllwWn3A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144639},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.3.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.3.2.tgz","_integrity":"sha512-kyJma+ivSQtW4OVPyGL7bEbuKnAR774q9uW9dkxd/ZnUWMbps37k9a6MwuT7w8MCVN9pUrQKWVRvNwQrpyrkZw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.3.2 <2.0.0-internal.5.4.0","@fluidframework/sequence":">=2.0.0-internal.5.3.2 <2.0.0-internal.5.4.0","@fluidframework/merge-tree":">=2.0.0-internal.5.3.2 <2.0.0-internal.5.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.3.2 <2.0.0-internal.5.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.3.2 <2.0.0-internal.5.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.3.2 <2.0.0-internal.5.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.3.2_1690492116916_0.8640570289474734","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.4.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.4.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.4.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d0734bc7546dc36794865d9804b3149c678ed8e6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.4.4.tgz","fileCount":64,"integrity":"sha512-lYNlWqGRR5+9jBYMn5lXCorWOucRgK9+KJOinHitjXWqS8cT+d6v2+hOlNltRTwbodHF+G+k9AOnd1mgcaju/w==","signatures":[{"sig":"MEQCIGHYYQFlo6cKBMZ+F13Ak3TLdOUlOzEI3tu4QKRmfr1sAiBDlPHWJ8TYBINnGjkuiW14J1qlXWYpZ9t8uKOrirQIhg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144259},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.4.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.4.4.tgz","_integrity":"sha512-lYNlWqGRR5+9jBYMn5lXCorWOucRgK9+KJOinHitjXWqS8cT+d6v2+hOlNltRTwbodHF+G+k9AOnd1mgcaju/w==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.4.4 <2.0.0-internal.4.5.0","@fluidframework/sequence":">=2.0.0-internal.4.4.4 <2.0.0-internal.4.5.0","@fluidframework/merge-tree":">=2.0.0-internal.4.4.4 <2.0.0-internal.4.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.4.4 <2.0.0-internal.4.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.4.4 <2.0.0-internal.4.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.4.4 <2.0.0-internal.4.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.4.4_1691098220316_0.14796653928247494","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e365d24dc7807b618929032218450327913d324c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.4.0.tgz","fileCount":65,"integrity":"sha512-35onIS2CEC5CsCUCoQgOrIS8q8rtcs9vMmZOdG3qOZzi33CCazbZh7gouglbQ0pnIIUNPWSGT3GF6ypRW1vBcw==","signatures":[{"sig":"MEYCIQDBotsX2UH0Jqbg/LnYL9eoMRDQ3MnTsgA3hgjCK7bayQIhALp7Q+dc0VYsqusxDmGLdFwhFvS+58xOcTPF9tyUnkft","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144713},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.4.0.tgz","_integrity":"sha512-35onIS2CEC5CsCUCoQgOrIS8q8rtcs9vMmZOdG3qOZzi33CCazbZh7gouglbQ0pnIIUNPWSGT3GF6ypRW1vBcw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0","@fluidframework/sequence":">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0","@fluidframework/merge-tree":">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.4.0_1691098378571_0.45646423571030215","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"164db274fdafdd0b1693fa6fbc0d6bfd8e2553f5","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.0.0.tgz","fileCount":65,"integrity":"sha512-we0ds0n+KoDidE7z/abh5CWE+IglC+Q7Oakr3qOGtp6MK1kCMZQsPnU02cp65LewnCI5OOmzK987PD6fHhfwxw==","signatures":[{"sig":"MEUCIE+7d0BoFU2IWNggdx3ldhVtv1GASvUEl+qkLGb5KIeKAiEAj7HP11cM3s7UDb4wIBL1dPRUQYlG4PW9orQc9QOifYs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145421},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.0.0.tgz","_integrity":"sha512-we0ds0n+KoDidE7z/abh5CWE+IglC+Q7Oakr3qOGtp6MK1kCMZQsPnU02cp65LewnCI5OOmzK987PD6fHhfwxw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.0.0 <2.0.0-internal.6.1.0","@fluidframework/sequence":">=2.0.0-internal.6.0.0 <2.0.0-internal.6.1.0","@fluidframework/merge-tree":">=2.0.0-internal.6.0.0 <2.0.0-internal.6.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.0.0 <2.0.0-internal.6.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.0.0 <2.0.0-internal.6.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.0.0 <2.0.0-internal.6.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.0.0_1691101861216_0.49598967830464735","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.3.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.3.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.3.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"56d4b480070291e0d311adb09dd2a1574e9b4009","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.3.4.tgz","fileCount":65,"integrity":"sha512-7yZ7gzNufWjqg1gd6U+5la6Lif2vw9tcKP4qwQng/rpYteKlxwIZ7ICUEONGW4Q5KT4sbMSzrQhMRGzoJQ+hlA==","signatures":[{"sig":"MEYCIQC2vOVYu2XicC90sae+KP8vTc0U+x9aNmDknHRKxsZxpgIhAOJi7DW1QYOgyONXGpPftLPWay8JSyJwUjEzii67wA7y","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144639},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.3.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.3.4.tgz","_integrity":"sha512-7yZ7gzNufWjqg1gd6U+5la6Lif2vw9tcKP4qwQng/rpYteKlxwIZ7ICUEONGW4Q5KT4sbMSzrQhMRGzoJQ+hlA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.3.4 <2.0.0-internal.5.4.0","@fluidframework/sequence":">=2.0.0-internal.5.3.4 <2.0.0-internal.5.4.0","@fluidframework/merge-tree":">=2.0.0-internal.5.3.4 <2.0.0-internal.5.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.3.4 <2.0.0-internal.5.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.3.4 <2.0.0-internal.5.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.3.4 <2.0.0-internal.5.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.3.4_1691439960537_0.07614987557691122","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.1.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b14cf65945f1cd4c0cc5ad94381c618e8b874d31","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.1.0.tgz","fileCount":65,"integrity":"sha512-AleEm2MsgDEquFFII8/8LnPiGKPGaGwGEdrNQNzKyf7N0bxTf84xTVR5FLn/36AgeJLWKxyUHbIXehyjQi5U8Q==","signatures":[{"sig":"MEUCIQDgVCnj4qR61kmx55IanS1DO+ZrQWmU5+PvQoKhAWtRkwIgUA84laEKY8OqLiDbfeHxcbKLq6N7pfKmi217gKb0/7I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145474},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.1.0.tgz","_integrity":"sha512-AleEm2MsgDEquFFII8/8LnPiGKPGaGwGEdrNQNzKyf7N0bxTf84xTVR5FLn/36AgeJLWKxyUHbIXehyjQi5U8Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.1.0 <2.0.0-internal.6.2.0","@fluidframework/sequence":">=2.0.0-internal.6.1.0 <2.0.0-internal.6.2.0","@fluidframework/merge-tree":">=2.0.0-internal.6.1.0 <2.0.0-internal.6.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.1.0 <2.0.0-internal.6.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.1.0 <2.0.0-internal.6.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.1.0 <2.0.0-internal.6.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.1.0_1692140705685_0.4374878757872447","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.1.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ebd0cbefb0a8f3f8bae2f2fad9d2a5694a90afd8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.1.1.tgz","fileCount":65,"integrity":"sha512-VRvzOYRddakXQ0OO7iBoSp/7D5nVxuEXtpsAwKTGJG+k98TgIs+5zDNg0va06NVh3EqrOilC6ac+lWCogT16EA==","signatures":[{"sig":"MEUCIQDqFF1s+EP8hlkWu5T8dxYzPTQPlM3x2i73rvnNKRC2uwIgWOGYajG7pCdh08XYcapu4Ijh2TLHFYFC7EZYt2o6sE8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145474},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.1.1.tgz","_integrity":"sha512-VRvzOYRddakXQ0OO7iBoSp/7D5nVxuEXtpsAwKTGJG+k98TgIs+5zDNg0va06NVh3EqrOilC6ac+lWCogT16EA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.1.1 <2.0.0-internal.6.2.0","@fluidframework/sequence":">=2.0.0-internal.6.1.1 <2.0.0-internal.6.2.0","@fluidframework/merge-tree":">=2.0.0-internal.6.1.1 <2.0.0-internal.6.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.1.1 <2.0.0-internal.6.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.1.1 <2.0.0-internal.6.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.1.1 <2.0.0-internal.6.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.1.1_1692316459850_0.47100021804429604","host":"s3://npm-registry-packages"}},"2.0.0-internal.5.4.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.5.4.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.5.4.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fa1dbdb741fdf636f614d1dd831fee14df9b3ec3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.5.4.2.tgz","fileCount":65,"integrity":"sha512-Qru1Isjjv4JBjJQVsoUxRiix+qhRlfL9GMYP/+IDCAYp1ut//uxARA80IVDYAYT185soHz/BvPE0qyxxFEt/NQ==","signatures":[{"sig":"MEUCICaMqLDOpz34z/I1MeIzWxDG9g3I07c8w7lFBr3OlKZQAiEAqgFtUUIOJaF2tV0mE3f7S6ZNxzJHn+NdKVEUqJ0UCAA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144713},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.5.4.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.5.4.2.tgz","_integrity":"sha512-Qru1Isjjv4JBjJQVsoUxRiix+qhRlfL9GMYP/+IDCAYp1ut//uxARA80IVDYAYT185soHz/BvPE0qyxxFEt/NQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0","@fluidframework/sequence":">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0","@fluidframework/merge-tree":">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^1.2.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.5.4.2_1692546772290_0.6643989420310137","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"944844ee4ede046875deaaddb1c6f6102ede7d94","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.0.1.tgz","fileCount":65,"integrity":"sha512-5F/Zlb5OK/wcmYGOB6Ke8rV9rUBgsEGR8EeXUYWaFkQ6Iw+xdv1USUbBaHOGGk3k6ztCovLjVdiEkGc4sa6Jcg==","signatures":[{"sig":"MEYCIQDBcdXoKfo/ZMe0/UKF2cNre2CJO7yrYe0VAug0kL4r7AIhAOhtieimvxbZUZu6jojAZyUcErL4B3KvOdHPxxwjpgiU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145421},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.0.1.tgz","_integrity":"sha512-5F/Zlb5OK/wcmYGOB6Ke8rV9rUBgsEGR8EeXUYWaFkQ6Iw+xdv1USUbBaHOGGk3k6ztCovLjVdiEkGc4sa6Jcg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.0.1 <2.0.0-internal.6.1.0","@fluidframework/sequence":">=2.0.0-internal.6.0.1 <2.0.0-internal.6.1.0","@fluidframework/merge-tree":">=2.0.0-internal.6.0.1 <2.0.0-internal.6.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.0.1 <2.0.0-internal.6.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.0.1 <2.0.0-internal.6.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.0.1 <2.0.0-internal.6.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.0.1_1692566661514_0.7286880125097337","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.2.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f1a63317194639d59db4e1b9b8c5920547b97205","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.2.0.tgz","fileCount":65,"integrity":"sha512-zMTD0HIQyyFIG/wwrtbV1VZGU28xbhLp5oKQZnHiPJegyyxNxYzczM7tcuvIs5+tuBY8YTUNtRHXatKeufS24Q==","signatures":[{"sig":"MEUCIQDmZ5yz0O+1eY15XvGpkG2ZBCVMb28C3B0/+0hTvkY6UAIgWlQVeouvUddG0VlHZnxilDMTLBHNBk2fR01912jmf3w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145568},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.2.0.tgz","_integrity":"sha512-zMTD0HIQyyFIG/wwrtbV1VZGU28xbhLp5oKQZnHiPJegyyxNxYzczM7tcuvIs5+tuBY8YTUNtRHXatKeufS24Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.2.0 <2.0.0-internal.6.3.0","@fluidframework/sequence":">=2.0.0-internal.6.2.0 <2.0.0-internal.6.3.0","@fluidframework/merge-tree":">=2.0.0-internal.6.2.0 <2.0.0-internal.6.3.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.2.0 <2.0.0-internal.6.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.23.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.23.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.2.0 <2.0.0-internal.6.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.2.0 <2.0.0-internal.6.3.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.2.0_1693333614835_0.20370221043324754","host":"s3://npm-registry-packages"}},"1.3.7":{"name":"@fluidframework/dds-interceptions","version":"1.3.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.3.7","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"36d8a33440e91ef929fd11dc0ac98de6fb544284","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.3.7.tgz","fileCount":70,"integrity":"sha512-XEoO280Nu97SQiydToIjIFyfMn7BvoKSLPz1sWDumiko5Q37yJGZAAlmINWLOLoZjMg4xdD827Q3kxkjxUsixA==","signatures":[{"sig":"MEUCIQCTBr6TZCHJs60f0Al0DHhhWccNrQeu5xc+//UI1UnJGgIgF9yD1UOC3qprFxA8GfmLQvtvlXYpYWVwf2+cBOleQeI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145611},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.3.7.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","tsfmt":"tsfmt --verify","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","tsfmt:fix":"tsfmt --replace","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-validator -g -d .","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"14.21.3","dependencies":{"@fluidframework/map":"^1.3.7","@fluidframework/sequence":"^1.3.7","@fluidframework/merge-tree":"^1.3.7","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"^1.3.7"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.3.0"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.2.74327","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.3.7","@fluidframework/test-runtime-utils":"^1.3.7","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@^1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.3.7_1693503938510_0.08582986001458592","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.3.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.3.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b9261867e1032d49f71d1675bf6cda3cecd2907b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.3.0.tgz","fileCount":65,"integrity":"sha512-cH6zXeDhlKjOweVzDMPm0H8bvHYerUjtm/ByLJQbtEHyD3om2TyXtm2YoPpL6nDAMfk8VjmCorrlKzenGmSq5w==","signatures":[{"sig":"MEUCIQDOKkI9VZZaKcY9OHHgfZYtjpaoXN2CF5sogYNI3AuPVQIgBKU3kG/mhpd9eDfRZZvqmPRIHXMZGGFuRK93WsW8GlM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145373},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.3.0.tgz","_integrity":"sha512-cH6zXeDhlKjOweVzDMPm0H8bvHYerUjtm/ByLJQbtEHyD3om2TyXtm2YoPpL6nDAMfk8VjmCorrlKzenGmSq5w==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0","@fluidframework/sequence":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0","@fluidframework/core-utils":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0","@fluidframework/merge-tree":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0","@fluidframework/runtime-definitions":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.3.0 <2.0.0-internal.6.4.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.3.0_1694039925865_0.7944647351035716","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.3.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.3.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.3.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bf848e6acb8554f253b52dceb97e97c17b47ed32","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.3.1.tgz","fileCount":65,"integrity":"sha512-ph2fJdrSXq5GLw4FFabULljTHhZBljiS8CyBTmj1XYnP767C2IFjDKOrq0Itm8NrsSsU7ImKf2cm86+ZmiuEUQ==","signatures":[{"sig":"MEYCIQDeTAR6X3DbQByCK7a0XZQ3cxKDUynFXV0zRBOVnbI4QAIhANN1KmZetjhqHMqzkjhr2K/85qES9S3mvetbPaCUI2xS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145373},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.3.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.3.1.tgz","_integrity":"sha512-ph2fJdrSXq5GLw4FFabULljTHhZBljiS8CyBTmj1XYnP767C2IFjDKOrq0Itm8NrsSsU7ImKf2cm86+ZmiuEUQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0","@fluidframework/sequence":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0","@fluidframework/core-utils":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0","@fluidframework/merge-tree":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0","@fluidframework/runtime-definitions":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.3.1 <2.0.0-internal.6.4.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.3.1_1694116813751_0.869165488621316","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0e6e42480759f358e618657ff319c56ec39f2e9b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.0.2.tgz","fileCount":65,"integrity":"sha512-WN5NFHS45RzPOwTGkzvmby1S4HCRnOPUS65lzlgiS5sRZUbISZj+qyEgQmVGJygb/15bHf9I/5/wv3Za2UKIdw==","signatures":[{"sig":"MEUCIQDRdxswS4KJx/6sPFsIM/Yx3VLqCO4k1nT2i8j3CxZQiAIgKieFU2OeD7IVrviomB0QaQ9ULp+lKfGOmF68GCj2eJM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145421},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.0.2.tgz","_integrity":"sha512-WN5NFHS45RzPOwTGkzvmby1S4HCRnOPUS65lzlgiS5sRZUbISZj+qyEgQmVGJygb/15bHf9I/5/wv3Za2UKIdw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.0.2 <2.0.0-internal.6.1.0","@fluidframework/sequence":">=2.0.0-internal.6.0.2 <2.0.0-internal.6.1.0","@fluidframework/merge-tree":">=2.0.0-internal.6.0.2 <2.0.0-internal.6.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.0.2 <2.0.0-internal.6.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.0.2 <2.0.0-internal.6.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.0.2 <2.0.0-internal.6.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.0.2_1694134832067_0.5819100195331346","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.3.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.3.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.3.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3c2df268053c8fac22a54b97f44867124e2cd71e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.3.2.tgz","fileCount":65,"integrity":"sha512-azj38UFuVUViKnPz/cnhEgGSih2bqZZgnE2Cqr28Ty0r9hK9RldDczdfCsqaeueekuC46HTFowFbAG3T4IWyxQ==","signatures":[{"sig":"MEQCIAx2z8UA+0Dsu8G/h/RsmqTsKgRAOPW8Jfh9QC/SybFnAiAU4UdUJZ4K0d85YV3l2KVg5k7W8xoEuz01GsXvzFA9vw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145373},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.3.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.3.2.tgz","_integrity":"sha512-azj38UFuVUViKnPz/cnhEgGSih2bqZZgnE2Cqr28Ty0r9hK9RldDczdfCsqaeueekuC46HTFowFbAG3T4IWyxQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0","@fluidframework/sequence":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0","@fluidframework/core-utils":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0","@fluidframework/merge-tree":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0","@fluidframework/runtime-definitions":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.3.2 <2.0.0-internal.6.4.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.3.2_1694213297288_0.17636431848734424","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.1.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.1.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.1.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a47c35a8bb48a0d32389dd7d855e49fc59eec8fa","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.1.2.tgz","fileCount":65,"integrity":"sha512-Be25QRcvjyMMA9iWjCabAySqQgRcF0FFok/8ci3tupZVkdro1nFEb2xtUD/pFCrlsDf8gBGLyP7RYCQng357cg==","signatures":[{"sig":"MEYCIQDn4PYFAM9eK+dDbPOFTNnERq+O3jh93y5TKgQIrLH+dQIhAMWiPOOqi4y5DD2CCE8d5lUwsgvmLPUOZK8LMtFvS+e2","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145474},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.1.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.1.2.tgz","_integrity":"sha512-Be25QRcvjyMMA9iWjCabAySqQgRcF0FFok/8ci3tupZVkdro1nFEb2xtUD/pFCrlsDf8gBGLyP7RYCQng357cg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.1.2 <2.0.0-internal.6.2.0","@fluidframework/sequence":">=2.0.0-internal.6.1.2 <2.0.0-internal.6.2.0","@fluidframework/merge-tree":">=2.0.0-internal.6.1.2 <2.0.0-internal.6.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.1.2 <2.0.0-internal.6.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.1.2 <2.0.0-internal.6.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.1.2 <2.0.0-internal.6.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.1.2_1694452941707_0.1664043474904635","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1511c94072dfdd790583ef75766d211cd8ca88a9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.0.3.tgz","fileCount":65,"integrity":"sha512-h32IdEUsrI2IOoxaGOtn7xpPsQ1IlChIlT5qjo0NNZNplQmHS7z24vdUpB1qNUfPYoIliH8+5MZfFBR1qwe6Fw==","signatures":[{"sig":"MEQCIHPMKw41L4xf+dH6bRNMMuoQ02kJh/f4KpEJWhOrB1+nAiBkPDpqXRuGgGSwsUG6Y6CrrPdmCfiRmnrn9gNWA3TBLA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145421},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.0.3.tgz","_integrity":"sha512-h32IdEUsrI2IOoxaGOtn7xpPsQ1IlChIlT5qjo0NNZNplQmHS7z24vdUpB1qNUfPYoIliH8+5MZfFBR1qwe6Fw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.0.3 <2.0.0-internal.6.1.0","@fluidframework/sequence":">=2.0.0-internal.6.0.3 <2.0.0-internal.6.1.0","@fluidframework/merge-tree":">=2.0.0-internal.6.0.3 <2.0.0-internal.6.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.0.3 <2.0.0-internal.6.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.0.3 <2.0.0-internal.6.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.0.3 <2.0.0-internal.6.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.0.3_1694453065457_0.24433746553271996","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.2.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.2.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8a570bdf1cbeb86cc0bfd05ee66b0fe91d770fa6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.2.1.tgz","fileCount":65,"integrity":"sha512-5SOVd9HEHU242gvIOx1mNuopou/q2WYhGebzk3WSirpGmarhgOwHCEKMv/J6N62FMETyzcI6NDDjBGUYbsbxzw==","signatures":[{"sig":"MEUCIBYAKsj2ED+eekaVjs/VgtoDJWjmM3gMPJR6VUXVh9owAiEAuf0SWs8w/gTT7YyrimvMojJJzfjBzDTZCo+PnMdRR+U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145568},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.2.1.tgz","_integrity":"sha512-5SOVd9HEHU242gvIOx1mNuopou/q2WYhGebzk3WSirpGmarhgOwHCEKMv/J6N62FMETyzcI6NDDjBGUYbsbxzw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.2.1 <2.0.0-internal.6.3.0","@fluidframework/sequence":">=2.0.0-internal.6.2.1 <2.0.0-internal.6.3.0","@fluidframework/merge-tree":">=2.0.0-internal.6.2.1 <2.0.0-internal.6.3.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.2.1 <2.0.0-internal.6.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.23.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.23.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.2.1 <2.0.0-internal.6.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.2.1 <2.0.0-internal.6.3.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.2.1_1694453221425_0.08970753091678696","host":"s3://npm-registry-packages"}},"2.0.0-internal.4.3.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.4.3.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.4.3.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fb2e19263ae302fa7f2b97c437d42e0810d12251","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.4.3.2.tgz","fileCount":64,"integrity":"sha512-tudjn/DjnlBC1UKjppGAG/axkmkfwCNhOHP5fUkJNZFattvsIx5NzaExyYNuXx/4MM9Vh4H50fdxX2RkGcoBMw==","signatures":[{"sig":"MEUCICRWS8WlcSsAi92Ab78hth+SDa0OWf6Ws8IJe4W8NO+BAiEA0FxPTfI/07GhFSAaMjoj2NoIS6/XYVKCh2jRayM32Cc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144208},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.4.3.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.4.3.2.tgz","_integrity":"sha512-tudjn/DjnlBC1UKjppGAG/axkmkfwCNhOHP5fUkJNZFattvsIx5NzaExyYNuXx/4MM9Vh4H50fdxX2RkGcoBMw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.19.4","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.20.2","dependencies":{"@fluidframework/map":">=2.0.0-internal.4.3.2 <2.0.0-internal.4.4.0","@fluidframework/sequence":">=2.0.0-internal.4.3.2 <2.0.0-internal.4.4.0","@fluidframework/merge-tree":">=2.0.0-internal.4.3.2 <2.0.0-internal.4.4.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.4.3.2 <2.0.0-internal.4.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.18.2","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.18.2","@fluidframework/build-common":"^1.1.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.4.3.2 <2.0.0-internal.4.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.4.3.2 <2.0.0-internal.4.4.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.4.3.2_1694465877641_0.6772418085197478","host":"s3://npm-registry-packages"}},"2.0.0-dev.6.4.0.191258":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.6.4.0.191258","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.6.4.0.191258","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1ff94d19355b64f45e48e2ce3493511be7951297","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.6.4.0.191258.tgz","fileCount":65,"integrity":"sha512-5477w+XkDM13donVU29bM5HG84RkRAuR1lB2rgDGh0vV5s8nQ7pMw69FZLgY7Oq13HS/87Bb3910tBVK+MTQgA==","signatures":[{"sig":"MEYCIQChUG9wOiOaXw9AFBHR/fF8hOcT3uUsRuuZHB635ZtzqwIhAImlAsGI5Q8RePLKndYL6yRBnKjx00TO9eNxcvy1mR05","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145221},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.6.4.0.191258.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.6.4.0.191258.tgz","_integrity":"sha512-5477w+XkDM13donVU29bM5HG84RkRAuR1lB2rgDGh0vV5s8nQ7pMw69FZLgY7Oq13HS/87Bb3910tBVK+MTQgA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.6.4.0.191258","@fluidframework/sequence":"2.0.0-dev.6.4.0.191258","@fluidframework/core-utils":"2.0.0-dev.6.4.0.191258","@fluidframework/merge-tree":"2.0.0-dev.6.4.0.191258","@fluidframework/runtime-definitions":"2.0.0-dev.6.4.0.191258"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.6.4.0.191258","@fluidframework/test-runtime-utils":"2.0.0-dev.6.4.0.191258","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.6.4.0.191258_1695095541334_0.66698707022611","host":"s3://npm-registry-packages"}},"2.0.0-dev.6.4.0.191457":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.6.4.0.191457","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.6.4.0.191457","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"177fcfe175e5d7ae84b2995b000d8fb1ab09a36f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.6.4.0.191457.tgz","fileCount":65,"integrity":"sha512-L6YXFw+BYzD50DIhSZUcJap9jg8253j2oWXdHFxQU8JxHgVowbrbr7x27EJxX8BAxdniP2HMnh9x+eQ3dDCr6g==","signatures":[{"sig":"MEQCIFuDRUw+vwlzaB84E6BumSI0eUa27420uyMUfFAh4r8SAiB++blLnSbkPmRyEHMkggoPFtLj26DrKKOweIsZR3secg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145221},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.6.4.0.191457.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.6.4.0.191457.tgz","_integrity":"sha512-L6YXFw+BYzD50DIhSZUcJap9jg8253j2oWXdHFxQU8JxHgVowbrbr7x27EJxX8BAxdniP2HMnh9x+eQ3dDCr6g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.6.4.0.191457","@fluidframework/sequence":"2.0.0-dev.6.4.0.191457","@fluidframework/core-utils":"2.0.0-dev.6.4.0.191457","@fluidframework/merge-tree":"2.0.0-dev.6.4.0.191457","@fluidframework/runtime-definitions":"2.0.0-dev.6.4.0.191457"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.6.4.0.191457","@fluidframework/test-runtime-utils":"2.0.0-dev.6.4.0.191457","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.6.4.0.191457_1695165640520_0.4943479354373437","host":"s3://npm-registry-packages"}},"2.0.0-dev.6.4.0.191515":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.6.4.0.191515","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.6.4.0.191515","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"73ef1ad77cfa4b874072c2a3aa613d034599005c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.6.4.0.191515.tgz","fileCount":65,"integrity":"sha512-W4uD+gDNm6on2Cr5Lst3MoGJ2M7apFkeYZu+kYivKopDDT2v3u2vi86HV7Cq2dP8Y4ZpzZ6jf2AvHEPCZhoqnA==","signatures":[{"sig":"MEUCIQCegPTKTH6rt+rm6kINcl4o0wh42CLwg61TF73QazV68QIgWhwlqV7cdDr3xmNPPlb07npms4L5Vsza0iPSyEfA9lc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145221},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.6.4.0.191515.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.6.4.0.191515.tgz","_integrity":"sha512-W4uD+gDNm6on2Cr5Lst3MoGJ2M7apFkeYZu+kYivKopDDT2v3u2vi86HV7Cq2dP8Y4ZpzZ6jf2AvHEPCZhoqnA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.6.4.0.191515","@fluidframework/sequence":"2.0.0-dev.6.4.0.191515","@fluidframework/core-utils":"2.0.0-dev.6.4.0.191515","@fluidframework/merge-tree":"2.0.0-dev.6.4.0.191515","@fluidframework/runtime-definitions":"2.0.0-dev.6.4.0.191515"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.6.4.0.191515","@fluidframework/test-runtime-utils":"2.0.0-dev.6.4.0.191515","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.6.4.0.191515_1695170036057_0.058798521128001546","host":"s3://npm-registry-packages"}},"2.0.0-dev.6.4.0.192049":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.6.4.0.192049","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.6.4.0.192049","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b8c4270842ff5cf14004529999b8194efc094242","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.6.4.0.192049.tgz","fileCount":65,"integrity":"sha512-DKPXP8kVVC/5e8x1Eavm9L/XxOpIgCV9PVpouzzLrg5kFsMjmbq8418L+uDjgFpT4Rrd9SKU3QHbhB5L3gOjIg==","signatures":[{"sig":"MEYCIQC7NAOvcm7kLNtEloEZN5CHDr7CfJfYSg1JD9Eo9D9BQwIhAKFq03VBEH4VeyBQa7HooozdBlLRVxGrtizQ7pBj3FoS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145221},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.6.4.0.192049.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.6.4.0.192049.tgz","_integrity":"sha512-DKPXP8kVVC/5e8x1Eavm9L/XxOpIgCV9PVpouzzLrg5kFsMjmbq8418L+uDjgFpT4Rrd9SKU3QHbhB5L3gOjIg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.6.4.0.192049","@fluidframework/sequence":"2.0.0-dev.6.4.0.192049","@fluidframework/core-utils":"2.0.0-dev.6.4.0.192049","@fluidframework/merge-tree":"2.0.0-dev.6.4.0.192049","@fluidframework/runtime-definitions":"2.0.0-dev.6.4.0.192049"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":"2.0.0-dev.6.4.0.192049","@fluidframework/test-runtime-utils":"2.0.0-dev.6.4.0.192049","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.6.4.0.192049_1695252938758_0.7355267219569084","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.3.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.3.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.3.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"da9329805c3fd22418842cd8da65005895fbfcec","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.3.3.tgz","fileCount":65,"integrity":"sha512-GffjR38lGPKgpnkIAzn/zRUdXjAcDxCvS1eWyMevjkTjB+/BnUW5UxhO/43CSDvTnz85vhAwNd7cAGQpTvgCSA==","signatures":[{"sig":"MEYCIQDyTPaVBKLPsQl6z816X7EgWzuEy2eYtL6mLEoZDCCdOAIhAPNrGc3Etv6XjiWwH8VvuZOT68Vj21j/CvweniImnGLs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145373},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.3.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.3.3.tgz","_integrity":"sha512-GffjR38lGPKgpnkIAzn/zRUdXjAcDxCvS1eWyMevjkTjB+/BnUW5UxhO/43CSDvTnz85vhAwNd7cAGQpTvgCSA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0","@fluidframework/sequence":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0","@fluidframework/core-utils":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0","@fluidframework/merge-tree":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0","@fluidframework/runtime-definitions":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.3.3 <2.0.0-internal.6.4.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.3.3_1695333278865_0.3518703746888192","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fb8b84b07a5ee940da5fe205e22f54a07336636c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.4.0.tgz","fileCount":65,"integrity":"sha512-Hchg2wjgKTXmSv6HJeF4/Q6JMFsCA5H+gy7I8J95Dkwbmpl2/5ESh2n9Zdp9+fAveX4pn9E2NWb93gqe3bJpaw==","signatures":[{"sig":"MEUCIF6XM/gKONdx0rSvD+71tymQkfBKsIvVuKrSSaYqHffhAiEAimsBSmahyR2VHAbdtTjZuW3rocEcxJ+Yvcx1M2Zrtww=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145424},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.4.0.tgz","_integrity":"sha512-Hchg2wjgKTXmSv6HJeF4/Q6JMFsCA5H+gy7I8J95Dkwbmpl2/5ESh2n9Zdp9+fAveX4pn9E2NWb93gqe3bJpaw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0","@fluidframework/sequence":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0","@fluidframework/core-utils":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0","@fluidframework/merge-tree":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.4.0 <2.0.0-internal.6.5.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.4.0_1695863189229_0.3366887896411781","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d8d54aa0632af22b2660b88674f8810375cb2d9c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.0.0.tgz","fileCount":65,"integrity":"sha512-kJd74/qOQVN0ia3gvNhJ+1sRBEpz7pU9AVopbo4RddFh3SbAvKCAmFq/Iv8e4CiO7mDAJitR9v+7SqafP6vOFQ==","signatures":[{"sig":"MEUCIFNCcRgrBUPvBGhDfK15z60vFAaLzGQnnC+VbvpClyN9AiEArJFiUYC+gptpm5e7YnH9SaVmr2kR/XZq3w0+jA+3O7g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145699},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.0.0.tgz","_integrity":"sha512-kJd74/qOQVN0ia3gvNhJ+1sRBEpz7pU9AVopbo4RddFh3SbAvKCAmFq/Iv8e4CiO7mDAJitR9v+7SqafP6vOFQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0","@fluidframework/sequence":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0","@fluidframework/core-utils":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0","@fluidframework/merge-tree":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.24.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.24.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.0.0 <2.0.0-internal.7.1.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.0.0_1695923057442_0.21989509749283842","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.0.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.0.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.0.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f045be0c360d58a660f9ede4459a290342f570a9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.0.4.tgz","fileCount":65,"integrity":"sha512-YNxoxdfJb9qGyWkdjtlLyEkIBeNbnPPpUrhz/ZqZlQHmZJ4fLXhUiJWahxMk3zSBBnxu45ulUcq6WNuHVCjO2w==","signatures":[{"sig":"MEUCIQCn2niVeLRGXnaUg55O9ZecrnaCC8NG6IkbOXd9bP2HsgIgWfBp7dMbUdg/IUgIhdVQeOMDbzdOciODEdK3nY+dFQ8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145421},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.0.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.0.4.tgz","_integrity":"sha512-YNxoxdfJb9qGyWkdjtlLyEkIBeNbnPPpUrhz/ZqZlQHmZJ4fLXhUiJWahxMk3zSBBnxu45ulUcq6WNuHVCjO2w==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.0.4 <2.0.0-internal.6.1.0","@fluidframework/sequence":">=2.0.0-internal.6.0.4 <2.0.0-internal.6.1.0","@fluidframework/merge-tree":">=2.0.0-internal.6.0.4 <2.0.0-internal.6.1.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.0.4 <2.0.0-internal.6.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.21.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.21.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.0.4 <2.0.0-internal.6.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.0.4 <2.0.0-internal.6.1.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.0.4_1696292930632_0.2340323511909006","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.1.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.1.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.1.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a85a92ac51988a381e0fb58a748fc3600d8abcd7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.1.3.tgz","fileCount":65,"integrity":"sha512-wh/qGq79/BJYCfF9L+IyILhM/3JBuRNcfElFhAGeONmZa02ReNjOOjNnoHdF9pUurPvG1oMNQiJRDIRWa3WDOw==","signatures":[{"sig":"MEUCIAC0wa8gjidHd+j1Pt7oJ/Q6hrN2t9dhjoTFvY2kshUkAiEA1INASwzHdbtKtkmoCBE7XY73zEvbPAojE0tREjWjW5E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145474},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.1.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form 2.0.0-internal.x.y.z, called the Fluid internal version\nscheme, you must use a `>= <` dependency range. Standard `^` and `~` ranges will not work as expected. See the\n[@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.1.3.tgz","_integrity":"sha512-wh/qGq79/BJYCfF9L+IyILhM/3JBuRNcfElFhAGeONmZa02ReNjOOjNnoHdF9pUurPvG1oMNQiJRDIRWa3WDOw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.1.3 <2.0.0-internal.6.2.0","@fluidframework/sequence":">=2.0.0-internal.6.1.3 <2.0.0-internal.6.2.0","@fluidframework/merge-tree":">=2.0.0-internal.6.1.3 <2.0.0-internal.6.2.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.1.3 <2.0.0-internal.6.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.1.3 <2.0.0-internal.6.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.1.3 <2.0.0-internal.6.2.0","@fluidframework/eslint-config-fluid":"^2.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.1.3_1696297225307_0.1945263082982156","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.3.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.3.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.3.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b9d930976c8447c9cfcc51eadca89aba86bbdac9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.3.4.tgz","fileCount":65,"integrity":"sha512-H721XZjLMxCrbL5/zj7TLeI1t4rNp9fWxxbT/+haVubMVd2rjyNBFDCIuAPRvDynjgZoHFzDZtJZBcyOPjoajw==","signatures":[{"sig":"MEYCIQCeT7BVVThNMNwVsafXgkoZwfSkeqYJhxuu+Mz2BEtApgIhALR97/3RR+dLCNATnPOQmGJ1fTbIHp5Aa/jefGIoU8Du","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145373},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.3.4.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.3.4.tgz","_integrity":"sha512-H721XZjLMxCrbL5/zj7TLeI1t4rNp9fWxxbT/+haVubMVd2rjyNBFDCIuAPRvDynjgZoHFzDZtJZBcyOPjoajw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0","@fluidframework/sequence":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0","@fluidframework/core-utils":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0","@fluidframework/merge-tree":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0","@fluidframework/runtime-definitions":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.22.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.22.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.3.4 <2.0.0-internal.6.4.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.3.4_1696300886921_0.8619552224356597","host":"s3://npm-registry-packages"}},"2.0.0-internal.6.2.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.6.2.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.6.2.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"40c04de454836685d1aa270c1932dc71a380493c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.6.2.2.tgz","fileCount":65,"integrity":"sha512-tizvcyoq/71IumjW7q6nMsouqwAl6dahmMtvqg/g7Zc+ZLxhdl6LasKAnzqX+iT/U3SLCi1eMHGjWKRmd0n0Gg==","signatures":[{"sig":"MEYCIQCZGGbQQWip89HphN/3K0PRk7+uCz1osvQvx+8UPoi1EwIhAK8NdooCPQuPi8DLC6wFUxNseE7h9DER+4leQhjOLNmz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145568},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.6.2.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","test:mocha:multireport":"npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.6.2.2.tgz","_integrity":"sha512-tizvcyoq/71IumjW7q6nMsouqwAl6dahmMtvqg/g7Zc+ZLxhdl6LasKAnzqX+iT/U3SLCi1eMHGjWKRmd0n0Gg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"8.11.0","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"16.16.0","dependencies":{"@fluidframework/map":">=2.0.0-internal.6.2.2 <2.0.0-internal.6.3.0","@fluidframework/sequence":">=2.0.0-internal.6.2.2 <2.0.0-internal.6.3.0","@fluidframework/merge-tree":">=2.0.0-internal.6.2.2 <2.0.0-internal.6.3.0","@fluidframework/common-utils":"^1.1.1","@fluidframework/runtime-definitions":">=2.0.0-internal.6.2.2 <2.0.0-internal.6.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"nyc":"^15.1.0","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","concurrently":"^7.6.0","@types/random-js":"^1.0.31","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.23.0","@microsoft/api-extractor":"^7.34.4","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.23.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.6.2.2 <2.0.0-internal.6.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.6.2.2 <2.0.0-internal.6.3.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.6.2.2_1696310086837_0.2672726861517627","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.1.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.1.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.1.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e1d342d5bb7acb08ad30fbc0fa38eb86a84e6eca","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.1.0.tgz","fileCount":70,"integrity":"sha512-HfKWkCnU2ayIIQ9Wp2ybRukXwn2JkVW/dABj4b4KMmTKI1GWa5/4LYE8/yXnC36UChACRuwpj2sGzSG4+a+UhA==","signatures":[{"sig":"MEYCIQC1wAM3ziP2jgCAnz1FdpVEuQOn/WKZ3aZZNovJ9SDl0AIhANajkg1wFPr0C1sCwpDR/XsCkgqAfdQVbiW8cX34+Uvn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161660},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.1.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.1.0.tgz","_integrity":"sha512-HfKWkCnU2ayIIQ9Wp2ybRukXwn2JkVW/dABj4b4KMmTKI1GWa5/4LYE8/yXnC36UChACRuwpj2sGzSG4+a+UhA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0","@fluidframework/sequence":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0","@fluidframework/core-utils":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0","@fluidframework/merge-tree":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.25.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.25.0","@fluidframework/build-common":"^2.0.1","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.1.0 <2.0.0-internal.7.2.0","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.1.0_1697236634689_0.3072544146929739","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.2.0.203917":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.2.0.203917","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.2.0.203917","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c9f2f4c9388bd53ebe4e714ef605baf719cdeb4a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.2.0.203917.tgz","fileCount":70,"integrity":"sha512-xVvVVFMoI8/P/KIg73QwEQVSRsogGli8wy4ce94vBuRp8EGLyM8RVy2HhfjU0Dob1wCMvs0FnyJYOcEplal5BA==","signatures":[{"sig":"MEUCIQDVAzVN7Oem54+Vt2swCJyBE8XLpyjkPT6wbEI1O8sonQIgOVLpWELUaZ9gjoQ9aq/prqFT9K3D5/CkLUAMGYGo7wM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161493},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.2.0.203917.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.2.0.203917.tgz","_integrity":"sha512-xVvVVFMoI8/P/KIg73QwEQVSRsogGli8wy4ce94vBuRp8EGLyM8RVy2HhfjU0Dob1wCMvs0FnyJYOcEplal5BA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.2.0.203917","@fluidframework/sequence":"2.0.0-dev.7.2.0.203917","@fluidframework/core-utils":"2.0.0-dev.7.2.0.203917","@fluidframework/merge-tree":"2.0.0-dev.7.2.0.203917","@fluidframework/runtime-definitions":"2.0.0-dev.7.2.0.203917"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"0.26.0-203096","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"0.26.0-203096","@fluidframework/build-common":"^2.0.2","@fluidframework/mocha-test-setup":"2.0.0-dev.7.2.0.203917","@fluidframework/test-runtime-utils":"2.0.0-dev.7.2.0.203917","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.2.0.203917_1698100231929_0.37567597572816536","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.2.0.204906":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.2.0.204906","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.2.0.204906","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6a394417b6960f7cd5efa11470219a5ab079a558","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.2.0.204906.tgz","fileCount":70,"integrity":"sha512-K/4TcYHbXNX+oRQOA1qy1sqRtxLnmNqWyfyFsxCGg823vDS0nNtlwfiqwsuqu0/XEzDddYlhDLgtxxeMdKsMoA==","signatures":[{"sig":"MEYCIQCR+JBPGaCBwnIW0wqSwUI6lKTKOfb7+rSZTyF4NVgY1QIhAPeIFGF8l6t3G+8Mxpkp0DVQ7gjRGDMfMCn8UAYnX+ni","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161493},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.2.0.204906.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.2.0.204906.tgz","_integrity":"sha512-K/4TcYHbXNX+oRQOA1qy1sqRtxLnmNqWyfyFsxCGg823vDS0nNtlwfiqwsuqu0/XEzDddYlhDLgtxxeMdKsMoA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.2.0.204906","@fluidframework/sequence":"2.0.0-dev.7.2.0.204906","@fluidframework/core-utils":"2.0.0-dev.7.2.0.204906","@fluidframework/merge-tree":"2.0.0-dev.7.2.0.204906","@fluidframework/runtime-definitions":"2.0.0-dev.7.2.0.204906"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"0.26.0-203096","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"0.26.0-203096","@fluidframework/build-common":"^2.0.2","@fluidframework/mocha-test-setup":"2.0.0-dev.7.2.0.204906","@fluidframework/test-runtime-utils":"2.0.0-dev.7.2.0.204906","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.2.0.204906_1698254690816_0.01213602081295817","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.2.0.205722":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.2.0.205722","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.2.0.205722","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"18a9ddfed5ed19dbe431a68af0239a0a06503637","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.2.0.205722.tgz","fileCount":66,"integrity":"sha512-eXARFChl9Sdq9cpKcbaq4F76BWO0sSrEH/QLqcS3+QaXJZpmO/KSptHgnq5H20ARF/R3m+9omvvXJ/QaxkIJxg==","signatures":[{"sig":"MEUCIGa/bNEfI11/Lh4BxIAHhWjc1HK4Q+xe0WoQAc0VtJAWAiEA9PZFr9lhD0nQuUuyb/Fl1rDLF6rH1zUGEpyDVmOUPQU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146865},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.2.0.205722.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.2.0.205722.tgz","_integrity":"sha512-eXARFChl9Sdq9cpKcbaq4F76BWO0sSrEH/QLqcS3+QaXJZpmO/KSptHgnq5H20ARF/R3m+9omvvXJ/QaxkIJxg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.2.0.205722","@fluidframework/sequence":"2.0.0-dev.7.2.0.205722","@fluidframework/core-utils":"2.0.0-dev.7.2.0.205722","@fluidframework/merge-tree":"2.0.0-dev.7.2.0.205722","@fluidframework/runtime-definitions":"2.0.0-dev.7.2.0.205722"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.2.0.205722","@fluidframework/test-runtime-utils":"2.0.0-dev.7.2.0.205722","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.2.0.205722_1698362201813_0.8352489910955443","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.2.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.2.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.2.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0e5035ca5af9108102e3ea1dacadb3d843d473c4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.2.0.tgz","fileCount":66,"integrity":"sha512-VdQ/5BONJwza8XFz0MVGUwUTe0vtHjIS/F/U4LwUU/cm2ByfZ3xeE3RAMqAD11fJFuxozdhYO6AihAoJosYOOw==","signatures":[{"sig":"MEQCIFXqzz6ObTWX8Hwy+dj407bskuHTyXc1a04CiUmfRaMgAiADeuvHZeDmiVI11kXH+Yi6SHakikFk+DxTBQ3v0trJ/A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147068},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.2.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.2.0.tgz","_integrity":"sha512-VdQ/5BONJwza8XFz0MVGUwUTe0vtHjIS/F/U4LwUU/cm2ByfZ3xeE3RAMqAD11fJFuxozdhYO6AihAoJosYOOw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0","@fluidframework/sequence":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0","@fluidframework/core-utils":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0","@fluidframework/merge-tree":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.2.0 <2.0.0-internal.7.3.0","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.2.0_1698369661019_0.044952630109750036","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.2.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.2.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.2.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"28b722d61b98ffb91f536c47b8da63100dfba85a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.2.1.tgz","fileCount":66,"integrity":"sha512-G7L0u0YWgFKGDDrGEA5ld4oZ02PlTH11juT6AKBqGw0EReXA23RmiN70oBrNJsEtEZTl8j3xEXYzh93LB32qfw==","signatures":[{"sig":"MEYCIQD5w4pfZ7y8/Jx1HVpGejTJxQV+VLydysaXjXLLicD5SQIhAMEgyy5MAIprjW/CK5K6IENF6AtfUsqX9QEeOIyLlFrb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147068},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.2.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.2.1.tgz","_integrity":"sha512-G7L0u0YWgFKGDDrGEA5ld4oZ02PlTH11juT6AKBqGw0EReXA23RmiN70oBrNJsEtEZTl8j3xEXYzh93LB32qfw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0","@fluidframework/sequence":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0","@fluidframework/core-utils":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0","@fluidframework/merge-tree":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.2.1 <2.0.0-internal.7.3.0","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.2.1_1698452958495_0.7080292244291144","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6efd24616a5955b64e313f89252cc3826a66e60b","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.0.1.tgz","fileCount":65,"integrity":"sha512-et3xon3A8uxXtsXQ85TnebEDE+kOjuIQYoHkjdxCNSbODqCYWa0Q0GahD9yM23CINoU5EVNTW8kQja2A5vA04A==","signatures":[{"sig":"MEUCIC49JhzGXs569EUN7yNtpM8Otuo/sT1iwG4GleCF56RYAiEA0mmqesJ7DB3KzSPBb/QYfeI2Ik8VThMikhyzz6ZqBxo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145699},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.0.1.tgz","_integrity":"sha512-et3xon3A8uxXtsXQ85TnebEDE+kOjuIQYoHkjdxCNSbODqCYWa0Q0GahD9yM23CINoU5EVNTW8kQja2A5vA04A==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0","@fluidframework/sequence":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0","@fluidframework/core-utils":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0","@fluidframework/merge-tree":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.24.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.24.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.0.1_1698453253144_0.9243627794156712","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.1.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.1.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.1.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6f1a9d8c60b74ee07c75cd3ed78256c07da2f526","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.1.1.tgz","fileCount":70,"integrity":"sha512-qS96OmC5juEDOYadTzVn05j0zghwCPfVNJWrQGWfmOMzWz2FLEJzd/4yYU8kiQuViNoTFZk8/i3s+t4w6CdUKA==","signatures":[{"sig":"MEQCIF7w8gyNPmDUrtV3KR+/gB5NafcVbwdVWhGLdSQdbx2fAiAST7sIMWa+6OWaUEBsQiOMKhhoimoRMPM2uBvI4/nGSg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161660},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.1.1.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.1.1.tgz","_integrity":"sha512-qS96OmC5juEDOYadTzVn05j0zghwCPfVNJWrQGWfmOMzWz2FLEJzd/4yYU8kiQuViNoTFZk8/i3s+t4w6CdUKA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0","@fluidframework/sequence":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0","@fluidframework/core-utils":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0","@fluidframework/merge-tree":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.25.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.25.0","@fluidframework/build-common":"^2.0.1","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.1.1 <2.0.0-internal.7.2.0","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.1.1_1698453277709_0.3978823356873462","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.206769":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.206769","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.206769","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"2a003ad21c1bb6a500d2bc1b064035441312b428","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.206769.tgz","fileCount":66,"integrity":"sha512-EliE15uwhLezJrYW5lC/U6XvV4PPqXWopNXGg6FF5RLDKvsPPtYr7KLC8ql/Db/wDGMWiTWLj96L6IVhCQBbkA==","signatures":[{"sig":"MEQCIBaDqwW6X7geMvRGB1oGRXX/6qBd4dVIdoWtuPMJhbpEAiA7pC+Ifcf0w041Z1FlDDM5NvS89GQlKbbc5WYNbOwe4Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146916},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.206769.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.206769.tgz","_integrity":"sha512-EliE15uwhLezJrYW5lC/U6XvV4PPqXWopNXGg6FF5RLDKvsPPtYr7KLC8ql/Db/wDGMWiTWLj96L6IVhCQBbkA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.206769","@fluidframework/sequence":"2.0.0-dev.7.3.0.206769","@fluidframework/core-utils":"2.0.0-dev.7.3.0.206769","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.206769","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.206769"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.206769","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.206769","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.206769_1698714218676_0.27338828603211685","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.207781":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.207781","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.207781","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c36421ac380d4d05be31d71eee5fc8b3d00ecfe2","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.207781.tgz","fileCount":66,"integrity":"sha512-xw3pruRyCPiIUkwNSh+JjzE3B1eT204elIM5s3f4d4icP7X4Z00jCdDWhuaxcvMJ8T5MJqXmr9qcd3D5VMnL+A==","signatures":[{"sig":"MEQCIEaFgtSiyHj4cXF2hAcsO7a+X/qyQNlMMdOfVSwPwMWpAiBIkJnYUztsTApinpXiAk8RN24Fl8V2WGoIaonFFG8ZRg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146916},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.207781.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.207781.tgz","_integrity":"sha512-xw3pruRyCPiIUkwNSh+JjzE3B1eT204elIM5s3f4d4icP7X4Z00jCdDWhuaxcvMJ8T5MJqXmr9qcd3D5VMnL+A==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.207781","@fluidframework/sequence":"2.0.0-dev.7.3.0.207781","@fluidframework/core-utils":"2.0.0-dev.7.3.0.207781","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.207781","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.207781"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.207781","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.207781","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.207781_1698884123889_0.26851678417691294","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.207992":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.207992","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.207992","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7663f6e16fd3b7ea4c7670acec2d7c8447892788","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.207992.tgz","fileCount":66,"integrity":"sha512-/T51EZM75EBqFbqnoMDfgWwHFQFtArZjNmrT85GL8LsBrgg//3P48+/U2+dZRTJ1A+6rlqa0VdXcoEQelauo4g==","signatures":[{"sig":"MEYCIQDyZM3sT0pKrxMdpKs0U6HRQchWS0KJhQh/69wmdldJLwIhAKBEm4Qh5/IOdxh6LFpFxxZwzI1xCNNmPjFc7tT1/gxl","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146916},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.207992.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.207992.tgz","_integrity":"sha512-/T51EZM75EBqFbqnoMDfgWwHFQFtArZjNmrT85GL8LsBrgg//3P48+/U2+dZRTJ1A+6rlqa0VdXcoEQelauo4g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.207992","@fluidframework/sequence":"2.0.0-dev.7.3.0.207992","@fluidframework/core-utils":"2.0.0-dev.7.3.0.207992","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.207992","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.207992"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.207992","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.207992","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.207992_1698954010085_0.029829596787569024","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.209023":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.209023","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.209023","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"da24646c5b8e7d1134e7a0b63fb4fe1a78b31220","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.209023.tgz","fileCount":66,"integrity":"sha512-df9pxWuK7PXmuu+1OtCfkWH+lDHSJI3LCW0t0X53ROmElS3T5d+QTeEvfGgypQC+LreNDW7L07DdTbK2dPAp4Q==","signatures":[{"sig":"MEUCIEZCREcFIEcYIXZCljlfDdaitQfzGSEf8tG2WngbQI60AiEA7iHUEe6d/9fpfKuSgm8Nc1eA+nDUIsPZxtf83rnBnK0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146918},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.209023.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.209023.tgz","_integrity":"sha512-df9pxWuK7PXmuu+1OtCfkWH+lDHSJI3LCW0t0X53ROmElS3T5d+QTeEvfGgypQC+LreNDW7L07DdTbK2dPAp4Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.209023","@fluidframework/sequence":"2.0.0-dev.7.3.0.209023","@fluidframework/core-utils":"2.0.0-dev.7.3.0.209023","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.209023","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.209023"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.209023","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.209023","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.209023_1699394272657_0.30009264656504087","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.2.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.2.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.2.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fe9f117c0b92af15c86eceec9fae06e6c2f50a2f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.2.2.tgz","fileCount":66,"integrity":"sha512-bMl8kCjafmP20gfDjbcCq7ncLlbT2hM45UjrjR7LHL93sXVJFY5/ZZPju7iK/trnwQ+sfyPrZ1cOSXBkx+yVrA==","signatures":[{"sig":"MEUCIFqbEFmYIUJuajKK267WeOmrO5eAEvRpUtQB91VhxwSaAiEA8UcT2rFChdACza5+euV8Mcd78Mk5DzKn5wm466Nl82I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147068},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.2.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.2.2.tgz","_integrity":"sha512-bMl8kCjafmP20gfDjbcCq7ncLlbT2hM45UjrjR7LHL93sXVJFY5/ZZPju7iK/trnwQ+sfyPrZ1cOSXBkx+yVrA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0","@fluidframework/sequence":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0","@fluidframework/core-utils":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0","@fluidframework/merge-tree":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.2.2 <2.0.0-internal.7.3.0","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.2.2_1699394866908_0.1326129826192899","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.1.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.1.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.1.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9df39bcb306ae043c1def585e5c346493c6bf686","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.1.2.tgz","fileCount":70,"integrity":"sha512-1ig89XOD4KWGNrtVyWvxJD+QYYybKQV9TLkVKJBqxJuxLb6FZZT+/ElduBXvLR77fpgaifqxyFIZvreNaex/Hw==","signatures":[{"sig":"MEYCIQCDkYkJXssF9RY3aMXz50LXHLiDF2KJ7zsNDSMcaDYXWQIhAIUzlobK6nT9sHQ96CMqCvgYTiCBQmrPDVYKOAl/D+Ow","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161660},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.1.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.1.2.tgz","_integrity":"sha512-1ig89XOD4KWGNrtVyWvxJD+QYYybKQV9TLkVKJBqxJuxLb6FZZT+/ElduBXvLR77fpgaifqxyFIZvreNaex/Hw==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0","@fluidframework/sequence":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0","@fluidframework/core-utils":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0","@fluidframework/merge-tree":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.25.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.25.0","@fluidframework/build-common":"^2.0.1","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.1.2 <2.0.0-internal.7.2.0","@fluidframework/eslint-config-fluid":"^3.0.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.1.2_1699395161602_0.15600668257339212","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"bf68b059babe33efe80bfdb9610f11d5db6c280a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.0.2.tgz","fileCount":65,"integrity":"sha512-/5dLKxCnmtKUmOreD9wuMDeVy3B43EK+Ff1tvX4YOI0MSY7kJ52vbd8emVDb8zwxHlpGoqvL4vzFHyn7BhWWDA==","signatures":[{"sig":"MEUCIQCjy979zKRbzmTYLjwBRmxoTQqX0nxz3ZTzx28Du0QQogIgNF+q66cYZ5z56zlXXfGiXT+6Gll1GajX89QgOS4IXx0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145699},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.0.2.tgz","_integrity":"sha512-/5dLKxCnmtKUmOreD9wuMDeVy3B43EK+Ff1tvX4YOI0MSY7kJ52vbd8emVDb8zwxHlpGoqvL4vzFHyn7BhWWDA==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0","@fluidframework/sequence":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0","@fluidframework/core-utils":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0","@fluidframework/merge-tree":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.24.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.24.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.0.2 <2.0.0-internal.7.1.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.0.2_1699395201668_0.3654831086067487","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.209174":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.209174","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.209174","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0061cc7a4f82f445abd867407ec5d2a84f83e472","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.209174.tgz","fileCount":66,"integrity":"sha512-64YS8JMUvJ2YaFCFN1n9sAA3ml4p1+yBb71v0cwTahfa1IY04I1v5kNqeNg6+4CsqeUE9cewfWPiOOE0FSfLSQ==","signatures":[{"sig":"MEUCIBY/zhjbvHbpC44YIAWQ3epnpGEAJFay9s3ry+wTIXHGAiEAhrfzg8gz3/GSVRwSCIKJd3qc3YIl3ECfg41Ce9uj74M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146918},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.209174.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.209174.tgz","_integrity":"sha512-64YS8JMUvJ2YaFCFN1n9sAA3ml4p1+yBb71v0cwTahfa1IY04I1v5kNqeNg6+4CsqeUE9cewfWPiOOE0FSfLSQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.209174","@fluidframework/sequence":"2.0.0-dev.7.3.0.209174","@fluidframework/core-utils":"2.0.0-dev.7.3.0.209174","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.209174","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.209174"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.209174","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.209174","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.209174_1699401663208_0.8663253307259984","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.209831":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.209831","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.209831","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"eb7d7e0538dda32ff51a924858cacf02e4bb0439","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.209831.tgz","fileCount":66,"integrity":"sha512-KR44KJgXDlEdwrBWCBaKWOSx51S6jmUIn8Vs1NHGoh2e5V5U+DnF4jAjP06a0pPWFH22rn8r0P32ErBrkYwD4g==","signatures":[{"sig":"MEUCIGu68qo2+N5zM2FT5QlEL2BZXYYHmOJJeeD+kuYzrBJKAiEA7EF90HPoUX5Jmofuc2WHf4qhvOgxEkzBFq2IESfbiXc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146918},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.209831.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.209831.tgz","_integrity":"sha512-KR44KJgXDlEdwrBWCBaKWOSx51S6jmUIn8Vs1NHGoh2e5V5U+DnF4jAjP06a0pPWFH22rn8r0P32ErBrkYwD4g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.209831","@fluidframework/sequence":"2.0.0-dev.7.3.0.209831","@fluidframework/core-utils":"2.0.0-dev.7.3.0.209831","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.209831","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.209831"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.26.1","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.26.1","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.209831","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.209831","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.209831_1699580568752_0.9681429982628469","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.210328":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.210328","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.210328","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0b3727e02cb06dc0cfe95a0aa51dd20e69c72ae6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.210328.tgz","fileCount":66,"integrity":"sha512-aXNvhiAnn0UO62Sl8IqV537brS30wgPzBiKypiXYx5gdde/IpciZ/UWwT2T+MglexpWHf85wf9Hj4G2vtdna3g==","signatures":[{"sig":"MEYCIQDfjZHL3YoI0f8HX+gJBjXjd/jo/2nyfxBDGPK2zz3Q2gIhAMDOmzdo4Z5TYGNRNXXfICwFdG9CTgn2tAK5NGkmXOVf","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146918},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.210328.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"*.tsbuildinfo\" \"*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.210328.tgz","_integrity":"sha512-aXNvhiAnn0UO62Sl8IqV537brS30wgPzBiKypiXYx5gdde/IpciZ/UWwT2T+MglexpWHf85wf9Hj4G2vtdna3g==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.210328","@fluidframework/sequence":"2.0.0-dev.7.3.0.210328","@fluidframework/core-utils":"2.0.0-dev.7.3.0.210328","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.210328","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.210328"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.27.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.27.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.210328","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.210328","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.210328_1699669649878_0.7771380795014236","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b1b663367898d6519359d2b5db27d5f806283b32","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.0.3.tgz","fileCount":65,"integrity":"sha512-3yzRskCKy0PD+F5W90k90GKCl4W23ToN8sEkoaxhjaxF+dUGhJxQ+PyezweQT4xhcynLeHGxl4z6E97LZXzXWg==","signatures":[{"sig":"MEYCIQCI0WNChCO28S0aBDNi0asPFMxiMhG/rw5Iuj8Ir8PpOgIhAIJmZPfT6heDSk49jo9wt/Wh2tP6XkFQt5kHagRLRiA4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145699},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.js","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand\nGuidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"tsc":"tsc","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob 'dist' 'lib' '*.tsbuildinfo' '*.build.log' '_api-extractor-temp' 'nyc'","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive 'dist/test/**/*.spec.js' -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc --project ./tsconfig.esnext.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.0.3.tgz","_integrity":"sha512-3yzRskCKy0PD+F5W90k90GKCl4W23ToN8sEkoaxhjaxF+dUGhJxQ+PyezweQT4xhcynLeHGxl4z6E97LZXzXWg==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0","@fluidframework/sequence":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0","@fluidframework/core-utils":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0","@fluidframework/merge-tree":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.6.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~2.6.2","copyfiles":"^2.4.1","cross-env":"^7.0.3","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.24.0","@microsoft/api-extractor":"^7.37.0","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.24.0","@fluidframework/build-common":"^2.0.0","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.0.3 <2.0.0-internal.7.1.0","@fluidframework/eslint-config-fluid":"^2.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.6.3.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.0.3_1700084552521_0.6860793463616199","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.211848":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.211848","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.211848","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"1a0065236946cf6a5d56e472044444c3a870eeb3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.211848.tgz","fileCount":66,"integrity":"sha512-u6eGgHRuFmjJk6BhZlkPAqPNsHEpsvkv4Q+1bPl0btMkgUilkm4a50Aj3k21OeJNN0gwWPbXWoaw06W2loq34A==","signatures":[{"sig":"MEUCIDAWudQ6z0HAMBlPy/fcdcjA0YwhwWdbpGz4bp1EOgAjAiEAsoxwVNsNyV43x//oL8K+MgeD5PPze5Jqe2M9JbwzUXU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147366},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.211848.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.211848.tgz","_integrity":"sha512-u6eGgHRuFmjJk6BhZlkPAqPNsHEpsvkv4Q+1bPl0btMkgUilkm4a50Aj3k21OeJNN0gwWPbXWoaw06W2loq34A==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.211848","@fluidframework/sequence":"2.0.0-dev.7.3.0.211848","@fluidframework/core-utils":"2.0.0-dev.7.3.0.211848","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.211848","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.211848"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"0.28.0-210888","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"0.28.0-210888","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.211848","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.211848","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.211848_1700173696693_0.7776108882368085","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.3.0.212138":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.3.0.212138","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.3.0.212138","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"748338e29d85288e7b37ebf8049cc105a47e3715","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.3.0.212138.tgz","fileCount":66,"integrity":"sha512-0G4msSDlI94RdLcpJCFfHQzBwlVG8DbbpPAiq5B4mgp87rM6damHqoteOuSztLsof6fk6Zoa94lh5HnMT76dmQ==","signatures":[{"sig":"MEUCIBjjzfcmfudLHpdq/s93ABgl1a9R+6u5snV/sT5sdVbSAiEAjHStxf/0O5zLwXV3UOAHsoKGGv7N6XebRAWT7Lh8ahM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147405},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.3.0.212138.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.3.0.212138.tgz","_integrity":"sha512-0G4msSDlI94RdLcpJCFfHQzBwlVG8DbbpPAiq5B4mgp87rM6damHqoteOuSztLsof6fk6Zoa94lh5HnMT76dmQ==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.3.0.212138","@fluidframework/sequence":"2.0.0-dev.7.3.0.212138","@fluidframework/core-utils":"2.0.0-dev.7.3.0.212138","@fluidframework/merge-tree":"2.0.0-dev.7.3.0.212138","@fluidframework/runtime-definitions":"2.0.0-dev.7.3.0.212138"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.3.0.212138","@fluidframework/test-runtime-utils":"2.0.0-dev.7.3.0.212138","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.3.0.212138_1700253680238_0.9730435940359843","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.3.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.3.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.3.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5f3967c8227694b6fa90f7cc86e1fa1f2248f6e7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.3.0.tgz","fileCount":66,"integrity":"sha512-LUF8CAk/N9b98SgOGM3YTM0ybwNGlbkLO5TgfrWODUexkRaOWxXNGg/bAmwCWpUggB14WBuL1ekqwOCFVRYR0Q==","signatures":[{"sig":"MEUCIQCQC02ngbugzgPFBY/fcpNIrFSrG9QnFqKUeHlzQaHXIAIgFD2GF3hPq9hAuS/IwrCvs+LQc4/BJw95uWEFJVvOjdI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":147557},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.3.0.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --ignore-path ../../../.prettierignore","build:docs":"api-extractor run --local","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.3.0.tgz","_integrity":"sha512-LUF8CAk/N9b98SgOGM3YTM0ybwNGlbkLO5TgfrWODUexkRaOWxXNGg/bAmwCWpUggB14WBuL1ekqwOCFVRYR0Q==","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0","@fluidframework/sequence":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0","@fluidframework/core-utils":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0","@fluidframework/merge-tree":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.3.0 <2.0.0-internal.7.4.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.3.0_1700256144332_0.7264772446994516","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.214930":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.214930","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.214930","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"3a384fc7704453300e2dbbc591a0377ee351819f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.214930.tgz","fileCount":74,"integrity":"sha512-O+/8nkeQBfMK1d4J8xOkAVseg7rKPZ7yiHZpd9t0uLigT4Z4ps+k926ItF72RQFH74wTJShm5aOHlSFt/+guyA==","signatures":[{"sig":"MEQCIGcTKYEzbHvMcfurJ83h47sd4ipyOuXZ7jP+NxcyIq9KAiA/ztCC//c+5SLr0COkdFj7WdoEMsv0bMoWIAZyDo3SvA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":177131},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.214930.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.214930.tgz","_integrity":"sha512-O+/8nkeQBfMK1d4J8xOkAVseg7rKPZ7yiHZpd9t0uLigT4Z4ps+k926ItF72RQFH74wTJShm5aOHlSFt/+guyA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.214930","@fluidframework/sequence":"2.0.0-dev.7.4.0.214930","@fluidframework/core-utils":"2.0.0-dev.7.4.0.214930","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.214930","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.214930"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.214930","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.214930","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.214930_1701214884852_0.0006221242558341888","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.215366":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.215366","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.215366","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"d2021d4e2af15001ced2bc8b6dfc10403c381fc6","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.215366.tgz","fileCount":74,"integrity":"sha512-8ZWjCvpu9V6LiU8xbNSqpU7HDUCPt91QuODaRt3yNPhjauzgyVgyTg/7qn9oPsR1XPLOeT/mTjD/PtyQGtXH6g==","signatures":[{"sig":"MEYCIQCC9PA4klkqfHPI7NAO5w4G/gBXnMf308xJgT0RQXKsfgIhAPyTYAqlrN4e6dAREqnjIF0ual2o/NGpGVwsn7gUKD8n","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":177131},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.215366.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.215366.tgz","_integrity":"sha512-8ZWjCvpu9V6LiU8xbNSqpU7HDUCPt91QuODaRt3yNPhjauzgyVgyTg/7qn9oPsR1XPLOeT/mTjD/PtyQGtXH6g==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.215366","@fluidframework/sequence":"2.0.0-dev.7.4.0.215366","@fluidframework/core-utils":"2.0.0-dev.7.4.0.215366","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.215366","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.215366"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.215366","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.215366","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.215366_1701299317428_0.9137257003594959","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.215747":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.215747","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.215747","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"08d9911fb4f75a722816c5fe393314ea7441b71a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.215747.tgz","fileCount":74,"integrity":"sha512-m/2FFhbzkXYfqWB6K0SgMomEfafMdL+MwTEI4XUxIXsM42VswDDDTlNfbBG0sH8acELj4YLvj4rjcmRfRRawxg==","signatures":[{"sig":"MEUCIQDJRYvD/zfVn4AJrkHhXnmSHunZnX/fl8PjWHBsYyYEhgIgXodcWn1p0ppbBw/g8EUb+SnURoskJTdc4Y2z0S4QFB4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":177131},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.215747.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.215747.tgz","_integrity":"sha512-m/2FFhbzkXYfqWB6K0SgMomEfafMdL+MwTEI4XUxIXsM42VswDDDTlNfbBG0sH8acELj4YLvj4rjcmRfRRawxg==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.215747","@fluidframework/sequence":"2.0.0-dev.7.4.0.215747","@fluidframework/core-utils":"2.0.0-dev.7.4.0.215747","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.215747","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.215747"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.215747","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.215747","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.215747_1701365613772_0.0890074610177487","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.215930":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.215930","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.215930","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7165a8982fa1217a98cfa929492b7f98fbfc2e1d","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.215930.tgz","fileCount":74,"integrity":"sha512-z2vhH75hDek0wXZhD5ILNPjuY8Y3cpJGjoRnmC6ZQRTvsQB0OG9WozdH5ghHTemm2PdQRTX7tiuXcCMiVdKP1A==","signatures":[{"sig":"MEYCIQD5N3BgYESrX3HWu+ZhsAC76Ud2RZp3X5IoJ4RnKv0YrgIhAPe28XryTgPeGb9nomS7G+g3rs/eky0kaUa0iwHJQ4v6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":177131},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.215930.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.215930.tgz","_integrity":"sha512-z2vhH75hDek0wXZhD5ILNPjuY8Y3cpJGjoRnmC6ZQRTvsQB0OG9WozdH5ghHTemm2PdQRTX7tiuXcCMiVdKP1A==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.215930","@fluidframework/sequence":"2.0.0-dev.7.4.0.215930","@fluidframework/core-utils":"2.0.0-dev.7.4.0.215930","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.215930","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.215930"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.215930","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.215930","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.215930_1701377041119_0.9309864613605705","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.216897":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.216897","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.216897","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c08efb9f43898cee0dbe54f84945129fbf13e9d8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.216897.tgz","fileCount":75,"integrity":"sha512-+VrM7t+qxF0w8cLlF4YcCNvIEyX/TAscmcZp3fB3IuSLWVCyXtq4fmDlO5WFvDY4lgOawsYXuV/+kQiHhQEwBg==","signatures":[{"sig":"MEUCIQDrBalBuewKxEE1xtnYLRQaGqc93q47gfxmad6/mQbznQIgaWvrkN435Gq6Zat6A+Uc/J45hDevbAKL8WtWSCzXc8s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159138},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.216897.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.216897.tgz","_integrity":"sha512-+VrM7t+qxF0w8cLlF4YcCNvIEyX/TAscmcZp3fB3IuSLWVCyXtq4fmDlO5WFvDY4lgOawsYXuV/+kQiHhQEwBg==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.216897","@fluidframework/sequence":"2.0.0-dev.7.4.0.216897","@fluidframework/core-utils":"2.0.0-dev.7.4.0.216897","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.216897","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.216897"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.216897","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.216897","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.216897_1701467222949_0.9801763939686556","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.217212":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.217212","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.217212","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ba441ba3a0b02166abf045d3892eef7675522af9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.217212.tgz","fileCount":75,"integrity":"sha512-Oxn/FrQo02+pGtUz23/SQmf6KD3JsxWHb4aFVATwyOZXowk9uLa8WPvt3D4ol4fyVVJduETGuyYsSHoIj7CMiA==","signatures":[{"sig":"MEUCIQC+19VE5Yat2cqoLYN6TAuHxku/3Y76pRZF2gEx/g4MnQIgOtAIlcnKoZrN/atrr7ltEV8jq6hulWvdz8elcJHC4HE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159138},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.217212.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.217212.tgz","_integrity":"sha512-Oxn/FrQo02+pGtUz23/SQmf6KD3JsxWHb4aFVATwyOZXowk9uLa8WPvt3D4ol4fyVVJduETGuyYsSHoIj7CMiA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.217212","@fluidframework/sequence":"2.0.0-dev.7.4.0.217212","@fluidframework/core-utils":"2.0.0-dev.7.4.0.217212","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.217212","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.217212"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^16.18.38","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.217212","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.217212","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.217212_1701540707193_0.805737895147794","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.217884":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.217884","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.217884","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"66a78140d7d88ae323e1e94ff38af7ea7a279451","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.217884.tgz","fileCount":75,"integrity":"sha512-Km1Xwq8AVr3hcCYqBGn56EVsLgYtZ7ARG02++J0+2M97QrrJNwQtnPI6RyjrQ2kzeu1gpYDyNQABPcdMjrDVuw==","signatures":[{"sig":"MEUCIQDRfsjV7m5pOeL8EwKh9oIX+RcXOKtKfxVwVnoVQhx8fgIgFCmw7aKDM6VUof7F/+mrz5FbuUN8i6M1gSPOM/LVHnU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159165},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.217884.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.217884.tgz","_integrity":"sha512-Km1Xwq8AVr3hcCYqBGn56EVsLgYtZ7ARG02++J0+2M97QrrJNwQtnPI6RyjrQ2kzeu1gpYDyNQABPcdMjrDVuw==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.217884","@fluidframework/sequence":"2.0.0-dev.7.4.0.217884","@fluidframework/core-utils":"2.0.0-dev.7.4.0.217884","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.217884","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.217884"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.217884","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.217884","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.217884_1701806188972_0.6305298839047428","host":"s3://npm-registry-packages"}},"2.0.0-dev.7.4.0.221926":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev.7.4.0.221926","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev.7.4.0.221926","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"df237b1611c9afa88c0094fc70f022ffbebc70cc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev.7.4.0.221926.tgz","fileCount":75,"integrity":"sha512-kUhVpIPlmSz+8Dg1TnhTUuAOCXiMeuNx2GudjcHkEPPyhPfP/QGcJjm6oPeIygggWJct5jgCIOnguKzERrebYA==","signatures":[{"sig":"MEUCIQDuHSR1eP5kL9s1zy1Ga4AfEjhmj7p0IvdCouWdtTTITgIgboTUo2lETSBJf3KoCVmxQAIwYBkebCwptRx/0JA0ucs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160031},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev.7.4.0.221926.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev.7.4.0.221926.tgz","_integrity":"sha512-kUhVpIPlmSz+8Dg1TnhTUuAOCXiMeuNx2GudjcHkEPPyhPfP/QGcJjm6oPeIygggWJct5jgCIOnguKzERrebYA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev.7.4.0.221926","@fluidframework/sequence":"2.0.0-dev.7.4.0.221926","@fluidframework/core-utils":"2.0.0-dev.7.4.0.221926","@fluidframework/merge-tree":"2.0.0-dev.7.4.0.221926","@fluidframework/runtime-definitions":"2.0.0-dev.7.4.0.221926"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev.7.4.0.221926","@fluidframework/test-runtime-utils":"2.0.0-dev.7.4.0.221926","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev.7.4.0.221926_1702428564134_0.778996363087922","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5830703ff7f3ae47d8f6c140c38f51b86a44fb58","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.0.tgz","fileCount":75,"integrity":"sha512-XIkqjJFM3BYNqqmANtRU7aJrRaohzTlktRd/x24LBMk1FbIR4+5i0K4/fNTTUgueBgY6q4/tFr6BLSxeP+D0ag==","signatures":[{"sig":"MEQCIEvjzzNbOko0VZfFtA5DPZ7HGRqcYM0kPuAovEY8AXnBAiBvMquilUqjz+cIufd3XK98Sl2fid6OnHvDYeORq4lVcg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.0.tgz","_integrity":"sha512-XIkqjJFM3BYNqqmANtRU7aJrRaohzTlktRd/x24LBMk1FbIR4+5i0K4/fNTTUgueBgY6q4/tFr6BLSxeP+D0ag==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.0 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.0_1702490645652_0.17809466707932353","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7e3bd1214040ebcfd438678bae900b9855ae5525","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.0.tgz","fileCount":75,"integrity":"sha512-pGpK+fb0bKCWC5Ti6Woj0eilBB5FI2z81Cww31CyhGYM3phDz5eAAapO0wIKeMcl0I3RRtNgaWkFNTXgHvY7vQ==","signatures":[{"sig":"MEUCIQD2FHWPlvvno/pTNGOpUisSHXZ+mKh30QAIB7+FHEBhWAIgT9twpra/Z81vhc8VVBimEfP22ZL17mLXhIlu5KvKBDw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.0.tgz","_integrity":"sha512-pGpK+fb0bKCWC5Ti6Woj0eilBB5FI2z81Cww31CyhGYM3phDz5eAAapO0wIKeMcl0I3RRtNgaWkFNTXgHvY7vQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.0 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.0_1702524456460_0.036769026165476504","host":"s3://npm-registry-packages"}},"2.0.0-dev-rc.1.0.0.224419":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev-rc.1.0.0.224419","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev-rc.1.0.0.224419","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ea5e5a42d7a31fcc4cc810a25220b24d64392ad8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev-rc.1.0.0.224419.tgz","fileCount":75,"integrity":"sha512-f5N2d/fAs7wO8j4jEEJw8uGIn2d3Vn5vi8ln6ViL1fBD5bUi/wC7vGopFmUA1h0wdD/cvpbN1ffZlJOPwqP5TQ==","signatures":[{"sig":"MEUCIEgIx3mjcC6R4MRf7SD2l+184Rr+yddCJi8s4uPI3QIzAiEAm3uZtkb70ouFsy6Mh16FI91tvNeIvtCGsS4JcOHdFCw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":151713},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.224419.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","build:rename-types":"renamer \"lib/**\" -f .d.ts -r .d.mts --force","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.224419.tgz","_integrity":"sha512-f5N2d/fAs7wO8j4jEEJw8uGIn2d3Vn5vi8ln6ViL1fBD5bUi/wC7vGopFmUA1h0wdD/cvpbN1ffZlJOPwqP5TQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev-rc.1.0.0.224419","@fluidframework/sequence":"2.0.0-dev-rc.1.0.0.224419","@fluidframework/core-utils":"2.0.0-dev-rc.1.0.0.224419","@fluidframework/merge-tree":"2.0.0-dev-rc.1.0.0.224419","@fluidframework/runtime-definitions":"2.0.0-dev-rc.1.0.0.224419"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","renamer":"^4.0.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"0.29.0-222379","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"0.29.0-222379","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev-rc.1.0.0.224419","@fluidframework/test-runtime-utils":"2.0.0-dev-rc.1.0.0.224419","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev-rc.1.0.0.224419_1703006226040_0.7497981602299852","host":"s3://npm-registry-packages"}},"2.0.0-dev-rc.1.0.0.225277":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev-rc.1.0.0.225277","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev-rc.1.0.0.225277","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"87bc79cd347950731dde6656bb3433cdadd6d736","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev-rc.1.0.0.225277.tgz","fileCount":76,"integrity":"sha512-3W+VViotiY/o8sO/IB19/OXdMg3EfYtAJYoHzU4Sqao7MXJnHlGUvFFSnnYqD+WzuXAw/o8r6CUT8DiIiY5tzA==","signatures":[{"sig":"MEYCIQCeUwd4/JFD5dKqhf0TEVmumW+0aR1FJMx/JodCjC71JgIhAICswjSMlJbuAm0Vdo+JitGH/SULVw55kuvXVI/pXTAa","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152837},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.225277.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.cjs"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.cjs"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.cjs"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.225277.tgz","_integrity":"sha512-3W+VViotiY/o8sO/IB19/OXdMg3EfYtAJYoHzU4Sqao7MXJnHlGUvFFSnnYqD+WzuXAw/o8r6CUT8DiIiY5tzA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev-rc.1.0.0.225277","@fluidframework/sequence":"2.0.0-dev-rc.1.0.0.225277","@fluidframework/core-utils":"2.0.0-dev-rc.1.0.0.225277","@fluidframework/merge-tree":"2.0.0-dev-rc.1.0.0.225277","@fluidframework/runtime-definitions":"2.0.0-dev-rc.1.0.0.225277"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"0.29.0-222379","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"0.29.0-222379","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev-rc.1.0.0.225277","@fluidframework/test-runtime-utils":"2.0.0-dev-rc.1.0.0.225277","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev-rc.1.0.0.225277_1703116060657_0.4901354300321332","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e5361c3813f64eb539ff284ebe364279552cd7f4","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.1.tgz","fileCount":75,"integrity":"sha512-VlMjXd9xa4b6CyiNDm0ItgXTFle0VuxtBgOzMbSaGcI/MOVaGPp917JYO+Jm+KMczaBJlo9ymCFhCDem+TBXPA==","signatures":[{"sig":"MEUCIFJ586Zu30FrgKrJtnmL4ZmQtgVvooOutFBZgxF1YVCJAiEA9zxC/5En1q04k9XWuWJpRY3CHwQsAbP3BrqvX+ZppfU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.1.tgz","_integrity":"sha512-VlMjXd9xa4b6CyiNDm0ItgXTFle0VuxtBgOzMbSaGcI/MOVaGPp917JYO+Jm+KMczaBJlo9ymCFhCDem+TBXPA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.1 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.1_1704477531963_0.8616397457440932","host":"s3://npm-registry-packages"}},"2.0.0-dev-rc.1.0.0.228517":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev-rc.1.0.0.228517","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev-rc.1.0.0.228517","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b2ecdf1a97d7907298347894ec62a0d5f9c4a214","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev-rc.1.0.0.228517.tgz","fileCount":75,"integrity":"sha512-MUTxl92mSrRVNgsljGAvuDy/X+NKgwljiIInv0B1N3AaPlW9ngAYv5oQXHZezd8/n9046EkYXT8NAkeQo9LZUQ==","signatures":[{"sig":"MEUCIQDjNXtnE2Rrf/GHW077mpQJEmDqTcpHjyfoyww9LFQIIAIgaxCW3X9u5KYGR0QYFPt5B4fT2vm0kJvK/RP/jdTXJiU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152081},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.228517.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.228517.tgz","_integrity":"sha512-MUTxl92mSrRVNgsljGAvuDy/X+NKgwljiIInv0B1N3AaPlW9ngAYv5oQXHZezd8/n9046EkYXT8NAkeQo9LZUQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev-rc.1.0.0.228517","@fluidframework/sequence":"2.0.0-dev-rc.1.0.0.228517","@fluidframework/core-utils":"2.0.0-dev-rc.1.0.0.228517","@fluidframework/merge-tree":"2.0.0-dev-rc.1.0.0.228517","@fluidframework/runtime-definitions":"2.0.0-dev-rc.1.0.0.228517"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev-rc.1.0.0.228517","@fluidframework/test-runtime-utils":"2.0.0-dev-rc.1.0.0.228517","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev-rc.1.0.0.228517_1704508663705_0.5672469553590349","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.0":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"ef49b283995ac891cd9f4f95a829b3f9a1aee354","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.0.tgz","fileCount":75,"integrity":"sha512-W5ySYvl3MEvNBJtSMIOVeq1co9gne+Q7x4lAwqDeq9fXcpWWLrgXNrreH+rzJXwLtsexkavfrkQ5mm/b/2CrOA==","signatures":[{"sig":"MEYCIQCBKDMY1mx7Q+lwl5BgrLU+61obLQP6WndXxyLfBbLQ2AIhAPmPqmglnvvIiL39QIDFPiUYjMhphThJo4rd/lAJ1znK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.0.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.0.tgz","_integrity":"sha512-W5ySYvl3MEvNBJtSMIOVeq1co9gne+Q7x4lAwqDeq9fXcpWWLrgXNrreH+rzJXwLtsexkavfrkQ5mm/b/2CrOA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.0 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.0_1704731583613_0.9802894584712678","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b895518ff44a77178ee0f037349f2dae87b1a028","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.1.tgz","fileCount":75,"integrity":"sha512-3NbXlCoizmVRJ+FPpGYltswKTqpVNREEsRUkHUE43/HMtVRUhUEa7FxABtdT6FwEBuS7/oaDnDa33WYqi373MQ==","signatures":[{"sig":"MEQCICo0WtpqXqDT5HR06JMHnW8RwXjcrlXxrHI18IpTyv0+AiB2J5myBZ28Hj6UfitG+ThHSVED/LbA9HdYdDZBj9iIhA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.1.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.1.tgz","_integrity":"sha512-3NbXlCoizmVRJ+FPpGYltswKTqpVNREEsRUkHUE43/HMtVRUhUEa7FxABtdT6FwEBuS7/oaDnDa33WYqi373MQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.1 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.1_1704771175171_0.803665040287256","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"9ee52d90f2189af7aa77e4c02d6e1aa386f448d0","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.2.tgz","fileCount":75,"integrity":"sha512-z30GqNwdpwRUmr1WjzsucqeL5ap+fZ5hY3U14QF4u3SfNkHcJocsygotppa9VoEl3rn+/By3G+RL3UDfurZOZA==","signatures":[{"sig":"MEUCICqy4ecGCvbuNjCJRijRRgrGEKzSM4A5/FmqLGYsp+zKAiEApuvKUY+DdoJQgISf7Vmv6+MQZlMUw2IGxlhxIk1fXDI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.2.tgz","_integrity":"sha512-z30GqNwdpwRUmr1WjzsucqeL5ap+fZ5hY3U14QF4u3SfNkHcJocsygotppa9VoEl3rn+/By3G+RL3UDfurZOZA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.2 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.2_1704925949833_0.2578102292516966","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.1":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.1","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.1","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6b02fff61c3c9516cad51800b4e276d4a6170976","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.1.tgz","fileCount":75,"integrity":"sha512-vIvYHQaP90YXe5noBjwF2VxFNB3mk2PjLX66OOGV1UGAAUwLpIh8y3mVDiAv2EyTZ/Y0YgulcjepKAZFUJMT2w==","signatures":[{"sig":"MEQCIGP/4HXcXkavioiSeQYxGjqFPb7jgyMNTetihhvHBA1uAiAFosVwnyZQpRvYdspnt+MMn4uIkctHiFuWJXR71EzV/w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.1.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.1.tgz","_integrity":"sha512-vIvYHQaP90YXe5noBjwF2VxFNB3mk2PjLX66OOGV1UGAAUwLpIh8y3mVDiAv2EyTZ/Y0YgulcjepKAZFUJMT2w==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.1 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.1_1704930683630_0.5841392474223139","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"8bd8ad3ba5567858fed38f5aa956353093d36300","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.2.tgz","fileCount":75,"integrity":"sha512-gtqRYzY9r5NbVpLmzMhrh9cxPW1aE+kbO4mKeYaMxnyUal1cdvRv3E1597ZOUMZPCC+mC4WAfmJdX5+eJbgVRQ==","signatures":[{"sig":"MEUCIAoVT4Wgu6IPgGkE2iIfXDK6k1Glxl/Wa0PIJ71ng7v6AiEAqIl6DNVh0fmnjHquhw85vqiyfPRz/mZO8NdrxhjPpDs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.2.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.2.tgz","_integrity":"sha512-gtqRYzY9r5NbVpLmzMhrh9cxPW1aE+kbO4mKeYaMxnyUal1cdvRv3E1597ZOUMZPCC+mC4WAfmJdX5+eJbgVRQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.2 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.2_1705435268009_0.31955655016791984","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"24b3f128f0e4782e006dc52235768b4f23a94f13","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.3.tgz","fileCount":75,"integrity":"sha512-2VTYhD3+Jz1Sb1FM6drIw6dWjdiCGOcbeBIPpQAQRuvmElg0W0cKKSTb1ShD9ja1dmh/EtT9HQMn7+42J4sLJg==","signatures":[{"sig":"MEUCIAh5xDobl5QgsKCo/CGxXCJmEo5XfI7/mDDVKwJct20HAiEAnUYZzGhVRJqwBhT1Ku7nVJLcfxrIfFsX7difbl4TIMs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.3.tgz","_integrity":"sha512-2VTYhD3+Jz1Sb1FM6drIw6dWjdiCGOcbeBIPpQAQRuvmElg0W0cKKSTb1ShD9ja1dmh/EtT9HQMn7+42J4sLJg==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.3 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.3_1705435600324_0.14464970139485156","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"45e7c006c6a8eb429895affe5e63625412283fdd","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.3.tgz","fileCount":75,"integrity":"sha512-neBpChc3veWgydb+Ey1KpTUAl9KNEES+ouwzE7JDdv88QOtuUFc/0nEdEhS5WcAgLAgP14YSTLY1AzfX9P00pQ==","signatures":[{"sig":"MEQCIF++19Ca+BC4o1jSUtuTIGsB61RKT/gi8dyqwLHefYbOAiACLWFjarNGucwmWFeiPlA5WcQMj4Dl6QEukLC3OYGyMw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.3.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.3.tgz","_integrity":"sha512-neBpChc3veWgydb+Ey1KpTUAl9KNEES+ouwzE7JDdv88QOtuUFc/0nEdEhS5WcAgLAgP14YSTLY1AzfX9P00pQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.3 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.3_1705619146914_0.4157582487314322","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"91ddf5ebac2e432aadc722ac1fd23bb1d3e1ea37","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.4.tgz","fileCount":75,"integrity":"sha512-za1m+mpGdlrebZWBzQ1h9JwHpH7PJ5+TFHyJWoCMxk7qQO/X/fIzJmRbkuf5ltVroPFi932pIcqryArNw86Xow==","signatures":[{"sig":"MEYCIQCuijK8zDS2HC8Drmaj05fWVwEt7EiPXRP+XaN9ID4h9gIhALGAUUBK6zk5BZ1UcH/L5xCoW6usC8bMs3bBOH6zSNcm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.4.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.4.tgz","_integrity":"sha512-za1m+mpGdlrebZWBzQ1h9JwHpH7PJ5+TFHyJWoCMxk7qQO/X/fIzJmRbkuf5ltVroPFi932pIcqryArNw86Xow==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.4 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.4_1705619864972_0.304233340481745","host":"s3://npm-registry-packages"}},"2.0.0-dev-rc.1.0.0.232845":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-dev-rc.1.0.0.232845","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-dev-rc.1.0.0.232845","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"538f2971270fb3c0e78bcc7f9274dd3ffc011e6a","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-dev-rc.1.0.0.232845.tgz","fileCount":75,"integrity":"sha512-vIj1x2RPZwlb9VzGalD3A8sMy8SIlUovji1kNwNoDwncLTgflFUY9z2m6BHusBhGvVzxMqkn0vViIZjhqkZQuQ==","signatures":[{"sig":"MEUCIQDiMBT46xjmhSxULcgPnqfKgXgxPP1d/nX8w9z1UsKmbAIgFoov0Z92vXl19B0Pev4O4oFsqvfd4+E9SNxcXx3qk6k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152081},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.232845.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-dev-rc.1.0.0.232845.tgz","_integrity":"sha512-vIj1x2RPZwlb9VzGalD3A8sMy8SIlUovji1kNwNoDwncLTgflFUY9z2m6BHusBhGvVzxMqkn0vViIZjhqkZQuQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"2.0.0-dev-rc.1.0.0.232845","@fluidframework/sequence":"2.0.0-dev-rc.1.0.0.232845","@fluidframework/core-utils":"2.0.0-dev-rc.1.0.0.232845","@fluidframework/merge-tree":"2.0.0-dev-rc.1.0.0.232845","@fluidframework/runtime-definitions":"2.0.0-dev-rc.1.0.0.232845"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.39.1","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":"2.0.0-dev-rc.1.0.0.232845","@fluidframework/test-runtime-utils":"2.0.0-dev-rc.1.0.0.232845","@fluidframework/eslint-config-fluid":"^3.3.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-dev-rc.1.0.0.232845_1706665348905_0.13490102608207843","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"a360ac1ab668d03eaa1ca1c742d1f542bda3046e","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.4.tgz","fileCount":75,"integrity":"sha512-NR+zagm11a7NSD8GjAwIKouMFoFgsOuxMqHMvMcX2PGWSw2qfuTh6lxzXim23tSZaisxg2iGj8tdmfYqAupeJg==","signatures":[{"sig":"MEUCIA8Ga9GSK5xv2HwIdAlqzQxDDVJYyc7oZFbDE8vW4V54AiEA2dUpnMlbqsgSvoftjIFNhFagQxeWKSyyPIl89dep1X8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.4.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.4.tgz","_integrity":"sha512-NR+zagm11a7NSD8GjAwIKouMFoFgsOuxMqHMvMcX2PGWSw2qfuTh6lxzXim23tSZaisxg2iGj8tdmfYqAupeJg==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.4 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.4_1707246231868_0.8309911765038325","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b51a00fa73c6b0d9e5492acd86689f66c077b9bc","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.5.tgz","fileCount":75,"integrity":"sha512-Y2KAv7Ktpeu8Fmr2SU9ckqKlOkC86gttGp+14MQvjTWeTcDw/BostmYP2YOqMw5/hXfeiM48UdEyU0q6rZM/4Q==","signatures":[{"sig":"MEQCIC9khYbRY25bcTNof46lRAf65PjkcoRbwyvWcDTX8sCKAiAGwX23jBPyeXD2wK+HvC1Ip+WP7hWqX1yo1wA9EZ2mWg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.5.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.5.tgz","_integrity":"sha512-Y2KAv7Ktpeu8Fmr2SU9ckqKlOkC86gttGp+14MQvjTWeTcDw/BostmYP2YOqMw5/hXfeiM48UdEyU0q6rZM/4Q==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.5 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.5_1707343987381_0.7318717157287109","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.6":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e490ceb0f3708de66cd2fcd6bc54521a3f75d7fa","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.6.tgz","fileCount":75,"integrity":"sha512-ClXrWoRtSXuipyO3TxPhOZBUFYOQeF/vn/b+sa+5JIAg2DFCTKO0SUPnS6f3QsmpaQt6OoM/B1qVEniICVORfA==","signatures":[{"sig":"MEQCIH7h8+GzAv11nLUHYrFaSHch/c4pgXVl3IhK3DnqRtvaAiAInfIcwitXxY0tyMWsuHCLdmO4bfZTD1lMCnpY0g7kBw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.6.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.6.tgz","_integrity":"sha512-ClXrWoRtSXuipyO3TxPhOZBUFYOQeF/vn/b+sa+5JIAg2DFCTKO0SUPnS6f3QsmpaQt6OoM/B1qVEniICVORfA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.6 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.6_1707353927241_0.3553283027738534","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"7f851f08ebad3f2a253c7c89a380747926ad2cd9","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.5.tgz","fileCount":75,"integrity":"sha512-YB1AAaDx9THVLrgMF1hF58vH8uNTztM9KYXAH7tPLyjqqUfb/I3praloSf7xPVNzJXDddRndTPOnd+3M6TZ5uw==","signatures":[{"sig":"MEUCIQDIPqST32G/CvU40MeBkb4MRcW4Sm4mXBdfiaYp/KAksQIgGPYmeUVuiFBigxmWPuCXv6WxYaV940djvMC4F6mEypo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.5.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.5.tgz","_integrity":"sha512-YB1AAaDx9THVLrgMF1hF58vH8uNTztM9KYXAH7tPLyjqqUfb/I3praloSf7xPVNzJXDddRndTPOnd+3M6TZ5uw==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.5 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.5_1707420789346_0.6941563635876564","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.2":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.2","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.2","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"fbc33b97f0330dd5b72237a830caf5360b38386f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.2.tgz","fileCount":75,"integrity":"sha512-k2be5ddMZXAcFVY2ZmbayuwNI6WV19y3p3MW+q8y3vDC3Joqc7Fa+A6ciPu4nECLJ247sm+vqNwtrQcQWMRylA==","signatures":[{"sig":"MEYCIQCXPcPOF5+a/UM7tvlfsTNTEtUtN/U0KJCByiC1reK+aAIhALNyFHeckwC2mhRTuTxjA07UYhS2n2SWTtR4lNv++sda","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.2.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.2.tgz","_integrity":"sha512-k2be5ddMZXAcFVY2ZmbayuwNI6WV19y3p3MW+q8y3vDC3Joqc7Fa+A6ciPu4nECLJ247sm+vqNwtrQcQWMRylA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.2 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.2_1707435731258_0.7488794815878901","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.3":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.3","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.3","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"63a83cf239221b7ab4abc677323080051aa2ecb1","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.3.tgz","fileCount":75,"integrity":"sha512-DDMMRdAtCpZ835DGfnIuNMXbr9sTof4WtAsmw7iY08xTz1ceFbQwdOmpoitiFLrzI1HvGSOQ7pUyynC5wLUP2w==","signatures":[{"sig":"MEUCIQDSxO/No+Rwl30XrjMXM6uws1s7Kc94q6XWbGrR69w/CAIgLh7y2NV/rQ1/WZi0NXJcsbG/5uCzKkTVU/aYf7T7IVk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.3.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.3.tgz","_integrity":"sha512-DDMMRdAtCpZ835DGfnIuNMXbr9sTof4WtAsmw7iY08xTz1ceFbQwdOmpoitiFLrzI1HvGSOQ7pUyynC5wLUP2w==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.3_1707782256363_0.06927177438445797","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.6":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0710f05c7c2f11a6c0f108c89e43c9988a9bde39","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.6.tgz","fileCount":75,"integrity":"sha512-uz1mI9gpE2LjkR1s7816HC2c46qgWfc/jRrEyhu54Xbt2S7VrU4YXmX+5zUNEZ+1a4T+jL6iaKseRO+TCL/gcw==","signatures":[{"sig":"MEYCIQDdFE38C87/wg8kSXwXIF9FLO97MKEZXfkCY/a8ehnACAIhAJGWOh4ddEraU9mDGr/Jq4VG/zUnQE59HXDymhno3X4b","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.6.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.6.tgz","_integrity":"sha512-uz1mI9gpE2LjkR1s7816HC2c46qgWfc/jRrEyhu54Xbt2S7VrU4YXmX+5zUNEZ+1a4T+jL6iaKseRO+TCL/gcw==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.6 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.6_1707783328573_0.33495902733364025","host":"s3://npm-registry-packages"}},"2.0.0-internal.7.4.7":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.7.4.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.7.4.7","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"c5a9ac6d49ca8dcd60d51245eaa89e9a7cb9e922","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.7.4.7.tgz","fileCount":75,"integrity":"sha512-630+UUJE6bXHi4cxallvqp9VjD25jfEbLy8DiimJ5sOIDwLy10FOU68HgVqqRUDUYgseeWVxRixEP0DCcdY2uQ==","signatures":[{"sig":"MEUCIQDv+Jyr92XQLMlW3+Suj7FMLuQaWH+84EZAYbSqOeZOPAIgOg2GBJpGfQOhLxWJ1IGWFzXHoIB3PZFXhrEEzKloHho=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160183},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.7.4.7.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.7.4.7.tgz","_integrity":"sha512-630+UUJE6bXHi4cxallvqp9VjD25jfEbLy8DiimJ5sOIDwLy10FOU68HgVqqRUDUYgseeWVxRixEP0DCcdY2uQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0","@fluidframework/sequence":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0","@fluidframework/core-utils":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0","@fluidframework/merge-tree":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0","@fluidframework/runtime-definitions":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.7.4.7 <2.0.0-internal.7.5.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.7.4.7_1707783778051_0.9655738999310086","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.7":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.7","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f9b0a50ceddfb59de007cbe696c37604b5d0042c","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.7.tgz","fileCount":75,"integrity":"sha512-Jz9qF3EGUseeH7C/PrDj8PUdB92026c6u3xo2Rk2GnIt+24Po/YlUBOyeWLQYa4oJoQBILl027eDlN7WpmlNJA==","signatures":[{"sig":"MEYCIQCHdgT0OpmsCQmBK9pAZvknbCyr8GQ7TxmgmaJDRH/AWAIhALxllkaU75bGB8qW83n+XnmXqTyur30ENfbWLEtg3sfG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.7.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.7.tgz","_integrity":"sha512-Jz9qF3EGUseeH7C/PrDj8PUdB92026c6u3xo2Rk2GnIt+24Po/YlUBOyeWLQYa4oJoQBILl027eDlN7WpmlNJA==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.7 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.7_1709146940069_0.9962080538992986","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.4":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.4","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.4","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"0997c17cfd11350c5149a24582e7ef150add0a6f","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.4.tgz","fileCount":75,"integrity":"sha512-PnlCM66IB/X7oInuxzFEOh0cSqhnOBa7Z3wCvsGUL/T9gZFQGIoWsGNBlYR6k8/JatCZGXBS/t8hNvo4ApH/SQ==","signatures":[{"sig":"MEUCIF1tTaSU79BtvtLzZbLqJ50yZfDRLlqSCEnrKu4/yXCpAiEAtNAnw0OSIsljVxiwa28y7V4y06USc0DpmeWtaJ2DVIc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.4.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.4.tgz","_integrity":"sha512-PnlCM66IB/X7oInuxzFEOh0cSqhnOBa7Z3wCvsGUL/T9gZFQGIoWsGNBlYR6k8/JatCZGXBS/t8hNvo4ApH/SQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.4 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.4_1709155091128_0.21887591087452551","host":"s3://npm-registry-packages"}},"2.0.0-internal.8.0.8":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-internal.8.0.8","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-internal.8.0.8","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.cjs"],"include":["src/**/*.ts","dist/**/*.cjs"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"6dbd2d6abce7e7850918bc24e12e8176f3a226ba","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-internal.8.0.8.tgz","fileCount":75,"integrity":"sha512-0dNae6mT672dvpX0GITkxe89ahJIN2SBwa7JnmBYJhnB5tx8Tp/BGtHWKjTZtoNjqwidnMMHaL9Bw4e/OjkzLQ==","signatures":[{"sig":"MEYCIQDM4ZOPwGnAJge2qlkHiVBkpC4rhu3qhWzfvwEUoMrTRQIhAJ3H0tXaCdwY62VtC7I3BJ3bEJClF23R8FozyF77VF0z","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152125},"main":"dist/index.cjs","_from":"file:fluidframework-dds-interceptions-2.0.0-internal.8.0.8.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\nNote that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme,\nyou must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`).\nStandard `^` and `~` ranges will not work as expected.\nSee the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md)\npackage for more information including tools to convert between version schemes.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","scripts":{"api":"fluid-build . --task api","tsc":"tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc-multi --config ./tsc-multi.test.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.cjs\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-internal.8.0.8.tgz","_integrity":"sha512-0dNae6mT672dvpX0GITkxe89ahJIN2SBwa7JnmBYJhnB5tx8Tp/BGtHWKjTZtoNjqwidnMMHaL9Bw4e/OjkzLQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0","@fluidframework/sequence":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0","@fluidframework/core-utils":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0","@fluidframework/merge-tree":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0","@fluidframework/runtime-definitions":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^7.7.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.28.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.28.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0","@fluidframework/test-runtime-utils":">=2.0.0-internal.8.0.8 <2.0.0-internal.8.1.0","@fluidframework/eslint-config-fluid":"^3.1.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-internal.8.0.8_1710894353817_0.7972177247369832","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.5":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.5","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.5","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5e35bb711282e12cd320afa498c6d203e08a4493","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.5.tgz","fileCount":75,"integrity":"sha512-DDznXfiJ9uNG2/2hHfYXRsJWtq51XpkEIM0Y0IdO4q+yrTxuQgKOVIIzmhnVui8F3l9SWfC0ZPyHZ0MwWZao6w==","signatures":[{"sig":"MEYCIQDdpOyJA23Fyb9fJNTJVhsxLfRPHllwEdEBD1cXjyMQwQIhAOh2z+T4cFqSiO2GFk4Dnnq8NSdidIz2gdalCs392pXh","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.5.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.5.tgz","_integrity":"sha512-DDznXfiJ9uNG2/2hHfYXRsJWtq51XpkEIM0Y0IdO4q+yrTxuQgKOVIIzmhnVui8F3l9SWfC0ZPyHZ0MwWZao6w==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.5 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.5_1711070221281_0.7870809904572771","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.6":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.6","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.6","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"5663ef4838519256be8faf170244b55cb7c577c3","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.6.tgz","fileCount":75,"integrity":"sha512-GuAoy6a5a2ki9bs9lh5PfAiWGtgmFadgi5TQAxRGrsvZOXXHt91jYB3VgCZn9lyltPcuj0tAZcsDWXyrZd4o4w==","signatures":[{"sig":"MEYCIQDHLMTbwxJw0CVJfgsntpb8iaZEGel3bTY2fSrgL3ldWwIhAMQR/BYtd91uDmldXBqfiDPbzK5ItCys6vig9b4n+/Mj","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.6.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.6.tgz","_integrity":"sha512-GuAoy6a5a2ki9bs9lh5PfAiWGtgmFadgi5TQAxRGrsvZOXXHt91jYB3VgCZn9lyltPcuj0tAZcsDWXyrZd4o4w==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.6_1711147923798_0.13074067912176512","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.7":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.7","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.7","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"f1199f8967712beaa8a0a900dfc770acc5919632","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.7.tgz","fileCount":75,"integrity":"sha512-ByjwQ98QfFIvSaX7IWH2p4PB0MYOGJumKlS/HGX+T3kec8ecfl63dLfmlp37YUQ2TYHTG00oD/AHf0NfbKfmlw==","signatures":[{"sig":"MEUCIQD7SQqn0TLcGOImWYGc6RiluVME5pcjSwLxrwrdrZeJ+gIgVXp2Iwev4SHEYp03f/a2K7CXIzTuKGDxJdKN4/P3AdM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.7.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.7.tgz","_integrity":"sha512-ByjwQ98QfFIvSaX7IWH2p4PB0MYOGJumKlS/HGX+T3kec8ecfl63dLfmlp37YUQ2TYHTG00oD/AHf0NfbKfmlw==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.7 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.7_1712090889048_0.3240452491911867","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.8":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.8","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.8","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"272b2fda2b01d1d0fbe96e3782c3d0d4b9fe99f7","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.8.tgz","fileCount":75,"integrity":"sha512-tURi7/HY9MQNdv9ewHrPAVASU4ecjkX6egjFa3bBBOMbehiysbYK2SwnG4okrM9/OvOHbwRRfX7VH9icz6GeqQ==","signatures":[{"sig":"MEQCICuTii7/68wBcbpSKQRZTkTimlI4JYuzSIMOQhvVJ8rmAiBsC6DICXNwmm3yy8pkh0J8AbVXdGzxzjk3H+pO9h+T4Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.8.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.8.tgz","_integrity":"sha512-tURi7/HY9MQNdv9ewHrPAVASU4ecjkX6egjFa3bBBOMbehiysbYK2SwnG4okrM9/OvOHbwRRfX7VH9icz6GeqQ==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.8 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.8_1712268826198_0.27949464028634585","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"@fluidframework/dds-interceptions","version":"1.4.0","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@1.4.0","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"nyc":{"all":true,"exclude":["src/test/**/*.ts","dist/test/**/*.js"],"include":["src/**/*.ts","dist/**/*.js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"b84b6d9ab570b4f12363249e273063b9153449bb","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-1.4.0.tgz","fileCount":70,"integrity":"sha512-1JVWmThftayssL7Z3SgcCFwKzzAv4HzZ+Jo6lBjAZ5gH0vtTM92Gv9t6ygbrIYs9HLywS5dzIdtQRrUiaoJVlQ==","signatures":[{"sig":"MEYCIQDkF29OObrverImzopvTuD4u7BOw8cRUSgEhuqh67K8/QIhAJIonLUNgkBtoIFg3TMxigNriFpCUGH1sqLvDRq60Jig","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145712},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-1.4.0.tgz","types":"dist/index.d.ts","module":"lib/index.js","scripts":{"tsc":"tsc","lint":"npm run eslint","test":"npm run test:mocha","build":"npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs","clean":"rimraf dist lib *.tsbuildinfo *.build.log","eslint":"eslint --format stylish src","lint:fix":"npm run eslint:fix","build:docs":"api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/","build:full":"npm run build","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive dist/test/**/*.spec.js -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict","build:esnext":"tsc --project ./tsconfig.esnext.json","build:genver":"gen-version","build:compile":"concurrently npm:build:commonjs npm:build:esnext","ci:build:docs":"api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/","test:coverage":"nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml","typetests:gen":"flub generate typetests --generate --dir . --no-generateInName","build:commonjs":"npm run tsc && npm run typetests:gen && npm run build:test","build:compile:min":"npm run build:compile","typetests:prepare":"flub generate typetests --prepare --dir . --pin","build:full:compile":"npm run build:compile","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha"},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"","_integrity":"","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"6.14.18","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":"^1.4.0","@fluidframework/sequence":"^1.4.0","@fluidframework/merge-tree":"^1.4.0","@fluidframework/common-utils":"^0.32.2","@fluidframework/runtime-definitions":"^1.4.0"},"_hasShrinkwrap":false,"typeValidation":{"broken":{},"version":"1.4.0","baselineRange":"~1.3.0","baselineVersion":"1.3.1"},"devDependencies":{"nyc":"^15.0.0","diff":"^3.5.0","mocha":"^10.0.0","eslint":"~8.6.0","rimraf":"^2.6.2","copyfiles":"^2.1.0","cross-env":"^7.0.2","random-js":"^1.0.8","typescript":"~4.5.5","@types/diff":"^3.5.1","@types/node":"^14.18.0","@types/mocha":"^9.1.1","concurrently":"^6.2.0","@types/random-js":"^1.0.31","typescript-formatter":"7.1.0","@microsoft/api-extractor":"^7.22.2","@rushstack/eslint-config":"^2.5.1","@fluidframework/build-tools":"^0.6.0","@fluidframework/build-common":"^0.24.0","@fluidframework/mocha-test-setup":"^1.4.0","@fluidframework/test-runtime-utils":"^1.4.0","@fluidframework/eslint-config-fluid":"^0.28.2000","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@1.3.1"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_1.4.0_1712697119572_0.35082266571562837","host":"s3://npm-registry-packages"}},"2.0.0-rc.1.0.9":{"name":"@fluidframework/dds-interceptions","version":"2.0.0-rc.1.0.9","author":{"name":"Microsoft and contributors"},"license":"MIT","_id":"@fluidframework/dds-interceptions@2.0.0-rc.1.0.9","maintainers":[{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},{"name":"curtisman","email":"curtism@microsoft.com"}],"homepage":"https://fluidframework.com","bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"c8":{"all":true,"exclude":["src/test/**/*.*ts","dist/test/**/*.*js"],"include":["src/**/*.*ts","dist/**/*.*js"],"reporter":["cobertura","html","text"],"cache-dir":"nyc/.cache","report-dir":"nyc/report","temp-directory":"nyc/.nyc_output","exclude-after-remap":false},"dist":{"shasum":"e7b48ab36032836a998ed8269dbc71f9895b36b8","tarball":"https://registry.npmjs.org/@fluidframework/dds-interceptions/-/dds-interceptions-2.0.0-rc.1.0.9.tgz","fileCount":75,"integrity":"sha512-LY7Yl/jovbD6eZsQ8fnmtpJgWVtrzzM9/tlB+g4ZLzPlsawJOHo8HHVsZ9ilzyBgojIS0itenCwA9ZwUKYcXMw==","signatures":[{"sig":"MEQCIG1anZrFTlIef9WFxaAhFjpGEZxlHEzy1G5OJzKFyGk7AiAr3LNSyD8TeA5vazEfVkSEc9G/vpVvUYNjtqQQ21QcXA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152119},"main":"dist/index.js","_from":"file:fluidframework-dds-interceptions-2.0.0-rc.1.0.9.tgz","types":"dist/index.d.ts","module":"lib/index.mjs","readme":"# @fluidframework/dds-interceptions\n\nThis package provides factory methods to create a wrapper around some of the basic Distributed Data Structures (DDS) that support an interception callback. Apps can provide a callback when creating these wrappers and this callback will be called when the DDS is modified. This allows apps to support features such as basic user attribution on a SharedString.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_DEPENDENCY_GUIDELINES_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Using Fluid Framework libraries\n\nWhen taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`.\nWhile Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries,\nlibrary consumers should always prefer `^`.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n\n## Shared String With Interception\n\nIt provides `createSharedStringWithInterception` that accepts a SharedString, the data store context and a callback, and returns a SharedString object:\n\n```typescript\nfunction createSharedStringWithInterception(\n\tsharedString: SharedString,\n\tcontext: IFluidDataStoreContext,\n\tpropertyInterceptionCallback: (props?: MergeTree.PropertySet) => MergeTree.PropertySet,\n): SharedString;\n```\n\nWhen a function is called that modifies the SharedString (for example, insertText), it calls propertyInterceptionCallback with the provided properties. The callback function can then provide the new set of properties that it wants to set. The operation in the called function and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nFor example, to support a feature like simple user attribution, the app can append the user information to the properties in the callback. The user information can than be retrieved by getting the properties at any position.\n\n## Shared Map With Interception\n\nIt provides `createSharedMapWithInterception` that accepts a SharedMap, the data store context and a callback, and returns a SharedMap object:\n\n```typescript\nfunction createSharedMapWithInterception(\n\tsharedMap: SharedMap,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (sharedMap: ISharedMap, key: string, value: any) => void,\n): SharedMap;\n```\n\nWhen set is called on the SharedMap, it calls setInterceptionCallback with the underlying SharedMap, the key and value that the set was called with. The callback function can then perform operations on either the underlying SharedMap or any other DDS. The original set operation and any operations in the callback are batched, i.e., they are guaranteed to be in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in the underlying SharedMap against a key derived from the original key - say against \"key.attribute\". Or, it could use a separate SharedMap to store the user information against the same key.\n\n## Shared Directory / Sub Directory With Interception\n\nIt provides `createdDirectoryWithInterception` that accepts an IDirectory object, the data store context and a callback, and returns an IDirectory object:\n\n```typescript\nfunction createDirectoryWithInterception<T extends IDirectory>(\n\tbaseDirectory: T,\n\tcontext: IFluidDataStoreContext,\n\tsetInterceptionCallback: (\n\t\tbaseDirectory: IDirectory,\n\t\tsubDirectory: IDirectory,\n\t\tkey: string,\n\t\tvalue: any,\n\t) => void,\n): T;\n```\n\nIt can be used to wrap a SharedDirectory or one of it's subdirectories to get an interception callback when set is called on the object. The callback function is passed the following:\n\n-   baseDirectory: This is the outermost directory in this directory structure that was wrapped. For example, when a SharedDirectory (say 'root') is wrapped, then a set on it or any of its sub directories will be passed 'root' as the baseDirectory.\n-   subDirectory: This is the directory that the set is called on and which calls the callback.\n-   key: They key that set was called with.\n-   value: They value that set was called with.\n\nThe original set operation and any operations in the callback function are batched, i.e., they are guaranteed to in order and will be applied together.\n\nExample: To support a feature like simple user attribution, in the callback, the app can set the user information in a sub directory of the original object against the same key.\n\n<!-- AUTO-GENERATED-CONTENT:START (README_TRADEMARK_SECTION:includeHeading=TRUE) -->\n\n<!-- prettier-ignore-start -->\n<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->\n\n## Trademark\n\nThis project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.\n\nUse of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\n\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\n\n<!-- prettier-ignore-end -->\n\n<!-- AUTO-GENERATED-CONTENT:END -->\n","exports":{".":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./beta":{"import":{"types":"./lib/dds-interceptions-beta.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-beta.d.ts","default":"./dist/index.js"}},"./alpha":{"import":{"types":"./lib/dds-interceptions-alpha.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-alpha.d.ts","default":"./dist/index.js"}},"./public":{"import":{"types":"./lib/dds-interceptions-public.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/dds-interceptions-public.d.ts","default":"./dist/index.js"}},"./internal":{"import":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"api":"fluid-build . --task api","tsc":"tsc","lint":"npm run prettier && npm run check:release-tags && npm run eslint","test":"npm run test:mocha","build":"fluid-build . --task build","clean":"rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc","eslint":"eslint --format stylish src","format":"npm run prettier:fix","lint:fix":"npm run prettier:fix && npm run eslint:fix","prettier":"prettier --check . --cache --ignore-path ../../../.prettierignore","build:docs":"fluid-build . --task api","build:test":"tsc --project ./src/test/tsconfig.json","eslint:fix":"eslint --format stylish src --fix --fix-type problem,suggestion,layout","test:mocha":"mocha --recursive \"dist/test/**/*.spec.*js\" -r node_modules/@fluidframework/mocha-test-setup","build:esnext":"tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json","prettier:fix":"prettier --write . --cache --ignore-path ../../../.prettierignore","build:compile":"fluid-build . --task compile","ci:build:docs":"api-extractor run","test:coverage":"c8 npm test","typetests:gen":"fluid-type-test-generator","build:commonjs":"fluid-build . --task commonjs","build:compile:min":"npm run build:compile","typetests:prepare":"flub typetests --dir . --reset --previous --normalize","check:release-tags":"api-extractor run --local --config ./api-extractor-lint.json","test:mocha:verbose":"cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha","api-extractor:esnext":"api-extractor run --config ./api-extractor-esm.json","api-extractor:commonjs":"api-extractor run --local","check:are-the-types-wrong":"attw --pack . --entrypoints ."},"_npmUser":{"name":"ms-fluid-bot","email":"ffsa@microsoft.com"},"_resolved":"/mnt/vss/_work/1/pack/scoped/fluidframework-dds-interceptions-2.0.0-rc.1.0.9.tgz","_integrity":"sha512-LY7Yl/jovbD6eZsQ8fnmtpJgWVtrzzM9/tlB+g4ZLzPlsawJOHo8HHVsZ9ilzyBgojIS0itenCwA9ZwUKYcXMw==","fluidBuild":{"tasks":{"build:docs":{"script":false,"dependsOn":["...","api-extractor:commonjs","api-extractor:esnext"]}}},"repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"_npmVersion":"9.6.7","description":"Distributed Data Structures that support an interception callback","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"@fluidframework/map":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0","@fluidframework/sequence":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0","@fluidframework/core-utils":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0","@fluidframework/merge-tree":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0","@fluidframework/runtime-definitions":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","typeValidation":{"broken":{}},"devDependencies":{"c8":"^8.0.1","diff":"^3.5.0","mocha":"^10.2.0","eslint":"~8.50.0","moment":"^2.21.0","rimraf":"^4.4.0","prettier":"~3.0.3","copyfiles":"^2.4.1","cross-env":"^7.0.3","tsc-multi":"^1.1.0","typescript":"~5.1.6","@types/diff":"^3.5.1","@types/node":"^18.19.0","@types/mocha":"^9.1.1","@arethetypeswrong/cli":"^0.13.3","mocha-multi-reporters":"^1.5.1","@fluid-tools/build-cli":"^0.29.0","@microsoft/api-extractor":"^7.38.3","mocha-json-output-reporter":"^2.0.1","@fluidframework/build-tools":"^0.29.0","@fluidframework/build-common":"^2.0.3","@fluidframework/mocha-test-setup":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0","@fluidframework/test-runtime-utils":">=2.0.0-rc.1.0.9 <2.0.0-rc.1.1.0","@fluidframework/eslint-config-fluid":"^3.2.0","@fluidframework/dds-interceptions-previous":"npm:@fluidframework/dds-interceptions@2.0.0-internal.8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dds-interceptions_2.0.0-rc.1.0.9_1713918079018_0.9473914019187497","host":"s3://npm-registry-packages"}}},"time":{"created":"2020-09-01T04:26:54.400Z","modified":"2026-07-29T21:14:06.290Z","0.26.0-3177":"2020-09-01T04:26:54.837Z","0.26.0":"2020-09-03T23:02:59.942Z","0.26.1":"2020-09-19T22:19:08.103Z","0.27.0":"2020-09-23T22:35:30.824Z","0.26.2":"2020-09-29T21:39:11.738Z","0.26.3":"2020-10-06T17:15:14.160Z","0.27.1":"2020-10-16T16:40:36.133Z","0.27.2":"2020-10-19T23:46:19.481Z","0.26.4":"2020-10-21T19:06:44.580Z","0.26.5":"2020-10-22T01:12:04.862Z","0.27.3":"2020-10-22T01:13:14.691Z","0.26.6":"2020-10-22T13:49:46.806Z","0.27.4":"2020-10-22T13:50:16.754Z","0.26.7":"2020-10-22T18:45:02.636Z","0.27.5":"2020-10-22T18:45:27.127Z","0.26.8":"2020-10-23T00:21:49.057Z","0.27.6":"2020-10-23T18:09:16.921Z","0.26.9":"2020-10-23T22:55:37.578Z","0.27.7":"2020-10-26T20:15:36.504Z","0.27.8":"2020-10-27T22:11:15.086Z","0.26.10":"2020-10-28T01:45:15.934Z","0.27.9":"2020-10-29T20:55:54.217Z","0.28.0":"2020-10-30T15:54:29.242Z","0.27.10":"2020-10-30T17:30:38.637Z","0.28.1":"2020-10-30T22:36:09.435Z","0.28.2":"2020-10-31T00:46:06.131Z","0.27.11":"2020-11-02T22:11:05.114Z","0.28.3":"2020-11-04T16:05:29.462Z","0.28.4":"2020-11-04T23:16:08.850Z","0.27.12":"2020-11-04T23:20:09.923Z","0.28.5":"2020-11-05T22:33:11.336Z","0.27.13":"2020-11-05T22:33:27.593Z","0.28.6":"2020-11-10T17:12:13.593Z","0.27.14":"2020-11-10T18:45:13.429Z","0.27.15":"2020-11-11T23:23:12.737Z","0.28.7":"2020-11-12T00:14:11.677Z","0.29.0":"2020-11-16T23:08:05.490Z","0.28.8":"2020-11-18T01:05:07.521Z","0.29.1":"2020-11-18T01:30:41.282Z","0.29.2":"2020-11-18T06:03:27.693Z","0.28.9":"2020-11-18T06:18:35.147Z","0.29.3":"2020-11-19T22:07:25.756Z","0.29.4":"2020-11-23T19:40:37.664Z","0.30.0":"2020-12-02T01:43:24.070Z","0.30.1":"2020-12-04T22:15:27.340Z","0.30.2":"2020-12-10T17:49:13.367Z","0.30.3":"2020-12-11T00:22:23.485Z","0.30.4":"2020-12-12T01:29:35.203Z","0.31.0":"2020-12-17T11:29:02.149Z","0.31.1":"2020-12-23T00:00:57.902Z","0.32.0":"2021-01-07T00:24:48.333Z","0.32.1":"2021-01-07T03:22:28.138Z","0.32.2":"2021-01-21T02:45:20.552Z","0.32.3":"2021-01-21T23:05:08.584Z","0.31.2":"2021-01-22T01:39:03.596Z","0.33.0-13708":"2021-01-22T20:20:47.393Z","0.33.0":"2021-01-23T01:11:25.873Z","0.33.1":"2021-01-27T21:26:26.296Z","0.33.2":"2021-01-28T17:49:14.476Z","0.32.4":"2021-01-28T18:10:45.296Z","0.32.5":"2021-01-29T01:26:16.536Z","0.33.3":"2021-01-29T01:41:59.074Z","0.34.0-14942":"2021-02-02T17:55:08.835Z","0.34.0":"2021-02-03T21:27:01.006Z","0.34.1":"2021-02-08T21:07:07.627Z","0.35.0-16170":"2021-02-16T18:55:07.280Z","0.35.0-16887":"2021-02-22T19:21:43.484Z","0.35.0":"2021-02-23T04:11:25.676Z","0.35.1":"2021-02-24T22:38:31.263Z","0.35.2":"2021-03-01T23:27:46.131Z","0.33.4":"2021-03-02T21:46:08.322Z","0.34.2":"2021-03-02T21:46:15.464Z","0.35.3":"2021-03-03T18:21:58.170Z","0.34.3":"2021-03-03T20:55:43.487Z","0.33.5":"2021-03-04T18:09:26.263Z","0.35.4":"2021-03-05T18:26:19.496Z","0.36.0-18883":"2021-03-09T22:43:52.584Z","0.36.0":"2021-03-10T03:21:26.572Z","0.35.5":"2021-03-19T17:19:19.686Z","0.36.1":"2021-03-19T19:27:35.666Z","0.35.6":"2021-03-19T19:45:04.702Z","0.35.7-20343":"2021-03-23T02:15:55.607Z","0.36.2-20364":"2021-03-23T18:46:28.744Z","0.37.0-20427":"2021-03-24T19:58:18.558Z","0.37.0-20517":"2021-03-25T20:53:21.149Z","0.37.0":"2021-03-26T07:03:30.816Z","0.37.1":"2021-03-29T18:47:15.239Z","0.37.2":"2021-03-29T23:41:14.222Z","0.37.3":"2021-04-06T18:21:25.740Z","0.37.3-21287":"2021-04-07T22:02:58.649Z","0.37.4":"2021-04-08T20:49:47.175Z","0.38.0-21934":"2021-04-14T18:24:55.163Z","0.38.0-22000":"2021-04-15T00:25:48.697Z","0.38.0-22040":"2021-04-15T16:57:43.212Z","0.38.0":"2021-04-15T23:46:32.656Z","0.38.1":"2021-04-21T00:20:31.732Z","0.38.2":"2021-04-21T21:57:25.835Z","0.38.3":"2021-04-23T19:05:49.516Z","0.38.4":"2021-04-23T23:15:53.513Z","0.39.0-23254":"2021-04-27T17:14:15.199Z","0.39.0-23272":"2021-04-27T18:17:16.450Z","0.39.0":"2021-04-28T00:09:23.194Z","0.39.1":"2021-05-06T01:26:50.371Z","0.39.2":"2021-05-11T22:33:27.345Z","0.39.3":"2021-05-13T17:26:15.703Z","0.40.0-25719":"2021-05-24T18:59:27.668Z","0.40.0-25851":"2021-05-25T22:36:39.692Z","0.41.0-25957":"2021-05-26T20:39:47.561Z","0.39.4":"2021-05-27T16:43:06.295Z","0.40.0":"2021-05-27T18:04:47.798Z","0.40.1":"2021-06-04T00:32:50.095Z","0.40.2":"2021-06-07T19:46:08.501Z","0.41.0-27154":"2021-06-11T18:58:04.832Z","0.41.0":"2021-06-11T23:29:35.014Z","0.40.3":"2021-06-15T19:27:47.361Z","0.41.1":"2021-06-16T01:49:30.252Z","0.42.0-27549":"2021-06-16T15:30:47.714Z","0.42.0-27644":"2021-06-16T21:52:47.171Z","0.42.0-27677":"2021-06-17T15:01:09.714Z","0.42.0-27683":"2021-06-17T16:30:16.579Z","0.41.2":"2021-06-22T00:37:25.648Z","0.41.3":"2021-06-22T23:07:06.195Z","0.41.4":"2021-06-23T22:42:16.615Z","0.42.0-28410":"2021-06-25T20:54:18.744Z","0.42.0":"2021-06-26T01:54:44.155Z","0.39.5":"2021-07-07T21:58:25.311Z","0.42.1":"2021-07-08T16:30:15.608Z","0.39.6":"2021-07-08T20:50:52.078Z","0.42.2":"2021-07-08T22:54:59.862Z","0.43.0":"2021-07-09T19:52:32.039Z","0.42.3":"2021-07-09T20:58:01.306Z","0.43.1":"2021-07-19T23:14:32.048Z","0.42.4":"2021-07-20T00:16:04.336Z","0.39.7":"2021-07-22T20:08:42.229Z","0.44.0-30858":"2021-07-22T22:12:46.717Z","0.44.0":"2021-07-23T01:34:06.915Z","0.39.8":"2021-07-26T21:50:28.568Z","0.44.1":"2021-08-04T00:55:33.926Z","0.45.0-32948":"2021-08-06T19:42:07.260Z","0.45.0":"2021-08-06T23:23:28.723Z","0.45.1":"2021-08-10T01:27:06.535Z","0.45.2":"2021-08-11T22:03:05.740Z","0.45.3":"2021-08-13T00:51:44.040Z","0.45.4":"2021-08-17T18:34:11.830Z","0.46.0-34784":"2021-08-20T23:12:00.859Z","0.46.0":"2021-08-21T00:47:43.395Z","0.47.0-35912":"2021-08-31T23:55:26.244Z","0.47.0-35961":"2021-09-01T17:29:10.235Z","0.46.1":"2021-09-02T22:52:36.481Z","0.47.0-36362":"2021-09-03T18:33:32.827Z","0.47.0-36699":"2021-09-07T23:44:22.208Z","0.47.0":"2021-09-08T18:01:55.401Z","0.46.2":"2021-09-15T22:03:24.889Z","0.47.1":"2021-09-15T22:59:04.507Z","0.48.0-38105":"2021-09-20T21:23:58.452Z","0.48.0-38142":"2021-09-21T16:02:07.199Z","0.48.0":"2021-09-21T20:09:26.711Z","0.48.1":"2021-09-23T22:29:31.646Z","0.48.2":"2021-09-27T19:58:05.283Z","0.48.3":"2021-09-30T20:31:14.119Z","0.49.0-39015":"2021-09-30T22:01:31.523Z","0.48.4":"2021-10-01T17:21:49.452Z","0.49.0-39313":"2021-10-04T23:23:25.420Z","0.48.5":"2021-10-05T21:59:41.034Z","0.49.0":"2021-10-06T23:02:23.920Z","0.49.1":"2021-10-11T16:25:40.048Z","0.49.2":"2021-10-11T22:24:07.359Z","0.50.0-41365":"2021-10-21T17:02:51.789Z","0.50.0-41540":"2021-10-22T15:51:59.080Z","0.50.0":"2021-10-25T16:51:05.341Z","0.50.1":"2021-10-27T22:55:55.189Z","0.51.0-43124":"2021-11-06T00:27:21.213Z","0.51.0":"2021-11-10T22:21:14.414Z","0.50.2":"2021-11-12T21:13:55.884Z","0.51.1":"2021-11-12T22:02:20.766Z","0.50.3":"2021-11-18T21:57:16.736Z","0.51.2":"2021-11-18T22:48:30.215Z","0.52.0-44610":"2021-11-19T23:01:24.743Z","0.52.0":"2021-11-22T22:20:43.857Z","0.51.3":"2021-11-23T20:29:53.785Z","0.52.1":"2021-11-23T21:48:47.995Z","0.50.4":"2021-11-24T00:15:33.998Z","0.53.0-46105":"2021-12-08T23:08:14.695Z","0.53.0":"2021-12-10T19:02:29.182Z","0.54.0-47413":"2021-12-29T18:48:18.289Z","0.54.0":"2022-01-03T22:37:41.243Z","0.54.1":"2022-01-05T22:04:52.802Z","0.54.2":"2022-01-11T20:52:04.545Z","0.55.0-48551":"2022-01-14T21:28:31.081Z","0.55.0":"2022-01-18T23:44:26.573Z","0.55.1":"2022-01-28T19:06:04.839Z","0.56.0-49831":"2022-01-28T20:33:30.682Z","0.56.0":"2022-01-29T00:32:46.475Z","0.54.3":"2022-02-03T02:20:34.107Z","0.56.1":"2022-02-03T02:34:27.266Z","0.55.2":"2022-02-03T02:35:31.387Z","0.56.2":"2022-02-09T23:58:57.719Z","0.55.3":"2022-02-11T01:29:04.159Z","0.56.3":"2022-02-11T01:32:37.577Z","0.57.0-51086":"2022-02-12T01:13:01.049Z","0.56.4":"2022-02-17T19:59:28.335Z","0.55.4":"2022-02-17T21:15:23.080Z","0.56.5":"2022-02-19T00:42:25.002Z","0.56.6":"2022-03-02T23:11:50.814Z","0.57.0":"2022-03-02T23:59:38.224Z","0.56.7":"2022-03-03T20:16:17.614Z","0.57.1":"2022-03-04T01:46:49.091Z","0.56.8":"2022-03-04T18:46:59.542Z","0.58.0-55561":"2022-03-04T20:06:51.479Z","0.58.0-55983":"2022-03-05T00:52:23.654Z","0.56.9":"2022-03-11T21:03:20.674Z","0.57.2":"2022-03-11T23:55:35.810Z","0.58.1000":"2022-03-14T20:26:28.428Z","0.58.1001":"2022-03-18T01:44:38.601Z","0.58.2000-58133":"2022-03-18T22:14:07.103Z","0.58.2000":"2022-03-23T20:43:09.376Z","0.58.2001":"2022-03-25T01:07:56.419Z","0.58.2002":"2022-03-28T18:57:31.392Z","0.56.10":"2022-03-28T22:06:19.503Z","0.56.11":"2022-03-29T00:23:38.090Z","0.58.3000-61081":"2022-04-12T01:55:39.043Z","0.59.2000-61729":"2022-04-14T20:39:49.457Z","0.59.1000-61898":"2022-04-15T23:17:23.057Z","0.59.1000":"2022-04-16T07:35:34.558Z","0.59.1001-62246":"2022-04-18T19:10:45.052Z","0.59.2000-63294":"2022-04-22T21:11:26.918Z","0.59.2000":"2022-04-27T21:35:18.167Z","0.59.2001":"2022-05-03T21:38:47.362Z","0.59.3000-66610":"2022-05-13T15:32:19.636Z","0.59.3000-67119":"2022-05-17T17:10:32.218Z","0.59.3000":"2022-05-18T17:45:54.963Z","0.59.1001":"2022-05-19T20:43:26.851Z","0.59.2002":"2022-05-19T22:47:33.566Z","0.59.2003":"2022-05-25T20:37:15.488Z","0.59.3001":"2022-05-25T20:47:53.544Z","0.59.3002":"2022-05-26T17:30:43.929Z","0.59.3003":"2022-05-27T21:16:39.263Z","0.59.4000-71128":"2022-06-02T18:57:41.750Z","0.59.4000-71130":"2022-06-02T19:10:10.662Z","0.59.4000":"2022-06-04T00:55:38.271Z","1.0.0":"2022-06-08T17:53:46.681Z","0.59.4001":"2022-06-08T17:58:36.067Z","1.0.1":"2022-06-15T23:38:58.725Z","1.1.0-75972":"2022-06-24T01:03:01.613Z","1.1.0-76254":"2022-06-24T20:47:47.674Z","1.1.0":"2022-06-25T03:48:28.581Z","0.59.4002":"2022-06-28T20:53:47.841Z","1.2.0-77818":"2022-07-01T00:05:59.396Z","1.2.0-78837":"2022-07-07T23:57:56.727Z","1.2.0":"2022-07-08T00:53:30.266Z","1.1.1":"2022-07-13T23:10:16.164Z","1.2.1":"2022-07-13T23:13:07.450Z","1.0.2":"2022-07-18T13:45:23.385Z","1.1.2":"2022-07-18T13:46:28.921Z","1.2.2":"2022-07-18T13:47:07.605Z","2.0.0-internal.1.0.0.81589":"2022-07-22T15:09:43.184Z","2.0.0-internal.1.0.0.81601":"2022-07-22T15:53:08.722Z","2.0.0-internal.1.0.0.82159":"2022-07-26T14:39:17.695Z","2.0.0-internal.1.0.0.82628":"2022-07-28T16:49:24.871Z","2.0.0-internal.1.0.0.82693":"2022-07-28T19:49:57.613Z","2.0.0-internal.1.0.0.83139":"2022-08-01T21:30:25.286Z","1.2.3-83900":"2022-08-04T20:01:26.704Z","2.0.0-internal.1.0.0.84253":"2022-08-08T19:30:02.599Z","2.0.0-internal.1.0.0":"2022-08-09T01:18:19.550Z","1.2.3-84921":"2022-08-11T21:30:29.082Z","1.2.3":"2022-08-11T22:41:07.781Z","1.2.4":"2022-08-25T01:55:30.870Z","1.2.5":"2022-08-31T23:47:07.792Z","2.0.0-internal.1.1.0":"2022-09-02T20:05:08.410Z","2.0.0-internal.1.1.1":"2022-09-09T21:40:19.091Z","2.0.0-internal.1.2.0.93071":"2022-09-14T20:50:27.697Z","1.2.6-93452":"2022-09-15T20:53:42.516Z","0.59.2004":"2022-09-15T22:23:20.403Z","2.0.0-internal.1.1.2":"2022-09-16T00:15:39.795Z","2.0.0-internal.1.0.1":"2022-09-22T23:35:31.053Z","1.2.6":"2022-09-23T18:01:18.937Z","2.0.0-internal.1.1.3":"2022-09-23T21:52:11.029Z","2.0.0-internal.1.2.0":"2022-09-26T20:13:30.798Z","1.2.7":"2022-09-27T23:39:11.294Z","0.59.4003":"2022-09-28T00:16:52.163Z","2.0.0-internal.1.1.4":"2022-09-28T00:28:19.583Z","2.0.0-dev.1.3.0.96595":"2022-09-30T20:03:07.375Z","2.0.0-internal.1.2.1":"2022-10-03T23:49:24.501Z","1.3.0-97515":"2022-10-04T23:11:22.512Z","2.0.0-internal.1.2.2":"2022-10-05T00:59:56.044Z","2.0.0-internal.1.4.0":"2022-10-06T23:14:55.059Z","2.0.0-internal.1.4.1":"2022-10-10T21:14:34.254Z","2.0.0-internal.1.4.2":"2022-10-13T00:01:33.145Z","1.3.0-100520":"2022-10-14T18:32:26.721Z","2.0.0-internal.2.0.0":"2022-10-18T02:53:43.761Z","2.0.0-internal.1.4.3":"2022-10-18T22:40:22.821Z","1.3.0":"2022-10-19T16:05:03.947Z","2.0.0-internal.1.4.4":"2022-10-20T06:43:02.419Z","2.0.0-internal.2.0.1":"2022-10-20T19:16:51.682Z","2.0.0-dev.1.4.5.105745":"2022-11-02T19:49:18.897Z","2.0.0-internal.1.4.5":"2022-11-03T19:24:25.564Z","2.0.0-dev.1.4.6.106135":"2022-11-03T21:56:10.152Z","2.0.0-internal.1.4.6":"2022-11-03T22:39:40.009Z","1.4.0-106438":"2022-11-04T22:01:46.221Z","2.0.0-internal.2.0.2":"2022-11-04T22:59:44.620Z","2.0.0-internal.2.0.3":"2022-11-10T18:48:55.193Z","1.4.0-108057":"2022-11-11T04:34:40.226Z","1.3.1":"2022-11-11T20:35:05.226Z","2.0.0-internal.2.1.0":"2022-11-14T19:14:08.849Z","2.0.0-internal.1.4.7":"2022-11-21T19:48:52.949Z","2.0.0-internal.2.0.4":"2022-11-21T23:03:49.043Z","2.0.0-internal.2.1.1":"2022-11-21T23:06:19.691Z","2.0.0-dev.2.2.0.111723":"2022-11-28T15:30:37.053Z","1.4.0-111997":"2022-11-29T15:11:39.377Z","2.0.0-internal.1.4.8":"2022-12-02T00:30:11.835Z","2.0.0-internal.2.1.2":"2022-12-02T00:36:13.416Z","1.3.2-112998":"2022-12-02T01:06:28.978Z","2.0.0-internal.2.2.0":"2022-12-09T19:44:10.831Z","2.0.0-dev.2.3.0.115467":"2022-12-13T23:16:03.135Z","1.4.0-115997":"2022-12-15T18:29:59.409Z","2.0.0-internal.2.2.1":"2023-01-07T01:22:18.743Z","1.3.3":"2023-01-12T19:19:10.249Z","1.4.0-121020":"2023-01-18T01:41:45.336Z","2.0.0-internal.2.3.0":"2023-01-18T01:42:11.454Z","1.3.4":"2023-01-18T19:20:30.049Z","1.3.5-121405":"2023-01-19T00:13:39.749Z","2.0.0-internal.1.4.9":"2023-01-19T00:19:45.790Z","2.0.0-internal.2.3.1":"2023-01-20T20:25:38.968Z","2.0.0-internal.2.4.0":"2023-01-25T22:20:20.493Z","2.0.0-internal.3.0.0":"2023-01-28T02:05:46.199Z","2.0.0-dev.3.1.0.125672":"2023-01-31T16:30:53.099Z","2.0.0-internal.3.0.1":"2023-02-04T00:00:36.378Z","2.0.0-internal.3.1.0":"2023-02-10T07:07:55.033Z","1.2.8":"2023-02-10T18:39:43.710Z","1.3.5":"2023-02-10T18:45:31.449Z","2.0.0-internal.3.0.2":"2023-02-14T17:48:06.854Z","2.0.0-internal.2.4.1":"2023-02-23T23:18:23.718Z","2.0.0-internal.3.2.0":"2023-02-24T02:58:13.222Z","2.0.0-internal.3.2.1":"2023-02-27T22:00:50.907Z","2.0.0-internal.3.0.3":"2023-02-27T23:55:10.288Z","2.0.0-internal.3.2.2":"2023-03-01T00:04:29.323Z","1.3.6":"2023-03-08T20:40:47.443Z","2.0.0-internal.3.0.4":"2023-03-10T01:00:29.940Z","2.0.0-internal.3.3.0":"2023-03-10T20:31:14.138Z","2.0.0-internal.2.4.2":"2023-03-10T23:04:40.365Z","2.0.0-internal.2.4.3":"2023-03-16T20:08:08.148Z","2.0.0-internal.3.3.1":"2023-03-16T23:38:32.356Z","2.0.0-internal.3.3.2":"2023-03-21T01:03:07.921Z","2.0.0-internal.3.4.0":"2023-03-22T22:08:59.776Z","2.0.0-internal.3.4.1":"2023-03-24T21:53:16.999Z","2.0.0-internal.4.0.0":"2023-03-24T22:24:34.584Z","2.0.0-internal.3.0.5":"2023-03-24T23:47:51.476Z","2.0.0-internal.3.2.3":"2023-03-27T18:53:24.591Z","2.0.0-internal.3.3.3":"2023-03-27T19:07:41.782Z","2.0.0-internal.3.4.2":"2023-03-27T19:11:17.044Z","2.0.0-internal.4.0.1":"2023-03-27T21:31:11.891Z","2.0.0-internal.3.1.1":"2023-03-29T01:42:31.487Z","2.0.0-internal.4.0.2":"2023-04-01T01:01:07.775Z","2.0.0-internal.3.0.6":"2023-04-01T01:43:25.459Z","2.0.0-internal.3.4.3":"2023-04-01T03:04:01.900Z","2.0.0-internal.3.4.4":"2023-04-04T20:49:14.657Z","2.0.0-internal.4.0.3":"2023-04-04T22:48:28.019Z","2.0.0-dev.4.1.0.148229":"2023-04-06T22:30:49.419Z","2.0.0-internal.4.0.4":"2023-04-07T17:25:04.701Z","2.0.0-internal.4.0.5":"2023-04-07T21:54:18.618Z","2.0.0-internal.4.0.6":"2023-04-21T02:16:28.015Z","2.0.0-internal.4.1.0":"2023-04-22T00:31:15.604Z","2.0.0-dev.4.2.0.153917":"2023-04-25T20:00:37.769Z","2.0.0-internal.4.1.1":"2023-04-27T17:34:51.550Z","2.0.0-internal.4.1.2":"2023-05-01T18:48:34.263Z","2.0.0-internal.3.4.5":"2023-05-04T20:22:59.058Z","2.0.0-internal.4.2.0":"2023-05-05T23:32:10.139Z","2.0.0-dev.4.3.0.157531":"2023-05-08T20:52:00.590Z","2.0.0-dev.4.3.0.158678":"2023-05-10T16:44:20.642Z","2.0.0-dev.4.3.0.159619":"2023-05-11T20:40:39.635Z","2.0.0-internal.4.2.1":"2023-05-11T21:21:43.046Z","2.0.0-internal.4.3.0":"2023-05-18T18:45:42.489Z","2.0.0-dev.4.4.0.161322":"2023-05-18T19:07:19.034Z","2.0.0-dev.4.4.0.161516":"2023-05-19T01:33:03.308Z","2.0.0-dev.4.4.0.161652":"2023-05-19T19:59:54.457Z","2.0.0-dev.4.4.0.161784":"2023-05-20T00:55:15.717Z","2.0.0-dev.4.4.0.162089":"2023-05-23T17:08:29.820Z","2.0.0-dev.4.4.0.162253":"2023-05-24T07:18:04.638Z","2.0.0-dev.4.4.0.162574":"2023-05-25T18:21:37.101Z","2.0.0-internal.4.4.0":"2023-06-05T17:45:36.288Z","2.0.0-internal.5.0.0":"2023-06-06T00:41:47.858Z","2.0.0-internal.4.3.1":"2023-06-13T04:07:46.988Z","2.0.0-internal.4.4.1":"2023-06-14T20:12:01.757Z","2.0.0-internal.5.0.1":"2023-06-14T21:19:00.377Z","2.0.0-dev.5.2.0.169897":"2023-06-21T15:48:17.306Z","2.0.0-internal.5.1.0":"2023-06-21T18:24:01.366Z","2.0.0-internal.5.1.1":"2023-06-29T23:22:14.310Z","2.0.0-internal.5.2.0":"2023-07-05T19:14:10.656Z","2.0.0-internal.5.3.0":"2023-07-15T00:57:02.583Z","2.0.0-internal.4.4.2":"2023-07-21T21:12:18.916Z","2.0.0-internal.5.3.1":"2023-07-24T18:41:22.302Z","2.0.0-dev.5.3.2.178189":"2023-07-25T18:36:33.394Z","2.0.0-internal.4.4.3":"2023-07-27T19:37:15.095Z","2.0.0-internal.5.3.2":"2023-07-27T21:08:37.127Z","2.0.0-internal.4.4.4":"2023-08-03T21:30:20.452Z","2.0.0-internal.5.4.0":"2023-08-03T21:32:58.777Z","2.0.0-internal.6.0.0":"2023-08-03T22:31:01.428Z","2.0.0-internal.5.3.4":"2023-08-07T20:26:00.776Z","2.0.0-internal.6.1.0":"2023-08-15T23:05:05.900Z","2.0.0-internal.6.1.1":"2023-08-17T23:54:20.103Z","2.0.0-internal.5.4.2":"2023-08-20T15:52:52.501Z","2.0.0-internal.6.0.1":"2023-08-20T21:24:21.774Z","2.0.0-internal.6.2.0":"2023-08-29T18:26:55.064Z","1.3.7":"2023-08-31T17:45:38.687Z","2.0.0-internal.6.3.0":"2023-09-06T22:38:46.110Z","2.0.0-internal.6.3.1":"2023-09-07T20:00:13.899Z","2.0.0-internal.6.0.2":"2023-09-08T01:00:32.294Z","2.0.0-internal.6.3.2":"2023-09-08T22:48:17.600Z","2.0.0-internal.6.1.2":"2023-09-11T17:22:22.204Z","2.0.0-internal.6.0.3":"2023-09-11T17:24:25.714Z","2.0.0-internal.6.2.1":"2023-09-11T17:27:01.711Z","2.0.0-internal.4.3.2":"2023-09-11T20:57:57.867Z","2.0.0-dev.6.4.0.191258":"2023-09-19T03:52:21.506Z","2.0.0-dev.6.4.0.191457":"2023-09-19T23:20:40.758Z","2.0.0-dev.6.4.0.191515":"2023-09-20T00:33:56.281Z","2.0.0-dev.6.4.0.192049":"2023-09-20T23:35:39.092Z","2.0.0-internal.6.3.3":"2023-09-21T21:54:39.046Z","2.0.0-internal.6.4.0":"2023-09-28T01:06:29.480Z","2.0.0-internal.7.0.0":"2023-09-28T17:44:17.678Z","2.0.0-internal.6.0.4":"2023-10-03T00:28:50.835Z","2.0.0-internal.6.1.3":"2023-10-03T01:40:25.474Z","2.0.0-internal.6.3.4":"2023-10-03T02:41:27.182Z","2.0.0-internal.6.2.2":"2023-10-03T05:14:47.054Z","2.0.0-internal.7.1.0":"2023-10-13T22:37:14.928Z","2.0.0-dev.7.2.0.203917":"2023-10-23T22:30:32.237Z","2.0.0-dev.7.2.0.204906":"2023-10-25T17:24:51.199Z","2.0.0-dev.7.2.0.205722":"2023-10-26T23:16:42.316Z","2.0.0-internal.7.2.0":"2023-10-27T01:21:01.368Z","2.0.0-internal.7.2.1":"2023-10-28T00:29:18.817Z","2.0.0-internal.7.0.1":"2023-10-28T00:34:13.384Z","2.0.0-internal.7.1.1":"2023-10-28T00:34:37.944Z","2.0.0-dev.7.3.0.206769":"2023-10-31T01:03:38.897Z","2.0.0-dev.7.3.0.207781":"2023-11-02T00:15:24.093Z","2.0.0-dev.7.3.0.207992":"2023-11-02T19:40:10.266Z","2.0.0-dev.7.3.0.209023":"2023-11-07T21:57:52.909Z","2.0.0-internal.7.2.2":"2023-11-07T22:07:47.159Z","2.0.0-internal.7.1.2":"2023-11-07T22:12:41.909Z","2.0.0-internal.7.0.2":"2023-11-07T22:13:21.883Z","2.0.0-dev.7.3.0.209174":"2023-11-08T00:01:03.456Z","2.0.0-dev.7.3.0.209831":"2023-11-10T01:42:49.021Z","2.0.0-dev.7.3.0.210328":"2023-11-11T02:27:30.153Z","2.0.0-internal.7.0.3":"2023-11-15T21:42:32.726Z","2.0.0-dev.7.3.0.211848":"2023-11-16T22:28:16.925Z","2.0.0-dev.7.3.0.212138":"2023-11-17T20:41:20.460Z","2.0.0-internal.7.3.0":"2023-11-17T21:22:24.498Z","2.0.0-dev.7.4.0.214930":"2023-11-28T23:41:24.996Z","2.0.0-dev.7.4.0.215366":"2023-11-29T23:08:37.637Z","2.0.0-dev.7.4.0.215747":"2023-11-30T17:33:33.984Z","2.0.0-dev.7.4.0.215930":"2023-11-30T20:44:01.373Z","2.0.0-dev.7.4.0.216897":"2023-12-01T21:47:03.166Z","2.0.0-dev.7.4.0.217212":"2023-12-02T18:11:47.442Z","2.0.0-dev.7.4.0.217884":"2023-12-05T19:56:29.211Z","2.0.0-dev.7.4.0.221926":"2023-12-13T00:49:24.300Z","2.0.0-internal.7.4.0":"2023-12-13T18:04:05.846Z","2.0.0-internal.8.0.0":"2023-12-14T03:27:36.645Z","2.0.0-dev-rc.1.0.0.224419":"2023-12-19T17:17:06.210Z","2.0.0-dev-rc.1.0.0.225277":"2023-12-20T23:47:40.839Z","2.0.0-internal.8.0.1":"2024-01-05T17:58:52.124Z","2.0.0-dev-rc.1.0.0.228517":"2024-01-06T02:37:43.890Z","2.0.0-rc.1.0.0":"2024-01-08T16:33:03.807Z","2.0.0-rc.1.0.1":"2024-01-09T03:32:55.385Z","2.0.0-internal.8.0.2":"2024-01-10T22:32:30.017Z","2.0.0-internal.7.4.1":"2024-01-10T23:51:23.774Z","2.0.0-internal.7.4.2":"2024-01-16T20:01:08.169Z","2.0.0-internal.8.0.3":"2024-01-16T20:06:40.526Z","2.0.0-internal.7.4.3":"2024-01-18T23:05:47.103Z","2.0.0-internal.8.0.4":"2024-01-18T23:17:45.108Z","2.0.0-dev-rc.1.0.0.232845":"2024-01-31T01:42:29.077Z","2.0.0-internal.7.4.4":"2024-02-06T19:03:52.036Z","2.0.0-internal.7.4.5":"2024-02-07T22:13:07.573Z","2.0.0-internal.7.4.6":"2024-02-08T00:58:47.392Z","2.0.0-internal.8.0.5":"2024-02-08T19:33:09.586Z","2.0.0-rc.1.0.2":"2024-02-08T23:42:11.539Z","2.0.0-rc.1.0.3":"2024-02-12T23:57:36.520Z","2.0.0-internal.8.0.6":"2024-02-13T00:15:28.762Z","2.0.0-internal.7.4.7":"2024-02-13T00:22:58.229Z","2.0.0-internal.8.0.7":"2024-02-28T19:02:20.246Z","2.0.0-rc.1.0.4":"2024-02-28T21:18:11.346Z","2.0.0-internal.8.0.8":"2024-03-20T00:25:53.952Z","2.0.0-rc.1.0.5":"2024-03-22T01:17:01.452Z","2.0.0-rc.1.0.6":"2024-03-22T22:52:03.959Z","2.0.0-rc.1.0.7":"2024-04-02T20:48:09.239Z","2.0.0-rc.1.0.8":"2024-04-04T22:13:46.370Z","1.4.0":"2024-04-09T21:11:59.733Z","2.0.0-rc.1.0.9":"2024-04-24T00:21:19.205Z"},"bugs":{"url":"https://github.com/microsoft/FluidFramework/issues"},"author":{"name":"Microsoft and contributors"},"license":"MIT","homepage":"https://fluidframework.com","repository":{"url":"git+https://github.com/microsoft/FluidFramework.git","type":"git","directory":"packages/framework/dds-interceptions"},"description":"Distributed Data Structures that support an interception callback","maintainers":[{"email":"ffsa@microsoft.com","name":"ms-fluid-bot"},{"email":"microsoft-oss-publishing@microsoft.com","name":"microsoft-oss-releases"},{"email":"npmjs@microsoft.com","name":"microsoft1es"}],"readme":"","readmeFilename":""}