{"_id":"@chaim-tools/chaim-bprint-spec","_rev":"10-ed55ee28eabc87834d12a8dd76c5eae0","name":"@chaim-tools/chaim-bprint-spec","dist-tags":{"latest":"0.2.10"},"versions":{"0.1.1":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.1.1","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.1.1","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"4a496927a9b3dd3f79548d6777dad7dcf991fde4","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.1.1.tgz","fileCount":10,"integrity":"sha512-jKtjSvtoy35idj7HISOStEb4uFjlUPwaPlhz7LKguI6RT7Q51GpAsjPjHFpCP6Rzv6XtUn3qMzS9bddRm3LssA==","signatures":[{"sig":"MEQCIExt6ltgqBfSwl3QxtN1n+sNcls/HqZO1Ay8KIaZnMaVAiBDsfa+9M+J6OfiPF4z8/E6jdOy3LcAwsOgxI+mFjAA3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27505},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"18c7cae7e56048047e7f62afc6a45ed2269e9c28","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.1.1_1762631218559_0.27606707663637775","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.0","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.0","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"0e9e126b8129b416059c389d9a46ef20cbeb946f","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.0.tgz","fileCount":11,"integrity":"sha512-1bGNb5SMQhjtaHSZH0kSL+gFSBIUsFZGFcCZmTQKsYd8Pb2XV1tCTluObx4Oh/lye3bUw6YibodiNAHkWow4Ng==","signatures":[{"sig":"MEYCIQDxSVuuvl7cawCsLYth0nZN/sjPhxyFrw0vv6LuM80s7wIhANkngzWU/4B30c0jfd2FyAilF0XKIhd2t2rSaTqPbZ8d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36016},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"dea83af36cabd0ac940f4a3235675e96bd60c961","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.0_1768848665689_0.7258661184781661","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.1","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.1","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"55f4260ebbbd076021329d0df4aaac6a7ff6ec88","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.1.tgz","fileCount":11,"integrity":"sha512-M57c+kUkYK01xrkkRVEumgOE2ELOslXmSe1imszRxexGu08fw1xv9Qs8eMY5FKCSVJbg9ELOX9l9H49eYBm3ag==","signatures":[{"sig":"MEYCIQCEcTjhOfJCO86yEuh027+Ek2PQBCQS+uLnoXNi7qxM2wIhAOLN67IZ2NFTk7mLDMn7PGGB/SANvTCCZhP0AiQk8xon","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36016},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"1df7d0a08f4012ed7aa7143dfcca00aaf38b5401","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.1_1768848738013_0.4713643397269862","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.3","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.3","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"8efeec7d0a74c123db5eea81e8aa822b15160d88","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.3.tgz","fileCount":11,"integrity":"sha512-pp2CtPeHYysDuWK03zp0lT66ilCoklCYtf5Z1MPIuJic0wIgnA7D2Rk1kMot14RNCSQDGVvzqrXRaNHHlIWjLw==","signatures":[{"sig":"MEUCIQDQ/3Blv0NgUPmUM4nROMBYNVLAHjX9aKKlhZIy42JZdQIgH4+HIuFhfoTc/FkHykLQDVLmChgKQCeY9dEETQ74htU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35983},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"0676264832dbcb5fdd32093f7ce487c90b96d388","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.3_1770667159808_0.364356965379641","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.4","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.4","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"401a481f03893d22857f3e4d34579a186f88a10c","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.4.tgz","fileCount":11,"integrity":"sha512-xBPGnK29iKfj5uO9C3O9Sl8qAJoA7/6fDnOCH4xzQL0vfcqQeaZkAn+jkna/U0bQtmmq6uWaspjP0cO+pTt1uA==","signatures":[{"sig":"MEUCIGu99iTYQELl1dZvhKFaprgKjVr0TJiPPjYqtVN28PikAiEA7lcD/JVszZmk+u5syKV9hw+3/oC8/c1bFfQml4mxNuI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46708},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"3d143723e1f4a9d6b1947877334592f439a401fa","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.4_1771192961690_0.00273145914131101","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.5","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.5","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"0c5ece821a2fc70040f4551ee08b23f54c1e4490","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.5.tgz","fileCount":14,"integrity":"sha512-FXQnG9lVNzDVqhpe3kLxixpjM2IjauoH5VJmH1VMf5KAt02OcomvA3fMi/lghGis5stC1OuZ43fhc5KcvOAq6A==","signatures":[{"sig":"MEUCIQDOT91dRL1ZQIOOQBYhLvTQW7eT+wIzzdniwfUPLewQyAIgVCgw5V2uzn5izm52Wp/TiANCeW3MPp71OZj7WJtjaJQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62614},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"f51e07bd6782922a9b919d5d1366771b635e98c1","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run spec:check && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","spec:bump":"node scripts/spec-version-bump.mjs","spec:check":"node scripts/spec-version-check.mjs","spec:bump:major":"node scripts/spec-version-bump.mjs major","spec:bump:minor":"node scripts/spec-version-bump.mjs minor","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.5_1771346403928_0.3162620484191878","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.6","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.6","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"1e922f1668d767f409b1abbe35924b8f4935ec5c","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.6.tgz","fileCount":14,"integrity":"sha512-CRVVIY5s1lUJWIqyCkGhkDRsS+RVYhybTu+uDaW6F7MYAcUnvQ99kEY4HUib3yPKlQZ3hdMw3FMOPO5XoMY6dA==","signatures":[{"sig":"MEUCICdqrJTW8CJ6f/Ppd3o831NjLfIIEm9v9mtdXyT2dbi8AiEAzZPePc7T3ccfxMmj1bRIfT0RYzMua4xtOHpVFHgT1fA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63564},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"b31987ddc280654c189745c0d221dc67a524b220","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc","check":"prettier -c . && eslint . && npm run spec:check && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","spec:bump":"node scripts/spec-version-bump.mjs","spec:check":"node scripts/spec-version-check.mjs","spec:bump:major":"node scripts/spec-version-bump.mjs major","spec:bump:minor":"node scripts/spec-version-bump.mjs minor","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.6_1771445033438_0.9121633704075904","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.8","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.8","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"70ba8cd954b46723673ef7b57353a78bd5e2ebc4","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.8.tgz","fileCount":15,"integrity":"sha512-YKYV8VbJxP9ZFUW0rJSMvpkjpwUCPyMwu0xXlynryVUyVehlNiI2J3wS3ml6MM8Cf5U6YeKRgyUxAMO81eYsqQ==","signatures":[{"sig":"MEQCIEz2x07/2lzWxjX8LCP0Bf03HjWSQnK0fNQdzQfR2xm1AiBqWzj1F1xG4wRTro3+uB9/B7mrvse+rJ5J18cCZLlE+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113210},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"8cadc757dc840baa928948566a381a9877912755","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc && cp -r schema dist/schema","check":"prettier -c . && eslint . && npm run spec:check && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","spec:bump":"node scripts/spec-version-bump.mjs","spec:check":"node scripts/spec-version-check.mjs","spec:bump:major":"node scripts/spec-version-bump.mjs major","spec:bump:minor":"node scripts/spec-version-bump.mjs minor","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.8_1771607652043_0.5944315096166832","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.9","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","_id":"@chaim-tools/chaim-bprint-spec@0.2.9","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"dist":{"shasum":"435f017be4af6053092326b128a3364e74427611","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.9.tgz","fileCount":15,"integrity":"sha512-vj1xQPh2EHZB75C88Xl+si0Jcq3eA90cBPcDLVCmvCFlOvU8AgNYOP+SiwBqEyFTBpnlCUo579gZKum0aat/vA==","signatures":[{"sig":"MEQCIGzgrYAPFs2FKm28Lx1p1V2TWHZ31JaNMNMVTD/lJDYQAiBQj/mhfWlIVOyNx98l/XPZTPZJ+TkJMO0lC9DEYRdZXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113210},"main":"dist/src/index.js","type":"commonjs","types":"dist/src/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"gitHead":"25f0ebca50043c969a1e7077f6a60a7605263db9","private":false,"scripts":{"lint":"eslint --max-warnings=0 .","test":"node --test tests/spec.test.mjs","build":"tsc && cp -r schema dist/schema","check":"prettier -c . && eslint . && npm run spec:check && npm run validate:examples && npm test","clean":"rm -rf dist","format":"prettier -w .","prepare":"npm run build","spec:bump":"node scripts/spec-version-bump.mjs","spec:check":"node scripts/spec-version-check.mjs","spec:bump:major":"node scripts/spec-version-bump.mjs major","spec:bump:minor":"node scripts/spec-version-bump.mjs minor","validate:single":"node scripts/validate-single.mjs","test:integration":"node --test tests/integration/*.test.mjs","validate:examples":"node scripts/validate-examples.mjs"},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"repository":{"url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git","type":"git"},"_npmVersion":"10.9.2","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.17.1","eslint":"^9.9.0","prettier":"^3.3.3","typescript":"^5.0.0","@types/node":"^20.0.0","ajv-formats":"^3.0.1","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chaim-bprint-spec_0.2.9_1771610208650_0.13360406811032033","host":"s3://npm-registry-packages-npm-production"}},"0.2.10":{"name":"@chaim-tools/chaim-bprint-spec","version":"0.2.10","description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","main":"dist/src/index.js","types":"dist/src/index.d.ts","private":false,"type":"commonjs","scripts":{"build":"tsc && cp -r schema dist/schema","clean":"rm -rf dist","prepare":"npm run build","lint":"eslint --max-warnings=0 .","validate:examples":"node scripts/validate-examples.mjs","validate:single":"node scripts/validate-single.mjs","test":"node --test tests/spec.test.mjs","test:integration":"node --test tests/integration/*.test.mjs","format":"prettier -w .","spec:check":"node scripts/spec-version-check.mjs","spec:bump":"node scripts/spec-version-bump.mjs","spec:bump:minor":"node scripts/spec-version-bump.mjs minor","spec:bump:major":"node scripts/spec-version-bump.mjs major","check":"prettier -c . && eslint . && npm run spec:check && npm run validate:examples && npm test"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./schema":"./schema/bprint.schema.json"},"engines":{"node":">=18"},"keywords":["chaim","bprint","schema","typescript","validation","ddb"],"author":{"name":"Chaim Tools"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git"},"bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","ajv":"^8.17.1","ajv-formats":"^3.0.1","eslint":"^9.9.0","eslint-config-prettier":"^9.1.0","prettier":"^3.3.3"},"_id":"@chaim-tools/chaim-bprint-spec@0.2.10","gitHead":"48bec058c036d73e5aff0791259b63afc6f49c97","_nodeVersion":"22.13.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-bTSEbXdKl/OQ6Ylkm2yPofLYq8MAQAbnPjmy7LqlY+b+va6C8ex842KY/HCNUQtmFQDrj/iBKshYq38X3HGPbA==","shasum":"1ba8f5910ff7f417a609c7cc3d886a632fc1febc","tarball":"https://registry.npmjs.org/@chaim-tools/chaim-bprint-spec/-/chaim-bprint-spec-0.2.10.tgz","fileCount":15,"unpackedSize":113211,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIESbqSOJQY7H5lplKyxENSrVSa9X6CRNoN9Jt67WtEsfAiBjccHyiQ0Bz4Ym4CKxlFLM9B0zdlKhQwn/B+rG8Ce1Og=="}]},"_npmUser":{"name":"chaim-creator","email":"andrew@chaim.co"},"directories":{},"maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chaim-bprint-spec_0.2.10_1771646453539_0.6372462884840584"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-08T19:46:58.436Z","modified":"2026-02-21T04:00:53.826Z","0.1.1":"2025-11-08T19:46:58.756Z","0.2.0":"2026-01-19T18:51:05.831Z","0.2.1":"2026-01-19T18:52:18.149Z","0.2.3":"2026-02-09T19:59:19.951Z","0.2.4":"2026-02-15T22:02:41.828Z","0.2.5":"2026-02-17T16:40:04.073Z","0.2.6":"2026-02-18T20:03:54.516Z","0.2.8":"2026-02-20T17:14:12.208Z","0.2.9":"2026-02-20T17:56:48.802Z","0.2.10":"2026-02-21T04:00:53.694Z"},"bugs":{"url":"https://github.com/chaim-tools/chaim-bprint-spec/issues"},"author":{"name":"Chaim Tools"},"license":"Apache-2.0","homepage":"https://github.com/chaim-tools/chaim-bprint-spec#readme","keywords":["chaim","bprint","schema","typescript","validation","ddb"],"repository":{"type":"git","url":"git+https://github.com/chaim-tools/chaim-bprint-spec.git"},"description":"Chaim Blueprint (.bprint) schema specification and TypeScript types","maintainers":[{"name":"chaim-creator","email":"andrew@chaim.co"}],"readme":"# chaim-bprint-spec\n\nThe Blueprint Specification (`.bprint`) defines the schema format that drives the entire Chaim toolchain. Every entity your application stores in DynamoDB starts as a `.bprint` file. This package provides the canonical JSON Schema, TypeScript types, and validation logic that all other Chaim packages depend on.\n\n**npm**: [`@chaim-tools/chaim-bprint-spec`](https://www.npmjs.com/package/@chaim-tools/chaim-bprint-spec)\n\n## Where This Fits\n\n```\n .bprint file  ──>  chaim-cdk  ──>  chaim-cli  ──>  chaim-client-java\n      ^                                                     │\n      │                                                     v\n  YOU WRITE THIS                                    Generated Java SDK\n```\n\nYou author `.bprint` files. The CDK construct reads them at synth time. The CLI reads cached snapshots and invokes the Java code generator. Every step validates your schema against this spec.\n\n## Installation\n\n```bash\nnpm install @chaim-tools/chaim-bprint-spec\n```\n\n## Schema Format\n\nA `.bprint` file is a JSON document describing a single entity: its name, identity (key fields), types, constraints, and metadata. The `entityName` must be PascalCase (e.g., `\"User\"`, `\"OrderItem\"`) — it becomes the class/type name in generated code.\n\n### Minimal Example\n\n```json\n{\n  \"schemaVersion\": \"1.0\",\n  \"entityName\": \"User\",\n  \"description\": \"User account information\",\n  \"identity\": { \"fields\": [\"userId\"] },\n  \"fields\": [\n    { \"name\": \"userId\", \"type\": \"string\", \"required\": true },\n    { \"name\": \"email\", \"type\": \"string\", \"required\": true },\n    { \"name\": \"isActive\", \"type\": \"boolean\", \"default\": true }\n  ]\n}\n```\n\n### Full-Featured Example\n\nThis example demonstrates every field type, all field properties, constraints, collection types, recursive nesting, and `nameOverride`:\n\n```json\n{\n  \"schemaVersion\": \"1.0\",\n  \"entityName\": \"Order\",\n  \"description\": \"Customer orders with line items, shipping, and payment details\",\n  \"identity\": {\n    \"fields\": [\"orderId\", \"customerId\"]\n  },\n  \"fields\": [\n    { \"name\": \"orderId\", \"type\": \"string\", \"required\": true },\n    { \"name\": \"customerId\", \"type\": \"string\", \"required\": true },\n    {\n      \"name\": \"email\",\n      \"type\": \"string\",\n      \"required\": true,\n      \"description\": \"Customer email for order notifications\",\n      \"constraints\": {\n        \"minLength\": 5,\n        \"maxLength\": 254,\n        \"pattern\": \"^[^@]+@[^@]+\\\\.[^@]+$\"\n      }\n    },\n    {\n      \"name\": \"status\",\n      \"type\": \"string\",\n      \"required\": true,\n      \"enum\": [\"pending\", \"confirmed\", \"shipped\", \"delivered\", \"cancelled\"]\n    },\n    {\n      \"name\": \"totalAmount\",\n      \"type\": \"number.decimal\",\n      \"required\": true,\n      \"constraints\": { \"min\": 0, \"max\": 999999.99 }\n    },\n    { \"name\": \"isPrime\", \"type\": \"boolean\", \"default\": false },\n    {\n      \"name\": \"priorityLevel\",\n      \"type\": \"number.int\",\n      \"enum\": [1, 2, 3, 4, 5],\n      \"description\": \"Shipping priority level\"\n    },\n    { \"name\": \"orderDate\", \"type\": \"timestamp.epoch\", \"required\": true },\n    {\n      \"name\": \"3pl-tracking-id\",\n      \"type\": \"string\",\n      \"nameOverride\": \"thirdPartyTrackingId\",\n      \"description\": \"Tracking ID from third-party logistics provider\"\n    },\n    {\n      \"name\": \"lineItems\",\n      \"type\": \"list\",\n      \"description\": \"Ordered products with pricing and discount details\",\n      \"items\": {\n        \"type\": \"map\",\n        \"fields\": [\n          { \"name\": \"productId\", \"type\": \"string\" },\n          { \"name\": \"productName\", \"type\": \"string\" },\n          { \"name\": \"quantity\", \"type\": \"number.int\" },\n          { \"name\": \"unitPrice\", \"type\": \"number.decimal\" },\n          { \"name\": \"discount\", \"type\": \"number.decimal\" },\n          {\n            \"name\": \"customization\",\n            \"type\": \"map\",\n            \"fields\": [\n              { \"name\": \"color\", \"type\": \"string\" },\n              { \"name\": \"size\", \"type\": \"string\" },\n              { \"name\": \"giftWrap\", \"type\": \"boolean\" },\n              { \"name\": \"engraving\", \"type\": \"string\" }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"shippingAddress\",\n      \"type\": \"map\",\n      \"fields\": [\n        { \"name\": \"recipientName\", \"type\": \"string\" },\n        { \"name\": \"street\", \"type\": \"string\" },\n        { \"name\": \"city\", \"type\": \"string\" },\n        { \"name\": \"state\", \"type\": \"string\" },\n        { \"name\": \"zip\", \"type\": \"string\" },\n        { \"name\": \"country\", \"type\": \"string\" },\n        {\n          \"name\": \"coordinates\",\n          \"type\": \"map\",\n          \"fields\": [\n            { \"name\": \"lat\", \"type\": \"number\" },\n            { \"name\": \"lng\", \"type\": \"number\" }\n          ]\n        },\n        {\n          \"name\": \"deliveryInstructions\",\n          \"type\": \"list\",\n          \"items\": { \"type\": \"string\" }\n        }\n      ]\n    },\n    {\n      \"name\": \"paymentHistory\",\n      \"type\": \"list\",\n      \"items\": {\n        \"type\": \"map\",\n        \"fields\": [\n          { \"name\": \"transactionId\", \"type\": \"string\" },\n          { \"name\": \"amount\", \"type\": \"number.decimal\" },\n          { \"name\": \"method\", \"type\": \"string\" },\n          { \"name\": \"processedAt\", \"type\": \"timestamp.epoch\" }\n        ]\n      }\n    },\n    {\n      \"name\": \"priorityScores\",\n      \"type\": \"list\",\n      \"items\": { \"type\": \"number.decimal\" }\n    },\n    { \"name\": \"tags\", \"type\": \"stringSet\" },\n    { \"name\": \"appliedCouponCodes\", \"type\": \"stringSet\" },\n    { \"name\": \"loyaltyPointsUsed\", \"type\": \"numberSet.long\" },\n    { \"name\": \"createdAt\", \"type\": \"timestamp.epoch\", \"required\": true },\n    { \"name\": \"updatedAt\", \"type\": \"timestamp.epoch\" }\n  ]\n}\n```\n\n**Features demonstrated above:**\n\n| Feature                                                    | Where                                                                         |\n| ---------------------------------------------------------- | ----------------------------------------------------------------------------- |\n| Composite identity (2 fields)                              | `identity`                                                                    |\n| All scalar types                                           | `email`, `totalAmount`, `isPrime`, `orderDate`                                |\n| Dot-notation number types (`number.int`, `number.decimal`) | `quantity`, `unitPrice`, `totalAmount`                                        |\n| Dot-notation timestamp types (`timestamp.epoch`)           | `orderDate`, `createdAt`, `processedAt`                                       |\n| String constraints (`minLength`, `maxLength`, `pattern`)   | `email`                                                                       |\n| Number constraints (`min`, `max`) on `number.decimal`      | `totalAmount`                                                                 |\n| `enum` (allowed values)                                    | `status`                                                                      |\n| `default` value                                            | `isPrime`                                                                     |\n| `required` fields                                          | `orderId`, `customerId`, `email`, etc.                                        |\n| `description` on fields                                    | `email`, `3pl-tracking-id`, `lineItems`                                       |\n| `nameOverride` (invalid identifier)                        | `3pl-tracking-id` -> `thirdPartyTrackingId`                                   |\n| `list` of scalars                                          | `priorityScores` (list of decimals), `deliveryInstructions` (list of strings) |\n| `list` of maps (`list<map>`)                               | `lineItems`, `paymentHistory`                                                 |\n| `map` (nested object)                                      | `shippingAddress`                                                             |\n| Map within map (recursive nesting)                         | `shippingAddress.coordinates`                                                 |\n| Map within list item (recursive nesting)                   | `lineItems[].customization`                                                   |\n| List within map (recursive nesting)                        | `shippingAddress.deliveryInstructions`                                        |\n| `stringSet`                                                | `tags`, `appliedCouponCodes`                                                  |\n| `numberSet.long` (typed number set)                        | `loyaltyPointsUsed`                                                           |\n\n## Supported Field Types\n\nField types follow the pattern `<base>` or `<base>.<subtype>`. The dot-notation suffix is a language-level precision hint — it does **not** change the DynamoDB attribute type, only the generated language type (e.g. `Long` vs `Integer` in Java).\n\n### Scalar Types\n\n| Type              | DynamoDB | Java Mapping | Description                                          |\n| ----------------- | -------- | ------------ | ---------------------------------------------------- |\n| `string`          | S        | `String`     | Text values                                          |\n| `number`          | N        | `Integer`    | Numeric — defaults to Integer                        |\n| `number.int`      | N        | `Integer`    | 32-bit integer                                       |\n| `number.long`     | N        | `Long`       | 64-bit integer                                       |\n| `number.float`    | N        | `Float`      | 32-bit float                                         |\n| `number.double`   | N        | `Double`     | 64-bit float (explicit)                              |\n| `number.decimal`  | N        | `BigDecimal` | Arbitrary-precision decimal                          |\n| `boolean`         | BOOL     | `Boolean`    | True/false                                           |\n| `binary`          | B        | `byte[]`     | Raw binary data (Buffer in Node.js, bytes in Python) |\n| `timestamp`       | S        | `Instant`    | ISO-8601 full datetime                               |\n| `timestamp.epoch` | N        | `Long`       | Unix epoch milliseconds                              |\n| `timestamp.date`  | S        | `LocalDate`  | ISO-8601 date only (e.g. `\"2024-01-15\"`)             |\n\n### Collection Types\n\n| Type                | DynamoDB | Java Mapping                | Description                                                  |\n| ------------------- | -------- | --------------------------- | ------------------------------------------------------------ |\n| `list`              | L        | `List<T>`                   | Ordered collection                                           |\n| `map`               | M        | Inner `@DynamoDbBean` class | Nested object with named fields                              |\n| `stringSet`         | SS       | `Set<String>`               | Unordered collection of unique string values                 |\n| `numberSet`         | NS       | `Set<Integer>`              | Unordered collection of unique numbers — defaults to Integer |\n| `numberSet.int`     | NS       | `Set<Integer>`              | Number set of 32-bit integers                                |\n| `numberSet.long`    | NS       | `Set<Long>`                 | Number set of 64-bit integers                                |\n| `numberSet.float`   | NS       | `Set<Float>`                | Number set of 32-bit floats                                  |\n| `numberSet.double`  | NS       | `Set<Double>`               | Number set of 64-bit floats (explicit)                       |\n| `numberSet.decimal` | NS       | `Set<BigDecimal>`           | Number set of arbitrary-precision decimals                   |\n\n### Dot-Notation Sub-Types\n\nThe dot-notation suffix selects the generated language type without changing DynamoDB storage:\n\n```json\n{ \"name\": \"quantity\",   \"type\": \"number.int\"      }   // Integer (same as bare number)\n{ \"name\": \"timestamp\",  \"type\": \"number.long\"      }   // Long (64-bit)\n{ \"name\": \"price\",      \"type\": \"number.decimal\"   }   // BigDecimal (arbitrary-precision)\n{ \"name\": \"eventTime\",  \"type\": \"timestamp.epoch\"  }   // Long, stored as DynamoDB N\n{ \"name\": \"birthDate\",  \"type\": \"timestamp.date\"   }   // LocalDate, stored as DynamoDB S\n{ \"name\": \"scores\",     \"type\": \"numberSet.int\"    }   // Set<Integer>\n{ \"name\": \"payments\",   \"type\": \"numberSet.decimal\"}   // Set<BigDecimal>\n```\n\n**`timestamp.date` note:** Java generators emit a `LocalDateConverter` class and annotate affected getters with `@DynamoDbConvertedBy(LocalDateConverter.class)` automatically. No manual converter setup is needed.\n\n**Constraints with sub-types:** `min`/`max` constraints work on any `number.*` field including `number.decimal`. The validator uses `compareTo()` for decimal fields automatically.\n\n### Cross-Language Type Mapping\n\nThe `.bprint` type system is designed for multi-language code generation. Below is the complete mapping for all planned target languages. The Java column reflects the current generator output; other columns show planned mappings.\n\n**Scalars:**\n\n| .bprint Type      | Java         | TypeScript              | Python     | Go             | C#               |\n| ----------------- | ------------ | ----------------------- | ---------- | -------------- | ---------------- |\n| `string`          | `String`     | `string`                | `str`      | `string`       | `string`         |\n| `number`          | `Integer`    | `number`                | `int`      | `int32`        | `int`            |\n| `number.int`      | `Integer`    | `number`                | `int`      | `int32`        | `int`            |\n| `number.long`     | `Long`       | `bigint`                | `int`      | `int64`        | `long`           |\n| `number.float`    | `Float`      | `number`                | `float`    | `float32`      | `float`          |\n| `number.double`   | `Double`     | `number`                | `float`    | `float64`      | `double`         |\n| `number.decimal`  | `BigDecimal` | `Decimal` ¹             | `Decimal`  | `*big.Float`   | `decimal`        |\n| `boolean`         | `Boolean`    | `boolean`               | `bool`     | `bool`         | `bool`           |\n| `binary`          | `byte[]`     | `Buffer` / `Uint8Array` | `bytes`    | `[]byte`       | `byte[]`         |\n| `timestamp`       | `Instant`    | `string` ²              | `datetime` | `time.Time`    | `DateTimeOffset` |\n| `timestamp.epoch` | `Long`       | `number`                | `int`      | `int64`        | `long`           |\n| `timestamp.date`  | `LocalDate`  | `string` ²              | `date`     | `civil.Date` ³ | `DateOnly`       |\n\n**Collections:**\n\n| .bprint Type  | Java           | TypeScript                    | Python      | Go                    | C#                |\n| ------------- | -------------- | ----------------------------- | ----------- | --------------------- | ----------------- |\n| `list`        | `List<T>`      | `T[]`                         | `list[T]`   | `[]T`                 | `List<T>`         |\n| `map`         | inner class    | interface / type              | `TypedDict` | struct                | class             |\n| `stringSet`   | `Set<String>`  | `Set<string>`                 | `set[str]`  | `map[string]struct{}` | `HashSet<string>` |\n| `numberSet`   | `Set<Integer>` | `Set<number>`                 | `set[int]`  | `map[int32]struct{}`  | `HashSet<int>`    |\n| `numberSet.*` | `Set<{T}>`     | `Set<number>` / `Set<bigint>` | `set[{T}]`  | `map[{T}]struct{}`    | `HashSet<{T}>`    |\n\n**Nullable modifier:** When `nullable: true`, generators emit nullable wrappers. Examples: `Integer` instead of `int` in Java, `Optional[int]` in Python, `*int32` in Go, `int?` in C#. TypeScript types are unaffected (all types are already nullable unless the field is `required`).\n\n> ¹ TypeScript `Decimal`: use `decimal.js` or similar library.\n> ² TypeScript timestamps: ISO-8601 strings. Consumers parse with `new Date()` or a library.\n> ³ Go `civil.Date`: `cloud.google.com/go/civil` or equivalent. Alternatively `string` with ISO format.\n\n### List Items\n\nA `list` field requires an `items` property defining the element type:\n\n```json\n{ \"name\": \"scores\", \"type\": \"list\", \"items\": { \"type\": \"number\" } }\n```\n\nFor a list of objects, use `items.type: \"map\"` with nested `fields`:\n\n```json\n{\n  \"name\": \"lineItems\",\n  \"type\": \"list\",\n  \"items\": {\n    \"type\": \"map\",\n    \"fields\": [\n      { \"name\": \"sku\", \"type\": \"string\" },\n      { \"name\": \"qty\", \"type\": \"number\" }\n    ]\n  }\n}\n```\n\n### Map Fields\n\nA `map` field requires a `fields` array of nested field definitions:\n\n```json\n{\n  \"name\": \"address\",\n  \"type\": \"map\",\n  \"fields\": [\n    { \"name\": \"street\", \"type\": \"string\" },\n    { \"name\": \"city\", \"type\": \"string\" },\n    { \"name\": \"zip\", \"type\": \"string\" }\n  ]\n}\n```\n\n### Recursive Nesting (Maps within Maps)\n\nNested fields support both scalar types (`string`, `number`, `boolean`, `timestamp`) and collection types (`map`, `list`). This enables arbitrarily deep nesting for rich document structures:\n\n```json\n{\n  \"name\": \"shippingAddress\",\n  \"type\": \"map\",\n  \"fields\": [\n    { \"name\": \"street\", \"type\": \"string\" },\n    { \"name\": \"city\", \"type\": \"string\" },\n    {\n      \"name\": \"coordinates\",\n      \"type\": \"map\",\n      \"fields\": [\n        { \"name\": \"lat\", \"type\": \"number\" },\n        { \"name\": \"lng\", \"type\": \"number\" }\n      ]\n    },\n    {\n      \"name\": \"deliveryAttempts\",\n      \"type\": \"list\",\n      \"items\": {\n        \"type\": \"map\",\n        \"fields\": [\n          { \"name\": \"attemptDate\", \"type\": \"timestamp\" },\n          { \"name\": \"status\", \"type\": \"string\" }\n        ]\n      }\n    }\n  ]\n}\n```\n\nThere is no hardcoded depth limit for nesting. The database itself is the guardrail for how deeply structures can be nested.\n\n## Field Properties\n\n| Property       | Type                 | Description                                                                                                                                                                                 |\n| -------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `name`         | string               | Attribute/column name in the data store (required). If it collides with a reserved keyword in any target language, a `nameOverride` is required.                                            |\n| `type`         | FieldType            | Data type (required)                                                                                                                                                                        |\n| `nameOverride` | string               | Alternative code identifier when `name` is not valid or collides with a reserved word                                                                                                       |\n| `required`     | boolean              | Generates null-check validation (default: false)                                                                                                                                            |\n| `nullable`     | boolean              | When true, generators emit nullable/wrapper types instead of primitives (e.g., `Integer` vs `int` in Java, `Optional[int]` in Python). Identity fields cannot be nullable. (default: false) |\n| `default`      | any                  | Default value; generates `@Builder.Default` in Java                                                                                                                                         |\n| `enum`         | (string \\| number)[] | Allowed values (strings or numbers); type-matched against the field type. Applies to nested fields too.                                                                                     |\n| `description`  | string               | Generates Javadoc on the field                                                                                                                                                              |\n| `constraints`  | object               | Validation constraints (see below)                                                                                                                                                          |\n| `annotations`  | object               | Extensible metadata for governance and tooling                                                                                                                                              |\n| `items`        | object               | Element type for `list` fields                                                                                                                                                              |\n| `fields`       | array                | Nested field definitions for `map` fields                                                                                                                                                   |\n\n### Constraints\n\nString fields support:\n\n| Constraint  | Type    | Description                  |\n| ----------- | ------- | ---------------------------- |\n| `minLength` | integer | Minimum string length        |\n| `maxLength` | integer | Maximum string length        |\n| `pattern`   | string  | Regex pattern for validation |\n\nNumber fields support:\n\n| Constraint | Type   | Description               |\n| ---------- | ------ | ------------------------- |\n| `min`      | number | Minimum value (inclusive) |\n| `max`      | number | Maximum value (inclusive) |\n\nConstraints cannot be applied to collection types.\n\n### Name Override\n\nWhen an attribute name contains hyphens, starts with a digit, or is otherwise invalid as an identifier, use `nameOverride`:\n\n```json\n{\n  \"name\": \"2fa-verified\",\n  \"type\": \"boolean\",\n  \"nameOverride\": \"twoFactorVerified\"\n}\n```\n\nThe generator uses `twoFactorVerified` as the Java field name and emits a `@DynamoDbAttribute(\"2fa-verified\")` annotation on the getter to map back to the DynamoDB attribute.\n\n## Schema vs Infrastructure Boundary\n\nThe `.bprint` schema defines **what data looks like** — field names, types, constraints, and metadata. Infrastructure concerns — **how and where data is stored** — belong in the CDK constructs (or future Terraform/CloudFormation binders).\n\n| Concern                         | Where it lives                                       | Why                                           |\n| ------------------------------- | ---------------------------------------------------- | --------------------------------------------- |\n| Field names, types, constraints | `.bprint` schema                                     | Portable across databases and languages       |\n| TTL attribute                   | CDK `timeToLiveAttribute`                            | DynamoDB-specific infrastructure config       |\n| GSIs / LSIs (secondary indexes) | CDK `addGlobalSecondaryIndex()`                      | Database-specific access pattern optimization |\n| Billing mode, capacity          | CDK table properties                                 | Operational/cost concern                      |\n| Streams, encryption, backups    | CDK table properties                                 | Infrastructure/compliance concern             |\n| Uniqueness enforcement          | CDK via GSI design (DynamoDB) or DB constraint (SQL) | Implementation varies by data store           |\n\nThis boundary is intentional: the same `.bprint` schema should be usable with DynamoDB today and PostgreSQL tomorrow without modification. Infrastructure-specific knobs stay in the infrastructure layer.\n\n### DynamoDB TTL\n\nDynamoDB TTL is configured on the CDK table construct — **not** in the `.bprint` schema. Simply declare the TTL field in your schema as a normal `timestamp.epoch` field, then configure the TTL attribute name on the table in CDK:\n\n```json\n{ \"name\": \"expiresAt\", \"type\": \"timestamp.epoch\", \"required\": true }\n```\n\n```typescript\n// CDK — the one place TTL is declared\nconst table = new dynamodb.Table(this, 'Sessions', {\n  partitionKey: { name: 'sessionId', type: dynamodb.AttributeType.STRING },\n  timeToLiveAttribute: 'expiresAt',\n});\n```\n\nThe `ChaimDynamoDBBinder` reads `timeToLiveAttribute` from the CDK L1 construct, validates the attribute name exists as a field in the `.bprint` schema, and captures it in the snapshot. The Java generator uses the snapshot's `ttlAttribute` to annotate the field appropriately.\n\n**Unit note:** DynamoDB TTL reads the stored value as Unix epoch **seconds**. When populating a TTL field in Java, use `Instant.getEpochSecond()` — not `toEpochMilli()`. Milliseconds will make items expire ~1000 years in the future.\n\n```java\nitem.setExpiresAt(Instant.now().plusSeconds(86400).getEpochSecond()); // 24h TTL\n```\n\n## TypeScript API\n\n### Types\n\n```typescript\nimport {\n  SchemaData,\n  Identity,\n  Field,\n  FieldType,\n  NumberSubType,\n  TimestampSubType,\n  ListItems,\n  NestedField,\n  NestedListItems,\n  FieldConstraints,\n  FieldAnnotations,\n} from '@chaim-tools/chaim-bprint-spec';\n```\n\n### Validation\n\n```typescript\nimport { validateSchema } from '@chaim-tools/chaim-bprint-spec';\n\nconst rawSchema = JSON.parse(fs.readFileSync('user.bprint', 'utf-8'));\nconst validated: SchemaData = validateSchema(rawSchema);\n```\n\n`validateSchema` performs:\n\n- Schema version format validation and support checking\n- Required top-level fields (`entityName`, `description`, `identity`, `fields`)\n- `entityName` PascalCase format validation and reserved-word collision check\n- Field type validation (including `binary` type)\n- Field `name` reserved-word check (requires `nameOverride` if the name collides with a keyword in Java, Python, Go, or TypeScript)\n- Duplicate field name detection\n- `nameOverride` identifier validity and reserved keyword checks\n- `nullable` property validation (boolean type, identity fields cannot be nullable)\n- Constraint type/range validation (string constraints on string fields, number constraints on number fields, min <= max)\n- Enum type-matching validation on both top-level and nested fields (string enums for string fields, numeric enums for number fields)\n- `binary` type restrictions (no defaults, no enums)\n- Regex pattern compilation check\n- Collection type rules (cannot have constraints/defaults/enums)\n- List `items` and map `fields` structure validation\n- Recursive validation of nested `map` and `list` types within map fields (no depth limit)\n\n### JSON Schema\n\nAccess the raw JSON Schema for use with any validator (e.g., Ajv):\n\n```typescript\nimport bprintSchema from '@chaim-tools/chaim-bprint-spec/schema';\n```\n\n### Schema Version\n\nThere are two independent version concepts — do not confuse them:\n\n| Concept                                      | Where                                | Who controls                                                          | Example                                                   |\n| -------------------------------------------- | ------------------------------------ | --------------------------------------------------------------------- | --------------------------------------------------------- |\n| **`schemaVersion`** (in your `.bprint` file) | `\"schemaVersion\": \"1.0\"`             | **You** — bump it each time you change your entity schema             | `\"1.0\"` → `\"1.1\"` after adding a field                    |\n| **Spec version** (this package's release)    | `spec-versions.json`, `package.json` | **Chaim maintainers** — tracks changes to the `.bprint` format itself | `1.3` = added `nullable`, `binary`, entityName validation |\n\n`schemaVersion` is your entity's version. It is **not** tied to the spec version. You start at `\"1.0\"` and increment whenever the schema content changes. The Chaim server enforces this: if content changes but the version doesn't, `cdk deploy` fails (HTTP 409).\n\nThe `SPEC_VERSION_PATTERN` regex is exported for format validation:\n\n```typescript\nimport { SPEC_VERSION_PATTERN } from '@chaim-tools/chaim-bprint-spec';\n// SPEC_VERSION_PATTERN = /^\\d+\\.\\d+$/\n```\n\nUse the CLI to bump the version automatically:\n\n```bash\nchaim bump ./schemas/user.bprint            # minor: 1.5 -> 1.6\nchaim bump ./schemas/user.bprint --major    # major: 1.5 -> 2.0\n```\n\n## Using in Your Application\n\nPlace `.bprint` files alongside your CDK infrastructure code. A typical project structure:\n\n```\nmy-cdk-project/\n├── schemas/\n│   ├── user.bprint\n│   ├── order.bprint\n│   └── product.bprint\n├── lib/\n│   └── my-stack.ts       # References schemas via ChaimDynamoDBBinder\n├── cdk.json\n└── package.json          # depends on @chaim-tools/cdk-lib\n```\n\nEach `.bprint` file describes one entity type. Multiple entities can share the same DynamoDB table (single-table design) by using the same partition/sort key field names.\n\n## CDK Synth-Time Validation\n\nWhen using `chaim-cdk`, the `ChaimDynamoDBBinder` construct performs additional validation at CDK synth time beyond what the `.bprint` spec validates on its own:\n\n- **Field reference validation** -- All DynamoDB key attribute names (table partition key, sort key, GSI partition/sort keys, LSI sort keys, and TTL attribute) must exist as fields in the `.bprint` schema. If any attribute references a field that doesn't exist in the schema, the CDK synth fails immediately with a descriptive error listing all mismatches.\n\nThis prevents silent drift between your `.bprint` schema and DynamoDB table definition.\n\n## Development\n\n```bash\nnpm run build          # Compile TypeScript\nnpm run test           # Run test suite (150+ tests)\nnpm run check          # Full validation: format, lint, spec check, examples, tests\nnpm run validate:examples  # Validate all example fixtures\n```\n\n### Test Fixtures\n\n`tests/fixtures/valid/` contains working `.bprint` examples covering basic schemas, composite keys, constraints, name overrides, collection types, recursive nested maps, and deeply nested structures. `tests/fixtures/invalid/` contains schemas that should fail validation.\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}