{"_id":"@atmyapp/structure","_rev":"11-c19c09d2c31ec11860138c3f902fe393","name":"@atmyapp/structure","dist-tags":{"next":"0.1.0-alpha.1","latest":"0.3.0"},"versions":{"0.0.1":{"name":"@atmyapp/structure","version":"0.0.1","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.0.1","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"cb5b7319c8f9fae95486e05b5ca2b5376c5c056f","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.0.1.tgz","fileCount":32,"integrity":"sha512-Q/6fBfPiDHNjwi4p/KGOAbiE7GCbdtu3pumwhWlhP6Xsv0y4CyoCADFMXCd0FgcblNrPIpGAot7woQTXXtWOKw==","signatures":[{"sig":"MEUCIQCOtPIQwtwlGAdxzB3HFtaacl8Yx+MLKVK+LDTSOgDLSwIgOHAf33lJbYH2fkpH0nm03a6Bj/iICsJaKAinVSHffzI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153616},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3bc90a8d547e2572ee8f646390f2a950c47677b5","scripts":{"test":"jest","build":"tsc"},"_npmUser":{"name":"gamma007","email":"maciekgamro@gmail.com"},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.6.2","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.0.1_1773582765015_0.5545785296347123","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@atmyapp/structure","version":"0.0.2","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.0.2","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"14a6037b8c7977e27a270c59a386f0d4d03709e0","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.0.2.tgz","fileCount":32,"integrity":"sha512-lKTN97WtQW09af/JOlFEDp8VTFPTLgYeYTLM9HlgCXOVJPvWSQZyvi37ikygmxorsU2TrEWvGd8TexjisUOqQw==","signatures":[{"sig":"MEUCICXgLtWHmoqwyw9GpOdP/8hKsw/Hi7ZZuDKi5DgMn51qAiEAin8U9HO5ttt18KauhNJgfZhN3079bu6VwUPmd9YBbOE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":160596},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"gitHead":"515da1e291891a2f0e938a453275bbfeaa1ac3d2","scripts":{"test":"jest","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a8c3549-a179-47c7-9739-1f67d6d6cd32"}},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.0.2_1773598035517_0.7943813910365538","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.1":{"name":"@atmyapp/structure","version":"0.1.0-alpha.1","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.0-alpha.1","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"76d8df947426a9c4bfc661a7885a064762d34565","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.0-alpha.1.tgz","fileCount":32,"integrity":"sha512-UhTXC8QQRMiGzk//wy4PZaBauuVOfG/wfH/Suq1l7vjB/C/StBrORfGWNwJMyQC2HJRAR80v3YlW0dkCF+VfqQ==","signatures":[{"sig":"MEUCIHDW21PiCYyTg6+Akbc0HI2jtNtV/GVqHm2lBjPBgwRHAiEAzoc93eF/NvZvlDbrA0hhIRlD6O3vjnbz6nDV+zPw8oY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.0-alpha.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":161830},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"gitHead":"dc1c1f8b8ab5f5906e3a3842cb474a173b90f429","scripts":{"test":"jest","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a8c3549-a179-47c7-9739-1f67d6d6cd32"}},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.0-alpha.1_1773668798354_0.0024409951020414322","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@atmyapp/structure","version":"0.1.0","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.0","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"3a5b81b5902f3f0bbdf7d63955f8ade0d84e53f0","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.0.tgz","fileCount":35,"integrity":"sha512-r0BzG2/h+r0PYA7pDDC5XQ26pWHa5lry2Mx8L9UQnVDglJD4GxDsFV7U+pyn7HQUj5AvVVWJh0jocb9Pe+l4Pg==","signatures":[{"sig":"MEYCIQC1vVQ52Bd81Y1tVz0+i5EiwHeL+8Lt56IHgi6DSXA08wIhAI/rJDqVnk070afwm6Rr02R+oDg7EajtCOBRTS4ELpKW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":177806},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"gitHead":"9a88b845d449391914e81dcf99b4d5387e196342","scripts":{"test":"jest","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a8c3549-a179-47c7-9739-1f67d6d6cd32"}},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.0_1774467686068_0.1512066672077561","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@atmyapp/structure","version":"0.1.1","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.1","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"d758d7ce37f4ae96d0bbba3d7074466452471c94","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.1.tgz","fileCount":38,"integrity":"sha512-0q64PfPs5moFVlnUdP2nvHwdaCsPbYBwbLIGMnK9mQX80dD7ND1xPmVrSctvuM3+HRCzV7XBT6DJZV669Unu4g==","signatures":[{"sig":"MEYCIQDECuuOc9mmK8eRyFBckS5MQ4ze1CuBJQTGfklmeuY4xgIhALkTE6ox61gGK+jwZp6F1dda8P4Mq0iTQe43IN8DILqk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":237977},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"gitHead":"68572e8169ed0e123659d452997ae867d0922961","scripts":{"test":"npm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a8c3549-a179-47c7-9739-1f67d6d6cd32"}},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.1_1775076603115_0.7988924721744524","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atmyapp/structure","version":"0.1.2","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.2","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"22c5a7fc6c2a437ff2c3190b0455fef2b7e4e000","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.2.tgz","fileCount":41,"integrity":"sha512-spbIWK7N6ggNDZQTuJqKBhLnttdbHvDesmBaF0/y8JX1XrjeVubHBvolRJMZFJfUg3uZbBgYBgZH3ngqnprjnA==","signatures":[{"sig":"MEUCIFaFt9T7kkP/XfynI8Mczqj0HabEptPdG+bB9sX0vmxlAiEAuXOnyjOqmGbr/2xJBNUboB43fwsNvSDzSk9PB7lEEIs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":261768},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"gitHead":"b0d53223b1b53420bbd79134bae8b4359ec7af54","scripts":{"test":"npm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a8c3549-a179-47c7-9739-1f67d6d6cd32"}},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.2_1777307502809_0.008409051813443424","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@atmyapp/structure","version":"0.1.3","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.3","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/structure#readme","bugs":{"url":"https://github.com/At-My-App/structure/issues"},"dist":{"shasum":"6234bb2d163167f35b2ab974cb57c8e0d054897a","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.3.tgz","fileCount":41,"integrity":"sha512-TTULg6dYx8bseq0LDyyGaRuanZjPjKu7I0vOXCg5no/joCvQ1gfefdpxazUMwH8H3HVHiVpP384hFoA2NoYCpQ==","signatures":[{"sig":"MEQCH0Y77FeJXHsDxX3Ii0TbYd+o6OuHOordPf53p+PGAbUCIQCyLmOzUP5CIIng1+0LgWcq4iSL4VEvBs8KznaGyYEe+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":273580},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"gitHead":"bfec038cbceb9e956a9c556b9fb2c8d98c91f49d","scripts":{"test":"npm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a8c3549-a179-47c7-9739-1f67d6d6cd32"}},"repository":{"url":"git+https://github.com/At-My-App/structure.git","type":"git"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.3_1780401957370_0.7273832228642769","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@atmyapp/structure","version":"0.1.4","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.4","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/atmyapp#readme","bugs":{"url":"https://github.com/At-My-App/atmyapp/issues"},"dist":{"shasum":"d357d1fb7929c5372710054c467ff9323d7ac45d","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.4.tgz","fileCount":41,"integrity":"sha512-xu4ix7ORWrl5Q/qZwjWWgBYpG6KN5/kHoJuZsiaV3yU0DIt3km9q+28ifiqZZOKwvcckgxSyu0q0q0YllvHG6A==","signatures":[{"sig":"MEUCIQDdEBFxJ2dZQAcw1KzoitG7lX6zbtLJKq9y6nbxJor6YwIgcnW57lnRU7lBbWgnyTZ/bk6wlPL9biffSFAIxiZU/EI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":273617},"main":"dist/index.js","_from":"file:atmyapp-structure-0.1.4.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"scripts":{"test":"pnpm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e54bb668-1a66-42cd-9b4c-02138301b63f"}},"_resolved":"/tmp/ba0adb082912a2cdede8fe4c89c1327c/atmyapp-structure-0.1.4.tgz","_integrity":"sha512-xu4ix7ORWrl5Q/qZwjWWgBYpG6KN5/kHoJuZsiaV3yU0DIt3km9q+28ifiqZZOKwvcckgxSyu0q0q0YllvHG6A==","repository":{"url":"git+https://github.com/At-My-App/atmyapp.git","type":"git","directory":"packages/structure"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.4_1783102064482_0.19323174067499327","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@atmyapp/structure","version":"0.1.5","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.1.5","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/atmyapp#readme","bugs":{"url":"https://github.com/At-My-App/atmyapp/issues"},"dist":{"shasum":"b89a5ce49a3d835f2390c03126995430da76d910","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.1.5.tgz","fileCount":47,"integrity":"sha512-R3fjlibv1Qx9xtczDMqYtdPUtpBw0su7rY/gFbsdbYK7mTm34VNitfQ5BorfmQ1ELgLPhZKn49n3xxfiTBZKrA==","signatures":[{"sig":"MEYCIQCPw730q4a8B4smqNctE5eWbTy2NSvoegsnpa1jn0MQxAIhAKa2BvAzYPC8SFXoB0eVSj7CdaglMpPB8+QpkIrKTqwh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDdpTyRgV/eOVH1w2fBdJbJQg6OP7Si2FP1K3zk4C4LGwIhAJc3dN1tsKKYO63FXRBhMo4LM6ioY555UyDrOtcy7peG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":316132},"main":"dist/index.js","_from":"file:atmyapp-structure-0.1.5.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"scripts":{"test":"pnpm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e54bb668-1a66-42cd-9b4c-02138301b63f"}},"_resolved":"/tmp/9e7279899ab89b6faf87dbe7bf5db5b8/atmyapp-structure-0.1.5.tgz","_integrity":"sha512-R3fjlibv1Qx9xtczDMqYtdPUtpBw0su7rY/gFbsdbYK7mTm34VNitfQ5BorfmQ1ELgLPhZKn49n3xxfiTBZKrA==","repository":{"url":"git+https://github.com/At-My-App/atmyapp.git","type":"git","directory":"packages/structure"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.1.5_1789076378235_0.8819019103090904","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atmyapp/structure","version":"0.2.0","author":{"name":"Maciej Gamrot"},"license":"ISC","_id":"@atmyapp/structure@0.2.0","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"homepage":"https://github.com/At-My-App/atmyapp#readme","bugs":{"url":"https://github.com/At-My-App/atmyapp/issues"},"dist":{"shasum":"864a5e9443546b7ffb27a31cb0f0303394f585c3","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.2.0.tgz","fileCount":47,"integrity":"sha512-EcxWKPaiW+bJYAMgvQUi3BJctN0oafsCRAdY4u7BNMTD4fhnZmVIz/y4woRMOb3tp65SPBvK5K4JvTt7+PERDw==","signatures":[{"sig":"MEUCIQDQwEpcU2hNl/69OYpKMLfqU1nvf2XqbHaL6Lzn6++GiQIgNP6lKxYHP52HsoA+ySo2kRrhsju2AnFdqLtmnsOU3D0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDZwBf0AI7gD43tqC5x7R98evN6o49JAO4Dxbv8xJl7lAiEAjcXe3dLhQdgNmHiIQnDsgiW6KonvVv85QmC3lEhwU78=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":316132},"main":"dist/index.js","_from":"file:atmyapp-structure-0.2.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"scripts":{"test":"pnpm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e54bb668-1a66-42cd-9b4c-02138301b63f"}},"_resolved":"/tmp/99b371d36b91c332b25e18b84caff9fd/atmyapp-structure-0.2.0.tgz","_integrity":"sha512-EcxWKPaiW+bJYAMgvQUi3BJctN0oafsCRAdY4u7BNMTD4fhnZmVIz/y4woRMOb3tp65SPBvK5K4JvTt7+PERDw==","repository":{"url":"git+https://github.com/At-My-App/atmyapp.git","type":"git","directory":"packages/structure"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/structure_0.2.0_1789077172933_0.7726917619074007","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@atmyapp/structure@0.3.0","bugs":{"url":"https://github.com/At-My-App/atmyapp/issues"},"dist":{"shasum":"2fabfa6bf173bca9fb31dc6f9ce7813edfd0647a","tarball":"https://registry.npmjs.org/@atmyapp/structure/-/structure-0.3.0.tgz","fileCount":50,"integrity":"sha512-7mYV7w0L2I8VgE8hRoHlXCEAkQ+K8/C4GY7vJV5bE905qHM5lIJVIkhvzSeQgBdBT6cpDoVtAGnK0fgiM4hoTA==","signatures":[{"sig":"MEUCIQDD/hI00PHtoCrHO0LP1DM1Aae7VH59P8HEYXcYvuXX2QIgc1GqS/U9Suj2NOirLHDg+9nOXMk793BY/xU1Glt18CY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDzVqLqY7Y234uFx1bl9WG0C5bIHctavhWSBxs5Xn9BvAiAOBKG7P0r7zhA1yJbbjTdVi9uNy67UYSZ0QK3DeWAFSw=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atmyapp%2fstructure@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":323018},"main":"dist/index.js","name":"@atmyapp/structure","_from":"file:atmyapp-structure-0.3.0.tgz","types":"dist/index.d.ts","author":{"name":"Maciej Gamrot"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./collectionSchemaConverter":{"types":"./dist/collectionSchemaConverter.d.ts","default":"./dist/collectionSchemaConverter.js"}},"license":"ISC","scripts":{"test":"pnpm run test:types && jest","build":"tsc","test:types":"tsc -p tsconfig.type-tests.json --noEmit"},"version":"0.3.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e54bb668-1a66-42cd-9b4c-02138301b63f"}},"homepage":"https://github.com/At-My-App/atmyapp#readme","_resolved":"/tmp/86d39bbdde61569d7e6ed632ca6c5012/atmyapp-structure-0.3.0.tgz","_integrity":"sha512-7mYV7w0L2I8VgE8hRoHlXCEAkQ+K8/C4GY7vJV5bE905qHM5lIJVIkhvzSeQgBdBT6cpDoVtAGnK0fgiM4hoTA==","repository":{"url":"git+https://github.com/At-My-App/atmyapp.git","type":"git","directory":"packages/structure"},"_npmVersion":"11.5.1","description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","directories":{},"maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.3.3","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.13.10"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/structure_0.3.0_1789557719297_0.42704934670351813"}}},"time":{"created":"2026-03-15T13:52:44.935Z","modified":"2026-09-16T11:21:59.823Z","0.0.1":"2026-03-15T13:52:45.193Z","0.0.2":"2026-03-15T18:07:15.663Z","0.1.0-alpha.1":"2026-03-16T13:46:38.506Z","0.1.0":"2026-03-25T19:41:26.231Z","0.1.1":"2026-04-01T20:50:03.280Z","0.1.2":"2026-04-27T16:31:42.964Z","0.1.3":"2026-06-02T12:05:57.553Z","0.1.4":"2026-07-03T18:07:44.655Z","0.1.5":"2026-09-10T21:39:38.440Z","0.2.0":"2026-09-10T21:52:53.008Z","0.3.0":"2026-09-16T11:21:59.381Z"},"bugs":{"url":"https://github.com/At-My-App/atmyapp/issues"},"author":{"name":"Maciej Gamrot"},"license":"ISC","homepage":"https://github.com/At-My-App/atmyapp#readme","repository":{"url":"git+https://github.com/At-My-App/atmyapp.git","type":"git","directory":"packages/structure"},"description":"[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure) [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC) [![TypeScript](https://img.shi","maintainers":[{"name":"gamma007","email":"maciekgamro@gmail.com"}],"readme":"# AtMyApp Structure\n\n[![npm version](https://badge.fury.io/js/%40atmyapp%2Fstructure.svg)](https://badge.fury.io/js/%40atmyapp%2Fstructure)\n[![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n[![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)\n\nCanonical schema toolkit for AtMyApp. `@atmyapp/structure` is the single runtime package that owns schema parsing, normalization, validation, introspection, migration planning, and legacy `.structure.json` compatibility.\n\n## What it solves\n\n- One canonical schema model for collections, documents, files, and images\n- Runtime-agnostic authoring with both TypeScript DSL and neutral JSON input\n- Shared validation across CLI, server, dashboard, and assistant flows\n- First-class system fields such as `id`, `createdAt`, `updatedAt`, and `slug`\n- First-class asset fields for associated files and images\n- First-class analytics event definitions with ordered columns\n- First-class submission definitions with typed fields and captcha config\n- Shared migration planning with actionable change prompts\n- Legacy `.structure.json` generation and parsing during rollout\n\n## Installation\n\n```bash\n# npm\nnpm install @atmyapp/structure\n\n# yarn\nyarn add @atmyapp/structure\n\n# pnpm\npnpm add @atmyapp/structure\n```\n\n## Rollout status\n\n`@atmyapp/structure` is the canonical runtime schema package today.\n\n- authoring should target canonical schema inputs such as `ama.schema.ts` or `ama.schema.json`\n- runtime consumers should use compiled schema APIs from this package\n- `.structure.json` is still supported as the persisted/generated compatibility artifact during rollout\n- legacy labels such as `jsonx` and legacy markers such as `__amatype` are accepted only for compatibility with older projects and older CLI outputs\n\n## Core concepts\n\n- `collection`: multi-entry structured data with indexes, query semantics, and system fields\n- `document`: single path-backed structured file, replacing the old `jsonx` concept\n- `asset` fields: first-class associated files such as `image`, `file`, and `gallery`\n- `systemFields`: reserved fields that can be enabled and configured but not declared as normal fields\n- fields are required by default; use `optional: true` to make a field optional\n- `description`: supported at schema, definition, field, MDX config, and MDX component levels for assistant-facing context\n- `events`: top-level analytics/event definitions with assistant-facing descriptions and ordered columns\n- `submissions`: top-level form submission definitions with typed fields and optional captcha config\n\n## TypeScript DSL\n\n```ts\nimport {\n  compileSchema,\n  defineCollection,\n  defineEvent,\n  defineDocument,\n  defineSubmission,\n  defineSchema,\n  s,\n} from \"@atmyapp/structure\";\n\nconst schema = defineSchema({\n  description: \"Marketing site schema\",\n  mdx: {\n    blog: {\n      description: \"Blog content components\",\n      components: {\n        Callout: {\n          description: \"Highlighted message block\",\n          props: {\n            title: \"string\",\n          },\n        },\n      },\n    },\n  },\n  events: {\n    page_view: defineEvent([\"page\", \"referrer\", \"timestamp\"], {\n      description: \"Tracked page view analytics event\",\n    }),\n  },\n  submissions: {\n    contact: defineSubmission({\n      description: \"Main contact form\",\n      fields: {\n        name: s.string(),\n        email: s.email(),\n        message: s.longText({\n          optional: true,\n        }),\n        resume: s.file({\n          optional: true,\n        }),\n      },\n      captcha: {\n        required: true,\n        provider: \"hcaptcha\",\n      },\n    }),\n  },\n  definitions: {\n    posts: defineCollection({\n      description: \"Blog posts\",\n      fields: {\n        title: s.string({\n          description: \"Public title shown on the page\",\n        }),\n        cover: s.image({\n          description: \"Associated hero image for the post\",\n          config: {\n            optimizeFormat: \"webp\",\n            maxSize: {\n              width: 1920,\n              height: 1080,\n            },\n          },\n        }),\n        body: s.mdx({\n          config: \"blog\",\n          description: \"Long-form article body\",\n        }),\n        author: s.reference({\n          target: \"authors\",\n          description: \"Linked author profile\",\n          by: \"slug\",\n        }),\n        seo: s.object({\n          description: \"SEO metadata\",\n          fields: {\n            title: s.string(),\n            socialImages: s.array({\n              optional: true,\n              description: \"Nested list of social preview images\",\n              items: s.image({\n                description: \"Image used for social previews\",\n              }),\n            }),\n          },\n        }),\n      },\n      systemFields: {\n        slug: {\n          enabled: true,\n          source: \"title\",\n        },\n      },\n      indexes: [\"title\"],\n    }),\n    settings: defineDocument({\n      description: \"Single site settings file\",\n      fields: {\n        theme: s.string({\n          description: \"Theme identifier used by the UI\",\n        }),\n        accent: s.string({\n          description: \"Optional accent color\",\n          optional: true,\n        }),\n      },\n    }),\n  },\n});\n\nconst compiled = compileSchema(schema);\n```\n\n`defineDocument()` does not need a `path` by default. If the key is `settings`, both `settings` and `settings.json` resolve to the same document automatically.\n\n## Neutral JSON input\n\nThe same canonical model can be authored without TypeScript:\n\n```json\n{\n  \"version\": 1,\n  \"description\": \"Marketing site schema\",\n  \"definitions\": {\n    \"settings\": {\n      \"kind\": \"document\",\n      \"description\": \"Single site settings file\",\n      \"path\": \"settings.json\",\n      \"fields\": {\n        \"theme\": {\n          \"kind\": \"scalar\",\n          \"scalar\": \"string\",\n          \"description\": \"Theme identifier used by the UI\"\n        }\n      }\n    }\n  }\n}\n```\n\n## Main APIs\n\n### Compiler\n\n```ts\nimport { compileSchema, parseSchema, normalizeSchema } from \"@atmyapp/structure\";\n```\n\n- `parseSchema(input)`: parses canonical JSON or legacy `.structure.json`\n- `normalizeSchema(schema)`: normalizes definitions, paths, and defaults\n- `compileSchema(input)`: builds the compiled schema with precomputed indexes\n\n### Introspection\n\n```ts\nimport {\n  getDefinition,\n  getCollection,\n  getDocument,\n  getField,\n  listAssetFields,\n  listConfigs,\n  listReferences,\n  listSystemFields,\n  resolveDefinitionForPath,\n} from \"@atmyapp/structure\";\n```\n\nUse these helpers instead of manually traversing raw `.structure` objects.\n\n## Events\n\nAnalytics events are modeled as a top-level schema concern and preserved through canonical and legacy compilation:\n\n```ts\nimport { defineBasicEvent, defineEvent, defineSchema } from \"@atmyapp/structure\";\n\nconst schema = defineSchema({\n  events: {\n    page_view: defineEvent([\"page\", \"referrer\", \"timestamp\"], {\n      description: \"Ordered columns for page view analytics\",\n    }),\n    session_start: defineBasicEvent({\n      description: \"Marker event with dynamic payload\",\n    }),\n  },\n  definitions: {},\n});\n```\n\nThe compiled schema exposes these under `compiled.events`, and legacy `.structure.json` compatibility output preserves them under top-level `events`.\n\n## Submissions\n\nSubmissions are modeled as a first-class top-level schema concern:\n\n```ts\nimport {\n  defineSchema,\n  defineSubmission,\n  s,\n  type InferSubmission,\n} from \"@atmyapp/structure\";\n\nconst schema = defineSchema({\n  definitions: {},\n  submissions: {\n    contact: defineSubmission({\n      description: \"Marketing contact form\",\n      fields: {\n        name: s.string(),\n        email: s.email(),\n        message: s.longText({\n          optional: true,\n        }),\n        resume: s.file({\n          optional: true,\n        }),\n      },\n      captcha: {\n        required: true,\n        provider: \"hcaptcha\",\n      },\n    }),\n  },\n});\n\ntype ContactSubmission = InferSubmission<\"contact\", typeof schema>;\n```\n\nNotes:\n\n- `acceptingResponses` is intentionally not part of the schema; that stays dashboard-managed\n- submission fields use the same field DSL as collections and documents\n- `InferSubmission` is input-oriented, so asset fields infer upload values rather than stored CDN URLs\n- legacy compatibility output keeps captcha settings under `requiresCaptcha`, `captchaProvider`, and `hcaptchaSecret`\n\n## References\n\nReferences store string values by default, but the schema can describe how those strings should resolve:\n\n```ts\ns.reference({\n  target: \"authors\",\n  by: \"id\",\n});\n\ns.reference({\n  target: \"posts\",\n  by: \"slug\",\n});\n\ns.reference({\n  target: \"settings\",\n  by: \"path\",\n});\n```\n\n- `target`: the referenced definition name\n- `by: \"id\"`: default for collection-style identity\n- `by: \"slug\"`: requires the target to expose a slug\n- `by: \"path\"`: useful for document-style references\n- `multiple: true`: stores an array of references\n- `onDelete`: optional lifecycle hint for downstream consumers\n\nThe current runtime value shape is a string or string array. That keeps references easy to store, easy to index, and easy to migrate while still carrying explicit semantics in the schema.\n\n## Nested types and lists\n\nNested objects and arrays are first-class in the canonical schema model:\n\n```ts\nconst article = defineDocument({\n  fields: {\n    title: s.string(),\n    seo: s.object({\n      description: \"SEO metadata\",\n      fields: {\n        title: s.string(),\n        summary: s.string({ optional: true }),\n      },\n    }),\n    gallery: s.array({\n      optional: true,\n      items: s.image({\n        config: {\n          optimizeFormat: \"webp\",\n        },\n      }),\n    }),\n  },\n});\n```\n\nNotes:\n\n- all nested fields are required unless marked with `optional: true`\n- composite fields use the object-input style: `s.object({ fields, optional, description })`, `s.array({ items, optional, description })`, `s.reference({ target, ... })`, and `s.mdx({ config, ... })`\n- `s.array({ items: s.image() })` works for image lists\n- `s.gallery()` is still available when you want a semantic “multiple images” asset field\n- nested field descriptions are preserved in the compiled schema and legacy output\n\n## Images and asset config\n\nImage fields support config aligned with existing `@atmyapp/core` and `@atmyapp/cli` image definitions:\n\n```ts\ns.image({\n  config: {\n    optimizeFormat: \"webp\",\n    optimizeLoad: \"progressive\",\n    ratioHint: { x: 16, y: 9 },\n    maxSize: { width: 1920, height: 1080 },\n  },\n});\n```\n\nThat config is preserved through canonical compilation and legacy `.structure.json` emission.\n\n### Validation\n\n```ts\nimport {\n  validateSchemaDocument,\n  validateContent,\n  validateContentAtPath,\n} from \"@atmyapp/structure\";\n```\n\n- `validateSchemaDocument(input)`: validates authored schema documents\n- `validateContent(compiled, definitionName, data)`: validates parsed content objects\n- `validateContentAtPath(compiled, path, content, mimeType?)`: validates raw file content against the resolved definition\n\n### Migrations\n\n```ts\nimport {\n  diffSchemas,\n  planMigration,\n  renderMigrationPrompts,\n} from \"@atmyapp/structure\";\n```\n\nMigration planning classifies changes as compatible, safe auto-convert, confirmable convert, or incompatible. The planner produces executable actions such as:\n\n- `confirm_convert`\n- `require_union`\n- `backfill_generated_field`\n- `create_unique_index`\n- `drop_field`\n- `drop_definition`\n\n## Legacy `.structure.json` compatibility\n\nThe package can compile existing `.structure.json` files and also emit legacy-compatible output:\n\n```ts\nimport { compileSchema, toLegacyStructure } from \"@atmyapp/structure\";\n\nconst compiled = compileSchema(existingStructureJson);\nconst legacy = toLegacyStructure(compiled.document);\n```\n\nThis keeps old projects working while runtime consumers migrate to the canonical schema model.\n\n## Development\n\n```bash\nnpm ci\nnpm test\nnpm run build\nnpm pack --dry-run\n```\n\n## Publishing\n\nThe repository includes manual release workflows similar to the `@atmyapp/core` package:\n\n- run tests before release\n- verify the version was bumped\n- build the package\n- create a GitHub release\n- publish to npm with provenance\n\nBefore publishing:\n\n1. Update the version in `package.json`.\n2. Run `npm test`.\n3. Run `npm run build`.\n4. Run `npm pack --dry-run`.\n5. Trigger the GitHub release workflow.\n\n## License\n\nISC\n","readmeFilename":"README.md"}