{"_id":"use-models-for-data","_rev":"27-ac72898e574d479ae995a7addab2af91","name":"use-models-for-data","dist-tags":{"latest":"0.0.27"},"versions":{"0.0.2":{"name":"use-models-for-data","version":"0.0.2","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.2","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"b57e69e86a8137d8239b3579a88bfd3ca275cb85","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.2.tgz","fileCount":35,"integrity":"sha512-OVeZlYYh2BnmRQ2sQG4Z6FPGHyUEdJvnFxfBGOxuXXxrUuR+tLrLMNIE5Ckx7MfSuwDC8cHGvqYXKpOw57QEdQ==","signatures":[{"sig":"MEYCIQCk3dYMLAJXLZw4nr1DEK/Er8V2YY8DbzV/lGjCxnn54gIhAPtj79leFIDPGo8tW6WAWR626RGzb2F7GwiXVjBiDuuC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":111808},"main":"index.js","type":"module","gitHead":"619a70d8af3a9020e1e5971874e2b306f96d39ab","scripts":{"test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","test:jest":"cross-env NODE_OPTIONS=--experimental-vm-modules jest --verbose=false","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:models:unstored":"npm run test:jest -- test/models/model.unstored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"7.20.3","description":"Work with your data through well-defined, always-consistent models, instead of rando plain JS objects","directories":{},"_nodeVersion":"16.7.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdom":"^17.0.0","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.2_1633300318862_0.26692643554089557","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"use-models-for-data","version":"0.0.3","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.3","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"bb23eca8f96c13e302d0184f6976985657d24ac4","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.3.tgz","fileCount":48,"integrity":"sha512-fxrpNQ70VEwk/geniVFbEmEhQaxWmcrvebX0yILcvCqBDx6AbExSE9zz60g/DcvoFPdMFCGzD1EqFJ4kWzkXkA==","signatures":[{"sig":"MEYCIQDzMmZ9M8XYc4TcprKQNtp2XMu7fF157yKmR9ayEQm9PAIhAOO2xMO7+7SsVsGFOtfc77+0dVPa+cV/O+qSpQk9+0+L","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":264334},"main":"index.js","type":"module","gitHead":"c7754d42dc12099172b21553bb341fda77acf0aa","scripts":{"test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","test:jest":"cross-env NODE_OPTIONS=--experimental-vm-modules jest --verbose=false","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"7.20.3","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"16.7.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","jsdoc-to-markdown":"^7.0.1"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.3_1633991483394_0.6970602364317655","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"use-models-for-data","version":"0.0.4","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.4","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"bed24ae8afd502184319bde489d8de8ea6b11d4d","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.4.tgz","fileCount":100,"integrity":"sha512-en+2JfSRBFifNOuAikenU74XTaVAU+M74w/rQpBnyjkDi2NItAPoiTnxSDznimZwDO0rAwxPmmYJtUb8egtMFg==","signatures":[{"sig":"MEQCIC8cBuNDJh7RnOchc0GLn41iHuoTmQlzobLbe7gd/CZpAiAnqbEKzAjeKSNM4PM9Zo+qIVZnzsuQMAr4Chla6Wgslg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1950956},"main":"index.js","type":"module","gitHead":"30081d5c7bbcde6c202c8f330d7e86afc259aa33","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=--experimental-vm-modules jest --verbose=false","docs:build":"jsdoc -R ./docs/api.md -r lib -d ./docs/API -t ./node_modules/docdash","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"7.20.3","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"16.7.0","dependencies":{"docdash":"^1.2.0","open-cli":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.4_1634922362847_0.13564913308671622","host":"s3://npm-registry-packages"}},"0.0.5":{"name":"use-models-for-data","version":"0.0.5","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.5","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"bb9f9e675b3de1ebf01c5520f1dc74b3ed17f6bb","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.5.tgz","fileCount":147,"integrity":"sha512-/30Yn099iuo1inZuuY66zG1YWuSaGEfZ7n09alDK/ohvD7Dn2QfhgrtUQJQES/hrAmtC9nOuLY/+mEQKt+M3pQ==","signatures":[{"sig":"MEUCIQDDwZXRNPPDAsnvaEOzbHLp7iVLVfnyDJvEwClJK0OB/gIgAmb6BrNDoMwXPB9e8JQRITlFvUAG2S5Rabo0LW36L8w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":3290238},"main":"index.js","type":"module","gitHead":"e3e19c3c19133423a6bca976fc0e7f8af084c1cd","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.5_1636655570142_0.44457362352847585","host":"s3://npm-registry-packages"}},"0.0.6":{"name":"use-models-for-data","version":"0.0.6","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.6","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"ac20ffc1362b19949e527d12756e0959da4724f5","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.6.tgz","fileCount":147,"integrity":"sha512-9IQjYIyySxbTwRtCKqCbM95oZMq4STTYzgMKrtoCsl9o6z64o2sL79xl7SHK3WP2YwGuCdcvwBUnWlraEdOSRg==","signatures":[{"sig":"MEYCIQCbGvQItU07slNUe92ErzCOaVFCC7C0ul9RKn4zixlD+QIhALyeMlTFgNhcUvoyAH9Q/Mn2/a9wCcmPPxvHvUqD7gnI","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":3290260},"main":"index.js","type":"module","gitHead":"4a3cb666ca20278c741b64af6abca9dc6f8e7433","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.6_1636656486067_0.7401966065324004","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"use-models-for-data","version":"0.0.7","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.7","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"8c5b0efa92c04cfcbc1ff1e7e164bce3f026f439","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.7.tgz","fileCount":33,"integrity":"sha512-34KC113xVDGAmzBrI4MQ9+sUpyI4V6kaSdAxMJMZwIuNtGjYaq9sRFtT6G9aHQ2FhScsFe9INJXbo04ASNNRwA==","signatures":[{"sig":"MEUCIEmCDj27U8MwxQxprXjGHQRMHRfF3q+PhfaOcAWw+YKjAiEA5vRO6YkD0iIheqz9quQgIaX9QsHGaknlYqoeGLX5YJQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159899},"main":"index.js","type":"module","gitHead":"958b618ef0f47a3dd275df5560a07d99014048d1","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.7_1636656602633_0.0793880305110144","host":"s3://npm-registry-packages"}},"0.0.8":{"name":"use-models-for-data","version":"0.0.8","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.8","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"2577cdd793e6a1d1611ccf22ccde53bd23b4af94","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.8.tgz","fileCount":33,"integrity":"sha512-IhEVzIhs7wLATqEpvjg3KG5k13lhRxRiQMMsWwvWlVsPXf87p7tpZcM71a3G+rs+FITBMx08K36eO5oi1W7xww==","signatures":[{"sig":"MEUCIBTsRFufQp3CAIvpcAOmXhhHXGE1vVlA33K98/oslGp2AiEA11ZYahnrZ83t21/FUAm72aDxnjV22u12Y+oRFn795hI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160149},"main":"index.js","type":"module","gitHead":"ff75f388d678e0d651063a5a13096d8628bfafe2","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.8_1636658890944_0.35851873236108656","host":"s3://npm-registry-packages"}},"0.0.9":{"name":"use-models-for-data","version":"0.0.9","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.9","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"a3230004cb8b16e55057ce7584fea7544e27c77e","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.9.tgz","fileCount":33,"integrity":"sha512-bNU2zNqyARtQhMT/3mO7p9feH1HDdwFYKEMVH3TZ14dN5XYlkuyndagkvv2dgZ+gJ/6Hu2UKZ/Wo6d7ORAdLeg==","signatures":[{"sig":"MEUCIGeubmVOKJ4g9PYSGBdFb2n2wm7vrpm7hQO9AHVatdGoAiEA9HkqhEnbkzt5HmfwjdH+MLFG4MuqizpG9E76JP+6DBg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159389},"main":"index.js","type":"module","gitHead":"05660d690f59c37b63ccf1dee929c4af146a042f","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.9_1636664585879_0.37045606725759694","host":"s3://npm-registry-packages"}},"0.0.10":{"name":"use-models-for-data","version":"0.0.10","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.10","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"140cc52cd394878c1c61bed6255b90426837492f","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.10.tgz","fileCount":33,"integrity":"sha512-nORLHXkv58vT5Dzno+iDN8LYj64BoS974i5+k2Z6GoT2EOn1gq8sJPI/vxjh1WJLUFX6Ei4GFwtqsHhkfhgRDA==","signatures":[{"sig":"MEQCIE82H06VB5ubk/lswCGBlbpuAUMAp7WgJ/putJaW045hAiAOnRXIq566yDto45E4XhhNh5Y5VIl0anZjwD7tv7Es2A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159180},"main":"index.js","type":"module","gitHead":"0de5aeafccaf797c70fddee56dc106a6d22488ed","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.10_1636747696199_0.18022795806937197","host":"s3://npm-registry-packages"}},"0.0.11":{"name":"use-models-for-data","version":"0.0.11","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.11","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"cbdc0ad5053a8d272503f5f3e13a0f862da8f2bb","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.11.tgz","fileCount":34,"integrity":"sha512-ztx65DJeXiPFSz9pyR0ZEyYVAu3Zo6CyVu17UtcG91ahcrWA2hEPBdt6yabpzo8Ph8gxi1VzuSZ1ZWtKfWJ9UQ==","signatures":[{"sig":"MEQCID+kcSo4FTZdTWPdhYOEqz0aOFQ2c6X3pSodPmltbpumAiAzuHQdbXmAJv7TJn2S49igwBkewlbQEf+UgbCRpvkaEw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160195},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"d0c73a4a96e3aaac241d76a8e05affd26e44c152","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.11_1636749158982_0.668596998215331","host":"s3://npm-registry-packages"}},"0.0.12":{"name":"use-models-for-data","version":"0.0.12","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.12","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"75f59e7c664db7486508670d08d5a77abf1058c1","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.12.tgz","fileCount":34,"integrity":"sha512-/R0Lz55kGZcWh5GKk9H1Z1TgIHvSE59JXGEqa61sGZFOCyxlfpjcN5m455r5D3rwHkzQUfZD0DOxPqBJXaSF5g==","signatures":[{"sig":"MEUCIDwjWUE5AEckXo9DEguAyV4gcgQWADj3GpcRUf14+vR+AiEAjE/y212pRExW+AV7qE6y4dUtlLNHvwnfMK/RzwfV55w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160195},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"98da5a1b3ecfc330bb64b14abb7a46d7a77b9c02","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.12_1636749956580_0.6337203043015545","host":"s3://npm-registry-packages"}},"0.0.13":{"name":"use-models-for-data","version":"0.0.13","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.13","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"ec95ceebc841a1291c8ec820521b7d0e12b37bd7","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.13.tgz","fileCount":34,"integrity":"sha512-CUb1hGgRm3Lmzzvsmb3qrbGiTlz35LoqzfTGO+Bj6PGOMVxuOSojRkMrRdbA+Z0Hxi6RZ3kg8P89nSB07TKGIQ==","signatures":[{"sig":"MEUCIQCl3G1Srg+Xzu/ijmQWLu4lCUpgqUw4kQLFdzMjSIHI/AIgNk47mKQDHAGVxdOZqqcvMYRkYB9staacheZ9aHeivE4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":160239},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"c4d300bd07eb05e3cc8698ead4abb29a53410fb3","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.13_1636776788231_0.7220304157026678","host":"s3://npm-registry-packages"}},"0.0.14":{"name":"use-models-for-data","version":"0.0.14","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.14","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"f19c015f46e5b5938039d434e2b75c7f90149a81","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.14.tgz","fileCount":34,"integrity":"sha512-IfuBuZrfV9cIH66e0VVdRDFr0jRDGCoda/4hvy1YvnktmtGCj9g1dpNhml9ZxSn8gxUnFThaWy5vhWx37xJgZw==","signatures":[{"sig":"MEYCIQDNdAFS14p1XLhmboamWLw+mdGxfarSL0V3fN/W/fJDjAIhAO2Q/GcPkWCcTelEAcsGyN0gVmeps4zHVnZrMUa07bBR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":163827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxNnYCRA9TVsSAnZWagAANw0P/iquZHalY8v3NUtwE/rK\nJ0Dc5bjsgL31/dub3cYWeUuAeYeksj1wlvsWM5W5s12AZGXA/Ij4JV3M5yLN\n3ND1nVJDxEOQ4bA46WjigwVKh5pbol/NsLLgr3Upztr5nCvZv+fdg2YND5df\ngXhsc3P24e/Dgx+hHrXfgj796DGxNiKpK2ihafhtL/sOGffQmLgafok7i0/k\nKb3MoTsE9P/YQmXmv+/bRztrpJ5RIHIHGhNAj307TTg+tUf0VdqW+9pfim63\nutyan83WLGUnvrdj/pLzCBKV0EcOs0OE/jIKvbf7QsrsOKfMZ4Vzs2UABW+o\nIZPXFRtAmLkSL9SiTDnGfRn23Kypy0lbnt09qEZHZukwhLfxKm0hwgCYsny3\n+XM3ar7F5nPgkCbcmOFSECXA43yqF3A9MiBgonJ5996YJU/NYtT0tbqNcoHN\nLqbI9cvWz8Ms6iEs7i67G7zhOeG+UqpNjh+29Jz+JxLf3HZY5TqISVLgAAze\nU1uD2n1AzldL8EYSxISC9N3uTVPXqi+jf0Gf70M5LvuXcoI//CAyiVZSS/H2\noqlcJSbE8uq7BaeD4v0YnTWt2/Am04xyRWyPka+wSyXXzQJHnLwANW1R6Yr3\nvXplYBnLkps3OIx5y47OettYCnHq5diW+Vl2AS+2r8BEIFxL+jd7TqqZOW1j\neL0o\r\n=WRwp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"aa651f1422b4bfcec3a4d412453870b2285a4630","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.14_1640290775903_0.771279096403428","host":"s3://npm-registry-packages"}},"0.0.15":{"name":"use-models-for-data","version":"0.0.15","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.15","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"63632a393fd96d8bff66bb5f6c62f67dc95b4a11","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.15.tgz","fileCount":34,"integrity":"sha512-B/DaX7XmKGS4o6bZYYrpa0LTZXDztyDj3w60OYpL99QgtIYtbRT62/vV0Bv1Vw23Ut8hOK5lTRgbXX8wTN0sQQ==","signatures":[{"sig":"MEUCIDSId7AKeErIDeOOH9B/hwpi7U1QHD4QowkV/74F6t6+AiEA65BUz+y1ZPfZFpH7ZyonOx5kjVLNSQPizYS6s1GaLfk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":163922,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxOcmCRA9TVsSAnZWagAAdCsP/3nk7Ez7Gbc0kLPfS6mt\nEHUQslYyMuIFQS2YdD0n1AuLM0G2RLNTROBYCVPgmvk9mpxO0FSXpz7TtQWQ\nZBSk2kZeB9KAw0wuykoXFu/XkTJpcw1lcFh+yDSfNHd/ualSGFuqSDBqosJ5\nDbQ0066m5KUtr+1wqp1ouSEMnTwumzIdTiwHe9pItdEh+KcvIY8jJqdiupP4\nQif6yPcW5kH5SxF2WkTZ/isQ3UmxAYnsZ2gUfqzZMmmuH2zYJ4KaeW+TlaJe\n6lHyX0ajHVSMvcL8mC03U0hJGv70tWS/6I24apvtGV1jQPhHIQSGuXzDGp+A\nXZgN4MBxGRbpBP67Fv3L+001IopUjtRWrM89eUDm8f774xeZnnvYD0NH8gZ/\neUCeFzpYjDVpUbQfuuvt05F63SWUmNlJsst4YGEvY2z6E9/YMJcsIS+O346h\nFwhfWfpO8WFCHceG+o32zImOmtHI5ROj2THK+CiaRWcNYBKrJcZmf1PlHVvj\niQfnOqKqyb02yWEYmUAcPHRB0GYHVM/E65ElWfasIB0899VpUUcj77gT41FS\nDxjU2GH+6YgGmmKfhAdZMHNl6mEinNLWySN4l9f+tt+TssqZsCdSHJ+a+3B9\nYmflDkZk8UfP1IIsA2pdw0zfKPGP5Ri9hfjkYbkbqX6U0ybkPDpOqWYkPEQS\n/7zK\r\n=vGyE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"ffc7f6cd35b947a6fd92703fdf7116f1b3eedc90","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.15_1640294182751_0.18533459450937118","host":"s3://npm-registry-packages"}},"0.0.16":{"name":"use-models-for-data","version":"0.0.16","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.16","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"0ca29664f71db19269fc68511c69969d5493b081","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.16.tgz","fileCount":34,"integrity":"sha512-4g27rLuGmKhEfzkiDkrRphn/anQ3xqRM77FfWEbfYo1gS3inHKVORGbfBzR+guM/Jm8UeSHu/4x3udqcWgeGEg==","signatures":[{"sig":"MEUCIQD9oWm1zNAvU/4busNZV8LvKGDZeT67Qzvl11gYZNSZlAIgYVSDwY0IJo/xWT0rbG9YtnzDgk8OZtlhi8PSgyQcehw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":164462,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxV+5CRA9TVsSAnZWagAAxusP/ApmjYdO9OxHZ4Im8iHG\npLXF5LuAxf1t71n667mlZmWAvyMcLiaL4Fdv7lW7kqhbXLSTO72xhHDPEy8r\nn8IqEDXMcjXmKOxUHpIn7PNJHQvk1f4JvPIsuhce36hU4RPZdwB10fyx67YQ\nLKF5f8Wp1CgPPgst6Vvq+agF7oc4rcpGyvCSJ21w4ALAHXikLYY8Ir92+3e+\n589A7BlEjBGiwLaucbj0w2lpNWVCdfpDjg4VSSkXbqXDogY3nn5aJcM44J9i\nSFuB8glAZRkT/ZzWhI+JIBOfaKPEppVydTFcIPD+5/qigEe3B7U2cSq9Pr/O\nAQsjjNtA206pQxbgrcbVUvynJskB7+V/56e5mHmHkBG16SZItEjspZgTryQj\n0fzgmI5Io5mpvZd9zaBpcG5D4t5XRM+Jt+HBnSH8wptFnV07E5d5hnT0SEgz\nrx5/9R7whxLzDfyFgW3oH/Cu29o0eu2m2F++9df1BWJEF3Ls8wYmAPJRsCn1\npCiDg5QEzIeBkpg8VyUELWWB60yhANqLVMYSKz6ccjR4sIkwh754WCwaRs60\nFmy4rWvV9URON6VVe1r++IxFtm9CKGq73uYli1IoAC3Q4cJc4/VqPFUuyfjy\neZmY+yjkdw0DMrEiUq3FWiwk5mlEglCnm0V3hwudE08geGHjz9oT61let6lC\n5fRz\r\n=VfGI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"850597d204ea5e0468cf64c6484ce9e5f40aec02","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.16_1640325049442_0.5799103538085264","host":"s3://npm-registry-packages"}},"0.0.17":{"name":"use-models-for-data","version":"0.0.17","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.17","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"1f61d456b675ddf7e9fce4353f9e0d91438ed353","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.17.tgz","fileCount":34,"integrity":"sha512-nZclq2Jt46G5uf6S7RjysfMnJAN+wSQgFb6xOpui0aX2eqKTcm7hLvcMgAq6WDAMpm07YliDpfrnqIvYvL7Avw==","signatures":[{"sig":"MEYCIQDuhn4zoECc4L2VHmtAWgKtJOHzZ4+vYt26QIIo+qcFuwIhAMY/cipBAO0qYnk/DgrluqpYyfpGPUNIfFlzqnx1Y85W","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":165898,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxg5iCRA9TVsSAnZWagAAdiYP/2bJ711VplwITSH8mtCt\nezDDuiyQwIQDNwNz3IGMy2ZaxWvJ9AlYbJqgnqiDGey6FCWR6wsZATAxMAeh\ncK7CS0k8BX7xXFQxZIZQSd0yJnY8IUHAtPKdk+gmN8V6709TVS00J4hrOaAp\nONxoYkF0G06SzOb20YZH0aU4e6LPYRItNKhoBkcZ8iIThLH/VHDZLwUHOc3q\nuMesZ4lp7noPpGDUpawhQqALVC3PRbL0iNCbbK2SEFrwLQNEnEa0jU2ZatFx\nwEiCyAFUSmsVajufaAk+NERYCSLArpfjq2iEgpegADIo6qWGbFB0/pnDAjgJ\n99WdE0JVLGWVo2AB+TVQcF9FxjanN96o1zgvG0vZTIFgzGrvHWSjLk+yahUn\nQAWadJM/OwgKBTvzdvLWgvPudUPOzaLkEaNiqvpuv/homFrwppMKCCgxfjES\niAXRhHxWa/231zMEtdWfcagwazvLBKWW0BVgFKi9JGqDazmCVcsajW6pFNiv\nrvdkSuIL2q62K90XxvoUbC80GsmBCj+qwh5aXq81jdA8OQWwc4IGPztU/gdU\nxyHtdyKf/jlezEszRsHH0gCU6sz1my1ANh6Zff5lSqx7RoqZFPUo6/GOGItG\ned0Y9AqZb8dwxvkk8gvfFzjuIoSK5VGmrNQk7sRMHxOaXnXYAguo3xL0MHrl\nlIud\r\n=prdX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"529152d16f61eace6e3bd7c82d804de9b4aa3bc1","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.17_1640369762273_0.9940816582441192","host":"s3://npm-registry-packages"}},"0.0.18":{"name":"use-models-for-data","version":"0.0.18","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.18","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"dist":{"shasum":"71fbc5c89420a321e6cbaee880640ee1cb0677c8","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.18.tgz","fileCount":34,"integrity":"sha512-ByxHz5ka8scX+Hoyns7hv10tz3sAWn0fR2QGixY0lCOHYXoSFUoXHKYv60pbw1GjmmyBWxAjZXySH/uzbowS0w==","signatures":[{"sig":"MEYCIQDfqcLCCnHc+PraL5+yLxZmZ9Bg/tkGqOsw/IYamGZItAIhAM0aNDnSJwvhCO8fUKHApHwFOODH0RgG0uf6ojszP+9z","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":165976,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxhAkCRA9TVsSAnZWagAAWLgP/0Kd9xJwZyp/wRx3zhDN\n4M2gFJ+V3ou7bR2vxWxyI7OEeSVJOMNGWTaKpIv75d7P+AXfnRTP4xFxcAPI\nyYUJ9NG0NDBMPojYEDqmEeN0JWsIJhezC3q2ehjzQXHoXU1ie3x6wek7oJNb\nIhi1pwAcyAWkCMnIuSe5VLIr4nnlpZpGhIERezV6NooiyVHoCKL7ouGQfOCT\nTRJ16HegAHU3Gw0vsQijIJ1g4G6QFpH4hU2ezE+2XflpJ9brTbO35tpAElgc\n29C1TKplU5zbGu3a+6T13itCmlJFu5XKu30jAf8feuzbvY4aipP6Ua4iJ462\nTktLYRayR68zx/+UzMX6HM948HZ++Zlyi8Dg7ZQvPxmYuCLpHkq5AMp623iD\n5UDP+CJT/GFNvRVCABHkzjicZvxVKFf395p83iC8vTpXqPu/Xo5R8hLZOLaa\nSdEGo8dm5yXP3V5kSz38DwbTF3iM2hEAkMruNU0NZf4kNAk9TKvEcxdFLYIh\nY8Du0bemNyHOHynNmeGqTJRAQMjIhogG63iNuDRpd39LUDu/aWCfZumQMQfy\nYp9Zv116uK3tAFNC204qsBg2fjDey6m9jleOGQJydCHDPy12dGDSFXpxKnw7\nI4KktRLpauqUiXlhfM4TPHI8vHtTVpCBbuNTA9Udo6ngEu3yRH3Qi3agv940\nogzQ\r\n=YZer\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"5198509ed47296eacbc5dccf0c0f53f6157c2875","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.18_1640370212326_0.8213187249874125","host":"s3://npm-registry-packages"}},"0.0.19":{"name":"use-models-for-data","version":"0.0.19","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.19","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"45c504a1f840f97f15ec962b6832708c14a0baab","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.19.tgz","fileCount":34,"integrity":"sha512-g8VgjyC1k0tscleXrRLKNr02VWKXUUNXZ6F1sHR0+Iw7l2JqX/0OwrV/Fo1Z6KXW4Fk4qKL/I8/AvDrp1SREnQ==","signatures":[{"sig":"MEYCIQDdoBiPeg5sYpNGZhNd2EsH/00q1y78I9i0kLJyORx4GAIhAMN2N3VcsWVjyxbiC9GVSYw9oo3t+5IRST+E95L7JiM6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166224,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxhutCRA9TVsSAnZWagAAyIYQAJTslFDMQn5Yg5O0WCtg\n0fTESU8+WJUCE43E0/YXCF2T5tSNbry0n516xES6EaevF/nBtlxrWYUF712A\ngloG4yj5l2OVwQmSRDzmBjBzwxp3yU5CSorvbAVB22fEYTpu77fKJC2aXMu0\n0zCEZXNBhynBR9gkz8QfffzDW5Su72E4/mAFkDvUwk1IvOo7EeRQHlAUet7+\nY/o7dVZItccB4AzU20CtToyU6mN2cXqHtmBREPpan6yNcZHSBJbzHEx3OqGz\ndNVwrqZWot0aYkvdXvz7z239d7U42U8xlDm3FL1MIPGUx2GXucrdxm0T6Txy\nmfxxTJ6tCrvstfp5iSbb3N+85YUMYTqMiUrCYu+M9uF0hegBkZ/bfT8LxPuh\nkDmj/7oobhX/1S2IMNIhZ1kA8o+MjBon7e7paC9JZPFFKMfRDYa2abs/HzFG\nlIQOemnmjWZvw0KOPmf44kFj3WUOzWRBSZhu3u7CSq3sIAsdK5BczD+ayIm3\n494s9oA6aycaPrAHYZDhVHCIK/2FCsg2865gBsAkhPLCWIUbe6p6BsXAtxjO\n1ga/y9elfVYcQwBGSEzRdybzBDSViki5g+GtYSU2jJRgW5N4SRU4bJqwZKD3\nyK9Cr3KjAMMQ4tDACwwf2+60tzwtc/qvS0hsMNEA0uGiDdM4vTgqn87rZS0a\nDJlA\r\n=5Md8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"be55d2bff4f8cda5502f4dd61131a850b3715497","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.19_1640373165209_0.4878181176319969","host":"s3://npm-registry-packages"}},"0.0.20":{"name":"use-models-for-data","version":"0.0.20","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.20","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"e840e4722b7fe71db3a8f6fe8ece59d41782a227","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.20.tgz","fileCount":34,"integrity":"sha512-gldr/97YL8v0J0av2gC0nSaX47q8ntP7vjxGtWcV5SioZRE6p7PqImt/+rGcLSrc57BFy7IZ1TWY8cz5NtCsIw==","signatures":[{"sig":"MEQCIAP7e4ZNhptGmRBcwBKsrwGjGQU1dfKfTQVJUsFY9gx0AiAsOjwOz7/R6vd09dbjrhi5e+9PVXobI9Ln0H5Fgp+UMA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166712,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxhzwCRA9TVsSAnZWagAAH8sQAJj0mWJGVY/0I+OGc5CT\nDWKx6aJV4+E8U8E+wbExFS1f6G/RLDr+yEifrQTy+QLEGgE00LBD4hQHjLRX\nPjgvhr+pjoiJcBOFEp5epoXWMRRXchCYwpBgoFr7TCNWpSv7HHSN7kTWRzFf\nMzos4RNxRQXigX0h00Q4kfVgY+9B6SIh1oW1ZsUBvd528pfTpsaz/lEWs4JF\nJ+p1BKLkc15AhgV/3oGO8Uvakkg13l47B2PrbLDYT07kxu8zHhiCnfKMGLXh\nhvLwaxezkUE3LrHRENsTzEu4EX4Qm7K8u0bTCLi/t0P6Clgmf0iMt7giOEyf\nuL2BjnGsxmdmxujlNs/9YiPmTpt53C/Oxs3tyUKW3dRH2AG9FNMKafMrkqFq\nP3qQn7+8I9pb0wE3k6OFz+lXjhuMkI5Q0Oqbly5AMqvel4XSAbMqMHl8MTh/\ntBEJlwu7wZcFgwUbVEUkBhOLF6pDZM5NNnoNc0CrVkQZHT/2BUQDdoT69guP\n09fMBaMKdrhkgC+t9ZDggTMV+uGrt8sbpKNtF3fcKB3S/OC/uG2C7h7c/uoi\nYFM5WHUx7qREQ3V36cwd7NqbY0ACcjq3N1iSsp7lmg/LTDXlrhnD5Lp6zjld\nJb0L3b6VSOAC3/sL3bksOffU8VTF8vAPWWivNSKct+TjQ/1vuyT1OmVdNRp6\na502\r\n=PqHp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"9c75975c2edfdf6435567260db8ca4a329ed4bb4","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.20_1640373487856_0.015256324212586714","host":"s3://npm-registry-packages"}},"0.0.21":{"name":"use-models-for-data","version":"0.0.21","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.21","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"98ad2c0b1c10cb0acff948ee39fd3d4ceef5b31c","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.21.tgz","fileCount":34,"integrity":"sha512-6T+Vs3Y9pgkbEvZCkyuglIyRnjabRQ75sb08pW2dzMVM641X3cCwvYqKPRihhvBKS7fJSApTkS3OFcJf7OE+Vw==","signatures":[{"sig":"MEUCIQDw/pC7VHTXnq1ihLH3MICqRr2xWpjFrAYk3MMSIuI+lwIgDBByouqB6pKrLweiIdlVZiStL6m9vq6TfUpU95Lu/Ck=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxh2PCRA9TVsSAnZWagAAZnsP/Rw0QTOKojZqEjCqFS/i\nCDgapfNEA+QUAoRlxnudajJkQRVoMJD4iGkMkPvSkcAtJZ0UDFBzuKLG1Vkh\nsFc3BaWY7Xaa8BW5LP87PRa93ujeP2xrlciKXMODLc+19Jd9/0kJyjA00LW8\nbrlV3u66M7xRREEdMCrdfkkB2AtabWbccLa5FGCA2wUFqAtfYJOnZZxF18IN\nUwJeGfoBwKN1z1dvRBPSxH5QcOhM9OGeTDA61UnQqMz+vBZsE/Z6Wf/ioT0A\n11rv/X1mCsgoKE0p/+SfZK8tmBwEMpHU+ios1SETHIoC62hG4zApP8dguq+/\nll71qjA8qAt4JJy5Jx5RvXEiUsyFrtt4+XQUg6EQsuik7rHD3iHrIkZUXjvk\nbImfbOBpVYE6SJRmFTa3tMTAXDQkKJdRqtYFItZt9gVXiorHwpQT4Tq4EArp\nDS8njQ6lR3brq2O/k5THcMbJTdVvbO0RMYh7AWx5u5Oq9oy/GnDuWT8uTp3u\npRHNNNYlH+/hy9mtmSrZtPpA1Sq/pCrGdwriputBDrqRxQwS3tBXU5NuzzCv\nnrNshz89z7swLaWIKzDS7chp87toor24j8ssFdrEU/CXbfNqbtCj3A3z50MI\nGdJSxkIN+jOfxuags1qWXf/zJh6uEDYXxBM9yJyGxhkHUQBtXMUXPqlSr6vJ\nMhpn\r\n=rxgF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"780e38acb4eddebe2c05cebb71a686c9224bfe3e","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.21_1640373647222_0.8760877906906248","host":"s3://npm-registry-packages"}},"0.0.22":{"name":"use-models-for-data","version":"0.0.22","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.22","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"201ef50d5ddaed419fc59d4ec1fda152ac5ea625","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.22.tgz","fileCount":34,"integrity":"sha512-rRPsvV2Q2qhOBq9oxhz4mQqh3KhBYeaHiDfbXjHjA+mJudmVRJjLcdE9wST7jk2w9vg8MqLJFgoSTrWmFgv1Pw==","signatures":[{"sig":"MEQCIGog9QlNulrdjfZcxQls7Jd9dw/24P0bnCuY/enRdp0wAiBPJHClGPA8lNcGiI23D3xVdFxtqeLBz7JgNJRtF4QoeA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxh4QCRA9TVsSAnZWagAA3TAP/0lXBbyHDzyA810OfR4g\nj35UuZrjdfsfqUDfdDUv6JiB+PQWoLpbu4vPN9ixIgAxBOSxHMM2Eq+j/oEE\n8HXLZF0V5mADpFMLqqjXQ576tu1+WEdjUVE4W25qw2VR5sPO5vCFyl2YwpzC\nvrJGY55ud2ITWNpbISLTCUkBa1Kg8hVdFaiRLwz77ctK4LBkbw6rikb024uU\nfFHdb9MaJhEP6N5piJ5hY8T+NcZJ+YhLmUSfLLJUT7dG+YaxjiooxH/tGCUi\ng4WPQiiXT7Vp/Haqe4m6mX2CNF/MlsZdDx2+hmMuvshCznszgVooPOKmiWy/\nBEZ75CbKx237ei/52Ha9kccinSLGwR+eb2WKB1LZpPmlkZ6VK9h0LEJ+AF/w\ncxyhn2we2oujv9md/y8hbCrFpwGCf+kKFhrEqsCKD1Cly/DdACaofnjuSVG2\nvsWxykdt+JbCwmKuqX0xBKgneLet7Zt3PaXf8x9hZnyE2HkH4mDORLSdVdGy\n77FdfRa1Ub5wrDVtQ5lHmQHkcX1qnXB1GapOKJjYuYU0Eb3HLtLHJgL2QdrN\nWfkEx+pSEgTG69ukcKyV3lsCZQj9Dklnwma8Mv9L7WeySKpvBO6wS6BQPODI\nVaGI9t02+J6Gr/WNaPl3bI1gJd8siOhAbIIx7lzlX0CD4yf/oJvr8U+dkrI4\noJcs\r\n=IZbW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"fbf1bb85db6ef35fb54a3028721cca2f0fb39542","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.22_1640373776740_0.3967388891240724","host":"s3://npm-registry-packages"}},"0.0.23":{"name":"use-models-for-data","version":"0.0.23","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.23","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"25d3b82daafa27f0c48d52571f4692a85171b52f","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.23.tgz","fileCount":34,"integrity":"sha512-l/AI5ARuQjJCvyQ/3x92van8npGTvdzhB1Fc1Iy3UtqDO0W/vWuiKdG0y9vzVoeKZ+YQqDdQyCLRJ/RYCE54AA==","signatures":[{"sig":"MEUCIQDoq3cDT+7v6mU8PerfBj7GnfL3i/Z+Wvp5a4cafzc8fwIgfWJ/O5hkACBQ1TOwdK0bi+yIPTvc/pfLcfuEzEqG0QM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxh46CRA9TVsSAnZWagAA50cP/09A99uVX2ZP4GbdgEXJ\nqdXp8BJn/4A410VHFMSYM+Wx05ewYq7L0/emH9A79/KKqUkWbWrZeuU6GiIS\nBd1Sd2F8RIpdeeILgoJWvZK6wVhEi72SBRxi2VZGpR/tCktJZYab4O/4dbXG\nMFWq/ZpmjQa3IcRRlZ4vmTKj+72xJfmJH3Ma0QoylUoy3jwbCn6xqUzk0oRg\ntOu5+mpLDaSkJBBe7xG/GU6OUKzyFUhrea/qPawb7NrY7XATP/3j5/530Gjp\nusIIWvlmhdvcPEsBIUHqeDmDv9pYYoUQEPG5lCSoNjTOZiCh1SH5ZJXtuqcJ\nWmtKOnxtL2Ysc1a1FdyJ6/LaFa6uUfb01tAKiyJt35Yagc2U+4f5XRiDBcMN\ncdv2qn92o9qlbO3j308RpHTe+eEXjrwIqcTLV9pelvtrwX60rDIbHXn+WCX2\nahSS5L8bVlBejUgdSBLMs8iqbpInKbx+WLZqu/Y2CNlalArAEFXjGu/5YYrh\nPEvd+SdV358ctBZRlQKvj5XZii1ypgFIOoGlp8I4ZWdH3PoCAD4PlUTHnvbS\nx5gYnREokoKKDqRVQkZ8VhQBDzbtt+kH4BASOx/4ylG5S6uWBzPy7NMpZbOO\n6T+ELcBQzruSQJ85/CsDlRbnB5pgiCpbAIn4EbZ2+ZA3PoL8nMouoJ5Hhq6U\nNJhp\r\n=Blxr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"5bf4a629ae90edce3c9b86206a006ecf07208c48","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.23_1640373818390_0.12819892298758284","host":"s3://npm-registry-packages"}},"0.0.24":{"name":"use-models-for-data","version":"0.0.24","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.24","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"cece196b40fcc8d093cd6cdbb8ea8104725b2048","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.24.tgz","fileCount":34,"integrity":"sha512-IV73DJY6i+N1g5ZGFC7tkF6taV2wGyBI9F7NH1z0tWOJHiqpggfcr9Q1vIeMXunqKwMEumY/Zru1A48VfHnOXw==","signatures":[{"sig":"MEQCIAxhDjhKe/4wzTbeME95t8BoEUHsxTobxj3BqnuxdFnQAiBIKJwnPpmDKj3Fph8tYm6+6aCsLGggZh6SokCbz3W5Pw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166856,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhxh7TCRA9TVsSAnZWagAANqoP/3iHOzltYdcXNlfg1bnq\nNwgMUH3rHNyJorePNLMXzndgFA5mDFkWKWPeQwjO72UOjLYzZhCcEr7OOg45\nMFhjAx4hU4L5BxT9VQ/9T43jl4ZOKy27ufPq/7hVRsti0Vfdhvd1hJks/6CA\nOtUUp9iHvyYIEKOek1Fc2hy0/f7a0IhjjmNmiBcBskgRh1yzjq8tdK5BXn7q\nJNIRorGzcIGkCSvAC+oVsq47g4GAH1jeAVuiQv/8uvGf/R5ng/8uRrFh/34v\ns7tot3s8veil0U25LwNv++JQGKoh7GNjBgZItKaHDH+hNB4efuyxVNRWNN59\n2Nx8oQjFixNed1AGTEwY99frvN/avS25e7+ZK2TNiigGLAQ4CHUh5Zb5Focy\nzQyyb6ytTxN9HbqaFjZK1n98ORs6ySTpO4h0a2ldne71evRIRNWKZis0we5E\nFuowGKSqtRzSYqoGtMoPoqccPx5CLFwr4grPocnZX2yVFu7p1AKs5OSe71Bv\nCqCURgu/tSC0ghnW3cyUnYVGZGtYv6PUC+lok6HtAcjK4XShPUMIvENhUElI\nUSWfLjjpFwgtqXweFC2iYo2RVrkrtDWDcIQJmgkjRXX/Jsarbb8ID0ZqgoJx\nlKbMEBCw8y13tjeWODH0s75lHJB/PRSrLpWjNHSt+Z/546P/IeTa+QEQ11LE\njZfU\r\n=hw6l\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"f1baf4953de0e326855cae6ef67a6a3602ceb844","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.1.2","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.24_1640373971303_0.1023213650988486","host":"s3://npm-registry-packages"}},"0.0.25":{"name":"use-models-for-data","version":"0.0.25","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.25","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"36d0126b7019223f01ec7b9bbac308833b3cd032","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.25.tgz","fileCount":34,"integrity":"sha512-oZYwAsYyP3UYmWEAMEzBsV+8hNIDq22znfIY/Zx6p5XuaYqHi8fq/rTZ1UNveElLfO87BJ5migWHOjx5I7Bf1Q==","signatures":[{"sig":"MEUCIQCxIpi/0/sm8DGlbqH4XRz6/cV83g2f+Ax/rFhF3tiDnQIgB1k+2hixaj/u3qYTVukyB63a6l0LdiWFuEbT7JgtsKQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166798,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhzKytCRA9TVsSAnZWagAAIwQP/j7HoHnHXfJMCFk/SyPu\n2E4bbdxBtMTKlLtPeMjLz8rRpdyuEP6Kihz8LkPFOeLuPsHiwfKAUtW8WgUF\nWhm7f684MgyMogX5x3+9yW6pXVw3fGVYLUi+cJBEFxxOndjTQlEVJyq5BbsW\nwx90CxGYcfdsgJsNOntmrTnV1qXkvio77a1nKDAxapXc0Z15KeJu5xd6x9PX\nxpnwaIcDQmlSTBaoN77HjQtq8Av2G/e0fTnm5IRq+m5E1SCHS7EbZLnW8LhZ\nof2gmD1I1NbvKw/QF4ROp2t3MiOImIqhSc0KsAfPoSql+S6vbqSbv61CMdfM\n7/4GIVrBAWNJdDuQh6lC0u04+3M6DI9dxTCVrfOzlDpLfDJfM914Vk5r+21N\nPFc+9Tq1GaBzKPMoRexHZ6j1XWsVVEDvxkEP5glCqUt8DZRQ/KwKRxCbwlXo\nR2b0sNw7NE8xnb02G6GAm/LvbNyTJhxowLHuodulQyfJB498mFV25EW/PUGd\nbi2Y6LdHYn5mP2KG3v58fLNLMy9x6p8CaSpXulX+LjOSPH+VfitxHsU2eZF4\nilsPU5xsT5aUWKwsIHKLOPwXHcBT7rCCmu9GcQK1Wk6cYaO4dW9rbwt7mFYb\nMDryBYzSqvyFtODzUfHotfxZmy7rWOh+J68KrbvHD7yNTcT7OBHZMjdCDNmp\n/RWc\r\n=Zr/3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"73e1e27afc3937208872201c9567ffe64ff5a4f8","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migration":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.3.0","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.3.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.25_1640803501385_0.7515055448480663","host":"s3://npm-registry-packages"}},"0.0.26":{"name":"use-models-for-data","version":"0.0.26","keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","_id":"use-models-for-data@0.0.26","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"dist":{"shasum":"e0b5d6b26d856e63dbfc49148bc16ef273608a03","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.26.tgz","fileCount":34,"integrity":"sha512-EXRU8ngz+ArOQr5KBV8cjO9LZ3AuU+op8YQCyM4tOKeTy6VZeXA9lmRaGG+B5ZM+V9mcNW0yUO7dwxPX7MPhMg==","signatures":[{"sig":"MEQCIA7G8fFQbPpIpm/11Io3bFsJQpRzAZ3Unebk0WiVZpFkAiBoahwVctxO4q15K6QgL8FRQ8wyVzFDAPQ2hIO0YKQubQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166814,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhzNBXCRA9TVsSAnZWagAAZ4sP/j250oRv9IMHIdp1xxsA\n1F5eJbA1SdutjDo6Wvq1kxdDHERhSJdJxvf9vom8bd4RDWzsb977H7cPA7pd\ntTyuKo6YCIpJWeaLt+jX6Qrll9z4hFcKf8yKLmcQV8VY4/xYFldJVhwxuJ+b\nFclPK7E3CtY/r5RrNX1q+khjZA1YvXW6ANDP9Y/JdLOc8/oNpxsRJ9bmzcaW\nblww8upV71CE5ZCGHlDbOkWvByBsO3BMrOjqe79yu//ZIAvxm0JzAKJ1+Ssy\n9F4aEpJHSCp36rfc0prf0bkaseJNM3tmL3yGN+5908bOudMlice3KYMZAeEj\nOgAMr0QguR7zufTnMkTtVEYKsoY8esyDlmp5+q9lvoU01l99hyjRjT2Dl9Xg\n/bJ5puMSb+B2uNnBq7D8oNF96lUvwmqdy/ZKHMxzObu93Jy2raV5djpnR+KC\nzBOLomriq+Svx1PzY0/IwD1bx+AHR2eKBlCljqq91NINmur/UYUUKxfuUW3h\nmg9dGlea/zG0/zpXEvpD2gtid7dCfhpoCpNp04b7llAKEp1ezuhRBZq2aqQc\nz7likAXoPmNpXYgByXBiONqMJducNisKweVeybtYTwhD7b8z1CLJ/WQK0Arf\nsXnuhUR3/8fAnfllzpiB1L2vPhhIyRsWrBNAS0e8s7fFtf0DbjJsuoYBU0wm\nUXc0\r\n=gXy/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","type":"module","browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"gitHead":"d2533972d5c525d6059cf4c081f3aca502e104c4","scripts":{"docs":"run-s docs:*","test":"run-s clean test:jest:*","clean":"prettier ./{lib,test}/**/*.js --write","docs:open":"open-cli ./docs/API/index.html","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:models":"run-s test:jest:models:*","test:jest:schema":"run-s test:jest:schema:*","test:jest:migrations":"npm run test:jest -- test/migration/migration.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js"},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"repository":{"url":"git+https://github.com/Pomax/use-models-for-data.git","type":"git"},"_npmVersion":"8.3.0","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","directories":{},"_nodeVersion":"17.3.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","open-cli":"^7.0.1","prettier":"^2.4.1","cross-env":"^7.0.3","npm-run-all":"^4.1.5","use-models-for-data":"file:./"},"_npmOperationalInternal":{"tmp":"tmp/use-models-for-data_0.0.26_1640812631492_0.2712815647266844","host":"s3://npm-registry-packages"}},"0.0.27":{"name":"use-models-for-data","version":"0.0.27","description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","main":"index.js","type":"module","repository":{"type":"git","url":"git+https://github.com/Pomax/use-models-for-data.git"},"homepage":"https://pomax.github.io/use-models-for-data/","bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"browser":{"./lib/models/store/filesystem-store.js":"./lib/models/store/dummy-store.js"},"scripts":{"clean":"prettier ./{lib,test}/**/*.js --write","test":"run-s clean test:jest:*","test:jest":"cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --verbose=false","test:jest:models":"run-s test:jest:models:*","test:jest:models:base":"npm run test:jest -- test/models/model.base.test.js","test:jest:models:stored":"npm run test:jest -- test/models/model.stored.test.js","test:jest:models:plain":"npm run test:jest -- test/models/model.plain.test.js","test:jest:models:bare":"npm run test:jest -- test/models/model.bare.test.js","test:jest:migrations":"npm run test:jest -- test/migration/migration.test.js","test:jest:forms":"npm run test:jest -- test/forms/forms.test.js","test:jest:schema":"run-s test:jest:schema:*","test:jest:schema:conforms":"npm run test:jest -- test/schema/conforms.test.js","docs":"run-s docs:*","docs:build":"jsdoc -R ./docs/README.md -r lib -d ./docs/API -t ./docs/template/docdash -c jsdoc.conf.json","docs:open":"open-cli ./docs/API/index.html"},"keywords":["js","model","schema","diff","equals"],"author":{"name":"Pomax"},"license":"MIT","devDependencies":{"cross-env":"^7.0.3","jest":"^27.2.2","jsdoc":"^3.6.7","jsdom":"^17.0.0","npm-run-all":"^4.1.5","open-cli":"^7.0.1","prettier":"^2.4.1","use-models-for-data":"file:./"},"_id":"use-models-for-data@0.0.27","gitHead":"7b4d63ea79b3114324977c59b3cd682691edc7d8","_nodeVersion":"20.11.1","_npmVersion":"10.2.4","dist":{"integrity":"sha512-UJsa+qxqCUlauNomOwQiNsmFF0YLZR/iUxcFzDhYKCdSynFIOCJ6N6hil4LoJfJyiJbWDjZSG9YkVTxXZ9r5UQ==","shasum":"6e79763377c36e49ba646bc01ee329ba617611d4","tarball":"https://registry.npmjs.org/use-models-for-data/-/use-models-for-data-0.0.27.tgz","fileCount":34,"unpackedSize":166802,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHQdC4YxHbEnJ6/LIAx/iGISjttpM1YoobriupzOvzqjAiEAz9lyCh4GYLINoMXbfFUA5vNnrUZZC0MKjqQdxuZpIZQ="}]},"_npmUser":{"name":"pomax","email":"pomax@nihongoresources.com"},"directories":{},"maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/use-models-for-data_0.0.27_1745772756916_0.05182423212295029"},"_hasShrinkwrap":false}},"time":{"created":"2021-10-03T22:31:58.862Z","modified":"2025-04-27T16:52:37.278Z","0.0.2":"2021-10-03T22:31:59.048Z","0.0.3":"2021-10-11T22:31:23.568Z","0.0.4":"2021-10-22T17:06:03.043Z","0.0.5":"2021-11-11T18:32:50.344Z","0.0.6":"2021-11-11T18:48:06.286Z","0.0.7":"2021-11-11T18:50:02.800Z","0.0.8":"2021-11-11T19:28:11.118Z","0.0.9":"2021-11-11T21:03:06.056Z","0.0.10":"2021-11-12T20:08:16.371Z","0.0.11":"2021-11-12T20:32:39.141Z","0.0.12":"2021-11-12T20:45:56.773Z","0.0.13":"2021-11-13T04:13:08.399Z","0.0.14":"2021-12-23T20:19:36.123Z","0.0.15":"2021-12-23T21:16:22.942Z","0.0.16":"2021-12-24T05:50:49.612Z","0.0.17":"2021-12-24T18:16:02.442Z","0.0.18":"2021-12-24T18:23:32.483Z","0.0.19":"2021-12-24T19:12:45.393Z","0.0.20":"2021-12-24T19:18:08.000Z","0.0.21":"2021-12-24T19:20:47.409Z","0.0.22":"2021-12-24T19:22:56.899Z","0.0.23":"2021-12-24T19:23:38.556Z","0.0.24":"2021-12-24T19:26:11.472Z","0.0.25":"2021-12-29T18:45:01.590Z","0.0.26":"2021-12-29T21:17:11.874Z","0.0.27":"2025-04-27T16:52:37.102Z"},"bugs":{"url":"https://github.com/Pomax/use-models-for-data/issues"},"author":{"name":"Pomax"},"license":"MIT","homepage":"https://pomax.github.io/use-models-for-data/","keywords":["js","model","schema","diff","equals"],"repository":{"type":"git","url":"git+https://github.com/Pomax/use-models-for-data.git"},"description":"Instead of plain JS objects, work with your data through well-defined, always-consistent models, using this one simple trick","maintainers":[{"name":"pomax","email":"pomax@nihongoresources.com"}],"readme":"_Please note that this library is not at v1.0 yet and both the code and docs may be incomplete_\n\n# Use Models For Data (dot JS)\n\n![A chat about using models for data](docs/images/chat.svg)\n\n---\n\nPlain JS objects and JSON are extremely convenient for moving data around, both in codebases and over the wire, but they're not all that great when it comes to data integrity: at some point, that data needs to actually get used, and when that happens it better be valid data. Whether you had a typo in your code, or a malicious users submitted a payload designed to break out of the expected payload-handling code path, you're going to have to run data validation in order to make sure data integrity problems are caught, and handled.\n\nSo: what if you didn't have to write any data validation code because that part gets handled automatically, and you can just focus on writing (and maintaining) code that really matters?\n\nThis library takes care of that for you. It lets you declare data models as normal, modern JS classes, using an almost trivial API for model fields, after which you're done: any time you construct or receive data, you wrap it as a model instance, and if that didn't throw an error you now have a data object that behaves exactly same as its plain JS object counterpart, but with automatic validation on assignment. Anywhere in the object. Any properties you get (both individual values as well as and entire subtrees) are always consistent with your model, and assigning values that would violate your model's schema (again, both individual values as well as entire subtrees) will get rejected, making your life as dev or maintainer a _lot_ easier.\n\n---\n\n![A request for an example](docs/images/example.svg)\n\n---\n\n## The simplest example\n\nSay we have some code that works with data that looks like:\n\n```js\nconst data = {\n    name: \"some string\",\n    age: <some number>\n};\n```\n\nNothing fancy, nothing special, but we do want to make sure that we never work with data that doesn't have a value for `name`, and let's pretend that age legislation actually means anything on the web, and make sure that `data.age` is 13 or over.\n\nThe conventional approach is to use a validator library for that, so that when we \"get\" that data object, we run the validator, and then we handle the exception:\n\n```js\nfunction workWith(data) {\n  try {\n    validate(data, NameAgeSchema);\n    doSomethingWith(data);\n  } catch (err) {\n    rejectNameAge(data, err);\n  }\n}\n```\n\nBut this isn't ideal: real code rarely jumps straight from \"having a data object\" to \"and then we unpack it and it gets garbage-collected\", so if we want to be sure that the data is valid from the get-go, we need to validate at the point where we build that data object, _and_ at the point where we unpack it. But of course, data objects quite often get \"built out further\" as they travel through your code towards where they finally get fully unpacked, and you better have validation calls at every point where you update that object. Now you have a bug surface with 2+N potential points of failure. And that's just for one data object. And new contributors, or external contractors, or a colleague new to your codebase, is almost certainly going to introduce a new point.\n\nUsing \"when I think I need it\" validation means you're always one merge away from bugs. And we've all been bitten by that one merge request that was let through. You know the one. (Good job on firefighting that one btw, that took a lot of effort, kudos to the whole team)\n\nOn the other hand, if we use a model that _forces_ validation while behaving like a plain JS object, that's no longer the case: validation is baked in, and no one (not even you) needs to be trained on when and where to validate. You create model instances (either from scratch or from received/stored data), and your data is now guaranteed valid until it's garbage collected.\n\n### 1. Let's wrap that `{name, age}` data in a model:\n\nFirst, we define a property/value model, using plain JS class syntax, where each property has an explicit type and type properties:\n\n```js\nimport { Model, Fields } from \"use-models-for-data\";\n\nexport class User extends Model {\n    name = Fields.string({ required: true });\n    age = Fields.number({ validate: value => (value > 13) )});\n}\n```\n\nIs that more work than working with a plain object? Absolutely. But at least the syntax is about as low friction as I can make it. You need a string? Say you need a string. Need a number? Say you need a number.\n\nIf fact, we can take things one step further and add some metadata to describe our model:\n\n```js\nimport { Model, Fields } from \"use-models-for-data\";\n\nexport class User extends Model {\n    __meta = {\n        name: \"System Users\",\n        description: \"A user model for our fancy project\",\n    };\n    name = Fields.string({ required: true });\n    age = Fields.number({ validate: value => (value > 13) )});\n}\n```\n\n(Do we _need_ that `__meta` description? Not until we also want to save our models to a data backend. Things will work just fine without it but let's be honest: you were going to write some code comments here anyway, so you may as well make what you were going to write part of your model-queryable metadata)\n\n### 2. Then use that model.\n\nNow instead of accepting, or inventing, a bare `const data = { name: ..., age: ... }` object, we turn that into a model instance:\n\n```js\nimport { User } from \"./my-models.js\";\n\ndata = User.create({\n    name: ...,\n    age: ...\n});\n```\n\nOr, even easier if we already had that `data` object mentioned above:\n\n```js\nimport { User } from \"./my-models.js\";\n\ndata = User.create(data);\n```\n\nand that's all you have to do.\n\nFrom this point on, `data` works exactly the way as `data` did before, acting like a plain (possibly nested) key/value object, but with every value protected by auto-validation.\n\nNow, many libraries will say \"_and that's all you have to do_\" and then immediately follow that up with \"_now whenever you X, just remember to Y_\": but we're doing none of that here. You really are now done, you don't even need to update your code, except for _removing_ the now superfluous code you had in place to explicitly run validation at various points: if you were using `data` as a plain object before, and you code worked, it needs exactly zero additional changes to accommodate the new model format.\n\nWhat to get values out? It's a regular object as far as JS knows, so just do that:\n\n```js\nconst { name } = data;\n```\n\nAssign a new value? Again, just do that.\n\n```js\n// this may throw on an illegal assignment. Like it should.\ndata.name = name;\n```\n\nAssign an entire subtree of values because you defined a deeply nested model? Still again, just do that:\n\n```js\n// this too may throw if any value is an illegal assignment.\ndata.profile = {\n  name: \"new name\",\n  password: \"this is secure, right?\",\n  preferences: {\n    theme: \"light\",\n    iconSet: \"playful\",\n  },\n};\n```\n\nThe most important benefit is that we're no longer ever in a situation where required data is missing (because the model creation will have thrown), nor can we be in a situation where a bad assignment is allowed through (because that throws).\n\nWe can rely on the fact that any line of code that uses a model instance will be using a model instance that is _known_ to be valid data. And if it runs without throwing, we _know_ that on the next line, it's _still_ valid data. If we try to assign any invalid property values (particularly somewhere in a code path that you forgot about, performing a blind assignment form some other data source) then that assignment will immediately throw an error. Meaning that you don't have to hunt down where in your code things _actually_ went wrong, because there is no validation-after-the-fact anymore. If your code, including dependency code you never wrote, does something that would violate data integrity, you get an error _at that exact point in the code_, and the stack trace will tell you exactly where to start fixing the problem.\n\nWhich also means that data validation itself is no longer something that you need tests for: you just need tests to make sure that at critical points in your code paths, `data instanceof ThatModelTheyShouldBe` is true.\n\nSo:\n\n1. your test suite is simpler,\n2. your errors are faster to find and fix,\n3. your code becomes cleaner, and\n4. no one needs to be trained to \"remember to validate\".\n\nEverybody wins.\n\n---\n\n![A request for a more complex example](docs/images/complex_example.svg)\n\n---\n\n## A more complex example\n\nLet's look at a slightly more realistic example, where we have a compound model for working with users in some forum software:\n\n```js\nimport { Model, Fields } from \"use-models-for-data\";\nimport { checkBase64Image } from \"some-web-image-library\";\nimport { daysToCrack } from \"a-good-password-library\";\nimport * as DateTimeLibrary from \"some-date-time-library\";\nimport Themes from \"./lib/themes.js\";\n\n/**\n    Let's model a user such that the model object is equivalent to:\n\n    {\n        isAdmin: bool,\n        profile: {\n            name: required string,\n            password: required string,\n            avatar: base64 image data-uri,\n            posts: number,\n            preferences: {\n                theme: string,\n                timezone: number,\n            }\n        }\n    }\n\n**/\n\nexport class ForumUser extends Model {\n    __meta = {\n        name: `users`,\n        description: `A simple CMS user model.`,\n        recordName: `profile.name`, // this is used for saving/loading model instances\n    };\n\n    isAdmin = Fields.string({\n      default: false, // obviously\n      configurable: false // users won't be able to toggle this through a form. obviously.\n    });\n\n    // In order to make sure property subtrees are properly\n    // managed, all we need to do is define them as models,\n    // too, and then just... point to those:\n    profile = Fields.model(Profile);\n}\n\nclass Profile extends Model {\n    name = Fields.string({ required: true });\n\n    password = Fields.string({\n        required: true,\n        validate: function(value) {\n            return daysToCrack(value) > 1000;\n        }\n    });\n\n    avatar = Fields.string({\n        validate: function(value) {\n          const result = checkBase64Image(value);\n          if (result.error) {\n            // we want to signal with more details than just \"yes/no\" in this case\n            const err = new Error(`Image did not pass validation`);\n            err.details = result;\n            throw err;\n          }\n        }\n    });\n\n    posts = Fields.number({ default: 0, configurable: false });\n\n    preferences =  = Fields.model(Preferences);\n}\n\nclass Preferences extends Model {\n    theme = Fields.string({\n        choices: Themes.getThemeNames(),\n        default: : Themes.defaultThemeName\n    });\n\n    timezone = Fields.number({\n        choices: DateTimeLibrary.getTimezones(),\n    });\n}\n```\n\nNow, let's use this model for our data, and let's say we're using an Express app:\n\n```js\nimport express from \"express\";\nimport {\n    resolveUsernameParam,\n    getUser,\n    checkAuthentication,\n    saveProfileUpdate\n} from \"./my-middleware.js\";\n// with additional express-related imports here\n\nimport { Models } from \"use-models-for-data\";\nimport { ForumUser } from \"./my-models.js\";\n\n/*\n * First, we set the model library to use a filesystem-backed data\n * store relative to our project root, but obviously *not* served by\n * the express server.\n *\n * This is a global binding that applies to all models.\n */\nconst STORE_LOCATION = process.env.STORE_LOCATION ?? `./data-store`;\nModels.useDefaultStore(STORE_LOCATION);\n\n// Then we bootstrap our express app:\nconst PORT = process.env.PORT ?? 80;\nconst app = express();\n// with additional app.use bindings for things like post handling etc.\n\napp.post(`register`,\n    registerNewUser,\n    async function (req, res) => {\n        res.render(`welcome.html`, { user: req.forumUser });\n    }\n);\n\napp.param('username', resolveUsernameParam);\n\napp.get(`profile/:username/`,\n  checkAuthentication,\n  async function(req, res) {\n    const user = req.forumUser;\n    const { authenticated, name } = req.authInfo;\n    const ourProfile = authenticated && name === user.name;\n    res.render(`profile.html`, {\n      user,\n      /*\n        * Models have \"form building\" built-in, because you're going to need\n        * it. They can generate plain HTML, as well as any kind of tree you\n        * need (for generating (P)React component trees, for example).\n        *\n        * And note that we're building a form for a submodel of user: any\n        * model property that is itself a model fully supports everything\n        * that the top model does. It's models all the way down.\n        */\n      editForm: ourProfile ? user.profile.toHTMLForm({\n          action: `/profile/${name}`,\n          method: `UPDATE`,\n      }) : ``,\n    });\n  }\n);\n\napp.update(`profile/:username/`,\n  checkAuthentication,\n  saveProfileUpdate,\n  async function (req, res) {\n    res.render(`profile.html`, { user: req.forumUser, updated: true });\n  }\n);\n\napp.post(`message/`,\n  checkAuthentication,\n  getUser,\n  processForumPost,\n  async function (req, res) {\n    res.render(`posted.html`, { user: req.forumUser });\n  }\n);\n\napp.listen(PORT, () => {\n  console.log(`server listening on http://localhost:${port}`);\n});\n```\n\nWith our middleware showing off using our models:\n\n```js\nimport sessionManager from \"./session-manager.js\";\nimport postMaster from \"./post-master.js\";\nimport { ForumUser } from \"./my-models.js\";\n\n// Register a new user into the system.\nexport async function registerNewUser(req, res, next) {\n  const { name, password } = req.body;\n  try {\n    /*\n     * Since we have a model store set up through the\n     * use of Models.useDefaultStore(...), and because in\n     * our model we said to use `profile.name` as record\n     * name, we can use .load() and .save() to access our\n     * data by key. The username, in this case.\n     *\n     * So, first: quick check, does this user already exist?\n     */\n    if (ForumUser.load(name)) return next(`Username taken`);\n\n    /*\n     * If not, we try to create a user with the provided\n     * required fields. Since the name and password go in\n     * the `profile` submodel, that's what we pass in as\n     * part of the constructor:\n     */\n    const user = ForumUser.create({\n      profile: {\n        name,\n        password,\n      },\n    });\n\n    /*\n     * Note that we can also do this using a flat object, like\n     * you'd get for e.g. a form submissions, where each value\n     * has a key-path rather than giving us a plain JS object\n     * to work with. In this case, we could have also used:\n     *\n     *   ForumUser.create({\n     *     \"profile.name\": name,\n     *     \"profile.password\": password\n     *   })\n     */\n\n    // Then, let's pretend this does something meaningful:\n    sessionManager.doSomethingWith(req, user);\n\n    /*\n     * And since we have a model store set up through the\n     * use of Models.useDefaultStore(...), and because in\n     * our model we said to use `profile.name` as record\n     * name, we can simply call .save() and it will save a\n     * new record keyed on the username, so we can load()\n     * it later on using that same key.\n     */\n    await user.save();\n\n    // Then we bind and continue\n    req.forumUser = user;\n    next();\n  } catch (err) {\n    next(err);\n  }\n}\n\n// Check whether a request has an associated authenticated,\n// so we'll know whether to allow form submissions (e.g. for\n// editing their own profile).\nexport async function checkAuthentication(req, res, next) {\n  req.authInfo = sessionManager.getAuthInfo(req);\n  next();\n}\n\n// A proxy for getUser(), for use with app.params()\nexport async function resolveUsernameParam(req, res, next, username) {\n  req.username = username;\n  getUser(req, res, next);\n}\n\n// Get a ForumUser that matches the URL-indicated username.\nexport async function getUser(req, res, next) {\n  const username = req.username || req.authInfo.name;\n  if (!username) return next(`Could not get user`);\n\n  try {\n    /*\n     * Much like user.save(), because we have a data store set\n     * up, and we have our model set to use `profile.name` as\n     * record name, we can simply use the model .load() function\n     * with the username as key to retrieve our stored user.\n     */\n    req.forumUser = ForumUser.load(username);\n    next();\n  } catch (err) {\n    /*\n     * This can fail for a few different reasons.\n     *\n     * 1. This could be a \"no file found for that record name\", or\n     * 2. the file might exist, but it failed getting parsed to data, or\n     * 3. it's a valid file, it parses to data, but the data is incompatible.\n     */\n    return next(`Could not get user`);\n  }\n}\n\n// Update a user's profile and save it to the backend.\nexport async function saveProfileUpdate(req, res, next) {\n  const user = req.forumUser;\n\n  const { authenticated, name } = req.authInfo;\n  if (!authenticated) return next(`Not logged in`);\n\n  const ourProfile = name === user.name;\n  if (!ourProfile) return next(`Cannot edit someone else's profile`);\n\n  try {\n    /*\n     * This is literally all we have to do to make sure this\n     * is a valid update: just perform a perfectly normal JS\n     * property assignment, as you would for any plain object.\n     *\n     * If the entire subtree assignment is good, the assignment\n     * is allowed through, otherwise the assignment will throw\n     * an error with a list of all values that failed validation,\n     * and why.\n     */\n    user.profile = req.body;\n  } catch (err) {\n    return next(err);\n  }\n\n  // Likewise, saving is about as plain as it gets.\n  try {\n    await user.save();\n  } catch (err) {\n    return next(err);\n  }\n\n  next();\n}\n\n// When users post to our forum, we bump out their post count.\nexport async function processForumPost(req, res, next) {\n  const user = res.forumUser;\n\n  // First, try to handle the posting.\n  try {\n    await postMaster.savePost(user, req.body);\n  } catch (err) {\n    return next(err);\n  }\n\n  // If that succeeds, mark this user as having one more\n  // post under their belt, again using perfectly mundane JS:\n  try {\n    user.profile.posts++;\n  } catch (err) {\n    return next(err);\n  }\n\n  // And again, saving this to the backend is a single call.\n  try {\n    await user.save();\n  } catch (err) {\n    next(err);\n  }\n\n  next();\n}\n```\n\n---\n\n![A chat about what happens when you change a model](docs/images/changes.svg)\n\n---\n\n## Dealing with model changes\n\nData validation is easy enough, but models don't stay the same over the lifetime of an application or API. You're going to need to update your models, and that means you're going to have to update your data to match. And when you need to do that, you want your tooling to be there for you, and make the task of uplifting all your old-model-conformant data to be new-model-conformant as quick and easy as possible. If you've used database-backed ORMs, you're probably familiar with the idea of schema migrations.\n\nThis library does that, too.\n\nWhen you tell the library that you're using a data store (which is a single function call), the library will turn on schema tracking for you: whenever you use models, it will keep a record of what schemas those models defined, and it will compare \"previously stored schema definitions\" to the models you're currently working with: if you shut down your app, update your models, and start it up again, this library can detect the change and store a new, up to date copy of your model schema generate you a standalone runner script for uplifting your data so that it conforms to your updated model, and then shut down your run.\n\nBecause, critically, _you_ should decide what to do next. Do you want to migrate your data, or change your code some more first? And if you want to migrate your data, you get to decide when to do that, because maybe you're just working on a feature branch and you're still in the middle of figuring out what the best revised model shape is. Sure, twenty schema revisions might be useful while working on that branch over the course of a week, but before you file that merge request you want to have the option to delete all those intermediates and just generate a single migration from the old model to the now finalised model.\n\nDid you move a property one level lower, or higher? Did you rename a key to something better? Did you delete some parts that are you longer needed? Did you reshuffle entire submodels? None of these things should require you to manually update all your data, whether that's with a script you threw together for that, or with some SQL update commands. Your tooling should know how to preserve data integrity, and make that easy for you to do.\n\nSo this does.\n\n---\n\n![A chat about what happens when you change a model](docs/images/api_docs.svg)\n\n---\n\nWhether you just want the API documentation, or a detailed explanation on how to use this library, hit up [the documentation](https://pomax.github.io/use-models-for-data/docs/API).\n\n## Thoughts, comments, discussions\n\nTo discuss this library, head on over to the [discussions]() for this project, or file a [new issue]() if you think you've found a bug that needs fixing.\n\nAnd if you just want to do a shout-out or engine in a short-term exchange, hit me up on [Mastodon@TheRealPomax](https://mastodon.social/@TheRealPomax).\n","readmeFilename":"README.md"}