{"_id":"@allnulled/flexible-db","_rev":"57-f81dbb2d4a6c1db4c8c71970e024d67e","name":"@allnulled/flexible-db","dist-tags":{"latest":"5.0.16"},"versions":{"1.0.0":{"name":"@allnulled/flexible-db","version":"1.0.0","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@1.0.0","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"d5ae9735748c1f5c30610cc958427d80290a3c28","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-1.0.0.tgz","fileCount":5,"integrity":"sha512-wX0hN7YOWz1YnYY8oNondWGQo91ICmNlK6f6jV4bXa3GRYw4Hk0Ceq048fQm5zvHITiAS6f+asPh8FYS8qmC6g==","signatures":[{"sig":"MEQCIG+BJ67QL9fXw4nt6ymS444lTP7CB/Y7bFmKbyP+ai7wAiB9btSTDx3JreVyk4U847DXQDB/VaWgWqLoiGh7AsAjJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28632},"main":"flexible-db.js","gitHead":"8b0ee195bf9f9e4db17e0973249252bdf4f032f6","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -e 'js' -x 'node test.js && node test-on-readme.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript.","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_1.0.0_1760307828135_0.5921240500143787","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@allnulled/flexible-db","version":"1.0.1","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@1.0.1","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"cdde7d52bd556651af945114d2721bb097a505f1","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-1.0.1.tgz","fileCount":5,"integrity":"sha512-5n8dUiF2R/sxYiC0y7yb19nwjxvgUKmOMSwKi12lQTrfnBQiB8+WzxZqINi24ELGvZcvO00Na8VsfLil5WnAJA==","signatures":[{"sig":"MEUCIQDbFTebLfNe9uHuDF9lMyI9SQPgDbGOJ+urdCVo3dM0RAIgavnrPt445EAzs0JyVke/k4nkHoWf7CgkVE1+ye6pPHE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30626},"main":"flexible-db.js","gitHead":"0a8783f1a93f95d1eb86b0d632a570ee662e8aa2","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -e 'js' -x 'node test.js && node test-on-readme.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript.","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_1.0.1_1760336751472_0.6695573547660334","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@allnulled/flexible-db","version":"1.0.2","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@1.0.2","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"d78b74b2d08ce9dce50b87cb5e3f70b51ff421b3","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-1.0.2.tgz","fileCount":5,"integrity":"sha512-cEz/R7Otk9k0BVtMd5RCJ8L0e+6DOX2fS9V+xzoVqF0Vh7+31bXMv6IGCq7nKZnDZrtRbTxBitwR4IAcIQ+Q5A==","signatures":[{"sig":"MEUCIFL3nWE4w2NhKDOKHJ7g1FVedkUcHP6zB8HhkcFd/x4gAiEAgtCuT4rPusdJxdn8wmYI2y5rYYguQGsSB2Xb3lp59VE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30774},"main":"flexible-db.js","gitHead":"3403418f58af0cb233da66a6ad4ea88576233ebe","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -e 'js' -x 'node test.js && node test-on-readme.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript.","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_1.0.2_1760336893547_0.7180329998206421","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@allnulled/flexible-db","version":"1.0.3","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@1.0.3","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"c6b9bb4ac7573c4600d8e9aa06e49efd5152bb36","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-1.0.3.tgz","fileCount":8,"integrity":"sha512-foOexWTYj9dpljMlmHaiHzBuUQJ2oA1n1JZNXgXo34B1mEMEVwzhyVOPn7UcDITNN7v/Yg7wiyufKTcdUXGa+g==","signatures":[{"sig":"MEUCIQD2IaKck4bg44CNnfDji2Ca1wPVhzvgdRF301To1qWj1wIgC9G18DAGvp96AG3BBipigWgBoGwDJ9KicSTLK2Hrvu4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33013},"main":"flexible-db.js","gitHead":"52e7747b3bd8dd6e959adac9d30734e83887ac2a","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -w 'test-of-persistence.js' -e 'js' -x 'node test.js && node test-on-readme.js && node test-of-persistence.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript.","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_1.0.3_1760338108130_0.16701338094265727","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@allnulled/flexible-db","version":"1.0.4","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@1.0.4","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"ae3cbde87c423e4cd64d3ec3d9a5347377ba851f","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-1.0.4.tgz","fileCount":10,"integrity":"sha512-3vylytDWjDgw6075TVpkUNwXkVjxOKqlJ+sNq3joWlkV4HZHj1qQhL+PYPtU/S0uFNT7e7VbraAVhPJfmKEROw==","signatures":[{"sig":"MEUCIQCh9Tsgr8Ar8khihvAGQwAV2w26+Ee323j4UROFA4L9eAIgHEkEBlRJnUT+YeYpH1ivL8kZZWIQMs1wPBzXpYSu8eQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34835},"main":"flexible-db.js","gitHead":"22a1e2806225343cdb5a9a3f26e093b9d17ef2cc","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -w 'test-of-persistence.js' -w 'test-of-trigger.js' -e 'js' -x 'node test.js && node test-on-readme.js && node test-of-persistence.js && node test-of-trigger.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript.","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_1.0.4_1760340179169_0.8259027047838472","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@allnulled/flexible-db","version":"2.0.0","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.0","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"2424e64b02909ed411278774df8472c4589b80c3","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.0.tgz","fileCount":11,"integrity":"sha512-XghfFNH0IVilm33yX1V515QQYtcONvHIx/q7rTF67j03r6T8CC7Ug54yEKviV9KswUKYkzuzh2ymWhHml9e1og==","signatures":[{"sig":"MEYCIQCTGr+woYd1ZzUwGGmip6tq2KekIDm39nUXzrHyatnpdQIhAPasUYiBdqSxSeeQp5j5/z5pi9IPC+jcgXJEyER1IO8j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40198},"main":"flexible-db.js","gitHead":"c77f036fd84f2343f0db9daf463e24518c4f4b6d","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -w 'test-of-persistence.js' -w 'test-of-trigger.js' -e 'js' -x 'node test.js && node test-on-readme.js && node test-of-persistence.js && node test-of-trigger.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.0_1760357321694_0.6613849270913763","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@allnulled/flexible-db","version":"2.0.1","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.1","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"7a5db7b0a99c822df705bba9d2fbd459378ebedd","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.1.tgz","fileCount":11,"integrity":"sha512-VTPoAWNhjvKCb3AX+4QI+rc4sbH16HLUIW3g5vdPo+BT/+pGzSyvCi5TZusgdMlG116/0eZfk90Ya6RzJHDjew==","signatures":[{"sig":"MEQCICWkhPjOxW06PNtFumYC6CbXbKgONxP1ZQ7oDKHySphbAiAvEwWHEpEpPQGk3wr2wtkr3LApSA+hw6m6toQ/vdvtWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41845},"main":"flexible-db.js","gitHead":"3e59418d019e1a6fa1d1c6b13f3b6d75bf891046","scripts":{"dev":"npx nodemon -w 'flexible-db.js' -w 'test.js' -w 'test-on-readme.js' -w 'test-of-persistence.js' -w 'test-of-trigger.js' -e 'js' -x 'node test.js && node test-on-readme.js && node test-of-persistence.js && node test-of-trigger.js'","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.1_1760357547578_0.6951558373752562","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@allnulled/flexible-db","version":"2.0.2","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.2","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"8a31e1f3be23e1884d7eeb89ff3550c86c5278d4","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.2.tgz","fileCount":14,"integrity":"sha512-pnKbjG5RegQzlbo3mrwCCb1l0JvYdRUj5mzkea2NFixCTcwzaDHIMGbSMoCpbjN9JgqN6UN0CRCfc8HgRaZPAg==","signatures":[{"sig":"MEYCIQDqv1Ao0svlmOcliAXmepSG1RKZpLn8E/XrkpDQCrwWDAIhAJhNovtxdPDkiwiobusI6jqsv8nnhH2MOEY6l619ugFc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71744},"main":"flexible-db.js","gitHead":"8712d00d576f7577362c1fa18d0e8a8e525c7547","scripts":{"dev":"bash dev.sh","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.2_1760364151718_0.08280341599354135","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@allnulled/flexible-db","version":"2.0.3","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.3","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"55a102ff0c792fde2a450ac988b8d0b10a288e3a","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.3.tgz","fileCount":14,"integrity":"sha512-Y/82/AO1ByzRDfZ8NczuTk4e9om3Pok+YbX6znpBAx9ejTN0CRVP+lnP2g5eZUCunUT44rqMqdCsGLSDwRTxUA==","signatures":[{"sig":"MEYCIQCcAUZDsvLCKGtGE74O9asIcAs7l5VtiDkkd9U08ikKGAIhAPrEY79rVM1Gb137ykqFlASKfKtLTFeGH0/N8uaS9cl8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71738},"main":"flexible-db.js","gitHead":"f1d01168753c4aba3d973bfbb892e9bdbbf36661","scripts":{"dev":"bash dev.sh","test":"node test.js"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.3_1760426150534_0.039015198115661454","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@allnulled/flexible-db","version":"2.0.4","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.4","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"12d2e4b5730982010bb3ad1c889a5dd08b84a1d7","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.4.tgz","fileCount":16,"integrity":"sha512-JfHoP5vFJJtoQQnXv6Jcu2OZvCj+Ge3Ub/iDjbcwt+fXhrxo/HDYsD5MFviX+qpszootWiytMKkRCaVoHsUuZQ==","signatures":[{"sig":"MEQCIHnTZjMsVY2f1VisbsjRhkz1VWwa+cCAaBc/6vHJFVV8AiAlvrZ5UOMFbRC+Ow6Ammag7J3+4Ox0hs0op3akRQR0hw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77693},"main":"flexible-db.js","gitHead":"2bd187f65ecb1e78d7da1084ab0829f77998be59","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.4_1760447158539_0.1127093499097851","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@allnulled/flexible-db","version":"2.0.5","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.5","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"a304815c0ee92a6092c934cdfb361be0a0c276d5","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.5.tgz","fileCount":18,"integrity":"sha512-iCZwh82mlTg0FmVKhJSYlEqo8uvW0gl0Rd2CGFoQZTXQIewtXxQ8ApDJwflO2EpJm15exBofHQfhFRlqkpLTQQ==","signatures":[{"sig":"MEYCIQCWvSmt+PnjPyPSZmoRpCVyISfBZCF4eEIvs+/k5eEctwIhAIC7bq3FFacWk4/RV3yDEOBnMQ/G0GGufgQieDVhDbv8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83555},"main":"flexible-db.js","gitHead":"f501daa736ac9e94b3d77dd64f9d5247da3e3b44","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.5_1760450720362_0.8154620366166561","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@allnulled/flexible-db","version":"2.0.6","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.6","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"ee2e683dd2fe1c5a547045e27c04b47dbba2bc08","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.6.tgz","fileCount":18,"integrity":"sha512-zai+AmKqcTstVh5yQulIHhoIiyYgSVb+glBGxvs+qyjGNfgJuYhtY6KOnibbvKpPgUtE35Yx/TbJ+5cmPRNI6A==","signatures":[{"sig":"MEQCIE5Y55Gds3MMVXxOeU81i4heXlpCIqhB4Vl63omFsc7vAiA7WEv+tcIUV/VFu+WEGTDGy4ZdfcmqmdbWzjnH98xV1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84205},"main":"flexible-db.js","gitHead":"39b6acabb27b4c880782915e367a22d222051546","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.6_1760450967687_0.6630828654678074","host":"s3://npm-registry-packages-npm-production"}},"2.0.7":{"name":"@allnulled/flexible-db","version":"2.0.7","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.7","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"f919b3db946fdd7045e765fe40d3344b0c6cf272","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.7.tgz","fileCount":20,"integrity":"sha512-uqO4TbfUnrMcKTiV1uYMNi5PSGtgqtDbIUQBV3sWwGzbS9VgcND1fy1bbghVXIzHmYgv2cvbpF5M1BYZPYLiqQ==","signatures":[{"sig":"MEYCIQCk43qYFJOHJSmhrHV0ONGiIo/9mMc+H/PJ+RhX9PwQ0QIhAKhJag6xtzYCQckH3ukj3vRnak5L5TUfs7gAxeT3/8rf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88983},"main":"flexible-db.js","gitHead":"1f0c8ec35b12b8278e5772822d829089a165c4cb","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.7_1760452283078_0.3356235398676184","host":"s3://npm-registry-packages-npm-production"}},"2.0.8":{"name":"@allnulled/flexible-db","version":"2.0.8","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.8","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"ecf523f376703bd309f558c12d0ee72eb42cc21b","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.8.tgz","fileCount":20,"integrity":"sha512-ZFyknvqfGGZzCN38FiisegBx00shPSoY6l7EDQ5cj6PZEgtoVcTgQqwuUmeUb0JVnmYpcRGFP3MNmrZd357KTw==","signatures":[{"sig":"MEYCIQCooIqIpp/Dq5U4A33V0ioYgCZ7ZfysHcd/8Qva40qmKwIhAORBsg+j8z/49jKpZxGXwrmiNk1wxsI939OExaXGeHlC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90004},"main":"flexible-db.js","gitHead":"92806d7731c056b3d929e9963c5bff1fd041b03f","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.8_1760452866289_0.9788305231304362","host":"s3://npm-registry-packages-npm-production"}},"2.0.9":{"name":"@allnulled/flexible-db","version":"2.0.9","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.9","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"dea86ca657fcf6a787420592c5842d4a52368a61","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.9.tgz","fileCount":20,"integrity":"sha512-Roamk89TTYY/sHEtTWreSLxZZLah7Nofyl4Sr61POmcyk2FNiiVEa1guh69MJjqUxWOHpGvDfDq+saKQYjij+Q==","signatures":[{"sig":"MEYCIQC/ILRU6zxVr01bpzIQs3y83AQ5lB1/G9mge/0vOHSHogIhAJQiB5okGaVt4ouTG0XNaCZlW9Min89x7w9oHww5mn9f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90180},"main":"flexible-db.js","gitHead":"4f2082dee2918a7e2b109024618497885f9339b1","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.9_1760460294164_0.527259450699239","host":"s3://npm-registry-packages-npm-production"}},"2.0.10":{"name":"@allnulled/flexible-db","version":"2.0.10","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.10","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"8b9b81aac124bd481459f242b56becc584e7d552","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.10.tgz","fileCount":21,"integrity":"sha512-xuXYiEyMhRSHtEqJyf4OMXmFlbC8GGLytBendvS/o8cdTGB9Omf8GkCQu6JTo0k63t2oX+DTvMPz/17jyuT35g==","signatures":[{"sig":"MEQCID9kPfohaapjjjRzHzgBsSAnIyYeOyum/yyhSFm+2V3WAiAVN1blz2XqWZD3xL5wHZcy5CAZcmom9DoyCC32CrVa7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78416},"main":"flexible-db.js","gitHead":"26c2551725aca1687e32ccef992891f8e5f94049","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.10_1760694837062_0.16033709210672242","host":"s3://npm-registry-packages-npm-production"}},"2.0.11":{"name":"@allnulled/flexible-db","version":"2.0.11","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@2.0.11","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"50f6050eb303e30dfdd912bda2eabd63696be976","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-2.0.11.tgz","fileCount":21,"integrity":"sha512-2YUbhWdGZfiVJd+GZkt8WqIAC1AdHbzVzaaMrWHvqLkP9D+GTCvgEDxdkinKgQk7i1hSqQtAeV0yTiVX5f1JlA==","signatures":[{"sig":"MEYCIQC7bLROzuvtPxL6eUeGomCys0Tg2OAro2oIuh2PlJjQVQIhAI7zRa14gjMRKRVYhBnmFFcKxataNE6jbOj10Gy6FcN2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78931},"main":"flexible-db.js","gitHead":"b996c3df9d57ec7f7a031f9a1ed1dd341ca5ce89","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_2.0.11_1760695467665_0.430280202874874","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@allnulled/flexible-db","version":"3.0.0","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.0","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"3ec8a789a01b711c70670a4aee6c82f61b7dc27b","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.0.tgz","fileCount":21,"integrity":"sha512-ov5vUgm6nTHj5fuKwN8tiyQgYycPksSl8/KTbs5p/y7Hse9PRQwhSTwBhrl6KNFc9nNZgzQqVZKr6xtr4cBlFQ==","signatures":[{"sig":"MEUCIQCXk7c5kRIXkwK5ibK7lfbesXwOUAJeYT9W8N3pMtfAhwIgD8XCUvt+O357nTDbs/2wWkfPLW1Tf2fsLNR6cjihI3A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86619},"main":"flexible-db.js","gitHead":"720d3bd31611c30eb175264e39498040eedd0977","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.0_1760784925316_0.2813565997399672","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@allnulled/flexible-db","version":"3.0.1","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.1","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"db496a3a748b1d4e048712249ba7a020b1bf9d4b","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.1.tgz","fileCount":21,"integrity":"sha512-ZGc6jk4pqZOk31dEwiEI58pbmc+AR6ys8UAqX+IrMN9nZmHWRo6ARj/bly9TjKwQpwz2JCQ4eYlz/WHa7sKoBw==","signatures":[{"sig":"MEUCIEvAwLt1DE75DCcgA0RxLBznd5WZYO2g0ig4TqLSzr+DAiEAzAPSkW3DQ6sB5lDjtWPHP5N27SUTULlFR/Kk4jwGc9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86823},"main":"flexible-db.js","gitHead":"b5b9444b0995bb8e04223eeb12c5258fcf9b656a","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.1_1760785188985_0.5772244823356536","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@allnulled/flexible-db","version":"3.0.2","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.2","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"b0c3fb1161614e543f361c0c729e45384356df07","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.2.tgz","fileCount":22,"integrity":"sha512-Xl69K2POx+1sHjuGLalGCh1YpLzxhiN5YRp+3+FWEWn+g/0YfJXJ84alfyYDu1SzCzO8RiHP/h0MWj3aaAUBYw==","signatures":[{"sig":"MEUCIQD0CiNviQoIYuLVDy1H3parfLvYl9ahmbvvPNKn0VhoLAIgfZwnRMBEemv4Nqw3w42+EN9FOxKER/fcDSjQx1UbwmQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92745},"main":"flexible-db.js","gitHead":"aa5ac4fedec5aab113b61bed1ff4b33e2046cf2b","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.2_1760787388405_0.3207760142990277","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@allnulled/flexible-db","version":"3.0.3","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.3","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"240b798eab1c782dab96061c6466cde08bfce676","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.3.tgz","fileCount":22,"integrity":"sha512-2IcQYHTY1aohV661qSy9dUmY+DUaLWPnAWwG96KZovLpiOXS6yHYKmf29jel5MRWGPZbTA3vk/slWRoYJjCLCw==","signatures":[{"sig":"MEUCIG1x8ErDpIgFBZD1VawNhHGAo/tn8XLzImQ7aLz3tNGzAiEAri4VwHNGIjGuEMmtOHwVCQueWkNtG67DioHMPsDAKtw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92886},"main":"flexible-db.js","gitHead":"31d90b706d8c1ac8929f89f1a932e9fe9c1a59a8","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.3_1760787573233_0.0036710934924770733","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"@allnulled/flexible-db","version":"3.0.4","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.4","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"4819a7287580a5770d28d355351a0dac05843e63","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.4.tgz","fileCount":23,"integrity":"sha512-QKsTv5jkrVSHg4ZYOcBD6kIj3l/90AHjTa9H4nGpnmgUNZ84If7nTGs5RwTEfEqzvClIXSsDzgQpMotO/MgSIw==","signatures":[{"sig":"MEUCIAXM7MTAlRb/ReRMKBub3Oi2cncE65sma8rXeBS978+0AiEAug8PH/RI63V0f7hZuSlBZ/HechZakutphDPrQ0yWjGc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97721},"main":"flexible-db.js","gitHead":"999493da83b9cf8fcfa323bd3d1c1442785ea8f4","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.4_1760790394819_0.3101555773438516","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"@allnulled/flexible-db","version":"3.0.5","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.5","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"4fc864ef69d56184641320778523908700072d53","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.5.tgz","fileCount":23,"integrity":"sha512-foUN8/ZvWmBKlcuwa6gxrpI9mTvHqKHiLRaLk2c1rp0AHWhpcAH2UrXz3YBwzj+uXHU79j4r7bJdKiyl2asCCQ==","signatures":[{"sig":"MEQCIGQ8Zsfeap43XYMFrNlZyv+zctGb/mYYUnwiCMW+guJdAiAdqrcYGdd87ToTS+XALp7bm2P+ddGLqwgkSRUXU6dhvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100622},"main":"flexible-db.js","gitHead":"b6ebd010f9c02698233cb76c66bacebc4ab40767","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.5_1760792000069_0.24163804041712744","host":"s3://npm-registry-packages-npm-production"}},"3.0.6":{"name":"@allnulled/flexible-db","version":"3.0.6","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.6","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"7c63af9a049d03c9a27a321b7a242a5204edc3b2","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.6.tgz","fileCount":23,"integrity":"sha512-AZcwgpWqXgTcLTYngdth7PJCf6nDE1DRkJ/lToPMJEcvEaJzAd/c0XEfip2zsq7Go6LDuc0aa6o5OUi9XW0pPQ==","signatures":[{"sig":"MEYCIQCD8xPJZ70fBzf3f0vvDfkW+Wvae/e3Q7nB8wR0VuyXtAIhAL03jDNwtRqfH+14v13FyMauBHLKZ+CjEEpAilllbF7f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101002},"main":"flexible-db.js","gitHead":"e85004a9a290fa80fa36196c42e7c404192fd1ac","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.6_1760792243321_0.7009030325546575","host":"s3://npm-registry-packages-npm-production"}},"3.0.7":{"name":"@allnulled/flexible-db","version":"3.0.7","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.7","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"7d1b290e952d0c1ebdae516d6950f66a12a8956d","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.7.tgz","fileCount":23,"integrity":"sha512-N1iRMqN1B85h1bGn7IuX/nHRrPy0kpUIvsGWI9VCtT+FJTpWS+35BSqHAldNR955LLOWgDmQVR/kO9Qqa+60fg==","signatures":[{"sig":"MEYCIQCunRLSpL0Dang9UmGg3HVp/JbGR7OcgYFSgJnWq41/ZwIhAPgcxFeYgtlJpTTZMWqCckpFn+l96EsS5PmBCeuTpRlJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101196},"main":"flexible-db.js","gitHead":"a796cbb4d928187db870a904d6da24b96aee3efd","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.7_1760807681108_0.3115185398779996","host":"s3://npm-registry-packages-npm-production"}},"3.0.8":{"name":"@allnulled/flexible-db","version":"3.0.8","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.8","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"61174072e6197dcbc7b1bcdb33ec7b57c60574c9","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.8.tgz","fileCount":23,"integrity":"sha512-tdxz7PiFFKlE8wQPO+rYpgz522Splm85G1HQAWAHbNwPJJPSsLezYBIlv8YHrIOVskh8morKNA6AQsUMmUdz2Q==","signatures":[{"sig":"MEYCIQDsJdKIkJqYulQYRxZ3VzCKKxiXTKEglQ2sWGNK7cxg2wIhALTzo7ImaV+8p+frDlKxzoo4B62IhkOsnh/K6oEt8aZn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105485},"main":"flexible-db.js","gitHead":"3437be02993df5c18739da08c81d7622a18c65b3","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.8_1760896578188_0.14976494785985528","host":"s3://npm-registry-packages-npm-production"}},"3.0.9":{"name":"@allnulled/flexible-db","version":"3.0.9","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.9","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"223a1140413beba34c4935361a673f243b797d2a","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.9.tgz","fileCount":23,"integrity":"sha512-hzpkJVSpKEwSgOmFxAMOUH/C+PwzaocML9Rbb95wwd4soEuuCgFyl3N5/MZS7CrJqSeL9dvtGQEkTDNTC61V0g==","signatures":[{"sig":"MEYCIQCc5nlG2qSpy2selQkQY14MD38Xw0H8jS+L7kGoE8NjrwIhAInNus8K9m+bNJEl2Ix7ykFGyY+LH2cpOoZPFMduBNLM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105433},"main":"flexible-db.js","gitHead":"a8e2fe83a48edbc163d93c6ee6f321b9782dad62","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.9_1760896646933_0.7696468442929607","host":"s3://npm-registry-packages-npm-production"}},"3.0.10":{"name":"@allnulled/flexible-db","version":"3.0.10","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.10","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"0ab2cad66401526ece575c17942573d38d2025c5","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.10.tgz","fileCount":24,"integrity":"sha512-gSanQBKC7rVFLIo0MXFJmv9S++6okGleuYwkNkDp18J0OF46CmSx7er5yDKIXp0lXGwf3ocozMCdQE9j0BrgRQ==","signatures":[{"sig":"MEQCICaWAg7Fhd5Z81yIMacUjmBff080f76tDxVZcSUbtzqWAiAkKw3GhUF7IAj3kqDd2UnRiIiEYxsXO94VPAgGGXfJVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123072},"main":"flexible-db.js","gitHead":"668c9630cd3f662b600fb27ea6982920480d4894","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.10_1760955829927_0.8494489269282697","host":"s3://npm-registry-packages-npm-production"}},"3.0.11":{"name":"@allnulled/flexible-db","version":"3.0.11","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.11","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"4d237c5e04cfe9439b4bf50f7e2256f8be549eb5","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.11.tgz","fileCount":24,"integrity":"sha512-wDM6PUfiPCExfmzoNBt4DxhRM+dDSQW/r41xLj27Y7uMtakoNXVyTX4ifoxlDPUrRdV3/BJKK0aY1wRhJbqN6g==","signatures":[{"sig":"MEYCIQC98d7pnWvI9p6B7G/0o3u2f1S7TT77R4UnR7P3ZJqEzAIhAOKyb4Gr23Z6PWjdAFHkSaawFwU8Q1agj/bQbaJzgJkH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123358},"main":"flexible-db.js","gitHead":"4b3d5276d2b83bc6935a171fbd0c68b83254dcfe","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.11_1760956398933_0.41050807628328156","host":"s3://npm-registry-packages-npm-production"}},"3.0.12":{"name":"@allnulled/flexible-db","version":"3.0.12","keywords":[],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.12","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"5fda998007ea07c73731517e115d07ccc5a08c24","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.12.tgz","fileCount":24,"integrity":"sha512-z76UKNhBhkPEurPonhU1ZmOH4KusJw/1BUj70+K5Eijl1Kv3ieZHE9Q61aVFkvdrkc98JOdro/IbI9xT5itu5A==","signatures":[{"sig":"MEUCIHOBRQBSPntlgiXk/vV1IGVwem8vPOi5YsSmE4yVPlYEAiEA32UzZcA6N1XY70FQZA9sUJwWqU2sOZCECPt4pqPgKfM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142097},"main":"flexible-db.js","gitHead":"22d4ceacf4fccf9ca8c922837d6417febca3493a","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.12_1760985166719_0.7968956374044955","host":"s3://npm-registry-packages-npm-production"}},"3.0.13":{"name":"@allnulled/flexible-db","version":"3.0.13","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.13","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"baafa6d80cae41a76c251cb2c1f6f369a886a404","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.13.tgz","fileCount":25,"integrity":"sha512-+YaUpNJ1OCvhRJKseGqfP86rPeOP7YbLHqpBpWclw96ZCoeH0w7HUjcDivbW3cG6TlxPqrzw2HjgUvPYoB5VSQ==","signatures":[{"sig":"MEUCIHHQ42RHEQtfnECQGScZZ8dXzh9sLlXKWO/Dmigw0n4vAiEA2TdzjWYAhJ9q01V26dqsi2u5/yYTYgQF28blEl3g/lE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191427},"main":"flexible-db.js","gitHead":"27ff797507362764011ddcc59fcac2c41e97994a","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.13_1761032956633_0.6747429643822416","host":"s3://npm-registry-packages-npm-production"}},"3.0.14":{"name":"@allnulled/flexible-db","version":"3.0.14","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.14","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"28f580babb03140fcd16486cfc58fb9cd03040da","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.14.tgz","fileCount":25,"integrity":"sha512-duonLU97GasA5tx5hIPW6C387putCb8uh/qnTiI/+SG5J5p44ZZAwsLMQanD5V2LI+5YcO/Fh+bUdN/8z76EYg==","signatures":[{"sig":"MEYCIQC16Qzv7jkrC5zensRh8Xyj7svkuktfibgCEVXeORE51gIhAPzYV7VqVVdqxV6SiKz33vIZyPt2UgOmnCPnTiZKnFkP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191554},"main":"flexible-db.js","gitHead":"ce38f8ad38658aea4fc04a7ab664793d4c736e1d","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.14_1761033047939_0.5929448484813844","host":"s3://npm-registry-packages-npm-production"}},"3.0.15":{"name":"@allnulled/flexible-db","version":"3.0.15","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.15","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"dfeb7def9dddc790436f5ae5159c6f2d8560d4bb","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.15.tgz","fileCount":25,"integrity":"sha512-q9MlVK84cObJSrwqPPKvkIG6BRjubm1y6e7l8zFD6txJngJ4TDvFKYeU7AFmyZ1yg9xRg2O4rCq9sEmX7gNO2Q==","signatures":[{"sig":"MEUCIA6/rt4/TvxKh8APSVtteDb/vyB8bCgTbDWh00W8AT9HAiEAwyy3bXZBE0Eqk/G9M35SS/hYHuPBN3zfguvVoefk4S8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192087},"main":"flexible-db.js","gitHead":"044fcfbe4c73683c2ade1ad250358ddfeabca4fc","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.15_1761033594194_0.28795108043603235","host":"s3://npm-registry-packages-npm-production"}},"3.0.16":{"name":"@allnulled/flexible-db","version":"3.0.16","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@3.0.16","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"846163a030c8843e59bcb9df188ec738db51ecc1","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-3.0.16.tgz","fileCount":26,"integrity":"sha512-UdpUyEkHwYB0WOuVb01DC82Jj9ZcZUzzYxbb1bOQLMK9u1DcwrpW6FfQIPtpqG8QBk5QnhcctydxmcI0GvLTXg==","signatures":[{"sig":"MEUCIB42tfQrKTb8D8kOawEFDpfh0Dk0uPbzd0QG2d3/h0rLAiEAzygCk9DY9i/kHaCl3PWAHYFpcfCJx2CCbi9MwO0lseY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113771},"main":"flexible-db.js","gitHead":"46859c515f659c28d1c9a774dcf158374e72619f","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_3.0.16_1761047316253_0.38682529289939116","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@allnulled/flexible-db","version":"4.0.1","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@4.0.1","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"697a2bbdcdf33b158f8b5fc7bddbaa8f96d6b44e","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-4.0.1.tgz","fileCount":26,"integrity":"sha512-oxWTqHujcayINbiIRInybe8paEs9nKhYYiEdcFKn4chaIza5+3jd8HNU6ZpZjKosIS+87hpkOn9Y5I15bDDEMQ==","signatures":[{"sig":"MEQCIE+h/v+l3i0tKEqeMEqEWfnqkahfWMCZRsFRjbDX7XqbAiBOqbuNrVJGXDb1FLCJijztANO2rUT5OmxxmzUZUelguw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145272},"main":"flexible-db.js","gitHead":"4b646b075747514721f0f34875640378e409e2a5","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_4.0.1_1761122084675_0.2228418483909982","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"@allnulled/flexible-db","version":"4.0.2","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@4.0.2","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"3bf7c6ebac9ad5e0286f4cdb32d82a2d5971fd06","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-4.0.2.tgz","fileCount":26,"integrity":"sha512-FX5Uv9a121JxHYUvyn8fieuavFL36/ilcmIaH8lm2TLeEEAWLo/la6ybLrGOectiZEeF2cb3AVdINRIVPZV4cQ==","signatures":[{"sig":"MEUCIDNx2dv5F52lb7iLHiLe3DA6qrYVHFs39wp1RJLThDyJAiEA7gzHyiYIEBPXFxebloGhdrrlC3Otly+uCZTa8UE7/AQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154820},"main":"flexible-db.js","gitHead":"8b48b7723e314d48eec6722b1e8337556fbd9d00","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_4.0.2_1761127698077_0.24480767670582337","host":"s3://npm-registry-packages-npm-production"}},"4.0.3":{"name":"@allnulled/flexible-db","version":"4.0.3","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@4.0.3","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"c286996255e1649fcef31b84a8d3cee18206e2f2","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-4.0.3.tgz","fileCount":35,"integrity":"sha512-7hU1vDU+SFOs/JFrmouqKhnyHw12t8UWZN5O5+aPbHgmPwYCkMnmNJBUuGgpDGK8r4IuNs7ywrC2/YXBvtws+Q==","signatures":[{"sig":"MEQCIE9qipmlF4eb5exBUrIrwtl/EqkBF2Gq2gilsAx8rocAAiBeawdeNkG4AxSibbitjGmhUxVue0hi/UG6/mPrmF61yg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257662},"main":"flexible-db.js","gitHead":"abdbfbd522dda3b5acfe3b126b14fd66123c5f07","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_4.0.3_1761177512427_0.1049777083152128","host":"s3://npm-registry-packages-npm-production"}},"4.0.4":{"name":"@allnulled/flexible-db","version":"4.0.4","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@4.0.4","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"487ee66abb39057014978f5cb69ab7c450569705","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-4.0.4.tgz","fileCount":37,"integrity":"sha512-bvngG7NpjSj57ITQtF7xmYHY2kCfxkjQTcWhR8e768/gDIijLYo0lPtG32osMyZAC7bZgx7ENNIYRaO2Pnj/Sg==","signatures":[{"sig":"MEUCIQCnqiVhVIFGkm8sMdDXOehHhx2bqZL6X1SCdJAciaBr1QIgNjDAlqfh8rwyi02GBJB/QLdPAUrddyrK0pCef1EA9Hg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":284367},"main":"flexible-db.js","gitHead":"39373fa7a6049e7604eb25f0c474247aa4863f25","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_4.0.4_1761271434610_0.9042747267882383","host":"s3://npm-registry-packages-npm-production"}},"4.0.5":{"name":"@allnulled/flexible-db","version":"4.0.5","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@4.0.5","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"5363a52c0dc3f867d5367662358da312a47f0061","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-4.0.5.tgz","fileCount":37,"integrity":"sha512-LPCB6AwtdWVtTIG4jevY7Fs/FPkyE4DNEsIYXfBJqLhdl2Sc3Mclv9issVzXIN6dRh5z8ax4BSmU8ijsbuIeUQ==","signatures":[{"sig":"MEMCIDsJMW2fI/gZfTt+AEvcW//+/Lg47sAzohsn5X4T/+ayAh8zoX4ct94IdIzfiq0R2ODDM5QPBh6VDjXM/uZMSl6n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":284365},"main":"flexible-db.js","gitHead":"50d8beb76d1509c6676e0152872d4bbf3c59b544","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_4.0.5_1761271568538_0.646676215973347","host":"s3://npm-registry-packages-npm-production"}},"4.0.6":{"name":"@allnulled/flexible-db","version":"4.0.6","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@4.0.6","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"f7824b1a02f5ea017764f720b8636561f86d4dcb","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-4.0.6.tgz","fileCount":37,"integrity":"sha512-c8tfuGwJfrTZbVw+PV9h7b5iWF9VJq/HMiRnVZZbmZ1hkrPhRxY8xwEJ/Pi1wibt8WoGFb9F2X/IvbPsqjACWA==","signatures":[{"sig":"MEUCIQDsR59h4h1iN51UB3uue28hyHM+7AzUZkdQsSgiIZOnqAIgOXpyWzyzRWqeyYbafvL5vrdrGEaE8QgRIBGXRkrgeqs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301716},"main":"flexible-db.js","gitHead":"adcc830209bc851351161d6be4dbc23179229d62","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_4.0.6_1761302903130_0.08201746361690798","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@allnulled/flexible-db","version":"5.0.0","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.0","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"aca92ef8261aceb0b81e99e97a4e95470ecd5ce4","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.0.tgz","fileCount":37,"integrity":"sha512-bwPAryUYtyD3fGYdf5KkEjCdvFIcBVVKdUHBM2z6rNgkkH1PsQ1F5ZxlKbnElE2pHDGS5m6HUM8iTcfNOIvqXA==","signatures":[{"sig":"MEQCIAXYu+ZiinNn+ZTrT70zNQKuGWoT9uCXJfFId9JBK//sAiBpuoL/QNsCb6Yqbu2w71sbbZNK3OYL4OiQyfrUP7kIrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302833},"main":"flexible-db.js","gitHead":"acbe72d72ac326a80bf9161db7f4cb34aa36c677","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.0_1761303382312_0.9555750515091828","host":"s3://npm-registry-packages-npm-production"}},"5.0.1":{"name":"@allnulled/flexible-db","version":"5.0.1","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.1","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"39831fe4afdbbe44d0d5080c92939f171bbad2f1","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.1.tgz","fileCount":37,"integrity":"sha512-naOcAf9/lfeW5KuyIjBmUrGC7OdLto6zvj9p8pKNUO55bDgRyw11Fb3GTtFjLK6U9mYWaVTpv8lrlWFerZH+fA==","signatures":[{"sig":"MEUCIFnZTeLVRNY/H2HvJ/0/+xTazUvWR/WmkPJ9TDbzgzIfAiEAiDT8xH89UwJgXPXE5Z3+tAOBqpd375d0CgIG9oo4ZYo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302906},"main":"flexible-db.js","gitHead":"e9bbda8c417e22c29f3aa77c4e375ce0ca5b533b","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.1_1761304063478_0.22614036176613816","host":"s3://npm-registry-packages-npm-production"}},"5.0.2":{"name":"@allnulled/flexible-db","version":"5.0.2","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.2","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"0b9746866c0cba758b086d1949d4c129b6f1024b","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.2.tgz","fileCount":38,"integrity":"sha512-UnXWt2v+LUNJ8bwPnbgGB85vOjf56SzrOng4AconuBieMXgjkmfSH9BPlcIdBzopzzOk/xiHUrNprTg/P1gssQ==","signatures":[{"sig":"MEYCIQCG1OkanguRGcsQG49tUqEIDN1+9x9lWzoIQgUzzzuAnwIhAKu3uqPJdtjVxBuX8jtbv+JR0PB9IR5NVpV9dnT7g6Z9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310744},"main":"flexible-db.js","gitHead":"4473b28a27378a33a8c3686ce57c7e6a77d928f2","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.2_1761308899991_0.014006561776172655","host":"s3://npm-registry-packages-npm-production"}},"5.0.3":{"name":"@allnulled/flexible-db","version":"5.0.3","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.3","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"10da8f12db3d0d83cbcd9a2f82b03bcbec5b8317","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.3.tgz","fileCount":39,"integrity":"sha512-AAk5DYigvy9/qmonpIT27HLZsGkVuSwpluykvARDnFrTYu/zJer/CbJ6cu82+5gvfKmvmLviVjj3e0aq9aN9ew==","signatures":[{"sig":"MEUCIQCBbqLVc1VnoYGrdlIFOoRvk9EDsWSuI/dEufSqRFE+SgIgNA5ju0/BiwZg5C0C/arJZ7RYXejxrc+hKHd5E/80zN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323275},"main":"flexible-db.js","gitHead":"2daf5982f66789adf01fedc12c147ce95d96493e","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.3_1761373224442_0.3045639756326064","host":"s3://npm-registry-packages-npm-production"}},"5.0.4":{"name":"@allnulled/flexible-db","version":"5.0.4","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.4","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"43e94d8f7dd8c28713cb80409ae8fb76e1455c27","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.4.tgz","fileCount":39,"integrity":"sha512-ZSmRzvJ9X/elwCVq3nDQc/utQObJpCjWoP12k5TqfITgomhZ8ReAMDRhMC5X3KtJnUQ9cexDSeCEKwgmWqBPPw==","signatures":[{"sig":"MEQCIAHjLuwkGKMFsCApTDx5l8kTtDuP7pij8bZSgPEaXApzAiB4jeUkZSrv6oflC0qrjge2W+bmkIr02u7+MFRH22gcOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":327779},"main":"flexible-db.js","gitHead":"4abc855a56d87218e1f0512b9c2afbe0bded4ac5","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.4_1761412395570_0.1467353108009164","host":"s3://npm-registry-packages-npm-production"}},"5.0.5":{"name":"@allnulled/flexible-db","version":"5.0.5","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.5","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"e84936f2ed49176d2a7841789da1145afa434949","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.5.tgz","fileCount":39,"integrity":"sha512-T6zOinsjXokepj9uICsjmagFCvJUiUqJvFQehKCFFxG2EHTTisfEthvTMx8PeGeosEs95YzJo9E9LL0iGFomEw==","signatures":[{"sig":"MEUCIGclCCVk2L1Ht8YTpogRbWI1+ZNgq1dC2f4pXLcmUEy0AiEA76VXaOAXxLrdgnpCY/AsFgmjfS7TLxXtIx0E/FCuBos=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":329282},"main":"flexible-db.js","gitHead":"abc9e333016e77e0be2f97fe6680f2ed9ac2daea","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.5_1761413726200_0.20806732777077586","host":"s3://npm-registry-packages-npm-production"}},"5.0.6":{"name":"@allnulled/flexible-db","version":"5.0.6","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.6","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"315914a86c34e5df2c9d3357e7750e7ad159804a","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.6.tgz","fileCount":39,"integrity":"sha512-Em6FCGij7nU83cGO8UvJEXejIpDVM798brsjGR6qEonaJXfOGMgHZLE8es0Oam/ZEyATAsEycdDBtYVOwQ/hKw==","signatures":[{"sig":"MEUCIGvQ+5OlZrZ0RX7eqm6QfFgEgr6gAbKSbUkgjB9GbQfpAiEApRTxUt7Fhk6xrdpYcBg9wLf75KcNXS9zcoGzmH/QupM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":328911},"main":"flexible-db.js","gitHead":"a2e7cd21893c5a912a0e514450a5fb5bb1e5a61b","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.6_1761413871343_0.7020806691992685","host":"s3://npm-registry-packages-npm-production"}},"5.0.7":{"name":"@allnulled/flexible-db","version":"5.0.7","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.7","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"3cbcf63cbc765a54e56a3b3b85ca1184125ad9b4","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.7.tgz","fileCount":41,"integrity":"sha512-lgHzqDRV9kTFwbY3e2XMKn00JFlXbTbX5R76VnYCUC0jXjeQp32g/CKL0Vv8i0ObUBnR5WIBBwztTE5PolrUAA==","signatures":[{"sig":"MEUCIQDWfDwCfJBDwTdjf268HCGs9gUn74Dsu55uiXsgDYv9RwIgNHbdEDtSGAsbNXGp8T4uH1ssS9z/aB/1HBdtZUqsecM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":347895},"main":"flexible-db.js","gitHead":"8ded13dca973b40c0fa49da15cb28bbac76b1678","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.7_1761430520134_0.9729211585107109","host":"s3://npm-registry-packages-npm-production"}},"5.0.8":{"name":"@allnulled/flexible-db","version":"5.0.8","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.8","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"be05cca56040f9815dc30e44c14c4ab789c58f0f","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.8.tgz","fileCount":41,"integrity":"sha512-Fjtr9nRXSmKVjK5pjdPNzolO42JXuRzESZXxZfbwcaRB6R6H8p5Qj0FwHhy5zPWoDCC+ozM++Nh86pq0HU63Eg==","signatures":[{"sig":"MEYCIQD0PSrg63+AN/O7+2J8Tq1o4Zp4ui6/LTVnoS1NTqVdRQIhAJs6TpcnyPHnpaEiJA0Dp6OdEMI96a/fidlQnjeasqft","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":354879},"main":"flexible-db.js","gitHead":"30800a498133d1fbf80d274b0e3aed31e1165d4c","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.8_1761474466238_0.8074112031908263","host":"s3://npm-registry-packages-npm-production"}},"5.0.9":{"name":"@allnulled/flexible-db","version":"5.0.9","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.9","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"920ea48f25210f69edb4a710ed050ec4987b0657","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.9.tgz","fileCount":41,"integrity":"sha512-bYk1HEo6hc4CT33REmXtxvhm2oKBm54PTay95Y5oVolCq6CwV7kBC69PMKHl++IVHaAOAWd7SwuTJprnH7Y1Xw==","signatures":[{"sig":"MEUCIQDCgJIkxgbQmYqUvUyelhVI5uuTh0N+siV9t0N/4Q82vAIgKcmwP3oA+IXBqO+XYyS9uVLzVAKgNjmgfDS9Dtjz/TU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":356783},"main":"flexible-db.js","gitHead":"abd39ccb27fdd58769b86ee19077a582c0903c8e","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.9_1761475622322_0.33173729760108084","host":"s3://npm-registry-packages-npm-production"}},"5.0.10":{"name":"@allnulled/flexible-db","version":"5.0.10","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.10","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"d672ad6cea8c0069f73c1c7daf26941ee4bfb67e","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.10.tgz","fileCount":42,"integrity":"sha512-eLPBut4YQlukHshRSQtqOkYQ35ZnTQIIJeHCs2ZXElYrRo5/IrHzhKlsWGuyjv5KHkCkP5+mZZYeC+CmmicZnA==","signatures":[{"sig":"MEQCIGuTd40pFXbNIiRjfWU/sIy/JXRsP/mWBHGbH7yRoDw0AiBWcaIzV/jRPyezjkjGrct+Bmoud7pR+FBogodvF4piaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371881},"main":"flexible-db.js","gitHead":"d7188d3bd5db1c784c4ff0797db7ee93289dc70c","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.10_1761501497798_0.6316987912025658","host":"s3://npm-registry-packages-npm-production"}},"5.0.11":{"name":"@allnulled/flexible-db","version":"5.0.11","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.11","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"4db58d0c20e7f856731b0d3f712adb2c37e095a4","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.11.tgz","fileCount":42,"integrity":"sha512-jz/x4EKl+oviwgbHirzLTY2fm2NEWJMxrcuTBSQ8UF2mBm/64cxQjGET8VnEOyoOCLJwQViX9dZn5J+bVt8/Wg==","signatures":[{"sig":"MEUCIQDQlonPFt+kgnw+b86iIL42O8FLiKLugnJ52U6n6tmybAIgZpaaAtkTKBvwlKB5hM9c1nGUce1NOGuY4Ii4CiAebhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":380286},"main":"flexible-db.js","gitHead":"155767b87ee10fdd92efa5d6a3f7f10c45b5c923","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.11_1761514030092_0.8027230715547868","host":"s3://npm-registry-packages-npm-production"}},"5.0.12":{"name":"@allnulled/flexible-db","version":"5.0.12","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.12","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"634ba5d77a48c872c7e9f85fc5887b4b4ad8cb2a","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.12.tgz","fileCount":42,"integrity":"sha512-zn9nwSkWUPYgkVE8mi5yRPGj8MoCq6jdJwWwpX4HHDLyEX8xkURPrDtpbopuhvoJXjGVVEOrS2TyrSJroQNQ1Q==","signatures":[{"sig":"MEUCIQCWGrG575ghs1tiBWYIjEYkrX3yYp+ByIu+upHym/lmTQIgT2IlbDpuLohlN1+E6w5FXLgTcFHsgkBigMKG5vxtkvQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387249},"main":"flexible-db.js","gitHead":"95dabd88a193a0578062ee2ca2094bb43af641a4","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.12_1761556391552_0.8678891464417213","host":"s3://npm-registry-packages-npm-production"}},"5.0.13":{"name":"@allnulled/flexible-db","version":"5.0.13","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.13","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"a81a6048f32193a520905d70206f2583bd6188f6","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.13.tgz","fileCount":42,"integrity":"sha512-xVDQi0lIZ1byE49CcdqrGSn8gRttJOE3ZaswJmgPgHESC8Cla3GMdB2Lute8fNuhXm8yB8vpmoFOeiXmByxt/w==","signatures":[{"sig":"MEUCICMXSgfWnTnnoQICYOKiog14CRKbZt/RDhhxeMbGCppIAiEAmW/eN7vned7tm1YNkeUs8Foar+Oy1uynlXljIGimAtE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387234},"main":"flexible-db.js","gitHead":"db7d21272ef967af532c34c2ba4c798cc5a472a9","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.13_1761556707273_0.8135025714368627","host":"s3://npm-registry-packages-npm-production"}},"5.0.14":{"name":"@allnulled/flexible-db","version":"5.0.14","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.14","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"c813d3a77e257755144b31960e9767df9de8a2f0","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.14.tgz","fileCount":42,"integrity":"sha512-M4pk1FVtQiWpmIO57pecET0RkYmOrG1E/+qFrVLb/jZIcPVYZVr76MLZKYcjkOvQNg1Ryl3XSXsp3XPznFE8mA==","signatures":[{"sig":"MEUCIQDPEhoN8t+0ooLEO00XIhCx4THwY31Kpm42nwZk+DEj3QIgfX2cF0cXpUaQ8O5sNP1g4tpu5Pzv8xoUCyFtrQpUIek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":388157},"main":"flexible-db.js","gitHead":"b56eb233d23d90c69714f40dbdf4ca4934dd8d3f","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.14_1761557007123_0.866119206831468","host":"s3://npm-registry-packages-npm-production"}},"5.0.15":{"name":"@allnulled/flexible-db","version":"5.0.15","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","_id":"@allnulled/flexible-db@5.0.15","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"dist":{"shasum":"e3109b5fe106d252e2b8d8095d7123de8d322ef6","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.15.tgz","fileCount":42,"integrity":"sha512-9Y9FPRUrZJ5/nqzHwZy1cEh6VCeq/bT76jVh1Oo0sDQcYTcHKTk2I236waXn0H+x44xPdq9fR6ccHw69Joth/A==","signatures":[{"sig":"MEYCIQDCJ/kmnjF45dndkLBHPPS7jzQFBM2v+Me1Ux3+0wbLrQIhALeG6mVGriQsdXxPTIv2PkfXYPT2XPUzJeT7ioN2cUrb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387012},"main":"flexible-db.js","gitHead":"c57b7f0caed3ab41f9a10cdf059cead74db72f9c","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"_npmVersion":"9.6.7","description":"Base de datos basada en JavaScript","directories":{},"_nodeVersion":"18.17.1","dependencies":{"express":"^5.1.0","body-parser":"^2.2.0","js-beautify":"1.15.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flexible-db_5.0.15_1761639860650_0.19333720319326697","host":"s3://npm-registry-packages-npm-production"}},"5.0.16":{"name":"@allnulled/flexible-db","version":"5.0.16","description":"Base de datos basada en JavaScript","main":"flexible-db.js","scripts":{"dev":"bash dev.sh","test":"bash test-all.sh"},"keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"author":{"name":"allnulled"},"license":"WTFPL","dependencies":{"body-parser":"^2.2.0","express":"^5.1.0","js-beautify":"1.15.4"},"gitHead":"ee4517e712ee3755bc607fb785b02df16a6a7604","_id":"@allnulled/flexible-db@5.0.16","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-QTm9Cs43nfOHyA+wGJArXTCWeL3FTUJLybsAQm12+s1veWroMNFPXVOl8xecT7z0oQvTIUlzSaKQ1yU/GvCf8Q==","shasum":"96746ad0de49247c5fec2e1208e1653f7044b000","tarball":"https://registry.npmjs.org/@allnulled/flexible-db/-/flexible-db-5.0.16.tgz","fileCount":42,"unpackedSize":388548,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAcZ9LKxvFbzPPcEfhbsAHoUCxEQYRIjz86bKebz0xB1AiEA6+4utqGc9onkw74OgmWHglyZlGWHv+tul1cEzvrj9qc="}]},"_npmUser":{"name":"allnulled","email":"todosanulados@gmail.com"},"directories":{},"maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/flexible-db_5.0.16_1761643792296_0.6013841377020381"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-12T22:23:48.017Z","modified":"2025-10-28T09:29:52.688Z","1.0.0":"2025-10-12T22:23:48.320Z","1.0.1":"2025-10-13T06:25:51.637Z","1.0.2":"2025-10-13T06:28:13.728Z","1.0.3":"2025-10-13T06:48:28.306Z","1.0.4":"2025-10-13T07:22:59.331Z","2.0.0":"2025-10-13T12:08:41.888Z","2.0.1":"2025-10-13T12:12:27.759Z","2.0.2":"2025-10-13T14:02:31.883Z","2.0.3":"2025-10-14T07:15:50.738Z","2.0.4":"2025-10-14T13:05:58.815Z","2.0.5":"2025-10-14T14:05:20.557Z","2.0.6":"2025-10-14T14:09:27.863Z","2.0.7":"2025-10-14T14:31:23.259Z","2.0.8":"2025-10-14T14:41:06.492Z","2.0.9":"2025-10-14T16:44:54.359Z","2.0.10":"2025-10-17T09:53:57.267Z","2.0.11":"2025-10-17T10:04:27.881Z","3.0.0":"2025-10-18T10:55:25.546Z","3.0.1":"2025-10-18T10:59:49.193Z","3.0.2":"2025-10-18T11:36:28.609Z","3.0.3":"2025-10-18T11:39:33.430Z","3.0.4":"2025-10-18T12:26:35.042Z","3.0.5":"2025-10-18T12:53:20.354Z","3.0.6":"2025-10-18T12:57:23.499Z","3.0.7":"2025-10-18T17:14:41.303Z","3.0.8":"2025-10-19T17:56:18.433Z","3.0.9":"2025-10-19T17:57:27.137Z","3.0.10":"2025-10-20T10:23:50.137Z","3.0.11":"2025-10-20T10:33:19.179Z","3.0.12":"2025-10-20T18:32:46.912Z","3.0.13":"2025-10-21T07:49:16.814Z","3.0.14":"2025-10-21T07:50:48.126Z","3.0.15":"2025-10-21T07:59:54.390Z","3.0.16":"2025-10-21T11:48:36.439Z","4.0.1":"2025-10-22T08:34:44.858Z","4.0.2":"2025-10-22T10:08:18.272Z","4.0.3":"2025-10-22T23:58:32.608Z","4.0.4":"2025-10-24T02:03:54.805Z","4.0.5":"2025-10-24T02:06:08.746Z","4.0.6":"2025-10-24T10:48:23.327Z","5.0.0":"2025-10-24T10:56:22.515Z","5.0.1":"2025-10-24T11:07:43.708Z","5.0.2":"2025-10-24T12:28:20.204Z","5.0.3":"2025-10-25T06:20:24.658Z","5.0.4":"2025-10-25T17:13:15.755Z","5.0.5":"2025-10-25T17:35:26.449Z","5.0.6":"2025-10-25T17:37:51.568Z","5.0.7":"2025-10-25T22:15:20.371Z","5.0.8":"2025-10-26T10:27:46.431Z","5.0.9":"2025-10-26T10:47:02.505Z","5.0.10":"2025-10-26T17:58:17.984Z","5.0.11":"2025-10-26T21:27:10.272Z","5.0.12":"2025-10-27T09:13:11.736Z","5.0.13":"2025-10-27T09:18:27.465Z","5.0.14":"2025-10-27T09:23:27.297Z","5.0.15":"2025-10-28T08:24:20.858Z","5.0.16":"2025-10-28T09:29:52.496Z"},"author":{"name":"allnulled"},"license":"WTFPL","keywords":["database","db","schema","schema-driven","dataset","flexible-db","flexible","allnulled","expandRecords","attachRecords"],"description":"Base de datos basada en JavaScript","maintainers":[{"name":"allnulled","email":"todosanulados@gmail.com"}],"readme":"# flexible-db\n\nBase de datos basada en JavaScript.\n\n## Índice\n\n- [flexible-db](#flexible-db)\n  - [Índice](#índice)\n  - [Links](#links)\n  - [Instalación](#instalación)\n  - [Features](#features)\n  - [API](#api)\n  - [Database API](#database-api)\n      - [`db = FlexibleDB.create(options:Object): Object`](#db--flexibledbcreateoptionsobject-object)\n      - [`db.getSchema(): Object`](#dbgetschema-object)\n      - [`db.getRelationsSchema(): Object`](#dbgetrelationsschema-object)\n      - [`db.setSchema(schema:Object): void`](#dbsetschemaschemaobject-void)\n      - [`db.dehydrate(): String`](#dbdehydrate-string)\n      - [`db.hydrate(stringifiedDatabase:String): Promise<void>`](#dbhydratestringifieddatabasestring-promisevoid)\n      - [`db.selectMany(table:String, filter:Function|Array = SELECT_ALL_FILTER, withTableType:Boolean|String = false): Promise<Array>`](#dbselectmanytablestring-filterfunctionarray--select_all_filter-withtabletypebooleanstring--false-promisearray)\n      - [`db.selectOne(table:String, id:Number, withTableType:Boolean|String = false): Promise<Object>`](#dbselectonetablestring-idnumber-withtabletypebooleanstring--false-promiseobject)\n      - [`db.selectByUid(uid:String): Promise<Object>`](#dbselectbyuiduidstring-promiseobject)\n      - [`db.selectByLabel(table:String, label:String): Promise<Array>`](#dbselectbylabeltablestring-labelstring-promisearray)\n      - [`db.selectByLabels(table:String, labels:Array<String>): Promise<Array>`](#dbselectbylabelstablestring-labelsarraystring-promisearray)\n      - [`db.insertOne(table:String, value:Object): Promise<Integer>`](#dbinsertonetablestring-valueobject-promiseinteger)\n      - [`db.insertMany(table:String, values:Array<Object>): Promise<Array<Integer>>`](#dbinsertmanytablestring-valuesarrayobject-promisearrayinteger)\n      - [`db.updateOne(table:String, id:Integer, properties:Object): Promise<Boolean>`](#dbupdateonetablestring-idinteger-propertiesobject-promiseboolean)\n      - [`db.updateMany(table:String, filter:Function, properties:Object): Promise<Array<Integer>>`](#dbupdatemanytablestring-filterfunction-propertiesobject-promisearrayinteger)\n      - [`db.deleteOne(table:String, id:Integer): Promise<Boolean>`](#dbdeleteonetablestring-idinteger-promiseboolean)\n      - [`db.deleteMany(table:String, filter:Function): Promise<Array<Integer>>`](#dbdeletemanytablestring-filterfunction-promisearrayinteger)\n      - [`db.renameTable(table:String, newName:String): Promise<Boolean>`](#dbrenametabletablestring-newnamestring-promiseboolean)\n      - [`db.renameColumn(table:String, column:String, newName:String): Promise<Boolean>`](#dbrenamecolumntablestring-columnstring-newnamestring-promiseboolean)\n      - [`db.addTable(table:String): Promise<Boolean>`](#dbaddtabletablestring-promiseboolean)\n      - [`db.addColumn(table:String, column:String, metadata:Object): Promise<Boolean>`](#dbaddcolumntablestring-columnstring-metadataobject-promiseboolean)\n      - [`db.dropTable(table:String): Promise<Boolean>`](#dbdroptabletablestring-promiseboolean)\n      - [`db.dropColumn(table:String, column:String): Promise<Boolean>`](#dbdropcolumntablestring-columnstring-promiseboolean)\n      - [`db.modifyAll(table:String, modifier:Function, errorHandler:Function = console.log): Promise<Array>`](#dbmodifyalltablestring-modifierfunction-errorhandlerfunction--consolelog-promisearray)\n      - [`db.expandRecords(sourceTable:String, dataset:Array, expandSpec:Object): Promise<Array>`](#dbexpandrecordssourcetablestring-datasetarray-expandspecobject-promisearray)\n      - [`db.attachRecords(sourceTable:String, newColumn:String, referredTable:String, referredColumn:String, dataset:Array): Promise<Array>`](#dbattachrecordssourcetablestring-newcolumnstring-referredtablestring-referredcolumnstring-datasetarray-promisearray)\n  - [Server API](#server-api)\n      - [`server = db.createServer(port:Integer):BasicServer`](#server--dbcreateserverportintegerbasicserver)\n      - [`server.start(port:Integer = this.$port):Promise`](#serverstartportinteger--thisportpromise)\n      - [`server.login(alias:String|null, email:String|null, password:String):Promise<String>`](#serverloginaliasstringnull-emailstringnull-passwordstringpromisestring)\n      - [`server.logout(token:String):Promise<Boolean>`](#serverlogouttokenstringpromiseboolean)\n      - [`server.authenticateRequest(request:ExpressRequest):Promise<Object|Boolean>`](#serverauthenticaterequestrequestexpressrequestpromiseobjectboolean)\n      - [`server.getFirewall():AsyncFunction`](#servergetfirewallasyncfunction)\n      - [`server.setFirewall(firewallCode:String):BasicServer`](#serversetfirewallfirewallcodestringbasicserver)\n      - [`server.triggerFirewall(operation:String, args:Array, authenticationToken:String, request:ExpressRequest, response:ExpressResponse)`](#servertriggerfirewalloperationstring-argsarray-authenticationtokenstring-requestexpressrequest-responseexpressresponse)\n      - [`server.stop():BasicServer`](#serverstopbasicserver)\n      - [`server.clone():BasicServer`](#serverclonebasicserver)\n      - [`server.generateSessionToken():String`](#servergeneratesessiontokenstring)\n      - [`server.onAuthenticate(opcode:String, args:Array, authenticationToken:String = null, request:ExpressRequest = null, response:ExpressResponse = null)`:String](#serveronauthenticateopcodestring-argsarray-authenticationtokenstring--null-requestexpressrequest--null-responseexpressresponse--nullstring)\n      - [`server.operation(opcode:String, args:Array):Promise<any>`](#serveroperationopcodestring-argsarraypromiseany)\n  - [Dataset API](#dataset-api)\n      - [`proxy = db.createDataset(dataset:Array, table:String = null)`](#proxy--dbcreatedatasetdatasetarray-tablestring--null)\n      - [`proxy.$dataset:Array`](#proxydatasetarray)\n      - [`proxy.$database:Object`](#proxydatabaseobject)\n      - [`proxy.$table:String`](#proxytablestring)\n      - [`proxy.findBySelector(selectorList:Array = []):BasicDataset`](#proxyfindbyselectorselectorlistarray--basicdataset)\n      - [`proxy.setDataset(dataset:Array):BasicDataset`](#proxysetdatasetdatasetarraybasicdataset)\n      - [`proxy.setTable(table:String):BasicDataset`](#proxysettabletablestringbasicdataset)\n      - [`proxy.setDatabase(database:Object):BasicDataset`](#proxysetdatabasedatabaseobjectbasicdataset)\n      - [`proxy.getDataset():any`](#proxygetdatasetany)\n      - [`proxy.copy():BasicDataset`](#proxycopybasicdataset)\n      - [`proxy.clone():BasicDataset`](#proxyclonebasicdataset)\n      - [`proxy.deduplicate():BasicDataset`](#proxydeduplicatebasicdataset)\n      - [`proxy.filterById(id:String):BasicDataset`](#proxyfilterbyididstringbasicdataset)\n      - [`proxy.mapById(id:String):BasicDataset`](#proxymapbyididstringbasicdataset)\n      - [`proxy.flat():BasicDataset`](#proxyflatbasicdataset)\n      - [`proxy.hasAnyOf(list:Array):BasicDataset`](#proxyhasanyoflistarraybasicdataset)\n      - [`BasicDataset.hasAnyOf(list1:Array, list2:Array):BasicDataset`](#basicdatasethasanyoflist1array-list2arraybasicdataset)\n      - [`async proxy.filter(callback:Function):Promise<BasicDataset>`](#async-proxyfiltercallbackfunctionpromisebasicdataset)\n      - [`async proxy.map(callback:Function):Promise<BasicDataset>`](#async-proxymapcallbackfunctionpromisebasicdataset)\n      - [`async proxy.reduce(callback:Function, original:any = []):Promise<BasicDataset>`](#async-proxyreducecallbackfunction-originalany--promisebasicdataset)\n      - [`async proxy.modify(callback:Function):Promise<BasicDataset>`](#async-proxymodifycallbackfunctionpromisebasicdataset)\n      - [`async proxy.each(callback:Function):Promise<BasicDataset>`](#async-proxyeachcallbackfunctionpromisebasicdataset)\n      - [`proxy.filterSync(callback:Function):BasicDataset`](#proxyfiltersynccallbackfunctionbasicdataset)\n      - [`proxy.mapSync(callback:Function):BasicDataset`](#proxymapsynccallbackfunctionbasicdataset)\n      - [`proxy.reduceSync(callback:Function, original:any = []):BasicDataset`](#proxyreducesynccallbackfunction-originalany--basicdataset)\n      - [`proxy.eachSync(callback:Function):BasicDataset`](#proxyeachsynccallbackfunctionbasicdataset)\n      - [`proxy.modifySync(callback:Function):BasicDataset`](#proxymodifysynccallbackfunctionbasicdataset)\n      - [`proxy.debug(message:String):BasicDataset`](#proxydebugmessagestringbasicdataset)\n      - [`proxy.filterByEval(callbackSource:String):Promise<BasicDataset>`](#proxyfilterbyevalcallbacksourcestringpromisebasicdataset)\n      - [`proxy.mapByEval(callbackSource:String):Promise<BasicDataset>`](#proxymapbyevalcallbacksourcestringpromisebasicdataset)\n      - [`proxy.reduceByEval(callbackSource:String, original:any = []):Promise<BasicDataset>`](#proxyreducebyevalcallbacksourcestring-originalany--promisebasicdataset)\n      - [`proxy.eachByEval(callbackSource:String):Promise<BasicDataset>`](#proxyeachbyevalcallbacksourcestringpromisebasicdataset)\n      - [`proxy.modifyByEval(callbackSource:String):Promise<BasicDataset>`](#proxymodifybyevalcallbacksourcestringpromisebasicdataset)\n      - [`proxy.pipeByMatrix(signatures:Array):Promise<BasicDataset>`](#proxypipebymatrixsignaturesarraypromisebasicdataset)\n      - [`async proxy.groupByColumn(column:String):BasicDataset`](#async-proxygroupbycolumncolumnstringbasicdataset)\n      - [`async proxy.groupByColumns(columns:Array<String>):BasicDataset`](#async-proxygroupbycolumnscolumnsarraystringbasicdataset)\n      - [`async proxy.groupByCallback(callback:Function):Promise<BasicDataset>`](#async-proxygroupbycallbackcallbackfunctionpromisebasicdataset)\n      - [`async proxy.groupByCallbacks(callbacks:Array<Function>):Promise<BasicDataset>`](#async-proxygroupbycallbackscallbacksarrayfunctionpromisebasicdataset)\n      - [`async proxy.groupByEval(evalSource:String):Promise<BasicDataset>`](#async-proxygroupbyevalevalsourcestringpromisebasicdataset)\n      - [`async proxy.groupByEvals(evalsList:Array<String>):Promise<BasicDataset>`](#async-proxygroupbyevalsevalslistarraystringpromisebasicdataset)\n      - [`proxy.sortByColumn(column:String):BasicDataset`](#proxysortbycolumncolumnstringbasicdataset)\n      - [`proxy.sortByColumns(columns:Array<String>):BasicDataset`](#proxysortbycolumnscolumnsarraystringbasicdataset)\n      - [`proxy.sortByCallback(callback:Function):BasicDataset`](#proxysortbycallbackcallbackfunctionbasicdataset)\n      - [`proxy.sortByEval(source:String):BasicDataset`](#proxysortbyevalsourcestringbasicdataset)\n      - [`proxy.extendBy(overrider:Object = {}):BasicDataset`](#proxyextendbyoverriderobject--basicdataset)\n      - [`async proxy.expandRecords(sourceTable:String, expandSpec:Object = {}):Promise<BasicDataset>`](#async-proxyexpandrecordssourcetablestring-expandspecobject--promisebasicdataset)\n      - [`async proxy.attachRecords(sourceTable:String, newColumn:String, referredTable:String, referredColumn:String):Promise<BasicDataset>`](#async-proxyattachrecordssourcetablestring-newcolumnstring-referredtablestring-referredcolumnstringpromisebasicdataset)\n  - [Query API](#query-api)\n      - [`query = FlexibleDB.BasicQuery.from(overrider:Object = {})`](#query--flexibledbbasicqueryfromoverriderobject--)\n      - [`async query.run():Promise`](#async-queryrunpromise)\n      - [`query.steps:Array<String>`](#querystepsarraystring)\n      - [`query.onError:Function|String`](#queryonerrorfunctionstring)\n      - [`query.wrapAsAsyncFunction(code:String, parameters:Array<String>)`](#querywrapasasyncfunctioncodestring-parametersarraystring)\n  - [Tree API](#tree-api)\n      - [`tree = db.createTree(table:String, column:String):BasicTree`](#tree--dbcreatetreetablestring-columnstringbasictree)\n      - [`async tree.addBranchOf(data:Object, parent:Integer):Promise<Integer>`](#async-treeaddbranchofdataobject-parentintegerpromiseinteger)\n      - [`async tree.getBranchesOf(parent:Integer):Promise<Array<Object>>`](#async-treegetbranchesofparentintegerpromisearrayobject)\n      - [`async tree.dropBranch(id:Integer):Promise<Boolean>`](#async-treedropbranchidintegerpromiseboolean)\n  - [Tests](#tests)\n  - [Ejemplo práctico](#ejemplo-práctico)\n\n## Links\n\n- [Página en Github](https://github.com/allnulled/flexible-db)\n- [Página en NPM](https://www.npmjs.com/package/@allnulled/flexible-db)\n\n## Instalación\n\n```\nnpm i -s @allnulled/flexible-db\n```\n\n## Features\n\n- Soporta esquema estricto (obligatorio, no es tan flexible)\n- Soporta referencias de objetos y de listas externas\n- Soporta integridad de estas referencias\n- Soporta semáforos automáticamente en `node.js`\n   - Para que se pueda usar en servidores\n- Soporta los tipos:\n   - `\"boolean\"`\n   - `\"integer\"`\n   - `\"float\"`\n   - `\"string\"`\n   - `\"object\"`\n   - `\"array\"`\n   - `\"object-reference\"` (con integridad referencial)\n   - `\"array-reference\"` (con integridad referencial)\n- Soporta métodos de esquema\n- Soporta métodos de persistencia\n- Soporta métodos de CRUD\n- Soporta una API para proxificar datasets\n- Soporta una API para desplegar servidores HTTP\n- Soporta un lenguaje DSL para concentrar el control de la autentificación y autorización\n   - Con un sistema de eventos básicos de esquema y CRUD a disposición\n   - Con gestión automática para `login` y `logout`\n   - Con opción de autentificar usuarios y gestionar sesiones con `authenticateRequest`\n      - Comprometiendo parcialmente el esquema con tablas específicas en español\n\n## API\n\nLa API se descompone en varias:\n\n- [Database API](#database-api)\n- [Server API](#server-api)\n- [Dataset API](#dataset-api)\n- [Query API](#query-api)\n- [Tree API](#tree-api)\n\n## Database API\n\n#### `db = FlexibleDB.create(options:Object): Object`\n\nCrea una instancia de base de datos.\n\nDentro contiene:\n\n- `db.$ids`\n- `db.$data`\n- `db.$schema`\n\nAcepta opciones mediante `options:Object` donde puedes especificar:\n\n- `trace = true` si quieres activar el traceo de los métodos\n- `onPersist:Function` si quieres sobreescribir el método automático de persistencia\n   - La función recibe el objeto `db` que tiene el método `db.dehydrate()` al uso de persistencia fácil\n   - Puedes ver el `test-of-persistence.js` para ver un ejemplo de uso\n- `onTrigger:Function` si quieres establecer un método automático de trigger\n   - La función recibe los 3 parámetros:\n      - `event:String, parameters:Array, db:Object`\n   - Puedes ver el `test-of-trigger.js` para ver un ejemplo de uso\n- `onLock:AsyncFunction` si quieres sobreescribir el método de bloqueo de persistencia por defecto.\n- `onUnlock:AsyncFunction` si quieres sobreescribir el método de desbloqueo de persistencia por defecto.\n- `lockingFile:String` si quieres sobreescribir el fichero de bloqueo de persistencia por defecto. Si no, será `process.cwd() + \"/db-locker.txt\"`\n- `lockingCheckInterval` si quieres sobreescribir el intervalo de espera muerta en bloqueo de persistencia. Si no, será `0`.\n\n#### `db.getSchema(): Object`\n\nDevuelve el esquema de datos, en `this.$schema`.\n\n#### `db.getRelationsSchema(): Object`\n\nDevuelve el esquema de relaciones de datos, en *runtime*, se construye al vuelo.\n\nSe espera un objeto con:\n  \n - `<table>.<column>.(actives|passives)[*].quantity`: puede ser `1` o `N`.\n - `<table>.<column>.(actives|passives)[*].referredTable`: puede ser una tabla del `db.$schema`.\n\nEn el `*` se accede a una de dos:\n - o a la `<tableId><columnId>` en *relaciones activas*.\n - o a la `<referredTable>.<columnId>` en *relaciones pasivas*.\n\n#### `db.setSchema(schema:Object): void`\n\nEl `schema` debe ser un objeto válido que represente al esquema de datos.\n\nSe pondrá en `this.$schema`.\n\nSe espera un objeto que:\n  - contenga: `<table>.<column>.type = `\n     - `\"boolean\"`\n     - `\"integer\"`\n     - `\"float\"`\n     - `\"string\"`\n     - `\"object\"`\n     - `\"array\"`\n     - `\"object-reference\"`\n        - con `<table>.<column>.referredTable = <una tabla conocida por schema>`\n     - `\"array-reference\"`\n        - con `<table>.<column>.referredTable = <una tabla conocida por schema>`\n  - contenga opcionalmente: `<table>.<column>.nullable = true`\n     - Provocará error si ese campo se pasa como `null`\n  - contenga opcionalmente: `<table>.<column>.unique = true`\n     - Provocará error si ese campo está repetido en otra row\n     - No provocará error si ese campo se pasa como `null`\n  - contenga opcionalmente: `<table>.<column>.defaultType = 'js'`\n     - Provocará que el valor `defaut` especificado sirva como código fuente de una función que será:\n        - evaluada en runtime\n        - para sacar el valor `default`.\n  - contenga opcionalmente: `<table>.<column>.default = ?`\n     - Provocará que al llegar como `undefined` el valor, aplicará el `defaut` especificado.\n     - Si el `typeof` da `function`, evaluará la función y tomará su retorno\n     - Si el `<table>.<column>.defaultType === 'js'`, tomará `default` como código de una función en JavaScript.\n        - En este caso se espera una sentencia `\"return  *\";` explícita en el `default`.\n\n#### `db.dehydrate(): String`\n\nDevuelve un `String` representando la base de datos.\n\n#### `db.hydrate(stringifiedDatabase:String): Promise<void>`\n\nSobreescribe los `$ids`, `$data` y `$schema` de la base de datos con el `stringifiedDatabase` proporcionado.\n\nEn `stringifiedDatabase` se espera un `String` como el que devuelve `db.dehydrate()`.\n\n#### `db.selectMany(table:String, filter:Function|Array = SELECT_ALL_FILTER, withTableType:Boolean|String = false): Promise<Array>`\n\nDevuelve un `Array` con los registros donde la función `filter` ha devuelto `true`.\n\nEl `filter` también puede ser un array de operaciones booleanas, que aceptan los 3 parámetros típicos:\n\n1. `columna`: nombre de la columna que queremos evaluar.\n2. `operador`: operación lógica que queremos hacer, donde cabe poner:\n   - `=`: igual a\n   - `!=`: diferente de \n   - `<`: menor que\n   - `<=`: menor o igual que\n   - `>`: mayor que\n   - `>=`: mayor o igual que\n   - `is null`: es nulo\n      - No usa parámetro objeto\n   - `is not null`: no es nulo\n      - No usa parámetro objeto\n   - `has`: cuando la columna es un array, buscará el elemento especificado dentro\n      - Debe usarse con columnas de tipo array\n   - `has not`: igual pero a la inversa\n      - Debe usarse con columnas de tipo array\n   - `in`: cuando el parámetro objeto es un array, buscará que la columna no esté dentro\n      - Debe usarse con un array\n   - `not in`: igual pero a la inversa\n      - Debe usarse con un array\n3. `objeto`: el parámetro con el que se compara.\n\nEl flag `withTableType`, si `true`, adjunta el campo `type = <table>` en las rows.\n\nSi el flag `withTableType` es un `string`, utilizará ese `string` como propiedad para indicar la tabla.\n\n#### `db.selectOne(table:String, id:Number, withTableType:Boolean|String = false): Promise<Object>`\n\nDevuelve un `Object` con el registro que tiene el `id` especificado o lanza error.\n\nEl flag `withTableType`, si `true`, adjunta el campo `type = <table>` en la row.\n\nSi el flag `withTableType` es un `string`, utilizará ese `string` como propiedad para indicar la tabla.\n\n#### `db.selectByUid(uid:String): Promise<Object>`\n\nDevuelve un `Object` con el registro que tiene el `uid` especificado o lanza error.\n\nEl flag `withTableType` se sobreentiende como `true`.\n\nNo es necesario especificar la `table` porque `uid` es universal.\n\n#### `db.selectByLabel(table:String, label:String): Promise<Array>`\n\nDevuelve un `Array` con los registros en los que aparezca `label` en las columnas con `label:true`.\n\nBuscará en todas las columnas donde `label:true` aparezca.\n\nSi la columna es tipo `string`, buscará con `===`.\n\nSi la columna es tipo `array`, buscará con `.indexOf`.\n\n#### `db.selectByLabels(table:String, labels:Array<String>): Promise<Array>`\n\nVariante del método anterior donde se le pasa una lista de `labels` para buscar.\n\nSi la columna es tipo `string`, buscará con `labels.indexOf`.\n\nSi la columna es tipo `array`, buscará con `BasicDataset.hasAnyOf`.\n\n#### `db.insertOne(table:String, value:Object): Promise<Integer>`\n\nInserta un registro y devuelve su `id`.\n\n#### `db.insertMany(table:String, values:Array<Object>): Promise<Array<Integer>>`\n\nInserta múltiples registros y devuelve sus `ids`.\n\n#### `db.updateOne(table:String, id:Integer, properties:Object): Promise<Boolean>`\n\nActualiza un registro concreto y devuelve `true`.\n\n#### `db.updateMany(table:String, filter:Function, properties:Object): Promise<Array<Integer>>`\n\nActualiza múltiples registros y devuelve sus `id`s en un `Array`.\n\n#### `db.deleteOne(table:String, id:Integer): Promise<Boolean>`\n\nElimina un registro concreto y devuelve sus `true`.\n\n#### `db.deleteMany(table:String, filter:Function): Promise<Array<Integer>>`\n\nElimina múltiples registros y devuelve sus `id`s en un `Array`.\n\n#### `db.renameTable(table:String, newName:String): Promise<Boolean>`\n\nRenombra una tabla a otro nombre y devuelve `true`.\n\n#### `db.renameColumn(table:String, column:String, newName:String): Promise<Boolean>`\n\nRenombra una columna a otro nombre y devuelve `true`.\n\n#### `db.addTable(table:String): Promise<Boolean>`\n\nAñade una tabla en el `db.$schema` y devuelve `true`.\n\n#### `db.addColumn(table:String, column:String, metadata:Object): Promise<Boolean>`\n\nAñade una columna en el `db.$schema` y devuelve `true`.\n\n#### `db.dropTable(table:String): Promise<Boolean>`\n\nElimina una tabla en del `db.$schema` y devuelve `true`. Comprueba integridad referencial antes.\n\n#### `db.dropColumn(table:String, column:String): Promise<Boolean>`\n\nElimina una columna del `db.$schema` y devuelve `true`. No necesita comprobación de integridad referencial.\n\n#### `db.modifyAll(table:String, modifier:Function, errorHandler:Function = console.log): Promise<Array>`\n\nAplica una función, que debe devolver las propiedades que se cambian con respecto al original, a todas las rows de la tabla especificada. La función recibe:\n\n- `it`: la row que se va a modificar.\n   - Es un objeto *copia* del original, para que si se hacen cambios, no repercuta a `db.$data[table][id]`.\n- `id`: el `id` de la row en la que se está iterando. Puede usarse para acceder al modelo real (y no solamente la copia anterior).\n\nDevuelve los `id`s donde ha saltado un error y no se ha aplicado el cambio.\n\nEn caso de error, se ejecutará el `errorHandler` que por defecto es un `console.log`. Recibe:\n\n- `error`: el error.\n- `originalValue`: el valor original sin el `id`.\n- `id`: el `id` de la row que ha fallado.\n- `counter`: un contador de la iteración en la que ha fallado.\n\n#### `db.expandRecords(sourceTable:String, dataset:Array, expandSpec:Object): Promise<Array>`\n\nSirve para adjuntar datos de esta tabla que se refieren a otras tablas, de forma recursiva.\n\n- El parámetro `sourceTable` se refiere a la `db.$schema[sourceTable]` correspondiente al `dataset`.\n- El parámetro `dataset` se refiere al conjunto de datos en sí.\n- El parámetro `expandSpec` cumple con la función de *saber qué campos se tienen que expandir* solamente, y lo consigue:\n   - Al poner un objeto con la clave `persona` entiendes que en `db.$schema[sourceTable].persona` hay una `array-reference` o `object-reference`.\n   - Al poner otro objeto bajo `persona` en lugar de un simple `true`, añades que `persona` tiene otros tipos que queremos expandir.\n   - De esta forma puedes recursivamente, por ejemplo:\n\n```js\ndb.expandRecords(\"Usuario\", dataset, { persona: { pais: true } });\n```\n\nCon este simple ejemplo, arrastramos `Usuario.persona` » `Persona.pais` » `Pais.*` automáticamente.\n\nEn este ejemplo estamos suponiendo un `schema` al uso.\n\nPero puedes ver los tests en [`test-of-complex-query.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-complex-query.js).\n\n\n#### `db.attachRecords(sourceTable:String, newColumn:String, referredTable:String, referredColumn:String, dataset:Array): Promise<Array>`\n\nSirve para adjuntar datos de otras tablas que se refieren al tipo de esta tabla, sea como `array-reference` o como `object-reference`.\n\nAmplía el `dataset` con una columna `newColumn` con todos los matches referidos en `db.$schema[referredTable][referredColumn]` del `dataset`.\n\nRequiere de relaciones `array-reference` o `object-reference`, concretamente que `db.$schema[sourceTable]` sea la `referredTable` de `db.$schema[referredTable][referredColumn]`.\n\n- El parámetro `sourceTable` indica el tipo de `db.$schema` que se considera a `dataset`.\n- El parámetro `newColumn` indica la nueva columna para `dataset` que se va a utilizar para adjuntar los datos.\n- El parámetro `referredTable` indica la tabla del `db.$schema` que contiene una columna que apunta con `array-reference` o `object-reference` a la tabla de `sourceTable`.\n- El parámetro `referredColumn` indica la columna de `db.$schema[referredTable]` que apunta con `array-reference` o `object-reference` a la tabla de `sourceTable`.\n\n## Server API\n\n#### `server = db.createServer(port:Integer):BasicServer`\n\nCrea una instancia de `new FlexibleDB.BasicServer` si está encuentra `global`, que sobreentiende entorno `node.js`.\n\nA continuación se expone la interfaz de `FlexibleDB.BasicServer` mediante la instancia `server`.\n\n#### `server.start(port:Integer = this.$port):Promise`\n\nInicia un servidor en el puerto especificado. Si había alguno corriendo, lo sobreescribirá sin importarle su estado.\n\nEl servidor va a esperar 2 parámetros:\n\n```js\nrequest.body.opcode:String = \"unknown\"\nrequest.body.parameters:Array = []\n```\n\n#### `server.login(alias:String|null, email:String|null, password:String):Promise<String>`\n\nPermite iniciar o recuperar una sesión del sistema. Utiliza o `Usuario.alias` o `Usuario.email`, y luego `Usuario.password`.\n\n#### `server.logout(token:String):Promise<Boolean>`\n\nPermite finalizar una sesión del sistema. Utiliza un `Sesion.token`.\n\n#### `server.authenticateRequest(request:ExpressRequest):Promise<Object|Boolean>`\n\nPermite autentificar una `request:ExpressRequest`.\n\nEsto inflará el campo `request.authentication` con un `Object`.\n\nUtiliza los campos `Sesion.token`, `Sesion.usuario`, `Usuario.id`, `Grupo.id`, `Permiso.id`.\n\nEste método se deja de libre uso, no se llama en el código explícitamente, y se reserva para utilizar en el `firewall` en función de los requisitos de la aplicación servidor.\n\nEl procedimiento consiste en:\n\n- Ir a buscar en `request.body.authentication` el `Sesion.token`\n- De ahí arrastrar `usuario:Usuario`, `grupos:Array<Grupo>` y `permisos:Array<Permiso>`\n\nLa vuelta es un objeto con:\n\n- `sesion:Sesion`\n- `usuario:Usuario`\n- `grupos:Array<Grupo>`\n- `permisos:Array<Permiso>`\n\nSe devuelve una `Promise` porque es asíncrono ya que usa varios `selectMany`/`selectOne`.\n\nPuede devolver `false:Boolean` si no encuentra ninguna sesión por el token proporcionado.\n\n#### `server.getFirewall():AsyncFunction`\n\nPermite acceder a la función compilada del firewall.\n\n#### `server.setFirewall(firewallCode:String):BasicServer`\n\nPermite establecer la lógica del firewall que se aplicará en las operaciones `server.operation`.\n\nEste método está pensado para `node.js` y usa `require` para importar el parser del lenguaje del firewall.\n\nEs necesario dominar un pequeño lenguaje intermedio para poder establecer reglas del firewall bien.\n\nEl fuente tiene como core esta sintaxis:\n\n```pegjs\nController_sentence = Event_sentence\n    / Start_process_sentence\n    / Break_process_sentence\n    / Create_sentence\n    / Assign_sentence\n    / Always_sentence\n    / Define_block_sentence\n    / Follow_block_sentence\n    / Throw_sentence\n    / If_sentence\n    / Native_expression\n```\n\nLuego para ver ejemplo completo está el fuente de las reglas del firewall básicas para cubrir las operaciones de la base de datos.\n\n```\ndefine block authentication {\n    start process authentication {\n        always {{ /* }}\n        always {{ console.log(\"url\", request.originalUrl); }}\n        always {{ console.log(\"operation\", operation); }}\n        always {{ console.log(\"model\", model); }}\n        always {{ console.log(\"args\", args); }}\n        always {{ console.log(\"authenticationToken\", authenticationToken); }}\n        always {{ console.log(\"authentication\", authentication); }}\n        always {{ */ }}\n        if not authentication then throw {{ new Error(\"The request requires authentication at this sensible point [52684251]\") }}\n    }\n}\n\ndefine block authorization {\n    start process authorization {\n        create permissions as {{ authentication.permisos.map(it => it.operacion) }}\n        always {{ // console.log(\"permissions\", permissions) }}\n        create hasOperationPermission as {{ permissions.indexOf(\"server.\" + operation) !== -1 }}\n        if hasOperationPermission then break process authorization\n        throw {{ new Error(\"The request requires specific privilege «server.\" + operation + \"» at this sensible point [12324688282]\") }}\n    }\n}\n\ndefine block basic_auth_steps {\n    create authentication as {{ await this.authenticateRequest(request) }}\n    follow block authentication\n    follow block authorization\n}\n\nevent on \n  operation\n    \"addTable\"\n    \"addColumn\"\n    \"renameTable\"\n    \"renameColumn\"\n    \"dropTable\"\n    \"dropColumn\"\n    \"setSchema\"\n  then follow block basic_auth_steps\n\nevent on\n  model\n    \"Usuario\"\n    \"Grupo\"\n    \"Sesion\"\n  operation\n    \"insertOne\"\n    \"insertMany\"\n    \"updateOne\"\n    \"updateMany\"\n    \"deleteOne\"\n    \"deleteMany\"\n  then follow block basic_auth_steps\n```\n\nEsto producirá un `javascript` bastante a bajo nivel que permitirá todo el juego de eventos y lógica cruzada.\n\nPero es muy importante aprender este lenguaje para meterse en la lógica del firewall.\n\nEl ejemplo todavía no es muy completo, pero el lenguaje permite:\n\n  - crear variables con `create it as {{ 5000 + 5 }}`\n  - asignar variables con `assign it to {{ 2000 }}`\n  - llamar a código libre con `always {{ console.log(\"printing things\") }}`\n  - condicionales con `if {{ val }} then { ... }`\n     - profundos con `else if {{ val }} then { ... }`\n     - por defecto con `else then { ... }`\n  - los `event on` son `if` en realidad\n  - lanzar errores con `throw {{ new Error(\"Whatever\") }}`\n  - iniciar un proceso con `start process Process_id { ... }`\n  - romper un proceso con `break process Process_id`\n  - definir un bloque con `define block Block_id { ... }`\n     - esto sirve para definir macros en memoria\n     - no afecta al código de salida\n  - imprimir un bloque con `follow block Block_id`\n     - esto sirve para imprimir un bloque\n     - afecta al código de salida en tanto que se va a imprimir tal cual el bloque\n  - agrupar variables para expresiones booleanas\n     - tiene parámetros `(~)` para agrupar variables y/o expresiones\n     - tiene parámetros `not ~` para negar variables y/o expresiones\n     - tiene parámetros `~ and ~`  para emplear conjunción lógica entre variables y/o expresiones\n     - tiene parámetros `~ or ~`  para emplear disyunción lógica entre variables y/o expresiones\n\nEste lenguaje busca la **alta legibilidad** en las lógicas del **control de negocio**.\n\n#### `server.triggerFirewall(operation:String, args:Array, authenticationToken:String, request:ExpressRequest, response:ExpressResponse)`\n\nPermite hacer la llamada a la función compilada de `server.setFirewall(firewallCode:String)`.\n\nLa función inyecta los siguientes parámetros:\n\n- `operation:String`: el método que se va a utilizar en esta llamada\n- `args:Array`: los parámetros que se le pasan al método de `operation` en formato `metodo(...parametros)`, por eso siempre es array.\n- `authenticationToken:String`: el token de sesión\n- `request:ExpressRequest`: la petición de `express`\n- `response:ExpressResponse`: la response de `express`\n- `model:String`: en principio es `args[0]` que coincide en muchas con el `model` pero dependerá de `operation` si este argumento tiene sentido o es un valor no relevante, porque no siempre `args[0]` es el modelo.\n\nEsto significa que en el script que ponemos en `server.setFirewall(source)` existen por lo menos estos parametros inyectados en el espacio de nombres de la `AsyncFunction`.\n\n#### `server.stop():BasicServer`\n\nPermite parar el servidor que estuviera corriendo y encadenar otros métodos.\n\n#### `server.clone():BasicServer`\n\nDevuelve otra instancia de `BasicServer.from(...server)`.\n\n#### `server.generateSessionToken():String`\n\nMétodo utilitario para generar tokens de sesión.\n\n#### `server.onAuthenticate(opcode:String, args:Array, authenticationToken:String = null, request:ExpressRequest = null, response:ExpressResponse = null)`:String\n\nMétodo usado internamente en `server.operation` para autentificar las peticiones.\n\nPrincipalmente, lo que este método hace es llamar al firewall con `server.triggerFirewall(...)`.\n\nEste método es llamado nada más iniciar `server.operation` si se han validado los parámetros.\n\nEstá aparte para que se pueda sobreescribir con una clase nueva si se quiere.\n\n#### `server.operation(opcode:String, args:Array):Promise<any>`\n\nEjecuta una acción contemplada en la API de `operation` pasándole los parámetros especificados.\n\nLos `opcode` válidos actualmente solo son los **nombres finales** de los **métodos** de la API. Aquí el switch cerrado de operaciones del `BasicServer.operation`:\n\n```js\nasync operation(opcode, args = [], authenticationToken = null, request = null, response = null) {\n  assertion(typeof opcode === \"string\", `Parameter «opcode» must be a string on «operation» specifically «${opcode}»`);\n  assertion(Array.isArray(args), `Parameter «args» must be an array on «operation» specifically «${opcode}»`);\n  let output = null;\n  switch(opcode) {\n    case \"login\": {\n      return await this.login(...args);\n    }\n  }\n  assertion(typeof authenticationToken === \"string\", `Parameter «authenticationToken» must be a string on «operation» specifically «${opcode}»`);\n  assertion(typeof request === \"object\", `Parameter «request» must be an object on «operation» specifically «${opcode}»`);\n  assertion(typeof response === \"object\", `Parameter «response» must be an object on «operation» specifically «${opcode}»`);\n  await this.onAuthenticate(opcode, args, authenticationToken, request, response);\n  switch (opcode) {\n    case \"logout\": {\n      output = await this.logout(...args);\n      break;\n    }\n    case \"selectOne\": {\n      output = await this.$database.selectOne(...args);\n      break;\n    }\n    case \"selectOne\": {\n      output = await this.$database.selectOne(...args);\n      break;\n    }\n    case \"selectMany\": {\n      output = await this.$database.selectMany(...args);\n      break;\n    }\n    case \"insertOne\": {\n      output = await this.$database.insertOne(...args);\n      break;\n    }\n    case \"insertMany\": {\n      output = await this.$database.insertMany(...args);\n      break;\n    }\n    case \"updateOne\": {\n      output = await this.$database.updateOne(...args);\n      break;\n    }\n    case \"updateMany\": {\n      output = await this.$database.updateMany(...args);\n      break;\n    }\n    case \"deleteOne\": {\n      output = await this.$database.deleteOne(...args);\n      break;\n    }\n    case \"deleteMany\": {\n      output = await this.$database.deleteMany(...args);\n      break;\n    }\n    case \"addTable\": {\n      output = await this.$database.addTable(...args);\n      break;\n    }\n    case \"addColumn\": {\n      output = await this.$database.addColumn(...args);\n      break;\n    }\n    case \"renameTable\": {\n      output = await this.$database.renameTable(...args);\n      break;\n    }\n    case \"renameColumn\": {\n      output = await this.$database.renameColumn(...args);\n      break;\n    }\n    case \"dropTable\": {\n      output = await this.$database.dropTable(...args);\n      break;\n    }\n    case \"dropColumn\": {\n      output = await this.$database.dropColumn(...args);\n      break;\n    }\n    case \"getSchema\": {\n      output = await this.$database.getSchema(...args);\n      break;\n    }\n    case \"setSchema\": {\n      output = await this.$database.setSchema(...args);\n      break;\n    }\n    default: {\n      throw new Error(`Parameter «opcode» must be a known opcode on «BasicServer.operation»`);\n    }\n  }\n  return output;\n}\n```\n\nLas que usan `Function` pueden funcionar con una serie de reglas:\n\n```js\nawait server.operation(\"selectMany\", [\"Grupos\", [\n  [\"id\", \"=\", 1]\n]]);\n```\n\nEste subset para selectores permite operaciones por servidor que sean seguras.\n\nSe permiten los siguientes operadores, formando sentencias encadenadas por ` && ` lógico.\n\nAquí es donde se transforman en operaciones:\n\n```js\nswitch(op) {\n  case \"=\": {\n    isValid = isValid && row[column] === target;\n    break;\n  }\n  case \"!=\": {\n    isValid = isValid && (row[column] !== target);\n    break;\n  }\n  case \"<\": {\n    isValid = isValid && (row[column] < target);\n    break;\n  }\n  case \">\": {\n    isValid = isValid && (row[column] > target);\n    break;\n  }\n  case \"<=\": {\n    isValid = isValid && (row[column] <= target);\n    break;\n  }\n  case \">=\": {\n    isValid = isValid && (row[column] >= target);\n    break;\n  }\n  case \"is null\": {\n    isValid = isValid && (row[column] === null);\n    break;\n  }\n  case \"is not null\": {\n    isValid = isValid && (row[column] !== null);\n    break;\n  }\n  case \"is in\": {\n    isValid = isValid && (target.indexOf(row[column]) !== -1);\n    break;\n  }\n  case \"is not in\": {\n    isValid = isValid && (target.indexOf(row[column]) === -1);\n    break;\n  }\n  case \"has\": {\n    isValid = isValid && (row[column].indexOf(target) !== -1);\n    break;\n  }\n  case \"has not\": {\n    isValid = isValid && (row[column].indexOf(target) === -1);\n    break;\n  }\n}\n```\n\n## Dataset API\n\n#### `proxy = db.createDataset(dataset:Array, table:String = null)`\n\nCrea una instancia de `new FlexibleDB.BasicDataset(dataset, table, db)` sobreentendiendo la `db` propia.\n\nA continuación se expone la interfaz de `FlexibleDB.BasicDataset` mediante la instancia `proxy`.\n\n#### `proxy.$dataset:Array`\n\nEl `dataset` sobre el que se está iterando.\n\n#### `proxy.$database:Object`\n\nLa `database` que se está usando para tipos.\n\n#### `proxy.$table:String`\n\nLa `table` que se sobreentiende como tipo del `dataset`.\n\n#### `proxy.findBySelector(selectorList:Array = []):BasicDataset`\n\nPermite cambiar el dataset con una subselección interna y encadenar otros métodos.\n\nEl juego de selectores permite:\n\n- `[\"id\"]`, donde:\n   - si el `$dataset` es un `array` cogerá la propiedad `id` de todos los items, la flateneará y la deduplicará.\n   - si el `$dataset` es un `object` cogerá la propiedad `id` del objeto\n- `[\"*\", \"*\", \"ids\"]`, donde:\n   - si el `$dataset` es un `array` cogerá las propiedad `ids` de todos los items, pero no las flateneará ni deduplicará.\n   - si el `$dataset` es un `object` pasará el objeto de rows a columnas, y luego seleccionará el `ids`, pero no lo flateneará ni deduplicará.\n\nEl doble asterisco `\"*\", \"*\"` permite pasar la vista de `rows` a `columnas`, entonces sirve para agrupar los valores por columnas.\n\nEn el [`test-of-select-by-uid-and-others.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-select-by-uid-and-others.js) está incluida una pequeña prueba.\n\n#### `proxy.setDataset(dataset:Array):BasicDataset`\n\nPermite cambiar el dataset y encadenar otros métodos.\n\n#### `proxy.setTable(table:String):BasicDataset`\n\nPermite cambiar la tabla del dataset y encadenar otros métodos.\n\n#### `proxy.setDatabase(database:Object):BasicDataset`\n\nPermite cambiar la base de datos del dataset y encadenar otros métodos.\n\n#### `proxy.getDataset():any`\n\nPermite obtener el dataset propiamente.\n\n#### `proxy.copy():BasicDataset`\n\nPermite hacer una copia JSON (con `stringify` y `parse`) del dataset y encadenar otros métodos.\n\n#### `proxy.clone():BasicDataset`\n\nPermite hacer un clon del `BasicDataset` y encadenar otros métodos.\n\nEs útil para iterar datos de un subset o al menos una copia diferente de proxy.\n\n#### `proxy.deduplicate():BasicDataset`\n\nPermite desduplicar un conjunto de datos. Utiliza el `row.id` y si no lo encuentra, el `row` directamente.\n\n\n#### `proxy.filterById(id:String):BasicDataset`\n\nPermite cambiar el `this.$dataset` aplicando un `filter` por una columna concreta especificada y encadenar otros métodos.\n\n#### `proxy.mapById(id:String):BasicDataset`\n\nPermite cambiar el `this.$dataset` aplicando un `map` por una columna concreta especificada y encadenar otros métodos.\n\n#### `proxy.flat():BasicDataset`\n\nPermite cambiar el `this.$dataset` aplicando un `flat` que es que si una row es 1 array, la junta como ítems no como array con las otras rows, y encadenar otros métodos.\n\n#### `proxy.hasAnyOf(list:Array):BasicDataset`\n\nPermite saber si `proxy.$dataset:Array` contiene alguno de los ítems de `list:Array`.\n\n#### `BasicDataset.hasAnyOf(list1:Array, list2:Array):BasicDataset`\n\nLo mismo que la anterior pero sin sobreentender `this.$dataset` como `list1`.\n\n#### `async proxy.filter(callback:Function):Promise<BasicDataset>`\n\nPermite hacer `filter` asíncronamente para operar sobre el dataset.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\nLa firma contractual de la función es la típica de `Array.prototype.filter`.\n\n#### `async proxy.map(callback:Function):Promise<BasicDataset>`\n\nPermite hacer `map` asíncronamente para operar sobre el dataset.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\nLa firma contractual de la función es la típica de `Array.prototype.map`.\n\n#### `async proxy.reduce(callback:Function, original:any = []):Promise<BasicDataset>`\n\nPermite hacer `reduce` asíncronamente para operar sobre el dataset.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\nLa firma contractual de la función es la típica de `Array.prototype.reduce`.\n\n#### `async proxy.modify(callback:Function):Promise<BasicDataset>`\n\nPermite hacer `modify` asíncronamente para operar sobre el dataset.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\nLa firma del método incluye a:\n\n- `this` como el `BasicDataset`\n- `arguments[0]` como el `this.$dataset` del `BasicDataset`\n\n#### `async proxy.each(callback:Function):Promise<BasicDataset>`\n\nPermite hacer `each` asíncronamente para operar sobre el dataset.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\nLa firma contractual de la función es la típica de `Array.prototype.each`.\n\n#### `proxy.filterSync(callback:Function):BasicDataset`\n\nVersión síncrona del mismo método. Es la misma firma contractual que `Array.prototype.filter` excepto porque permite encadenar otros métodos.\n\n#### `proxy.mapSync(callback:Function):BasicDataset`\n\nVersión síncrona del mismo método. Es la misma firma contractual que `Array.prototype.map` excepto porque permite encadenar otros métodos.\n\n#### `proxy.reduceSync(callback:Function, original:any = []):BasicDataset`\n\nVersión síncrona del mismo método. Es la misma firma contractual que `Array.prototype.reduce` excepto porque permite encadenar otros métodos.\n\n#### `proxy.eachSync(callback:Function):BasicDataset`\n\nVersión síncrona del mismo método. Es la misma firma contractual que `Array.prototype.each` excepto porque permite encadenar otros métodos.\n\n#### `proxy.modifySync(callback:Function):BasicDataset`\n\nVersión síncrona del mismo método.\n\n#### `proxy.debug(message:String):BasicDataset`\n\nPermite imprimir el `proxy.$dataset` adjuntando algún mensaje y encadenar otros métodos.\n\n#### `proxy.filterByEval(callbackSource:String):Promise<BasicDataset>`\n\nVersión evaluativa de código, del mismo método. Tiene inyección de parámetros con:\n\n- `it:Object`: la row del `Array`.\n- `i:Integer`: el índice de la row.\n\nSe espera código asíncrono directamente en un `string` para la función del método equivalente asíncrono.\n\nSe devuelve a sí misma pero en una `Promise` porque es código asíncrono.\n\n#### `proxy.mapByEval(callbackSource:String):Promise<BasicDataset>`\n\nVersión evaluativa de código, del mismo método. Tiene inyección de parámetros con:\n\n- `it:Object`: la row del `Array`.\n- `i:Integer`: el índice de la row.\n\nSe espera código asíncrono directamente en un `string` para la función del método equivalente asíncrono.\n\nSe devuelve a sí misma pero en una `Promise` porque es código asíncrono.\n\n#### `proxy.reduceByEval(callbackSource:String, original:any = []):Promise<BasicDataset>`\n\nVersión evaluativa de código, del mismo método. Tiene inyección de parámetros con:\n\n- `output:Array`: el `Array`.\n- `it:Object`: la row del `Array`.\n- `i:Integer`: el índice de la row.\n\nSe espera código asíncrono directamente en un `string` para la función del método equivalente asíncrono.\n\nSe devuelve a sí misma pero en una `Promise` porque es código asíncrono.\n\n#### `proxy.eachByEval(callbackSource:String):Promise<BasicDataset>`\n\nVersión evaluativa de código, del mismo método. Tiene inyección de parámetros con:\n\n- `it:Object`: la row del `Array`.\n- `i:Integer`: el índice de la row.\n\nSe espera código asíncrono directamente en un `string` para la función del método equivalente asíncrono.\n\nSe devuelve a sí misma pero en una `Promise` porque es código asíncrono.\n\n#### `proxy.modifyByEval(callbackSource:String):Promise<BasicDataset>`\n\nVersión evaluativa de código, del mismo método. Tiene inyección de parámetros con:\n\n- `input:any`: el `proxy.$dataset`.\n- `dataset:BasicDataset`: el `proxy`.\n\nSe espera código asíncrono directamente en un `string` para la función del método equivalente asíncrono.\n\nSe devuelve a sí misma pero en una `Promise` porque es código asíncrono.\n\n#### `proxy.pipeByMatrix(signatures:Array):Promise<BasicDataset>`\n\nPermite procesar el `proxy.$dataset` por diferentes métodos del proxy, de golpe.\n\nEn `signatures:Array` se espera un conjunto de reglas donde:\n\n- `signatures[i][0]:String`: nombre del método del mismo `proxy`.\n- `signatures[i][1]:Array`: parámetros de la llamada al método.\n\nDe esta forma, puede usarse así:\n\n```js\nawait proxy.pipeByMatrix([\n  [\"mapByEval\", \"return await this.$database.selectOne('Permiso', it)\"]\n  [\"mapByEval\", \"return it.operacion\"]\n]);\n```\n\n#### `async proxy.groupByColumn(column:String):BasicDataset`\n\nPermite mutar el `proxy.$dataset` a un objeto con propiedades los valores de `proxy.$dataset[*][column]`.\n\nEsas propiedades serán `Array` con todos los ítems que tienen, en el campo `column`, el valor de esa propiedad.\n\nEl resultado será `proxy.$dataset[propiedad]:Array<Object>`.\n\nEl problema de este método es que el corte es, estrictamente, el valor del campo. A menudo querremos hacer cortes de rango, y para eso, este método no nos servirá.\n\n#### `async proxy.groupByColumns(columns:Array<String>):BasicDataset`\n\nPermite lo mismo que el anterior, pero estableciendo más de 1 nivel de agrupación.\n\nDe esta forma, podemos hacer `proxy.$dataset[column1][column2][column3]...` y seguir las agrupaciones.\n\nEl problema de este método es que el corte es, estrictamente, el valor del campo. A menudo querremos hacer cortes de rango, y para eso, este método no nos servirá.\n\n#### `async proxy.groupByCallback(callback:Function):Promise<BasicDataset>`\n\nPermite crear grupos de 1 nivel utilizando una función para saber en qué grupo cae cada row.\n\nLa `callback:Function` recibirá `it:Object` e `i:Integer` con la row y el índice de row.\n\nLa `callback:Function` devolverá un `label:String` con el nombre de la propiedad donde esta row cae.\n\nEl `proxy.$dataset` entonces mutará para un objeto.\n\nPor tanto, este método requiere de `proxy.$dataset:Array` al principio, y terminará con `proxy.$dataset:Object`.\n\nSolo permite agrupaciones de 1 nivel.\n\n#### `async proxy.groupByCallbacks(callbacks:Array<Function>):Promise<BasicDataset>`\n\nMismo método, pero permitiendo agrupaciones multinivel, al aceptar no 1 `Function` sino un `Array<Function>`.\n\nLas funciones pueden ser asíncronas.\n\nUn simple ejemplo de uso sería este:\n\n```js\nconst proxy = await flexdb.createDataset([\n  { name: \"Ana\", age: 10, active: true },\n  { name: \"Luis\", age: 10, active: false },\n  { name: \"Eva\", age: 20, active: true },\n]).groupByCallbacks([\n  it => it.active ? \"activos\" : \"inactivos\",\n  it => it.age < 18 ? \"menores\" : \"adultos\"\n]);\nproxy.debug();\n```\n\nEsto nos imprime:\n\n```json\n{\n  \"activos\": {\n    \"menores\": [{\n      \"name\": \"Ana\",\n      \"age\": 10,\n      \"active\": true\n    }],\n    \"adultos\": [{\n      \"name\": \"Eva\",\n      \"age\": 20,\n      \"active\": true\n    }]\n  },\n  \"inactivos\": {\n    \"menores\": [{\n      \"name\": \"Luis\",\n      \"age\": 10,\n      \"active\": false\n    }]\n  }\n}\n```\n\nCon este método sí puedes hacer:\n\n- **cortes de rango** y otras condiciones más complejas.\n- **agrupaciones multinivel** con diferentes condiciones y campos.\n\nEs el más completo de la saga de métodos `groupBy`.\n\nTambién se puede devolver un `Array<String>` para clasificar a 1 row en varias categorías a la vez:\n\n```js\nconst proxy = await flexdb.createDataset([\n  { name: \"Ana\", age: 10, active: true },\n  { name: \"Luis\", age: 10, active: false },\n  { name: \"Eva\", age: 20, active: true },\n]).groupByCallbacks([\n  it => it.active ? \"activos\" : \"inactivos\",\n  it => it.age < 18 ? \"menores\" : (it.age >= 18) && (it.age < 35) ? [\"adultos\", \"jovenes\"] : it.age < 65 ? [\"adultos\"] : \"veteranos\",\n])\nproxy.debug();\n```\n\nEste ejemplo, en cambio, nos daría:\n\n```json\n{\n  \"activos\": {\n    \"menores\": [{\n      \"name\": \"Ana\",\n      \"age\": 10,\n      \"active\": true\n    }],\n    \"adultos\": [{\n      \"name\": \"Eva\",\n      \"age\": 20,\n      \"active\": true\n    }],\n    \"jovenes\": [{\n      \"name\": \"Eva\",\n      \"age\": 20,\n      \"active\": true\n    }]\n  },\n  \"inactivos\": {\n    \"menores\": [{\n      \"name\": \"Luis\",\n      \"age\": 10,\n      \"active\": false\n    }]\n  }\n}\n```\n\nComo se ve, `Eva` aparece en 2 categorías a la vez: `adultos` y `jovenes`. Y solo hemos devuelto un `Array<String>` con las categorías en las que queríamos que apareciera, según la lógica que quisiéramos.\n\n#### `async proxy.groupByEval(evalSource:String):Promise<BasicDataset>`\n\nPermite llamar a `proxy.groupByCallback` pero sin usar una función, solo `string` con código asíncrono.\n\n#### `async proxy.groupByEvals(evalsList:Array<String>):Promise<BasicDataset>`\n\nPermite llamar a `proxy.groupByCallbacks` pero sin usar una función, solo `string` con código asíncrono.\n\nEl ejemplo anterior se haría con:\n\n```js\nconst proxy6 = await flexdb.createDataset([\n  { name: \"Ana\", age: 10, active: true },\n  { name: \"Luis\", age: 10, active: false },\n  { name: \"Eva\", age: 20, active: true },\n]).groupByEvals([\n  `return it.active ? \"activos\" : \"inactivos\";`,\n  `return it.age < 18 ? \"menores\" : (it.age >= 18) && (it.age < 35) ? [\"adultos\", \"jovenes\"] : it.age < 65 ? [\"adultos\"] : \"veteranos\";`,\n]);\n```\n\nEste método es también el más completo de la saga `groupBy`, permite lo mismo que `groupByCallbacks`.\n\n#### `proxy.sortByColumn(column:String):BasicDataset`\n\nPermite reordenar un `proxy.$dataset:Array` según el valor de una columna.\n\n#### `proxy.sortByColumns(columns:Array<String>):BasicDataset`\n\nPermite reordenar un `proxy.$dataset:Array` según el valor de varias columnas, donde las columnas aparecen por orden de prioridad.\n\n#### `proxy.sortByCallback(callback:Function):BasicDataset`\n\nPermite reordenar un `proxy.$dataset:Array` mediante una función síncrona `sort` típica.\n\nSe le inyectan `a, b`.\n\n#### `proxy.sortByEval(source:String):BasicDataset`\n\nVersión del mismo método pero usando código síncrono en formato `string`.\n\nSe le inyectan `a, b`.\n\nPor ejemplo:\n\n```js\nflexdb.createDataset([\n  { name: \"Ana\", surname: \"Dac\", active: true },\n  { name: \"Luis\", surname: \"Bac\", active: false },\n  { name: \"Eva\", surname: \"Cac\", active: true },\n]).sortByEval(\"return a.surname > b.surname ? 1 : -1;\").debug();\n```\n\nNos dará a Luis, Eva y Ana por este orden. Es un ejemplo.\n\n#### `proxy.extendBy(overrider:Object = {}):BasicDataset`\n\nPermite extender/sobreescribir cualquier propiedad o método del dataset.\n\nGeneralmente, interesará sobreescribir propiedades instumentales para el proceso de formateo del dataset.\n\n#### `async proxy.expandRecords(sourceTable:String, expandSpec:Object = {}):Promise<BasicDataset>`\n\nPermite expandir registros del dataset con la database.\n\nSigue el mismo contrato de tipos que el homónimo `db.expandRecords(sourceTable, dataset, expandSpec)` dando por sobreentendido el `dataset`.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\n#### `async proxy.attachRecords(sourceTable:String, newColumn:String, referredTable:String, referredColumn:String):Promise<BasicDataset>`\n\nPermite adjuntar registros del dataset con la database.\n\nSigue el mismo contrato de tipos que el homónimo `db.attachRecords(sourceTable, newColumn, referredTable, referredColumn, dataset)` dando por sobreentendido el `dataset`.\n\nConviene usarlo con una línea aparte que iterará sobre el dataset interno, porque es asíncrono.\n\n## Query API\n\nLa Query API es una API muy sencilla y abierta pero que permite gestionar los pasos de una consulta de datos en sentido amplio, mediante código asíncrono en `function` o `string`.\n\nEsto es para facilitar la conversión de APIs de interfaz gráfica a código y hacer de una `BasicQuery`, un objeto persistible fácilmente.\n\n#### `query = FlexibleDB.BasicQuery.from(overrider:Object = {})`\n\nPermite crear una `BasicQuery`.\n\nPor defecto, `BasicQuery` introduce estos `query.steps` por defecto, que pueden sobreescribirse con `overrider` fácilmente:\n\n```js\n  steps = [\n    \"onStart\",\n    \"onReset\",\n    \"onFetch\",\n    \"onValidate\",\n    \"onPrepare\",\n    \"onQuery\",\n    \"onConfirm\",\n    \"onTransform\",\n    \"onCommit\",\n    \"onEnd\",\n  ];\n```\n\nPuedes sobreescribir cualquiera con una `function` o con un `string` con código asíncrono, que `query.run()` funcionará correctamente.\n\n#### `async query.run():Promise`\n\nPermite llamar a todos los `query[query.steps[i]].call(query)` y funcionar tanto si son `function` como `string` con código asíncrono.\n\n#### `query.steps:Array<String>`\n\nLista de pasos que sobreentiende `query.run` que se tienen que suceder entre sí.\n\nSobreescribir para cambiar proceso en `query.run()`.\n\n#### `query.onError:Function|String`\n\nPermite inyectar una función que controle los errores.\n\nPor defecto va a imprimir `console.error(\"Error in step «\" + step + \"»\", error);` y volverá a lanzar el error con `throw error;`.\n\nSobreescribir para mejor gestión del error.\n\nLa función recibe 2 parámetros:\n\n- `error:Error`: el error que ha saltado.\n- `step:String`: el método en el que ha saltado.\n\nSe puede poner en forma tanto de `function` como de `string` que gestionará el error con código plano también.\n\n#### `query.wrapAsAsyncFunction(code:String, parameters:Array<String>)`\n\nMétodo utilitario para fabricar `AsyncFunction` y definir los nombres de los parámetros de la función de una vez.\n\nSe utiliza en `query.run()` para evaluar a todos los `query.steps` que sean `string` y no `function`.\n\nTambién lo usa `query.run()` para gestionar los `onError`, que puede ser llamado aunque no aparezca en `query.steps`.\n\n## Tree API\n\nLa `Tree API` puede ir bien para gestionar estructuras tipo árbol cuando una columna es `tree: true`, que forzadamente tiene que ser `referredTable: $self`.\n\nEs un conjunto de métodos muy reducido de momento que permite gestionar el uso clásico de un árbol suponiendo que la columna donde metemos `tree: true` es el **padre** del nodo.\n\nA continuación se transmiten los métodos y clases.\n\n#### `tree = db.createTree(table:String, column:String):BasicTree`\n\nPermite crear un árbol desde la base de datos, especificando `table` y `column` del schema.\n\nSe comprobará que el `db.$schema` esté apoyando esto.\n\nSe pondrán en `tree.$table` y `tree.$column`.\n\n#### `async tree.addBranchOf(data:Object, parent:Integer):Promise<Integer>`\n\nPermite añadir una subbranca a una branca padre.\n\nSería lo mismo que sobreescribir la columna del `tree.$column` en el `data`.\n\nPor debajo hace un `db.insertOne` y lo devuelve.\n\n#### `async tree.getBranchesOf(parent:Integer):Promise<Array<Object>>`\n\nPermite acceder a las subbrancas de la branca especificada.\n\nPara obtener las brancas raíces, pasar `null` en `parent` es también correcto.\n\n#### `async tree.dropBranch(id:Integer):Promise<Boolean>`\n\nPermite eliminar una branca, si es que la tesis de integridad lo permite.\n\nNo lo permitirá si hay alguna branca en la base de datos que tiene a ésta como padre, mediante la propiedad `tree.$column`, entre otras posibles comprobaciones.\n\nEn otras palabras, no hará eliminación recursiva, de momento.\n\n## Tests\n\nEstos son los tests actualmente:\n\n- [`test-of-complex-query.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-complex-query.js)\n- [`test-of-controller-language.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-controller-language.js)\n- [`test-of-dataset-proxy.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-dataset-proxy.js)\n- [`test-of-default.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-default.js)\n- [`test-of-modify-all.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-modify-all.js)\n- [`test-of-performance.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-performance.js)\n- [`test-of-persistence.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-persistence.js)\n- [`test-of-relations-schema.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-relations-schema.js)\n- [`test-of-renaming.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-renaming.js)\n- [`test-of-rescheming.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-rescheming.js)\n- [`test-of-select-by-uid-and-others.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-select-by-uid-and-others.js)\n- [`test-of-server.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-server.js)\n- [`test-of-trigger.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-trigger.js)\n- [`test-of-uniqueness.js`](https://github.com/allnulled/flexible-db/blob/main/test-of-uniqueness.js)\n- [`test-on-readme.js`](https://github.com/allnulled/flexible-db/blob/main/test-on-readme.js)\n- [`test.js`](https://github.com/allnulled/flexible-db/blob/main/test.js)\n\n## Ejemplo práctico\n\n\n\n```js\nrequire(__dirname + \"/flexible-db.js\");\n\nconst main = async function () {\n  const flexdb = FlexibleDB.create({\n\n  });\n\n  await flexdb.setSchema({\n    Sesion: {\n      token: { type: \"string\", nullable: false },\n      usuario: { type: \"object-reference\", referredTable: \"Usuario\", nullable: false },\n    },\n    Pais: {\n      nombre: { type: \"string\" },\n      presidentes: { type: \"array-reference\", referredTable: \"Persona\" }\n    },\n    Persona: {\n      nombre: { type: \"string\", label: true, },\n      edad: { type: \"integer\", },\n      pais: { type: \"object-reference\", referredTable: \"Pais\" },\n      tags: { type: \"array\", default: [], label: true }\n    },\n    Usuario: {\n      persona: { type: \"object-reference\", referredTable: \"Persona\" },\n      alias: { type: \"string\", unique: true },\n      email: { type: \"string\", unique: true },\n      password: { type: \"string\" }\n    },\n    Grupo: {\n      nombre: { type: \"string\", unique: true },\n      usuarios: { type: \"array-reference\", referredTable: \"Usuario\" },\n      permisos: { type: \"array-reference\", referredTable: \"Permiso\" },\n      presidente: { type: \"object-reference\", referredTable: \"Usuario\", nullable: true },\n      legislaciones: { type: \"array-reference\", referredTable: \"Legislacion\", nullable: true },\n    },\n    Permiso: {\n      nombre: { type: \"string\", unique: true },\n      operacion: { type: \"string\" },\n      modelo: { type: \"string\" },\n      descripcion: { type: \"string\" },\n    },\n    Legislacion: {\n      titulo: { type: \"string\" },\n      contenido: { type: \"string\" },\n      creador: { type: \"object-reference\", referredTable: \"Persona\" }\n    },\n  });\n\n  await flexdb.insertOne(\"Persona\", { nombre: \"Carlos\", edad: 20, pais: 1, tags: [\"uat\"] });\n  await flexdb.insertOne(\"Persona\", { nombre: \"user2\", edad:  30, pais: 1, tags: [\"cal\"] });\n  await flexdb.insertOne(\"Persona\", { nombre: \"user3\", edad:  40, pais: 1, tags: [\"nic\"] });\n  await flexdb.insertOne(\"Persona\", { nombre: \"user4\", edad:  50, pais: 1 });\n  await flexdb.insertOne(\"Persona\", { nombre: \"user5\", edad:  60, pais: 1 });\n  await flexdb.insertOne(\"Persona\", { nombre: \"user6\", edad:  70, pais: 1 });\n  const legislacion1 = await flexdb.insertOne(\"Legislacion\", { titulo: \"Carta de derechos 1\", contenido: \"tal\", creador: 1 });\n  const legislacion2 = await flexdb.insertOne(\"Legislacion\", { titulo: \"Carta de derechos 2\", contenido: \"tal\", creador: 2 });\n  const legislacion3 = await flexdb.insertOne(\"Legislacion\", { titulo: \"Carta de derechos 3\", contenido: \"tal\", creador: 1 });\n  const legislacion4 = await flexdb.insertOne(\"Legislacion\", { titulo: \"Carta de derechos 4\", contenido: \"tal\", creador: 2 });\n  const legislacion5 = await flexdb.insertOne(\"Legislacion\", { titulo: \"Carta de derechos 5\", contenido: \"tal\", creador: 1 });\n  const legislacion6 = await flexdb.insertOne(\"Legislacion\", { titulo: \"Carta de derechos 6\", contenido: \"tal\", creador: 4 });\n  await flexdb.insertOne(\"Pais\", { nombre: \"España\", presidentes: [1] });\n  await flexdb.insertOne(\"Pais\", { nombre: \"Andorra\", presidentes: [2] });\n  await flexdb.insertOne(\"Pais\", { nombre: \"Francia\", presidentes: [3] });\n  await flexdb.insertOne(\"Pais\", { nombre: \"Portugal\", presidentes: [4] });\n  const usuario1 = await flexdb.insertOne(\"Usuario\", { persona: 1, alias: \"usuario1\", email: \"usuario1@gmail.org\", password: \"123456.1\" });\n  const usuario2 = await flexdb.insertOne(\"Usuario\", { persona: 2, alias: \"usuario2\", email: \"usuario2@gmail.org\", password: \"123456.2\" });\n  const usuario3 = await flexdb.insertOne(\"Usuario\", { persona: 3, alias: \"usuario3\", email: \"usuario3@gmail.org\", password: \"123456.3\" });\n  const permisoAdministrar = await flexdb.insertOne(\"Permiso\", { nombre: \"administrar\", operacion: \"app.administrate\" });\n  const permisoMoverCosas = await flexdb.insertOne(\"Permiso\", { nombre: \"mover cosas\", operacion: \"app.move things\" });\n  const permisoSelectOne = await flexdb.insertOne(\"Permiso\", { operacion: \"server.selectOne\" });\n  const permisoSelectMany = await flexdb.insertOne(\"Permiso\", { operacion: \"server.selectMany\" });\n  const permisoInsertOne = await flexdb.insertOne(\"Permiso\", { operacion: \"server.insertOne\" });\n  const permisoInsertMany = await flexdb.insertOne(\"Permiso\", { operacion: \"server.insertMany\" });\n  const permisoUpdateOne = await flexdb.insertOne(\"Permiso\", { operacion: \"server.updateOne\" });\n  const permisoUpdateMany = await flexdb.insertOne(\"Permiso\", { operacion: \"server.updateMany\" });\n  const permisoDeleteOne = await flexdb.insertOne(\"Permiso\", { operacion: \"server.deleteOne\" });\n  const permisoDeleteMany = await flexdb.insertOne(\"Permiso\", { operacion: \"server.deleteMany\" });\n  const permisoAddTable = await flexdb.insertOne(\"Permiso\", { operacion: \"server.addTable\" });\n  const permisoAddColumn = await flexdb.insertOne(\"Permiso\", { operacion: \"server.addColumn\" });\n  const permisoRenameTable = await flexdb.insertOne(\"Permiso\", { operacion: \"server.renameTable\" });\n  const permisoRenameColumn = await flexdb.insertOne(\"Permiso\", { operacion: \"server.renameColumn\" });\n  const permisoDropTable = await flexdb.insertOne(\"Permiso\", { operacion: \"server.dropTable\" });\n  const permisoDropColumn = await flexdb.insertOne(\"Permiso\", { operacion: \"server.dropColumn\" });\n  const permisoSetSchema = await flexdb.insertOne(\"Permiso\", { operacion: \"server.setSchema\" });\n  const permisoGetSchema = await flexdb.insertOne(\"Permiso\", { operacion: \"server.getSchema\" });\n  await flexdb.insertOne(\"Grupo\", {\n    nombre: \"administración\",\n    usuarios: [usuario1],\n    permisos: [\n      permisoAdministrar,\n      permisoSelectOne,\n      permisoSelectMany,\n      permisoInsertOne,\n      permisoInsertMany,\n      permisoUpdateOne,\n      permisoUpdateMany,\n      permisoDeleteOne,\n      permisoDeleteMany,\n      permisoAddTable,\n      permisoAddColumn,\n      permisoRenameTable,\n      permisoRenameColumn,\n      permisoDropTable,\n      permisoDropColumn,\n      permisoSetSchema,\n      permisoGetSchema\n    ],\n    legislaciones: [legislacion1, legislacion2]\n  });\n  await flexdb.insertOne(\"Grupo\", {\n    nombre: \"logística\",\n    usuarios: [usuario2, usuario3],\n    permisos: [permisoMoverCosas],\n    legislaciones: [legislacion1, legislacion2, legislacion3]\n  });\n  const persona1 = await flexdb.selectByUid(1)\n  const persona2 = await flexdb.selectByUid(2)\n  const persona3 = await flexdb.selectByUid(3)\n  const objeto4 = await flexdb.selectByUid(flexdb.$ids.uid);\n  FlexibleDB.assertion(typeof persona1.uid === \"number\", `Parameter «persona1.uid» must be an integer here`);\n  FlexibleDB.assertion(typeof persona2.uid === \"number\", `Parameter «persona2.uid» must be an integer here`);\n  FlexibleDB.assertion(typeof persona3.uid === \"number\", `Parameter «persona3.uid» must be an integer here`);\n  FlexibleDB.assertion(typeof objeto4.uid === \"number\", `Parameter «objeto4.uid» must be an integer here`);\n  const personasPorLabel1 = await flexdb.selectByLabel(\"Persona\", \"Carlos\");\n  const personasPorLabel2 = await flexdb.selectByLabels(\"Persona\", [\"Carlos\", \"user2\"]);\n  const personasPorLabel3 = await flexdb.selectByLabels(\"Persona\", [\"uat\", \"cal\"]);\n  FlexibleDB.assertion(personasPorLabel1.length === 1, `Parameter «personasPorLabel1.length» must be 1 here`);\n  FlexibleDB.assertion(personasPorLabel2.length === 2, `Parameter «personasPorLabel2.length» must be 2 here`);\n  FlexibleDB.assertion(personasPorLabel3.length === 2, `Parameter «personasPorLabel3.length» must be 2 here`);\n  const d1 = await flexdb.createDataset(await flexdb.selectMany(\"Grupo\"), \"Grupo\");\n  FlexibleDB.assertion(d1.getDataset()[0].nombre === \"administración\", \"Parameter «d1.getDataset()[0].nombre» must be «administración»\");\n  const d2 = d1.clone().findByS","readmeFilename":"README.md"}