{"_id":"@data-prism/core","_rev":"19-98d098df0d607d0cdc62956646268482","name":"@data-prism/core","dist-tags":{"latest":"0.2.1"},"versions":{"0.0.1":{"name":"@data-prism/core","version":"0.0.1","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.1","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"b46898868a60ba0c1aac077760d8dcf4ffbb1306","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.1.tgz","fileCount":65,"integrity":"sha512-9hCpSem7BDcxb1PSvn301he+VcMQ8a0thy0WB79UeaEoVzUrkdkXyHdF7R6Cxdk3xhWzj72Zdq6bQTCUFffQgA==","signatures":[{"sig":"MEUCIQDk6hlzquF5AA07KnPBSgnH1f6ICXTEuPkcBuWPuPBpngIgFbkYO+tsvqIScbTIRTR5gLl65bNPlf657Cy5GqQq/28=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":69230},"type":"module","exports":{"./*":{"import":"./src/*.js","require":"./dist/*.js"}},"gitHead":"f6583a2150216a1bb65b2caf7e835741b1556308","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"vite build","serve":"vite serve","start":"vite","test:watch":"NODE_ENV=test ava -w --verbose"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.5.0","description":"## Uses","directories":{},"_nodeVersion":"18.15.0","dependencies":{"ajv":"^8.12.0","mathjs":"^11.5.1","solid-js":"^1.6.11","csv-parse":"^5.3.5","lodash-es":"^4.17.21","solid-element":"^1.6.3","@solidjs/router":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.58.1","vite":"^4.1.1","jsdom":"^21.1.0","eslint":"^8.34.0","vitest":"^0.28.5","prettier":"^2.8.4","typescript":"^5.0.0-beta","@types/csv-parse":"^1.2.2","@types/lodash-es":"^4.17.6","typescript-eslint":"^0.0.1-alpha.0","vite-plugin-solid":"^2.5.0","eslint-plugin-solid":"^0.9.4","html-webpack-plugin":"^5.5.0","vite-plugin-solid-svg":"^0.6.0","eslint-config-prettier":"^8.6.0","eslint-config-standard":"^17.0.0","@typescript-eslint/parser":"^5.52.0","@typescript-eslint/eslint-plugin":"^5.52.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.1_1684855492914_0.5898810410071307","host":"s3://npm-registry-packages"}},"0.0.11":{"name":"@data-prism/core","version":"0.0.11","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.11","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"61fff40fad3bf4bbec0813dfcfb798aeae6b10d4","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.11.tgz","fileCount":35,"integrity":"sha512-NTPtaLGKoUWglIAtprXXgogbtw3HUvEDjmR5vCfRpns/5mPJFUb+C0Z1vnib8SCTUOb0h6QGQLii6U8McZnvTQ==","signatures":[{"sig":"MEUCIQC7BRHKdwTIrBpB8BVtzBup3bM4erpZu0tpsZfyiZtbFQIgMtSjlhwFW9RNMzxOAi+PdXdGrzNguNXF6gx0Q15VB+c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":132031},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"6ff659eee613b33b17fe88e5f6462f7c9fc6f5ae","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.5.0","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.3","@data-prism/expressions":"^0.0.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.11_1692204691564_0.8026415292586624","host":"s3://npm-registry-packages"}},"0.0.12":{"name":"@data-prism/core","version":"0.0.12","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.12","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"969c8920a4d094656a74adad087235fbced8bb8e","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.12.tgz","fileCount":38,"integrity":"sha512-SSDzSbmJq4QYGOoe4a5jsCBwdp6eqHRDDWzMFuEhxvRuQNPYMZUhdt24qQKuK9hSFAQjyWwrkzGx7WAKFFhn4Q==","signatures":[{"sig":"MEUCIFe+9e+aQ9P9TGRapq2TVhUjOo69JvDvW1YEzxxGFcP4AiEAg6F1FDxTpgyV8rfg3XRuq33B4xb+TLP/EnJZN29IEcs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":140673},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"8cb8ac2fecc8ca7dca4bb79ec39d850db8bf5c29","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"8.18.0","directories":{},"_nodeVersion":"18.8.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.3","@data-prism/expressions":"^0.0.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.12_1692990484456_0.30297076065830497","host":"s3://npm-registry-packages"}},"0.0.13":{"name":"@data-prism/core","version":"0.0.13","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.13","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"1fd17222ce45e98038483a9ca8b37161bce0a3a4","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.13.tgz","fileCount":38,"integrity":"sha512-h2C2AiUfohbxPygtD8XDjkazv2pk+F3v3eZTBe0sDLhgN8xeu81yfkno0cszzadwqN0b0eXYHoba0x1WxkigpA==","signatures":[{"sig":"MEUCIQDqpnJ3IRFZmHZR9IfkyHOvKjii0r3fTRW5ObSM46mqVgIgWylf8YIYPl6oekV73bOInWbuEcdYHFQR0QehBnBVgh0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":141910},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"9bc75c8c242017401d97e9c82fe57a5a7bce13d3","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.3","@data-prism/expressions":"^0.0.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.13_1694020546762_0.6155322239583927","host":"s3://npm-registry-packages"}},"0.0.14":{"name":"@data-prism/core","version":"0.0.14","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.14","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"4a1f6189f856e2629214ffc62312f65d97fb253c","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.14.tgz","fileCount":45,"integrity":"sha512-CCuAMGERoitb/YYEKr2yaGg1FKqaeYGCQpDcjLFmem6iBbQO7XhqNvSaSLh5X0H1KRTFlTifHVOFOQWSQ/ShAA==","signatures":[{"sig":"MEUCIQCiKL82rQnSTDK7wf+dADNbsLa1AbhoBbGK2ksPmbFOBQIgczDI/4nJPcCohTP/65vfQP6Apq4mazUBJpbWAJRnyqg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148842},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"fa255ef4e06d35f40c2de0dcea8258a6e448f327","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.3","@data-prism/expressions":"^0.0.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.14_1694196297034_0.48390648777011536","host":"s3://npm-registry-packages"}},"0.0.15":{"name":"@data-prism/core","version":"0.0.15","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.15","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"e577bb35397b7f0c1bd0f2a3b34b5259de819684","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.15.tgz","fileCount":45,"integrity":"sha512-dYzzxTQly2xvIsDZ2+xKlpPvtDb7TJHzmUQfiSSaeA+PFpw6LvZmJyi0fQb2a5McQGDnAM5rr6g3tyRy3pDt7w==","signatures":[{"sig":"MEQCIFum6e0T3K7U2NFHgqs1S9Z5iaBsUMXz+gZBtl0zwyC9AiA3WvvfVbF0zaRIj7QK3D0r0o5SGb6lPNE5+Jhle4WHhw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":151482},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"77f2c909138f5649a013863cb31e4e42d0185139","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.3","@data-prism/expressions":"^0.0.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.15_1695662948859_0.8793696595950267","host":"s3://npm-registry-packages"}},"0.0.16":{"name":"@data-prism/core","version":"0.0.16","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.16","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"b808db60945c437a30e095c3ffaa949807f7a2c7","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.16.tgz","fileCount":45,"integrity":"sha512-CdMJ0Vfua1etOi4GAA4E7VoYHCaU1Mz4ZWjiIpcl/kAn0HjyzGMCnmQZpXhLU1wUgAjkEi1Zbt5c3+Ve8KlnHA==","signatures":[{"sig":"MEUCIQDd5SKM2o1DDCVoX557+gYQDPNGtovIZScJvBar/fxoBgIgH56MDcCEvWBtcoOtsYcYTtGdP+ApvoR+yPxLy6LClT8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":150972},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"7385728384ce084b1ca5de1c8c1f4dfd3c4ec74a","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.5","@data-prism/expressions":"^0.0.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.16_1697130677440_0.3009274653754097","host":"s3://npm-registry-packages"}},"0.0.17":{"name":"@data-prism/core","version":"0.0.17","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.17","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"2ed970b88b5015062d1631e6741b25261df44c28","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.17.tgz","fileCount":45,"integrity":"sha512-cJcQ2yWbJRzzBczjtWO6uxwVQm/EfmcN/LND/5H6d//j3/dbOpsdT31imT+/GqGmfffJSiXGEF44z577GQKRHQ==","signatures":[{"sig":"MEUCIANbLjpCq1y2vWHmrACEnPSp9UNHXrOvDmTGDEqURuRaAiEA6nZZMnwhYLmx/kvrvMGdj8Gq+lyNiVAjdMsQ2G+IOTE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":150972},"main":"./dist/core.js","type":"module","types":"./dist/core.d.ts","exports":{".":"./dist/core.js","./*":"./src/*.ts"},"gitHead":"7385728384ce084b1ca5de1c8c1f4dfd3c4ec74a","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.6","@data-prism/expressions":"^0.0.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.17_1697131031650_0.9460233889369687","host":"s3://npm-registry-packages"}},"0.0.18":{"name":"@data-prism/core","version":"0.0.18","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.18","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"8b32b64018ed89471d904d4df8c20b81cef402bd","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.18.tgz","fileCount":55,"integrity":"sha512-Y+e358WaOj2PYC9rZ2O0C7ElgZpTGu7grMiOMguZtqAgeKqffxdLOhZmVnvkyXgEbCyYIQ9v6AqW1ry1TJbG+Q==","signatures":[{"sig":"MEQCIE9EOxpUMsgFq2ZEsfSl4GzI1vJJrpleXYAyH0W9W67AAiBsM3DxlbS0dCt1CqVgT9OJHl2Y/gdFcvYOY2CadjZsLA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":247366},"main":"./build/cjs/src/index.js","type":"module","types":"./build/cjs/src/index.d.ts","module":"./build/mjs/src/index.js","exports":{"import":"./build/esm/src/index.js","require":"./build/cjs/src/index.js"},"gitHead":"0fdff3d84050afbd09cb406aa6ecd60c0f08d077","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -b ./tsconfig.cjs.json ./tsconfig.esm.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","description":"Query breakdowns are a useful way of viewing nested queries. They present the root query and each subquery in a single array that can be manipulated for such things as query building. It's helpful to not have to navigate a tree structure in every situatio","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.1.0","@data-prism/expressions":"^0.0.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.18_1701192775239_0.5389105593995123","host":"s3://npm-registry-packages"}},"0.0.20":{"name":"@data-prism/core","version":"0.0.20","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.20","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"ca7ebb293c7bd817446162d27a4622cb9d4353db","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.20.tgz","fileCount":69,"integrity":"sha512-VK26Flqi7nd3GtGoQh3rtippEPpZEeuo8T/VgpbOAV5k8lVfuM13HfTsxaRVdW8iIXCDhrQ0t7uTNx7pGRoaoA==","signatures":[{"sig":"MEUCIQDrZ/JMGC3QOYtxYTkgS4aYKCP7OgFT3QWg8M7+mXQHHQIgETP0Qthlww5wHCdmLDXktrYYJRk7h7OBfQjs0a29FDU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":268461},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"gitHead":"fa67be247a14e379222b68ad4e2155b10d200a32","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","description":"Query breakdowns are a useful way of viewing nested queries. They present the root query and each subquery in a single array that can be manipulated for such things as query building. It's helpful to not have to navigate a tree structure in every situatio","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.5","@data-prism/expressions":"^0.0.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.20_1701883254094_0.6626496431700359","host":"s3://npm-registry-packages"}},"0.0.21":{"name":"@data-prism/core","version":"0.0.21","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.0.21","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"bed2975235695b90b19204454e38c379ccb5bc94","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.0.21.tgz","fileCount":68,"integrity":"sha512-FLRTcc9xWIvQ2qWYLFoYPv6WQRuslKKyb/zovs6s3enEaeMkfD1GXghNeQQmuqodOu3mpYgvm30Me+dTJc/8qw==","signatures":[{"sig":"MEQCIBLTwC6j9IK2AuQo9iS7BObs6reOHOvxFjerzo/CegYPAiBSo4E50YvO7QjGdoL2p/qmYVER/1JeSk3yI38+R5Q6rw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":269242},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"gitHead":"fa67be247a14e379222b68ad4e2155b10d200a32","private":false,"scripts":{"test":"NODE_ENV=test vitest","build":"tsc -p ./tsconfig.json"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"9.8.1","description":"Query breakdowns are a useful way of viewing nested queries. They present the root query and each subquery in a single array that can be manipulated for such things as query building. It's helpful to not have to navigate a tree structure in every situatio","directories":{},"_nodeVersion":"18.15.0","dependencies":{"lodash-es":"^4.17.21","@data-prism/utils":"^0.0.5","@data-prism/expressions":"^0.0.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","vitest":"^0.31.4","prettier":"^2.8.8","typescript":"^5.1.3","typescript-eslint":"^0.0.1-alpha.0","eslint-config-prettier":"^8.8.0","eslint-config-standard":"^17.1.0","@typescript-eslint/parser":"^5.59.8","@typescript-eslint/eslint-plugin":"^5.59.8"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.21_1701886820957_0.06699213491636735","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"@data-prism/core","version":"0.1.0","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.1.0","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"d376348423de382f2387c0a17a75570ab5c9f820","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.1.0.tgz","fileCount":6,"integrity":"sha512-d0+e/xontgkPh8HXrB/eKfHApa5PDFNjSwjPN0G71VI+Yhyqs5+L1sBfv0ammqiWoKwezJaKnFTzoYB9hSvXjw==","signatures":[{"sig":"MEUCIFEi5lVEehyY+wTlvXsqnpUn3uO1haE7R/TR1Nau/oXMAiEAjLXrcHpAwUA67g4i/2I/QSqFMoLgvezWIwEbn7h5awM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423990},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"8e0dac755cd06fd5b5ab0922c45d12b02e55a523","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"11.4.2","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"23.6.0","dependencies":{"ajv":"^8.17.1","uuid":"^10.0.0","lodash-es":"^4.17.21","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","@data-prism/utils":"^0.0.6","@data-prism/expressions":"^0.0.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.28.1","vitest":"^3.0.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.1","@vitest/coverage-istanbul":"^3.0.4","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1754954334417_0.6992068563465377","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@data-prism/core","version":"0.1.1","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.1.1","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"8fca35c40ccdf66769507a6feacaeff15a6b3305","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.1.1.tgz","fileCount":6,"integrity":"sha512-2HR79w07CDrQm6Opga/VrBJmnuRLj9r9NGLR1x7Puogk66HhsdhIhBdt8wYFVSXKnZ4vjrEqGkjLdTNvBQ/5PA==","signatures":[{"sig":"MEUCIFOcFcxnup61345+Io9uGs0x2Xmlbm9XnSf9r2q8UlfzAiEAq186+tbCQHff+tap+tR/VhtJezMrSmmugW9tTiNPjIc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":428374},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"a804c5cf94da654261a65c84a2ee9174c8bc0cb7","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"11.4.2","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"23.6.0","dependencies":{"ajv":"^8.17.1","uuid":"^10.0.0","lodash-es":"^4.17.21","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","@data-prism/utils":"^0.0.6","@data-prism/expressions":"^0.0.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.28.1","vitest":"^3.0.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.1","@vitest/coverage-istanbul":"^3.0.4","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1754954832071_0.3651350703808851","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@data-prism/core","version":"0.1.2","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.1.2","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"086c05bcc93911baf74819e7eabbf7b0614c8707","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.1.2.tgz","fileCount":6,"integrity":"sha512-k/jLEK3SzsQ1W0yTM+Lo4L3DWKfJq8HfkLJ75/vpfNGCZrh+1uXrWAR/aSxggd2jOlOWE/1mOu1HJ3lmt/4PzA==","signatures":[{"sig":"MEQCIHI+lo0dg3i3ncRUtAi4wxzEz8w56+XJVAbLpgrU1zLCAiAGwtqKi3XnqMiZw0GN42XadkJ4P5pl1zwAU6GHwIC5cQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420453},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"c577f4bc03cc49ba54919dfaa038b1c13ab74537","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"11.4.2","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"23.6.0","dependencies":{"ajv":"^8.17.1","uuid":"^10.0.0","lodash-es":"^4.17.21","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","@data-prism/utils":"^0.0.6","@data-prism/expressions":"^0.0.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.28.1","vitest":"^3.0.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.1","@vitest/coverage-istanbul":"^3.0.4","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.2_1755038454049_0.07227906929483208","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@data-prism/core","version":"0.1.4","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.1.4","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"f6938bd9d7b4749072fce0caf9cb3b087b4464b9","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.1.4.tgz","fileCount":6,"integrity":"sha512-8hQ18heavGdrfZalaTXjtht6V3l248qqHEMZ1S3b7PSgcyCVd0tAWAW0F68CO58kXbjFX6Z+JGZsjbqimcV35w==","signatures":[{"sig":"MEQCIFhuFOpvHnfXhr/RTwXdz0rHJcTcsvRmrHsB1GvlvpBNAiB4x7vDWmEi6/FFlLWfebV6zDeSnicP+1W2jJbqdz0n4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":431299},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"b996596e1fad67a85585166ba1344dc8e8bba75e","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"npm run lint && npm run test"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"11.4.2","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"23.6.0","dependencies":{"ajv":"^8.17.1","uuid":"^10.0.0","lodash-es":"^4.17.21","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","@data-prism/utils":"*","@data-prism/expressions":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.28.1","vitest":"^3.0.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.1","@data-prism/test-fixtures":"*","@vitest/coverage-istanbul":"^3.0.4","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.4_1755634019688_0.15217230207743704","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@data-prism/core","version":"0.1.5","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.1.5","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"cfc151dd98a53ce207f442e6ee21dc326a99f2d4","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.1.5.tgz","fileCount":6,"integrity":"sha512-kGUDKn/bxm5WZEnsDKE6+jhXWlKdfwrFody5qtIf5i2GJaWQxZ5OB8GMLwusU8hXqhINtin04jimpKV6qXfMuw==","signatures":[{"sig":"MEUCIQCw64MGg80EkIDHbNdgqkhXU0QgKV7BDEoxNDvsdAO96wIgYYAid9pbfSZZAEt1S8BNagOBFdQSu8w9Y2gIs63aMRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438524},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"f4692e4bc3324f60fd0774789f4c57ea3f4b9b71","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"npm run lint && npm run test"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"11.4.2","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"23.6.0","dependencies":{"ajv":"^8.17.1","uuid":"^10.0.0","lodash-es":"^4.17.21","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","@data-prism/utils":"*","@data-prism/expressions":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.28.1","vitest":"^3.0.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.1","@data-prism/test-fixtures":"*","@vitest/coverage-istanbul":"^3.0.4","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.5_1755723164330_0.473120532704816","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@data-prism/core","version":"0.1.6","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.1.6","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"95dbe4d492448848d01fde2db341d0f088cbca3b","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.1.6.tgz","fileCount":6,"integrity":"sha512-f37UYJ+fqLgMvAbB8eSm9D9Ni+vTAHlbGtkEG79rzVhAvk/nK9+T/lSqmeF84q645PZnZEsOof1oo+VMQXCoPw==","signatures":[{"sig":"MEYCIQDx2yqA5eRO+eWzt3wZPY+d5Y+5AC7ilcFOUIBtz7eUPAIhALN/o7QM9DRRk10W+2NJtQP1HnRQTVqUy7Nl09vOuUQD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":437264},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"e3e771cd06ec07ad9d1189689e7fcaaf5fdc6126","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"npm run lint && npm run test"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"11.4.2","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"23.6.0","dependencies":{"ajv":"^8.17.1","uuid":"^10.0.0","lodash-es":"^4.17.21","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","@data-prism/utils":"*","@data-prism/expressions":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.28.1","vitest":"^3.0.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.1","@data-prism/test-fixtures":"*","@vitest/coverage-istanbul":"^3.0.4","@rollup/plugin-node-resolve":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.6_1755884031506_0.6874358462193093","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@data-prism/core","version":"0.2.0","keywords":[],"author":{"name":"Jake Sower"},"_id":"@data-prism/core@0.2.0","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"dist":{"shasum":"071d551f8865561093b0b2909413c5ed1cf333a7","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.2.0.tgz","fileCount":6,"integrity":"sha512-nqT0KbZBeIVQCQ7lbOKNYOK9EHN40QR/M5RtGyw+9GZUp+zRg40Ln269K23NDBur2e7uyK3JKGkNFMbwzxVnzA==","signatures":[{"sig":"MEYCIQCiY9FovMplHnm1MbeCNOqfFxykYBr40YhnCjfNl29sVwIhAJKsPUtCwVCh01n6IjGhnNtUoLraIWHN8xs/OCCFTjAF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":596747},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"gitHead":"d1b2076b5a321321302a91b81f0a3246346242c5","private":false,"scripts":{"lint":"eslint src/ test/","test":"NODE_ENV=test vitest run --coverage","build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","lint:fix":"eslint --fix src/ test/","format:fix":"prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"","test:watch":"vitest","format:check":"prettier --check \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"","prepublishOnly":"npm run lint && npm run test"},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"_npmVersion":"10.9.3","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"ajv":"^8.17.1","uuid":"^12.0.0","ajv-errors":"^3.0.0","es-toolkit":"^1.39.10","ajv-formats":"^3.0.1","json-expressions":"^0.3.3","@data-prism/utils":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.50.1","vitest":"^3.2.4","@rollup/plugin-json":"^6.1.0","@vitest/coverage-v8":"^3.2.4","@rollup/plugin-commonjs":"^28.0.6","@vitest/coverage-istanbul":"^3.2.4","@data-prism/interface-tests":"*","@rollup/plugin-node-resolve":"^16.0.1"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.0_1757714648838_0.9612822888016559","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@data-prism/core","version":"0.2.1","deprecated":"This package has been renamed to '@spectragraph/core'. Please use '@spectragraph/core' instead.","type":"module","main":"./dist/index.cjs.js","module":"./dist/index.esm.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.cjs.js"}},"scripts":{"build":"npm run clean && rollup -c && cp index.d.ts dist/","clean":"rm -rf dist","format:check":"prettier --check \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"","format:fix":"prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"","lint":"eslint src/ test/","lint:fix":"eslint --fix src/ test/","prepublishOnly":"npm run lint && npm run test","test":"NODE_ENV=test vitest run --coverage","test:watch":"vitest"},"keywords":[],"author":{"name":"Jake Sower"},"devDependencies":{"@data-prism/interface-tests":"*","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-json":"^6.1.0","@rollup/plugin-node-resolve":"^16.0.1","@vitest/coverage-istanbul":"^3.2.4","@vitest/coverage-v8":"^3.2.4","rollup":"^4.50.1","vitest":"^3.2.4"},"publishConfig":{"access":"public"},"private":false,"sideEffects":false,"dependencies":{"@data-prism/utils":"*","ajv":"^8.17.1","ajv-errors":"^3.0.0","ajv-formats":"^3.0.1","es-toolkit":"^1.39.10","json-expressions":"^0.3.3","uuid":"^12.0.0"},"_id":"@data-prism/core@0.2.1","gitHead":"d90da54a8b4c84ca0cde531e924f44836e9be871","description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-hSUPXO1N5H+Do/pdVDUW3u4igbhrG0PLJjCTtTLLSndq0vZk9Ezwh3qlWQ6CCwsDw3XauQRuS0IhSRZcKTqiEQ==","shasum":"196f97942c72d420dcac0b2566766f1116b1a505","tarball":"https://registry.npmjs.org/@data-prism/core/-/core-0.2.1.tgz","fileCount":6,"unpackedSize":596861,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD+1yIp8pGbDsclDYpGcjX9NfXq8omc0uIh9orCS1/rzQIgTitDmXMoXtd2Rb+vlRdVd63mssoHgbyT07bSbGgAc8M="}]},"_npmUser":{"name":"blossomlib","email":"kind.salt4683@fastmail.com"},"directories":{},"maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.2.1_1757801634076_0.2703418119709582"},"_hasShrinkwrap":false}},"time":{"created":"2023-05-23T15:24:52.851Z","modified":"2025-09-13T22:13:54.461Z","0.0.1":"2023-05-23T15:24:53.191Z","0.0.11":"2023-08-16T16:51:31.796Z","0.0.12":"2023-08-25T19:08:04.632Z","0.0.13":"2023-09-06T17:15:47.105Z","0.0.14":"2023-09-08T18:04:57.283Z","0.0.15":"2023-09-25T17:29:09.095Z","0.0.16":"2023-10-12T17:11:17.664Z","0.0.17":"2023-10-12T17:17:11.883Z","0.0.18":"2023-11-28T17:32:55.399Z","0.0.20":"2023-12-06T17:20:54.250Z","0.0.21":"2023-12-06T18:20:21.182Z","0.1.0":"2025-08-11T23:18:54.618Z","0.1.1":"2025-08-11T23:27:12.253Z","0.1.2":"2025-08-12T22:40:54.241Z","0.1.4":"2025-08-19T20:06:59.968Z","0.1.5":"2025-08-20T20:52:44.513Z","0.1.6":"2025-08-22T17:33:51.751Z","0.2.0":"2025-09-12T22:04:09.039Z","0.2.1":"2025-09-13T22:13:54.286Z"},"author":{"name":"Jake Sower"},"keywords":[],"description":"A JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit f","maintainers":[{"name":"blossomlib","email":"kind.salt4683@fastmail.com"}],"readme":"# Data Prism Core\n\nA JavaScript library for working with schema-driven graph data. Data Prism provides powerful tools for querying, validating, and manipulating relational data structures with a focus on type safety and developer experience. It is intended to be a toolkit for building Data Prism stores.\n\n## Overview\n\nData Prism Core is built around several key principles:\n\n- **Schema-driven**: Everything flows from user-defined schemas that describe your data structure\n- **Query-focused**: Powerful query language for retrieving exactly the data you need\n- **Practical**: Optimized for real-world messy data scenarios with schema powered validation\n\n## Installation\n\n```bash\nnpm install @data-prism/core\n```\n\n## Core Concepts\n\n### Schemas\n\nSchemas define the structure of your data, including resource types, attributes, and relationships. They serve as the foundation for all Data Prism operations.\n\n```javascript\nconst schema = {\n\tresources: {\n\t\tteams: {\n\t\t\tattributes: {\n\t\t\t\tid: { type: \"string\" },\n\t\t\t\tname: { type: \"string\" },\n\t\t\t\tcity: { type: \"string\" },\n\t\t\t},\n\t\t\trelationships: {\n\t\t\t\thomeMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"homeTeam\",\n\t\t\t\t},\n\t\t\t\tawayMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"awayTeam\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmatches: {\n\t\t\tattributes: {\n\t\t\t\tid: { type: \"string\" },\n\t\t\t\tfield: { type: \"string\" },\n\t\t\t\tageGroup: { type: \"integer\" },\n\t\t\t},\n\t\t\trelationships: {\n\t\t\t\thomeTeam: { type: \"teams\", cardinality: \"one\", inverse: \"homeMatches\" },\n\t\t\t\tawayTeam: { type: \"teams\", cardinality: \"one\", inverse: \"awayMatches\" },\n\t\t\t},\n\t\t},\n\t},\n};\n```\n\n### Graphs\n\nGraphs represent your actual data in a normalized structure, organized by resource type and ID:\n\n```javascript\nconst graph = {\n\tteams: {\n\t\t\"team-1\": {\n\t\t\ttype: \"teams\",\n\t\t\tid: \"team-1\",\n\t\t\tattributes: { name: \"Arizona Bay FC\", city: \"Phoenix\" },\n\t\t\trelationships: {\n\t\t\t\thomeMatches: [{ type: \"matches\", id: \"match-1\" }],\n\t\t\t\tawayMatches: [{ type: \"matches\", id: \"match-2\" }],\n\t\t\t},\n\t\t},\n\t\t\"team-2\": {\n\t\t\ttype: \"teams\",\n\t\t\tid: \"team-2\",\n\t\t\tattributes: { name: \"Scottsdale Surf\", city: \"Scottsdale\" },\n\t\t\trelationships: {\n\t\t\t\thomeMatches: [{ type: \"matches\", id: \"match-2\" }],\n\t\t\t\tawayMatches: [{ type: \"matches\", id: \"match-1\" }],\n\t\t\t},\n\t\t},\n\t},\n\tmatches: {\n\t\t\"match-1\": {\n\t\t\ttype: \"matches\",\n\t\t\tid: \"match-1\",\n\t\t\tattributes: { field: \"Phoenix Park 1\", ageGroup: 11 },\n\t\t\trelationships: {\n\t\t\t\thomeTeam: { type: \"teams\", id: \"team-1\" },\n\t\t\t\tawayTeam: { type: \"teams\", id: \"team-2\" },\n\t\t\t},\n\t\t},\n\t\t\"match-2\": {\n\t\t\ttype: \"matches\",\n\t\t\tid: \"match-2\",\n\t\t\tattributes: { field: \"Scottsdale Community Center\", ageGroup: 11 },\n\t\t\trelationships: {\n\t\t\t\thomeTeam: { type: \"teams\", id: \"team-2\" },\n\t\t\t\tawayTeam: { type: \"teams\", id: \"team-1\" },\n\t\t\t},\n\t\t},\n\t},\n};\n```\n\n### Queries\n\nQueries describe what data you want to retrieve, closely matching your desired output structure:\n\n```javascript\nconst query = {\n\ttype: \"teams\",\n\tselect: [\"name\", { homeMatches: [\"field\", \"ageGroup\"] }]\n};\n```\n\n### Expressions\n\nData Prism queries support expressions for computed fields and conditional logic. These expressions are provided by the [json-expressions](https://github.com/jakesower/json-expressions) library, which offers a comprehensive set of operators for data transformation and filtering.\n\n#### Expression Engines\n\nData Prism uses focused expression engines to provide different capabilities for different query contexts:\n\n- **SELECT Engine** (`defaultSelectEngine`): Full expression capabilities including filtering, aggregations, transformations, and computed fields\n- **WHERE Engine** (`defaultWhereEngine`): Filtering-only operations for performance and security - excludes expensive aggregation operations\n\nThis architecture ensures that resource-intensive operations are only available where appropriate, preventing performance issues from expensive aggregations in WHERE clauses.\n\n#### What are Expressions?\n\nExpressions are JSON objects that describe computations to be performed on data. Each expression has a single key that identifies the operation (prefixed with `$`) and a value that provides the parameters:\n\nSimple comparison:\n\n```json\n{ \"$gt\": 11 }\n```\n\nLogical expressions:\n\n```json\n{ \"$and\": [{ \"$gte\": 2020 }, { \"$eq\": \"active\" }] }\n```\n\nConditional logic:\n\n```json\n{\n\t\"$if\": {\n\t\t\"if\": { \"$eq\": \"Phoenix\" },\n\t\t\"then\": { \"$get\": \"name\" },\n\t\t\"else\": \"Away Team\"\n\t}\n}\n```\n\n#### Basic Expression Examples\n\nCheck if player is eligible for age group:\n\n```json\n{ \"$gte\": 11 }\n```\n\nGet team's home field:\n\n```json\n{ \"$get\": \"homeField.name\" }\n```\n\nCalculate total match cost:\n\n```json\n{ \"$add\": [150, 25] }\n```\n\nSum all team scores:\n\n```json\n{ \"$sum\": [2, 1, 4, 0] }\n```\n\nFilter teams by city:\n\n```json\n{ \"$filter\": { \"$eq\": \"Phoenix\" } }\n```\n\nGet all team names:\n\n```json\n{ \"$map\": { \"$get\": \"name\" } }\n```\n\nJoin team cities:\n\n```json\n{ \"$join\": \" vs \" }\n```\n\n#### Available Operations\n\nThe json-expressions library provides comprehensive operations including:\n\n- **Core**: `$compose`, `$debug`, `$ensurePath`, `$get`, `$prop`, `$isDefined`, `$literal`, `$pipe`\n- **Conditionals**: `$switch`, `$case`, `$if`\n- **Logic**: `$and`, `$not`, `$or`\n- **Comparisons**: `$eq`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$ne`\n- **Pattern matching**: `$matchesRegex`, `$matchesLike`, `$matchesGlob`\n- **Aggregation**: `$count`, `$max`, `$min`, `$mean`, `$median`, `$mode`, `$sum`\n- **Array operations**: `$all`, `$any`, `$append`, `$filter`, `$find`, `$flatMap`, `$join`, `$map`, `$prepend`, `$reverse`\n- **Math**: `$add`, `$subtract`, `$multiply`, `$divide`, `$modulo`\n- **Generative**: `$random`, `$uuid`\n- **Temporal**: `$nowLocal`, `$nowUTC`, `$timestamp`\n\nFor complete documentation of all available operations, see the [json-expressions documentation](https://github.com/jakesower/json-expressions).\n\n#### Custom Expressions\n\nAvailable expressions can be extended. Most stores accept `selectEngine` and `whereEngine` parameters. See the [json-expressions documentation](https://github.com/jakesower/json-expressions) for how to create and use custom expressions.\n\n#### Using Expressions in Queries\n\nExpressions can be used in both `where` clauses for filtering and `select` clauses for computed fields:\n\n```javascript\n// Query teams with expressions in where clause\nconst teamQuery = {\n\ttype: \"teams\",\n\twhere: {\n\t\t$and: [\n\t\t\t{ founded: { $gte: 2000 } }, // founded >= 2000\n\t\t\t{ founded: { $lte: 2020 } }, // founded <= 2020\n\t\t\t{ active: { $eq: true } }, // active === true\n\t\t],\n\t},\n\tselect: {\n\t\tname: \"name\",\n\t\tcity: \"city\",\n\t\tseasonsActive: { $subtract: [2024, { $get: \"founded\" }] }, // Computed field\n\t\tdivision: \"division\",\n\t},\n};\n\n// Complex conditional logic for match analysis\nconst matchQuery = {\n\ttype: \"matches\",\n\tselect: {\n\t\tfield: \"field\",\n\t\tageGroup: \"ageGroup\",\n\t\tstatus: {\n\t\t\t$case: {\n\t\t\t\tvalue: { $get: \"ageGroup\" },\n\t\t\t\tcases: [\n\t\t\t\t\t{ when: { $lt: 12 }, then: \"Youth League\" },\n\t\t\t\t\t{ when: { $lt: 16 }, then: \"Junior League\" },\n\t\t\t\t\t{ when: { $gte: 16 }, then: \"Senior League\" },\n\t\t\t\t],\n\t\t\t\tdefault: \"Unassigned\",\n\t\t\t},\n\t\t},\n\t\tisPlayoff: {\n\t\t\t$and: [\n\t\t\t\t{ $gte: 10 }, // week >= 10\n\t\t\t\t{ $eq: \"important\" }, // importance === \"important\"\n\t\t\t],\n\t\t},\n\t},\n};\n```\n\n## API Reference\n\n### Schema Functions\n\n#### `ensureValidSchema(schema, options?)`\n\nValidates that a schema conforms to the Data Prism schema specification.\n\n**Parameters:**\n\n- `schema` (unknown) - The schema to validate\n- `options.validator` (Ajv, optional) - Custom AJV validator instance\n\n**Throws:** Error if schema is invalid\n\n```javascript\nimport { ensureValidSchema } from \"@data-prism/core\";\n\nensureValidSchema(mySchema); // Throws if invalid\n```\n\n### Graph Functions\n\n#### `createEmptyGraph(schema, options?)`\n\nCreates an empty graph structure based on a schema.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to base the graph on\n- `options.skipValidation` (boolean, optional) - Skip schema validation for performance\n\n**Returns:** Empty graph with resource type placeholders\n\n```javascript\nimport { createEmptyGraph } from \"@data-prism/core\";\n\nconst emptyGraph = createEmptyGraph(schema);\n// Returns: { teams: {}, matches: {} }\n\n// Skip validation for performance\nconst emptyGraph = createEmptyGraph(schema, { skipValidation: true });\n```\n\n#### `linkInverses(schema, graph)`\n\nLinks inverse relationships in a graph, filling in missing relationship data where possible. Queries will not work without relationships going in the direction of the query, so it's important to use this if you're constructing a graph from semi-connected pieces. This is commonly used with `mergeGraphsDeep`.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema defining relationships\n- `graph` (Graph) - The graph to link inverses in\n\n**Returns:** New graph with inverse relationships linked\n\n```javascript\nimport { linkInverses } from \"@data-prism/core\";\n\nconst linkedGraph = linkInverses(schema, graph);\n```\n\n#### `mergeGraphs(left, right)`\n\nMerges two graphs together by combining resource collections. Right graph takes precedence for resources with conflicting IDs.\n\n**Parameters:**\n\n- `left` (Graph) - The left graph\n- `right` (Graph) - The right graph (takes precedence for conflicts)\n\n**Returns:** Merged graph with combined resource collections\n\n```javascript\nimport { mergeGraphs } from \"@data-prism/core\";\n\nconst combined = mergeGraphs(graph1, graph2);\n```\n\n#### `mergeGraphsDeep(left, right)`\n\nMerges two graphs together, merging individual resources with matching IDs using `mergeResources()`.\n\n**Parameters:**\n\n- `left` (Graph) - The left graph\n- `right` (Graph) - The right graph\n\n**Returns:** Merged graph with resources intelligently merged\n\n```javascript\nimport { mergeGraphsDeep } from \"@data-prism/core\";\n\nconst combined = mergeGraphsDeep(graph1, graph2);\n```\n\n### Query Functions\n\n#### `ensureValidQuery(schema, query, options?)`\n\nValidates that a query is valid against a schema.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `query` (RootQuery) - The query to validate\n- `options.selectEngine` (SelectExpressionEngine, optional) - Expression engine for SELECT clauses\n- `options.whereEngine` (WhereExpressionEngine, optional) - Expression engine for WHERE clauses\n\n**Throws:** Error if query is invalid\n\n```javascript\nimport { ensureValidQuery } from \"@data-prism/core\";\n\nensureValidQuery(schema, query); // Uses default engines\n```\n\n#### `normalizeQuery(schema, rootQuery, options?)`\n\nNormalizes a query by expanding shorthand syntax and ensuring consistent structure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema object\n- `rootQuery` (RootQuery) - The query to normalize\n- `options.selectEngine` (SelectExpressionEngine, optional) - Expression engine for SELECT clauses\n- `options.whereEngine` (WhereExpressionEngine, optional) - Expression engine for WHERE clauses\n\n**Returns:** Normalized query with expanded selections and consistent structure\n\n```javascript\nimport { normalizeQuery } from \"@data-prism/core\";\n\nconst normalized = normalizeQuery(schema, {\n\ttype: \"users\",\n\tselect: \"*\", // Expands to all attributes\n});\n```\n\n#### `queryGraph(schema, query, graph, options?)`\n\nExecutes a query against a graph directly (convenience function).\n\n**Parameters:**\n\n- `schema` (Schema) - The schema defining relationships\n- `query` (RootQuery) - The query to execute\n- `graph` (Graph) - The graph to query\n- `options.selectEngine` (SelectExpressionEngine, optional) - Expression engine for SELECT clauses\n- `options.whereEngine` (WhereExpressionEngine, optional) - Expression engine for WHERE clauses\n\n**Returns:** Query results matching the query structure\n\n```javascript\nimport { queryGraph } from \"@data-prism/core\";\n\nconst results = queryGraph(\n\tschema,\n\t{\n\t\ttype: \"teams\",\n\t\tid: \"team-1\",\n\t\tselect: {\n\t\t\tname: \"name\",\n\t\t\thomeMatches: { select: [\"field\"] },\n\t\t},\n\t},\n\tgraph,\n);\n```\n\n### Resource Functions\n\n#### `normalizeResource(schema, resourceType, resource)`\n\nConverts a flat resource object into Data Prism's normalized format.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema defining the resource structure\n- `resourceType` (string) - The type of resource being normalized\n- `resource` (object) - The flat resource data\n\n**Returns:** Normalized resource with separated attributes and relationships\n\n```javascript\nimport { normalizeResource } from \"@data-prism/core\";\n\nconst flatTeam = {\n\tid: \"team-1\",\n\tname: \"Tempe Tidal Wave\",\n\tcity: \"Tempe\",\n\thomeMatches: [\"match-1\", \"match-3\"], // IDs or objects\n\tawayMatches: [\"match-2\", \"match-4\"],\n};\n\nconst normalized = normalizeResource(schema, \"teams\", flatTeam);\n// Returns normalized resource with attributes and relationships separated\n```\n\n#### `mergeResources(left, right)`\n\nMerges two partial resources of the same type, combining their attributes and relationships. The right resource takes precedence for conflicting attribute keys.\n\n**Parameters:**\n\n- `left` (PartialNormalResource) - The first resource to merge\n- `right` (PartialNormalResource) - The second resource to merge\n\n**Returns:** Merged PartialNormalResource with combined attributes and relationships\n\n**Throws:** Error if resources are of different types or have conflicting IDs\n\n```javascript\nimport { mergeResources } from \"@data-prism/core\";\n\nconst existing = {\n\ttype: \"teams\",\n\tid: \"team-1\",\n\tattributes: { name: \"Old Name\", founded: 2000 },\n\trelationships: { homeField: { type: \"fields\", id: \"field-1\" } },\n};\n\nconst update = {\n\ttype: \"teams\",\n\tid: \"team-1\",\n\tattributes: { name: \"New Name\", active: true }, // name will override\n};\n\nconst merged = mergeResources(existing, update);\n// Returns:\n// {\n//   type: \"teams\",\n//   id: \"team-1\",\n//   attributes: { name: \"New Name\", founded: 2000, active: true },\n//   relationships: { homeField: { type: \"fields\", id: \"field-1\" } }\n// }\n```\n\n#### `createGraphFromResources(schema, rootResourceType, rootResources)`\n\nCreates a complete graph from an array of resource objects, recursively processing nested relationships. **This function is particularly useful for handling nested resources.**\n\n**Parameters:**\n\n- `schema` (Schema) - The schema defining the resource structure\n- `rootResourceType` (string) - The root resource type to process\n- `rootResources` (Array) - Array of flat resource objects to convert\n\n**Returns:** Complete graph with all discoverable resources from the input data\n\n```javascript\nimport { createGraphFromResources } from \"@data-prism/core\";\n\nconst flatTeam = {\n\tid: \"team-1\",\n\tname: \"Arizona Bay FC\",\n\tcity: \"Phoenix\",\n\thomeMatches: [\n\t\t{\n\t\t\tid: \"match-1\",\n\t\t\tfield: \"Phoenix Park 1\",\n\t\t\tageGroup: 11,\n\t\t\tawayTeam: \"team-2\",\n\t\t},\n\t],\n};\n\nconst graph = createGraphFromResources(schema, \"teams\", [flatTeam]);\n// Returns a graph containing teams and matches resources\n// with proper normalization and relationship structure\n```\n\n### Error Classes\n\nData Prism Core provides specialized error classes to help stores and applications handle unsupported functionality gracefully.\n\n#### `ExpressionNotSupportedError`\n\nError thrown when a store does not support a particular expression. This allows stores to explicitly declare unsupported functionality and enables tests to handle these cases gracefully.\n\n**Constructor Parameters:**\n- `expression` (string) - The expression that is not supported (e.g., \"$matchesRegex\")  \n- `storeName` (string) - The name of the store that doesn't support the expression\n- `reason` (string, optional) - Optional reason why the expression is not supported\n\n**Properties:**\n- `name` - \"ExpressionNotSupportedError\"\n- `expression` - The unsupported expression name\n- `storeName` - The store name\n- `reason` - Optional reason (if provided)\n\n```javascript\nimport { ExpressionNotSupportedError } from \"@data-prism/core\";\n\n// In a store implementation\nif (!this.supportsRegex) {\n    throw new ExpressionNotSupportedError(\n        \"$matchesRegex\", \n        \"simple-store\", \n        \"Regex operations require additional dependencies\"\n    );\n}\n\n// In application code\ntry {\n    const results = await store.query(queryWithRegex);\n} catch (error) {\n    if (error instanceof ExpressionNotSupportedError) {\n        console.log(`Expression ${error.expression} not supported by ${error.storeName}`);\n        // Handle gracefully, perhaps with a fallback query\n    }\n}\n```\n\n#### `StoreOperationNotSupportedError`\n\nError thrown when a store does not support a particular operation. This allows stores to explicitly declare unsupported functionality and enables tests to handle these cases gracefully. This is particularly useful for readonly stores or stores with limited write capabilities.\n\n**Constructor Parameters:**\n- `operation` (string) - The store operation that is not supported (e.g., \"create\", \"update\", \"delete\")\n- `storeName` (string) - The name of the store that doesn't support the operation\n- `reason` (string, optional) - Optional reason why the operation is not supported\n\n**Properties:**\n- `name` - \"StoreOperationNotSupportedError\"\n- `operation` - The unsupported operation name\n- `storeName` - The store name  \n- `reason` - Optional reason (if provided)\n\n```javascript\nimport { StoreOperationNotSupportedError } from \"@data-prism/core\";\n\n// In a readonly store implementation\nclass ReadOnlyStore {\n    create(resource) {\n        throw new StoreOperationNotSupportedError(\n            \"create\", \n            \"readonly-store\", \n            \"This store only supports read operations\"\n        );\n    }\n    \n    update(resource) {\n        throw new StoreOperationNotSupportedError(\"update\", \"readonly-store\");\n    }\n    \n    delete(resource) {\n        throw new StoreOperationNotSupportedError(\"delete\", \"readonly-store\");\n    }\n}\n\n// In application code\ntry {\n    await store.create(newResource);\n} catch (error) {\n    if (error instanceof StoreOperationNotSupportedError) {\n        console.log(`Operation ${error.operation} not supported by ${error.storeName}`);\n        // Handle gracefully, perhaps by using a different store or informing the user\n    }\n}\n```\n\n### Validation Functions\n\n#### `validateSchema(schema, options?)`\n\nValidates that a schema conforms to the Data Prism schema specification.\n\n**Parameters:**\n\n- `schema` (unknown) - The schema to validate\n- `options.validator` (Ajv, optional) - Custom AJV validator instance\n\n**Returns:** Array of validation errors (empty if valid)\n\n```javascript\nimport { validateSchema } from \"@data-prism/core\";\n\nconst errors = validateSchema(mySchema);\nif (errors.length > 0) {\n\tconsole.error(\"Schema validation failed:\", errors);\n}\n```\n\n#### `validateQuery(schema, query, options?)`\n\nValidates that a query is valid against a schema.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `query` (RootQuery) - The query to validate\n- `options.selectEngine` (SelectExpressionEngine, optional) - Expression engine for SELECT clauses\n- `options.whereEngine` (WhereExpressionEngine, optional) - Expression engine for WHERE clauses\n\n**Returns:** Array of validation errors (empty if valid)\n\n```javascript\nimport { validateQuery } from \"@data-prism/core\";\n\nconst errors = validateQuery(schema, query);\nif (errors.length > 0) {\n\tconsole.error(\"Query validation failed:\", errors);\n}\n```\n\n#### `createValidator(options?)`\n\nCreates a new AJV validator instance configured for Data Prism.\n\n**Parameters:**\n\n- `options.ajvSchemas` (Array, optional) - Additional schemas to add\n\n**Returns:** Configured AJV validator\n\n```javascript\nimport { createValidator } from \"@data-prism/core\";\n\nconst validator = createValidator({\n\tajvSchemas: [myCustomSchema],\n});\n```\n\n#### `defaultValidator`\n\nThe default AJV validator instance used by Data Prism.\n\n```javascript\nimport { defaultValidator } from \"@data-prism/core\";\n\n// Use the default validator directly\nconst isValid = defaultValidator.validate(schema, data);\n```\n\n#### `defaultSelectEngine`\n\nThe default expression engine for SELECT clauses, providing full expression capabilities including filtering, aggregations, transformations, and computed fields.\n\n```javascript\nimport { defaultSelectEngine } from \"@data-prism/core\";\n\n// Use in custom query normalization\nconst normalizedQuery = normalizeQuery(schema, query, { \n\tselectEngine: defaultSelectEngine \n});\n```\n\n#### `defaultWhereEngine`\n\nThe default expression engine for WHERE clauses, providing filtering-only operations for performance and security. Excludes expensive aggregation operations.\n\n```javascript\nimport { defaultWhereEngine } from \"@data-prism/core\";\n\n// Use in custom query validation\nconst errors = validateQuery(schema, query, { \n\twhereEngine: defaultWhereEngine \n});\n```\n\n#### `validateCreateResource(schema, resource, options?)`\n\nValidates a resource for creation operations.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (CreateResource) - The resource to validate\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Returns:** Array of validation errors (empty if valid)\n\n```javascript\nimport { validateCreateResource } from \"@data-prism/core\";\n\nconst errors = validateCreateResource(schema, {\n\ttype: \"teams\",\n\tattributes: { name: \"Scottsdale Surf\", city: \"Scottsdale\" },\n});\n```\n\n#### `validateUpdateResource(schema, resource, options?)`\n\nValidates a resource for update operations.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (UpdateResource) - The resource to validate\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Returns:** Array of validation errors (empty if valid)\n\n#### `validateDeleteResource(schema, resource)`\n\nValidates a resource for delete operations.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (DeleteResource) - The resource reference to validate\n\n**Returns:** Array of validation errors (empty if valid)\n\n#### `validateMergeResource(schema, resource, options?)`\n\nValidates a resource tree that will be merged into a graph.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (unknown) - The resource tree to validate\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Returns:** Array of validation errors (empty if valid)\n\n#### `validateQueryResult(schema, rootQuery, result, options?)`\n\nValidates that query results match the expected structure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `rootQuery` (RootQuery) - The original query\n- `result` (unknown) - The query results to validate\n- `options.selectEngine` (SelectExpressionEngine, optional) - Expression engine for SELECT clauses\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Returns:** Array of validation errors (empty if valid)\n\n```javascript\nimport { validateQueryResult } from \"@data-prism/core\";\n\nconst errors = validateQueryResult(schema, query, results);\nif (errors.length > 0) {\n\tconsole.error(\"Query result validation failed:\", errors);\n}\n```\n\n### Ensure Functions\n\nThe following functions provide throwing variants of the validation functions above, useful for fail-fast scenarios:\n\n#### `ensureValidCreateResource(schema, resource, options?)`\n\nValidates a resource for creation operations. Throws on validation failure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (CreateResource) - The resource to validate\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Throws:** Error if resource is invalid\n\n```javascript\nimport { ensureValidCreateResource } from \"@data-prism/core\";\n\nensureValidCreateResource(schema, newResource); // Throws if invalid\n```\n\n#### `ensureValidUpdateResource(schema, resource, options?)`\n\nValidates a resource for update operations. Throws on validation failure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (UpdateResource) - The resource to validate\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Throws:** Error if resource is invalid\n\n#### `ensureValidDeleteResource(schema, resource)`\n\nValidates a resource for delete operations. Throws on validation failure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (DeleteResource) - The resource reference to validate\n\n**Throws:** Error if resource is invalid\n\n#### `ensureValidMergeResource(schema, resource, options?)`\n\nValidates a resource tree that will be merged into a graph. Throws on validation failure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `resource` (unknown) - The resource tree to validate\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Throws:** Error if resource is invalid\n\n#### `ensureValidQueryResult(schema, rootQuery, result, options?)`\n\nValidates that query results match the expected structure. Throws on validation failure.\n\n**Parameters:**\n\n- `schema` (Schema) - The schema to validate against\n- `rootQuery` (RootQuery) - The original query\n- `result` (unknown) - The query results to validate\n- `options.selectEngine` (SelectExpressionEngine, optional) - Expression engine for SELECT clauses\n- `options.validator` (Ajv, optional) - Custom validator instance\n\n**Throws:** Error if results don't match expected structure\n\n## Examples\n\n### Basic Usage\n\n```javascript\nimport {\n\tensureValidSchema,\n\tcreateEmptyGraph,\n\tqueryGraph,\n\tnormalizeResource,\n} from \"@data-prism/core\";\n\n// 1. Define your schema\nconst schema = {\n\tresources: {\n\t\tteams: {\n\t\t\tattributes: {\n\t\t\t\tid: { type: \"string\" },\n\t\t\t\tname: { type: \"string\" },\n\t\t\t},\n\t\t\trelationships: {\n\t\t\t\thomeMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"homeTeam\",\n\t\t\t\t},\n\t\t\t\tawayMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"awayTeam\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n\n// 2. Validate the schema\nensureValidSchema(schema);\n\n// 3. Create and populate a graph\nconst graph = createEmptyGraph(schema);\nconst teamData = { id: \"1\", name: \"Arizona Bay FC\" };\nconst normalizedTeam = normalizeResource(schema, \"teams\", teamData);\n\ngraph.teams[\"1\"] = normalizedTeam;\n\n// 4. Query the data\nconst results = queryGraph(\n\tschema,\n\t{\n\t\ttype: \"teams\",\n\t\tselect: [\"name\"],\n\t},\n\tgraph,\n);\n\nconsole.log(results); // [{ name: \"Arizona Bay FC\" }]\n```\n\n### Working with Relationships\n\n```javascript\nconst schema = {\n\tresources: {\n\t\tteams: {\n\t\t\tattributes: {\n\t\t\t\tid: { type: \"string\" },\n\t\t\t\tname: { type: \"string\" },\n\t\t\t},\n\t\t\trelationships: {\n\t\t\t\thomeMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"homeTeam\",\n\t\t\t\t},\n\t\t\t\tawayMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"awayTeam\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmatches: {\n\t\t\tattributes: {\n\t\t\t\tid: { type: \"string\" },\n\t\t\t\tfield: { type: \"string\" },\n\t\t\t},\n\t\t\trelationships: {\n\t\t\t\thomeTeam: { type: \"teams\", cardinality: \"one\", inverse: \"homeMatches\" },\n\t\t\t\tawayTeam: { type: \"teams\", cardinality: \"one\", inverse: \"awayMatches\" },\n\t\t\t},\n\t\t},\n\t},\n};\n\n// Query with relationship traversal\nconst results = queryGraph(\n\tschema,\n\t{\n\t\ttype: \"teams\",\n\t\tselect: {\n\t\t\tname: \"name\",\n\t\t\thomeMatches: {\n\t\t\t\tselect: [\"field\", \"awayTeam\"],\n\t\t\t},\n\t\t},\n\t},\n\tgraph,\n);\n```\n\n### Data Validation\n\n```javascript\nimport {\n\tvalidateCreateResource,\n\tensureValidCreateResource,\n} from \"@data-prism/core\";\n\nconst newTeam = {\n\ttype: \"teams\",\n\tattributes: {\n\t\tname: \"Mesa Mariners\",\n\t\tcity: \"Mesa\",\n\t},\n};\n\n// Option 1: Check errors manually\nconst errors = validateCreateResource(schema, newTeam);\nif (errors.length > 0) {\n\tconsole.error(\"Validation failed:\", errors);\n}\n\n// Option 2: Throw on validation failure\ntry {\n\tensureValidCreateResource(schema, newTeam);\n\tconsole.log(\"Resource is valid!\");\n} catch (error) {\n\tconsole.error(\"Validation failed:\", error.message);\n}\n```\n\n## TypeScript Support\n\nData Prism Core includes comprehensive TypeScript definitions. Import types as needed:\n\n```typescript\nimport type {\n\tSchema,\n\tGraph,\n\tQuery,\n\tRootQuery,\n\tNormalResource,\n} from \"@data-prism/core\";\n\nconst schema: Schema = {\n\tresources: {\n\t\tteams: {\n\t\t\tattributes: {\n\t\t\t\tid: { type: \"string\" },\n\t\t\t\tname: { type: \"string\" },\n\t\t\t},\n\t\t\trelationships: {\n\t\t\t\thomeMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"homeTeam\",\n\t\t\t\t},\n\t\t\t\tawayMatches: {\n\t\t\t\t\ttype: \"matches\",\n\t\t\t\t\tcardinality: \"many\",\n\t\t\t\t\tinverse: \"awayTeam\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n```\n\n## Advanced Usage\n\n### Custom Validation\n\n```javascript\nimport {\n\tcreateValidator,\n\tvalidateSchema,\n\tensureValidSchema,\n} from \"@data-prism/core\";\n\nconst customValidator = createValidator({\n\tajvSchemas: [myCustomSchema],\n});\n\n// Option 1: Check errors manually\nconst errors = validateSchema(schema, { validator: customValidator });\nif (errors.length > 0) {\n\tconsole.error(\"Schema validation failed:\", errors);\n}\n\n// Option 2: Throw on validation failure\nensureValidSchema(schema, { validator: customValidator });\n```\n\n### Performance Optimization\n\nFor better performance with large datasets:\n\n1. Link inverses once with `linkInverses` rather than on each query\n2. Validate schemas once during application startup\n\n## Related Packages\n\n- `@data-prism/memory-store` - In-memory data store implementation\n- `@data-prism/postgres-store` - PostgreSQL backend\n- `@data-prism/jsonapi-store` - JSON:API client store\n","readmeFilename":"README.md"}