{"_id":"@anchovie/schematic","_rev":"17-c67c56360ae0cf7ae96ad78e3e34e711","name":"@anchovie/schematic","dist-tags":{"latest":"2.2.10"},"versions":{"2.1.6":{"name":"@anchovie/schematic","version":"2.1.6","keywords":["shopify","section","schema","build"],"author":{"name":"Josh Alley","email":"alley@alleyford.com"},"license":"ISC","_id":"@anchovie/schematic@2.1.6","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/AlleyFord/schematic#readme","bugs":{"url":"https://github.com/AlleyFord/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"df95edd10993e0dc08f591e1243af61d6689ff34","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.1.6.tgz","fileCount":9,"integrity":"sha512-djbA+izRnGjduXsIVAGG2ajJFUQaU4/GoB9dG1InPNgkK9Hlao/XHSbQpfugsr8p2LltTMcY/b68GjolKvOEOA==","signatures":[{"sig":"MEYCIQCr45gqm06d9JNJDUAzjpWjua/1YsF7C+207ZgQkQcFuAIhAPylq/I62mMrpOJmZcfPJKoG+xBeSLWHZA29pVKFXvjJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52648},"main":"./loader.js","gitHead":"9c714c69279e8077c34e1395c8c46ef838c192db","_npmUser":{"name":"anchovie","email":"anthony.baggett@gmail.com"},"repository":{"url":"git+https://github.com/AlleyFord/schematic.git","type":"git"},"_npmVersion":"10.9.0","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"21.7.3","dependencies":{"fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.1.6_1741842766502_0.37927239707873084","host":"s3://npm-registry-packages-npm-production"}},"2.1.7":{"name":"@anchovie/schematic","version":"2.1.7","keywords":["shopify","section","schema","build"],"author":{"name":"Josh Alley","email":"alley@alleyford.com"},"license":"ISC","_id":"@anchovie/schematic@2.1.7","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/AlleyFord/schematic#readme","bugs":{"url":"https://github.com/AlleyFord/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"df34d05be24c574da5b09ebfa65eee563372f946","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.1.7.tgz","fileCount":9,"integrity":"sha512-GAUGdQMHRDPRiFkZywPSKa0QwxQpXRNTqq7/uPLLTHYAyyzZ94Aj+JuG3bvOsUxo4VVsMwj1FCVeCw/ghd54HQ==","signatures":[{"sig":"MEUCIQClr+QVdf8/+zElAkPv12AajmGSUaWxgn/Nn9zdwmtZ5gIgRrDp1bofwv1ynTc+vL2g1aGIxVqLIVyQlsICj432TNc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52643},"main":"./loader.js","gitHead":"f3e86db1dcceff212322356f039f16bdc3fa4733","_npmUser":{"name":"anchovie","email":"anthony.baggett@gmail.com"},"repository":{"url":"git+https://github.com/AlleyFord/schematic.git","type":"git"},"_npmVersion":"10.9.0","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"21.7.3","dependencies":{"fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.1.7_1741844791482_0.2681078438871738","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@anchovie/schematic","version":"2.2.0","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.0","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"83a7cef4fb9bbf9e3b0eda72e61389c3763596a9","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.0.tgz","fileCount":9,"integrity":"sha512-SS5uXwqvxNHIhz682FbMRlsKiXZ976Njy1lwOe1yQpgzoEJwGMLd+WZtcKYJT1EFFKjZFkQx8pcqesg7bn4HxA==","signatures":[{"sig":"MEQCIHCOimgqPeRyYSJ+KaHItPSHtuuqUSnb7en50dAFbVckAiA7Z27iqtQ+M+4S5UmP8bZ9oFOQ1GYBoPCQjDvqGCPO1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63943},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"2766fb0c721b7db71b93e42264229627bc45682f","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"anchovie","email":"anthony.baggett@gmail.com"},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.6.0","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"22.18.0","dependencies":{"fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.0_1759251437822_0.26978747024158767","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@anchovie/schematic","version":"2.2.1","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.1","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"a16246ed689be08a7ecf6623beeb4d8d79840268","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.1.tgz","fileCount":13,"integrity":"sha512-XmR4vUzDaElNKW3EKRGORD+8qXmFWs4Dfgsm8IAg/YfbZW3Nz+oH72qqjlexgCZXaCjvJi/phCf9NV6SofSU7Q==","signatures":[{"sig":"MEUCIQD2M6fdS/91NedRfLK2p0awt9jwMEd9sbH0FWi9W6vDLgIgX4mxooudpUo7k0jo5mLwcxqHa/eupFRlw4NBRG18uSY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216829},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"e3236cf9d3b400856b4e5897bd8162bac6aa76cc","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"anchovie","email":"anthony.baggett@gmail.com"},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.6.2","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"22.18.0","dependencies":{"chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.1_1761413014974_0.006675553155805591","host":"s3://npm-registry-packages-npm-production"}},"2.2.3":{"name":"@anchovie/schematic","version":"2.2.3","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.3","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"0888d9dafd9f97daabb69d77d60da722ba0a71c7","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.3.tgz","fileCount":11,"integrity":"sha512-gJEVkxA9mqJEi1fwMJ/yFo8hJKXBe5M05B6SFJraFtVI4H7tLzAK863apCOdwP3Gpk3Zf/HAcNU7GO7o6Brhkw==","signatures":[{"sig":"MEYCIQC5J4Ci8ylGMZiKjYxqqtj8n5KQNiZAaR6jiRbL5hiUogIhAKsOa5MPhkDs+Y27HH0X1oToSPN/LJrZFxhgHiM918pE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":88516},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"26a401025c8401d3c6d9e6b07a5bb5e9498ad0db","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.6.4","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.3_1764173001650_0.10141168076399087","host":"s3://npm-registry-packages-npm-production"}},"2.2.4":{"name":"@anchovie/schematic","version":"2.2.4","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.4","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"2efd741456c8ab5908238c6feaf3326cffaa6e18","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.4.tgz","fileCount":11,"integrity":"sha512-0+3GfrEfoxV6yNsKdwI/wxMSb6g7EP+QCHRSlq542duKqdYHUeI2+17KhlNkEOKQIOI0I19FBI/xizfO/dgizA==","signatures":[{"sig":"MEUCIEtfPns+7gVYvk8yuf8dwL0J2QgzA7VG4cK/WgoDDto0AiEAtzFN7ntOrvUL2nO6aTZGbL9Yv61sUqJiL9808Jtm+eY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":93318},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"8f17404b5a7fd836abf328e555581a6622bed1f7","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.6.4","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.4_1764350793075_0.6540370522072381","host":"s3://npm-registry-packages-npm-production"}},"2.2.5":{"name":"@anchovie/schematic","version":"2.2.5","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.5","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"beb3c5055d2956e657e486dd623e8bcd2b44afec","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.5.tgz","fileCount":11,"integrity":"sha512-JXp13+00bqTjsmSs3ijGg55W7Q5hEsSE2/qyFFCMELEy65262DwX+cnx8AD69kNUKuZlmHSkjOf571xk6/VBSw==","signatures":[{"sig":"MEUCIFWqpYhzKoxsg+xnvqQ/aMxA2qcMaofKF8Ci/wZhuvlNAiEAptjKXIry69YI+PPsuA8OK5CubKwA7pxQrcHbM0OvDVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":94121},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"70ebc151e21d046d0008f6df964859f254929a01","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.6.4","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.5_1764353444143_0.9189419258099598","host":"s3://npm-registry-packages-npm-production"}},"2.2.6":{"name":"@anchovie/schematic","version":"2.2.6","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.6","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"d4fffe2438ca7f742f9ea3661b17a45009b0db18","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.6.tgz","fileCount":11,"integrity":"sha512-1Q1M75+d54FC87F1Rd8zxHfgIZullP4zKd50bxq/UxOjHWfW9W234Sysi344OtB3AfrgqUlSjYgcmDKhXq0O7Q==","signatures":[{"sig":"MEUCIQDBHLSFPG9QhYEySatE5NGijYLukj68fPM+teaRJOhT7AIgbleEM6zFdRk1Q2xNvKJ31JVCmVvgRbR3dn0a7/+6+IA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":94060},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"679333b644f7e851849ac9beea121445314546d0","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.12.1","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.6_1775320876044_0.9073554819198233","host":"s3://npm-registry-packages-npm-production"}},"2.2.7":{"name":"@anchovie/schematic","version":"2.2.7","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.7","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"c8b6891486fb63c567f0cc46f2620e2989bcc18b","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.7.tgz","fileCount":11,"integrity":"sha512-1lEzEbljpA+k5LTGUFI1sU9L1EVj5PsrZR9aFZu1dLrK9xgTE5IskOQ4LSsDbPGCuefXv+ccOAkutrkGUOFCRA==","signatures":[{"sig":"MEUCIAny2M9HbS2Fb9asygVWzVLAKVCsxYRXl3ho90DnyOH4AiEAwepC32BBQ3FQj3SNx8mNrkRTSl+qKgmzQApKbqtdYRo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":97422},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"6dca3fcf5ee011f38815765b4d033123691d0f1b","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.12.1","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.7_1776874690118_0.13706129152621394","host":"s3://npm-registry-packages-npm-production"}},"2.2.8":{"name":"@anchovie/schematic","version":"2.2.8","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.8","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"5534b0a7c65cb2e5030e0584fbfe5d7e33433446","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.8.tgz","fileCount":11,"integrity":"sha512-qGDSpprmw0HBaLc737zzDiQdAtzsgaimHUaIokZLQTxp8gWNyV7lRyD0a/NuLM2l+M/YA+WAq0N99rJgNzu8GQ==","signatures":[{"sig":"MEQCIHl1Aj554ABoMjZpX/wY6NjBmyZaEg17WmwQXpnmKpNPAiAGmn28qwFyOwpfDZ0S1PQZbLzgGZNztX08bd8bBoVpog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98052},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","gitHead":"885b2932ae599efa43eda542df9fafcb9f5cfcd2","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.13.0","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.8_1776899478621_0.1463442221723834","host":"s3://npm-registry-packages-npm-production"}},"2.2.9":{"name":"@anchovie/schematic","version":"2.2.9","keywords":["shopify","section","schema","build"],"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","_id":"@anchovie/schematic@2.2.9","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"homepage":"https://github.com/anchovie91471/schematic#readme","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"bin":{"schematic":"bin/schematic"},"dist":{"shasum":"66802909453d8923e886ea25c273beea555d019e","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.9.tgz","fileCount":11,"integrity":"sha512-mTlsnQRPQAhmjXhaigpKxVRazZdPpBCDZ8Fqr0wvvGtXGrBxwRMEpGMKcdbmV79q1dXmihwRtmYpLfnOYoii4Q==","signatures":[{"sig":"MEUCIFrntme9J6fuHGcq2zE3ZaH++9L6btTCs4hJlUjzyfboAiEA6yD5PX2ZNWVU3fs2USzIJ3ayp9ZgBVJ4Z5sUhqRua8g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":105944},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testEnvironment":"node","coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"main":"./loader.js","engines":{"node":">=20.0.0"},"gitHead":"5c94e96193ceb770a8dec5f7fb6cad11e67ed3d2","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"repository":{"url":"git+https://github.com/anchovie91471/schematic.git","type":"git"},"_npmVersion":"11.13.0","description":"Write Shopify schema with JS, not JSON.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ora":"^9.0.0","chalk":"^4.1.2","fs-extra":"^11.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0"},"_npmOperationalInternal":{"tmp":"tmp/schematic_2.2.9_1776917749285_0.27220872724221934","host":"s3://npm-registry-packages-npm-production"}},"2.2.10":{"name":"@anchovie/schematic","version":"2.2.10","description":"Write Shopify schema with JS, not JSON.","keywords":["shopify","section","schema","build"],"main":"./loader.js","bin":{"schematic":"bin/schematic"},"scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"jest":{"testEnvironment":"node","testMatch":["**/__tests__/**/*.test.js"],"coveragePathIgnorePatterns":["/node_modules/","/__tests__/fixtures/"]},"repository":{"type":"git","url":"git+https://github.com/anchovie91471/schematic.git"},"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"homepage":"https://github.com/anchovie91471/schematic#readme","engines":{"node":">=20.0.0"},"devDependencies":{"jest":"^30.2.0"},"dependencies":{"chalk":"^4.1.2","fs-extra":"^11.3.0","ora":"^9.0.0"},"gitHead":"7665b3edebee79b9f508f6fb959aca729ae75e3b","_id":"@anchovie/schematic@2.2.10","_nodeVersion":"20.20.2","_npmVersion":"11.13.0","dist":{"integrity":"sha512-ReB6ndaLTslEM3RaTrs/cgkgd5galsrT4o6rMi9Ztp3y/K3Q2EnrmBygSzRIrn0DT3j6LbLGBrzEA6b/yxH4IQ==","shasum":"1999987d66f83f0ae706445d52e6c10c96d21c68","tarball":"https://registry.npmjs.org/@anchovie/schematic/-/schematic-2.2.10.tgz","fileCount":11,"unpackedSize":107449,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anchovie%2fschematic@2.2.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID7aXQsUyXxaVDggT1A3BY8mdDBY3fMqGkPt9TZfTODOAiB5lFj8PA8jfay/lf+nkGraIpymxE+UjN9/k5O2jaRgyg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb8660c2-7bb3-4175-9e9a-655cfcbbd99f"}},"directories":{},"maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/schematic_2.2.10_1776920714040_0.301298093769641"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-13T05:12:46.444Z","modified":"2026-04-23T05:05:15.249Z","2.1.5":"2025-03-13T04:56:49.925Z","2.1.6":"2025-03-13T05:12:46.743Z","2.1.7":"2025-03-13T05:46:31.639Z","2.2.0":"2025-09-30T16:57:18.015Z","2.2.1":"2025-10-25T17:23:35.196Z","2.2.2":"2025-11-25T06:09:46.965Z","2.2.3":"2025-11-26T16:03:21.837Z","2.2.4":"2025-11-28T17:26:33.260Z","2.2.5":"2025-11-28T18:10:44.330Z","2.2.6":"2026-04-04T16:41:16.192Z","2.2.7":"2026-04-22T16:18:10.322Z","2.2.8":"2026-04-22T23:11:18.755Z","2.2.9":"2026-04-23T04:15:49.431Z","2.2.10":"2026-04-23T05:05:14.324Z"},"bugs":{"url":"https://github.com/anchovie91471/schematic/issues"},"author":{"name":"Anthony Baggett","email":"anthony.baggett@gmail.com"},"license":"ISC","homepage":"https://github.com/anchovie91471/schematic#readme","keywords":["shopify","section","schema","build"],"repository":{"type":"git","url":"git+https://github.com/anchovie91471/schematic.git"},"description":"Write Shopify schema with JS, not JSON.","maintainers":[{"name":"anchovie","email":"anthony.baggett@gmail.com"}],"readme":"# Schematic\nA more sane approach for writing custom schema definitions within Shopify themes.\n\n> **Note:** This is a maintained fork of the original [`@alleyford/schematic`](https://github.com/AlleyFord/schematic) by [@alleyford](https://github.com/AlleyFord). The original package has been archived.\n\n## Working with Shopify schema sucks\nWorking with syntactically strict JSON in Shopify themes sucks. You can't put schema into partials to be included, breaking all hopes of modularity or code reuse, which means intensely duplicated schemas and inconsistency in naming and labeling. Worse, if you have big schemas (like icon lists) that get updated regularly, you have to update definitions everywhere they exist, which is a giant mess.\n\n## Schematic helps\nSchematic helps you write Shopify theme schema in JS, not JSON. You can build arrays or objects however you want with normal import/require. Use functions. Do whatever. This is a standalone `node` executable that will compile & swap schema definitions for sections whenever it's run. That means it edits the actual `.liquid` file for simplicity and compatibility with task runners, build managers, Shopify CLI theme serving, and whatever else.\n\n## To use\n\n**Requirements:** Node.js 20 or newer.\n\n*Install Schematic:*\n```bash\nnpm i -D @anchovie/schematic\n```\n\n*Running:*\n```bash\nnpx schematic\n```\n\n### Using npm Scripts (Recommended for Teams)\n\nFor consistent team workflows, add a Schematic command to your theme's `package.json`:\n\n```json\n{\n  \"scripts\": {\n    \"schema\": \"schematic\"\n  }\n}\n```\n\nThen run with:\n```bash\nnpm run schema\n```\n\n**Benefits:**\n\n- Consistent commands across the team\n- Easy to integrate with other build tools\n\n### Configuration\n\nBy default, Schematic wants to be executed in the theme root and looks for schema definitions in `src/schema`. You can change this by passing arguments to the Schematic constructor, if invoking directly and not via `npx`:\n```js\nconst app = new Schematic({\n  paths: {\n    config: './config', // directory for shopify configuration files\n    sections: './sections', // directory for section files\n    snippets: './snippets', // directory for snippet files\n    locales: './locales', // directory for locale files\n    schema: './src/schema', // directory with all of the schema definitions for schematic to consume\n  },\n  localization: {\n    file: './snippets/p-app-localization.liquid', // file to scan to replace magic comment with localization strings\n    expression: 'window.app.copy = %%json%%;', // the expression to write for localization strings\n  },\n  verbose: false, // show summary by default; set to true for detailed output with all file paths\n});\n```\n\n## Module System Support\n\nSchematic works with both **CommonJS** and **ES6 module** theme projects.\n\n### How It Works\n\nSchematic automatically detects your project's module system by checking your theme's `package.json`:\n\n| Your Theme Setup | Supported Extensions | Recommended Format |\n|-----------------|---------------------|-------------------|\n| No `\"type\"` field | `.js`, `.cjs`, `.mjs` | CommonJS (`.js` with `module.exports`) |\n| `\"type\": \"commonjs\"` | `.js`, `.cjs`, `.mjs` | CommonJS (`.js` with `module.exports`) |\n| `\"type\": \"module\"` | `.cjs`, `.js`, `.mjs` | CommonJS (`.cjs` with `module.exports`) |\n\n**Note:** If you create a custom executable with `npx schematic init`, the generated file will automatically use the appropriate syntax for your project:\n- **ES6 module projects** (`\"type\": \"module\"`): Uses `import { Schematic } from '@anchovie/schematic'`\n- **CommonJS projects**: Uses `const { Schematic } = require('@anchovie/schematic')`\n\n### For ES6 Module Projects\n\nIf your Shopify theme has `\"type\": \"module\"` in its `package.json`, you have two options:\n\n**Option 1: Use `.cjs` files (Recommended)**\n```javascript\n// src/schema/mySection.cjs\nconst { app } = require('@anchovie/schematic');\n\nmodule.exports = {\n  ...app.section('My Section'),\n  settings: [],\n};\n```\n\n**Option 2: Use `.js` files with ESM syntax**\n```javascript\n// src/schema/mySection.js\nexport default {\n  name: 'My Section',\n  presets: [{ name: 'My Section' }],\n  settings: [],\n};\n```\n\n**Note:** When using ESM syntax (`.js` or `.mjs`), you cannot use Schematic helpers like `app.section()` because `@anchovie/schematic` is a CommonJS package. For full helper support, use `.cjs` files.\n\n### Extension Fallback Order\n\nSchematic tries extensions in this order:\n\n| Project Type | Fallback Order |\n|--------------|---------------|\n| ESM (`\"type\": \"module\"`) | `.cjs` → `.js` → `.mjs` |\n| CommonJS | `.js` → `.cjs` → `.mjs` |\n\nThis means if you're migrating an ESM project with existing `.js` files, Schematic will still find them even if it prefers `.cjs`.\n\n### Helpful Error Messages\n\nIf a schema file isn't found, Schematic provides helpful error messages:\n```\nSchema file not found for \"my-section\"\n\nSearched paths:\n  - /path/to/src/schema/my-section.cjs\n  - /path/to/src/schema/my-section.js\n  - /path/to/src/schema/my-section.mjs\n\nHint: In ESM projects (type: module), schema files can be:\n  - .cjs (CommonJS - recommended)\n  - .js (ESM with export default)\n  - .mjs (ESM)\n```\n\n**Good news:** When you run `schematic scaffold <name>`, Schematic automatically creates schema files with the correct extension for your project type.\n\n_Learn more about Node.js module systems: [ES Modules](https://nodejs.org/api/esm.html) | [CommonJS Modules](https://nodejs.org/api/modules.html)_\n\n## Creating Schema Definitions\n\nThen you're free to create schema definitions, either in full, partials, or whatever else. Here's some example Schematic schema JS for a Shopify section which renders a single icon and a heading.\n\nFirst, some JS which exports objects we can reuse:\n```js\n// ./src/schema/global.js (use .cjs if your theme has \"type\": \"module\")\n\nmodule.exports = {\n  iconWidth: {\n    type: 'select',\n    id: 'icon_width',\n    label: 'Icon width',\n    options: [\n      {\n        value: '96px',\n        label: '96px',\n      },\n      {\n        value: '64px',\n        label: '64px',\n      },\n      {\n        value: '48px',\n        label: '48px',\n      },\n      {\n        value: '32px',\n        label: '32px',\n      },\n      {\n        value: '24px',\n        label: '24px',\n      },\n      {\n        value: '16px',\n        label: '16px',\n      },\n    ],\n    default: '32px',\n  },\n};\n```\n\nThen, the JS which produces the full Shopify section JSON schema:\n```js\n// ./src/schema/iconAndHeading.js\n\nconst global = require('./global');\n\nmodule.exports = {\n  name: 'Icon and heading',\n  tag: 'section',\n  enabled_on: {\n    templates: [\n      'collection',\n      'product',\n    ],\n  },\n  presets: [{\n    name: 'Icon and heading',\n  }],\n  settings: [\n    {\n      type: 'text',\n      id: 'heading',\n      label: 'Heading',\n    },\n    {\n      type: 'select',\n      id: 'icon',\n      label: 'Icon',\n      options: [\n        {\n          label: '',\n          value: 'None',\n        },\n        {\n          label: 'Heart',\n          value: 'heart',\n        },\n        {\n          label: 'Fire',\n          value: 'fire',\n        },\n      ],\n    },\n    global.iconWidth,\n  ],\n};\n```\n\nTo tie this to Shopify and tell Schematic what to build, you edit your section liquid files with a magic comment with the entry point for the schema definition.\n```liquid\n// ./sections/iconAndHeading.liquid, bottom of file\n\n{%- comment -%} schematic iconAndHeading {%- endcomment -%}\n```\n\nThis will find `./src/schema/iconAndHeading.js`, build the JSON, and either draw in the schema tag with full definition, or replace the existing schema definition with the new one.\n\nIf you've named your schema and section files the same (`./src/schema/iconAndHeading.js`, `./sections/iconAndHeading.liquid`), then you can simply use:\n```liquid\n{%- comment -%} schematic {%- endcomment -%}\n```\n\nAnd Schematic will intuit the path for the schema definition from the filename.\n\n## Set this up as an executable\nThe recommended approach is to install Schematic as a dev dependency in your theme project. This ensures everyone on your team uses the same version and makes your project more portable. Simply run `npx schematic` within the Shopify theme directory. This assumes you have `./src/schema/` set up with your schema definitions.\n\nIf you need more customization, or your directory structure for schema definitions is different, you can create a custom executable with the init command:\n\n```bash\nnpx schematic init\n```\n\nThis creates an executable file named `schematic` with default configuration that you can customize. You can also specify a custom name:\n\n```bash\nnpx schematic init my-builder\n```\n\nThe generated file will include:\n- All default paths (config, sections, snippets, blocks, locales, schema, themeBlocksSchema)\n- Helpful comments explaining each option\n- `verbose: false` by default for clean summary output\n- Automatic executable permissions (`chmod +x`)\n- Automatically uses ES6 `import` syntax for projects with `\"type\": \"module\"` in package.json, or CommonJS `require()` otherwise\n\nAfter creation, you can edit the file to customize paths, options, and behavior. Then run it with:\n```bash\n./schematic\n```\n\nOr with your custom name:\n```bash\n./my-builder\n```\n\n### Using the built-in executable\nThe best way to run this is:\n```bash\nnpx schematic\n```\n\nIf you need to apply options, like verbosity or paths, you can set them in your environment:\n\n| Variable | Example value |\n| --- | --- |\n| SCHEMATIC_VERBOSE | `0` or `1` |\n| SCHEMATIC_PATH_CONFIG | Path to to the Shopify `config/` directory |\n| SCHEMATIC_PATH_SECTIONS | Path to to the Shopify `sections/` directory |\n| SCHEMATIC_PATH_SNIPPETS | Path to to the Shopify `snippets/` directory |\n| SCHEMATIC_PATH_BLOCKS | Path to the Shopify `blocks/` directory |\n| SCHEMATIC_PATH_SCHEMA | Path to to the directory with our schema definitions |\n| SCHEMATIC_PATH_THEME_BLOCKS_SCHEMA | Path to the directory with theme block schema definitions |\n\n**Verbose Mode:**\n\nDefault (verbose off) - Shows clean summary (e.g., \"Generated: 3 sections, 2 blocks\"):\n```bash\nnpx schematic\n```\n\nVerbose on - Shows detailed output with all file paths and operations:\n```bash\nSCHEMATIC_VERBOSE=1 npx schematic\n```\n\nExplicit off - Same as default:\n```bash\nSCHEMATIC_VERBOSE=0 npx schematic\n```\n\n**Example with custom paths:**\n```bash\nSCHEMATIC_PATH_SCHEMA=../src/schema npx schematic\n```\n\n## Built-in components and functions\nSince it also sucks creating a bunch of schema from scratch for every project, Schematic comes with some nice generic definitions and helper methods to use out of the box. The `app` variable derived from the package will contain everything you can use. We'll tie this together at the end to show it in use.\n\n### Sidebar methods\n| Method | Arguments | Description | Example |\n| --- | --- | --- | --- |\n| header | content, [info] | Returns [sidebar header](https://shopify.dev/docs/themes/architecture/settings/sidebar-settings#header) object | `app.header('Icon', \"Icons help convey meaning in a visual and quick way.\")` |\n| paragraph | content | Returns [sidebar paragraph](https://shopify.dev/docs/themes/architecture/settings/sidebar-settings#paragraph) object | `app.paragraph(\"This adds some helpful copy to the sidebar.\")` |\n\n### Quality of life methods & objects\n| Method or property | Arguments | Description | Example |\n| --- | --- | --- | --- |\n| section | name, [props] | Returns starter object for section schema (name, preset name, and optionally tag) | `...app.section('Icon and heading', { class: 'section', tag: 'div' })` |\n| option | id, label, [group] | Returns option object | `app.option('heart', 'Heart icon', 'Theme Icon')` |\n| types | | Returns object of camelCase input types | `app.types.bgColor; // returns \"color_background\"` |\n| templates | | Returns object of camelCase template names | `app.templates.activateAccount; // returns \"customers/activate_account\"` |\n| common | | Returns object of common, pre-build generic inputs | `app.common.colorBackgroundSelector` |\n| normalTemplates | | Returns an array of normal templates (article, index, page, product, blog, collection, collection list, gift card) | `app.normalTemplates` |\n| allTemplates | | Returns an array of all Shopify templates | `app.allTemplates` |\n| font | | Sidebar input object for selecting font style (sans, serif, script) | `app.font` |\n| textAlign | | Sidebar input object for selecting text alignment (left, center, right, justify, start, end) | `app.textAlign` |\n| orientation | | Sidebar input object for selecting orientation (left, right) | `app.orientation` |\n| imageStyle | | Sidebar input object for selecting image style (cover, full) | `app.imageStyle` |\n| defaults | | Contains objects for often repeated blank values | `options: [app.defaults.blank, ...]` |\n\n### Input methods\n| Method | Arguments | Description | Example |\n| --- | --- | --- | --- |\n| make | type, [props] | Factory to return [input settings](https://shopify.dev/docs/themes/architecture/settings/input-settings) objects | `app.make('richtext', {id: 'copy', label: \"Copy\"})` |\n| input | type, [props] | Alias of `make` | `app.input('blog', {label: \"Select the blog for related reading\"})` |\n| prefixOptions | prefix, options | Returns array with option values prefixed | `app.prefixOptions('fill-', ['red', 'green', 'blue'])` |\n| suffixOptions | suffix, options | Returns array with option values suffixed | `app.suffixOptions('-500', ['red', 'green', 'blue'])` |\n| enumerateId | (obj\\|[obj, ..]), index | Returns object(s) with the id suffixed with enumeration | `app.enumerateId(app.imageSelector, 1)` `app.enumerateId(app.imageSelector, 2)` |\n| changeId | obj, id | Returns object with the id property changed | `app.changeId(app.imageSelector, 'backgroundImage')` |\n| changeLabel | obj, label | Returns object with the label property changed | `app.changeLabel(app.imageSelector, 'Background image')` |\n| changeDefault | obj, default | Returns object with the default property changed | `app.changeDefault(app.number, 42)` |\n| changeLimit | obj, limit | Returns object with the limit property changed | `app.changeLimit(app.collectionsSelector, 3)` |\n| changeProperty | obj, key, value | Returns object with the property changed | `app.changeProperty(app.number, 'id', 'articleLimit')` |\n| changeProperties | (obj\\|[obj, ..]), props | Returns object(s) with the properties changed | `app.changeProperties(app.number, {id: 'articleLimit', default: 3})` |\n| removeProperty | obj, key | Returns object with the property deleted | `app.removeProperty(app.productSelector, 'limit')` |\n| removeProperties | obj, keys | Returns object with the properties deleted | `app.removeProperties(app.productSelector, ['limit', 'default'])` |\n\n### Default input objects\n| Property | Aliases |\n| --- | --- |\n| articleSelector | articlePicker, `app.make('article')` |\n| blogSelector | blogPicker, `app.make('blog')` |\n| pageSelector | pagePicker, `app.make('page')` |\n| menuSelector | menuPicker, `app.make('menu')`, `app.make('linkList')` |\n| collectionSelector | collectionPicker, `app.make('collection')` |\n| collectionsSelector | collectionsPicker, collectionList, `app.make('collections')` |\n| productSelector | productPicker, `app.make('product')` |\n| productsSelector | productsPicker, productList, `app.make('products')` |\n| colorSelector | colorPicker, `app.make('color')` |\n| colorBackgroundSelector | colorBackgroundPicker, backgroundColorSelector, backgroundColorPicker, bgColorSelector, bgColorPicker, `app.make('bgColor')` |\n| urlSelector | urlPicker, `app.make('url')` |\n| backgroundImageSelector | backgroundImagePicker, backgroundImage, bgImage, `app.make('bgImage')` |\n| fontSelector | fontPicker, `app.make('font')` |\n| imageSelector | imagePicker, `app.make('image')` |\n| subheading | `app.make('subheading')` |\n| heading | `app.make('heading')` |\n| text | `app.make('text')` |\n| copy | `app.make('copy')` |\n| html | `app.make('html')` |\n| liquid | `app.make('liquid')` |\n| videoLink | `app.make('videoLink')` |\n| checkbox | `app.make('checkbox')` |\n| number | `app.make('number')` |\n| range | `app.make('range', {...})` |\n| select | dropdown, `app.make('select')` |\n| text | input, `app.make('text')` |\n| textarea | `app.make('textarea')` |\n\nUsing these helpers, we can significantly reduce the amount of JS we have to write:\n```js\n// ./src/schema/iconAndHeading.js\n\nconst { app } = require('@anchovie/schematic');\nconst global = require('./global');\n\nmodule.exports = {\n  ...app.section('Icon and heading'),\n  settings: [\n    app.heading,\n    app.make('select', {\n      id: 'icon',\n      label: 'Icon',\n      options: [\n        app.defaults.none,\n        app.option('heart', 'Heart icon'),\n        app.option('fire', 'Fire icon'),\n      ],\n    }),\n    global.iconWidth,\n  ],\n};\n```\n\nSometimes you have a specific code reason to change the ID or another property for a definition, but otherwise keep the definition the same. Schematic supports some helper methods to adjust definitions on the fly:\n```js\n  //...\n\n  settings: [\n    app.changeId(app.heading, 'heading_left'),\n    app.changeId(app.heading, 'heading_right'),\n    app.changeProperties(app.heading, {\n      id: 'heading_center',\n      label: 'Center heading',\n      default: 'Welcome to Zombocom',\n    }),\n  ],\n\n  //...\n```\n\nOr to make drawing panel schema a little easier:\n```js\n  //...\n\n  settings: [\n    app.paragraph(\"Icons and headings really make the world go 'round.\"),\n\n    app.header('Left icon'),\n    app.changeId(app.heading, 'heading_left'),\n    app.changeId(common.iconWidth, 'icon_left'),\n\n    app.header('Right icon'),\n    app.changeId(app.heading, 'heading_right'),\n    app.changeId(common.iconWidth, 'icon_right'),\n\n    app.header('Center heading', \"A center heading helps focus attention. Loudly.\"),\n    app.changeProperties(app.heading, {\n      id: 'heading_center',\n      label: 'Center heading',\n      default: 'Welcome to Zombocom',\n    }),\n  ],\n\n  //...\n};\n```\n\n## Bundling common patterns\nSections sometimes have fields that always go together, like a `heading`, `subheading`, and `copy`. Or a reusable CTA. Instead of defining every one repeatedly, you can use the spread (`...`) operator when pulling them from a definition.\n```js\n// ./src/schema/components/cta.js\n\nmodule.exports = [ // default export of an array of objects\n  {\n    type: 'text',\n    id: 'cta_copy',\n    label: 'Button copy',\n  },\n  {\n    type: 'url',\n    id: 'cta_link',\n    label: 'Button destination',\n  },\n  {\n    type: 'select',\n    id: 'cta_style',\n    label: 'Button style',\n    options: [\n      {\n        value: 'button',\n        label: 'Button',\n      },\n      {\n        value: 'link',\n        label: 'Link',\n      },\n      {\n        value: 'hidden',\n        label: 'None',\n      },\n    ],\n    default: 'link',\n  },\n];\n```\n\nInclude the file in your schema, and (`...cta`) will draw in all three definitions:\n```js\n// ./src/schema/iconAndHeading.js\n\nconst { app } = require('@anchovie/schematic');\nconst global = require('./global');\nconst cta = require('./components/cta');\n\nmodule.exports = {\n  ...app.section('Icon and heading'),\n  settings: [\n    app.header('Left icon'),\n    app.changeId(app.heading, 'heading_left'),\n    app.changeId(common.iconWidth, 'icon_left'),\n\n    app.header('Right icon'),\n    app.changeId(app.heading, 'heading_right'),\n    app.changeId(common.iconWidth, 'icon_right'),\n\n    ...cta,\n  ],\n};\n```\n\nIf you have other section schema definitions which could use the same CTA pattern, you can just include the same file and its definition using the spread operator. If you ever update the original defintion, running Schematic will update all instances where it's being used.\n\n## Auto-write boilerplate switchboard code\nI think it's a helpful design pattern to keep most logic out of sections and offload it to snippets. Since you're auto-generating schema, it may make sense in some cases to also auto-generate the switchboard code to render section schema to its identically-named snippet.\n\nYou do this by passing an argument to the magic comment, like so:\n```liquid\n// ./sections/iconAndHeading.liquid, bottom of file\n\n{%- comment -%} schematic iconAndHeading writeCode {%- endcomment -%}\n```\n\nOr if your files are named the same across schema, sections, and snippets:\n```liquid\n{%- comment -%} schematic writeCode {%- endcomment -%}\n```\n\nRunning Schematic then produces the compiled schema, plus a line to render the snippet with all that schema automatically mapped:\n```liquid\n{%-\n\n    render 'iconAndHeading',\n        id: section.id,\n        heading_left: section.settings.heading_left,\n        icon_left: section.settings.icon_left,\n        heading_right: section.settings.heading_right,\n        icon_right: section.settings.icon_right,\n        cta_copy: section.settings.cta_copy,\n        cta_link: section.settings.cta_link,\n        cta_style: section.settings.cta_style\n\n-%}\n```\n\n### Compact render syntax with `writeCodeShort`\n\nFor simpler sections that use the entire section object, you can use the `writeCodeShort` option:\n\n```liquid\n{%- comment -%} schematic writeCodeShort {%- endcomment -%}\n```\n\nThis generates compact syntax that passes the whole section:\n```liquid\n{%- render 'iconAndHeading' with section as section -%}\n```\n\nUse `writeCodeShort` when your snippet needs access to the full section object (settings, blocks, etc.) without explicit parameter mapping.\n\n**Note:** When building custom Shopify themes, it's strongly recommended to use the section/snippet separation pattern, and to use `writeCode` or `writeCodeShort` where possible to handle connecting variables to snippets as schema changes over time. Using either option will wipe out any other code in the file.\n\n## Scaffolding pattern\nReiterating the above, you can use Schematic to create placeholder files for this pattern to scaffold things out when building custom sections:\n\n```bash\n# Create a full section with all files\nnpx schematic scaffold my-hero-section\n\n# Create with short render syntax (writeCodeShort)\nnpx schematic scaffold my-hero-section --short\n# or\nnpx schematic scaffold my-hero-section -s\n\n# Create ONLY a theme block (no section/snippet)\nnpx schematic scaffold announcement --block\n# or\nnpx schematic scaffold announcement -b\n```\n\n### Full Section Scaffold\n\n`npx schematic scaffold my-hero-section` creates three section files:\n```\n./sections/my-hero-section.liquid\n./snippets/my-hero-section.liquid\n./src/schema/my-hero-section.js\n```\n\n### Block-Only Scaffold\n\n`npx schematic scaffold announcement --block` creates two block files:\n```\n./blocks/announcement.liquid\n./src/schema/theme-blocks/announcement.js\n```\n\n**Note:** The `--short` and `--block` flags cannot be used together, as `--short` only applies to sections.\n\n**Smart naming:** The schema file will automatically format the section name. For example, `my-hero-section` becomes `My Hero Section` in the generated schema, instead of a generic \"Boilerplate\" name.\n\n**Automatic extension detection:** Schematic automatically creates schema files with `.cjs` extension if your theme has `\"type\": \"module\"` in package.json, or `.js` otherwise. You don't need to specify the extension.\n\nThe section file will contain the `writeCode` magic comment (or `writeCodeShort` if using `--short`), the snippet will be a basic template, and the schema files will contain starter code with Schematic helper methods.\n\n## Theme Blocks Support\n\nSchematic supports [Shopify theme blocks](https://shopify.dev/docs/storefronts/themes/architecture/blocks/theme-blocks), which are reusable components that can be added to any section or to the theme's JSON templates.\n\n### Directory Structure\n\nTheme blocks work similarly to sections, but live in their own directory:\n\n```\n./blocks/             # Theme block liquid files\n./src/schema/theme-blocks/  # Theme block schema definitions\n```\n\n### Using Schematic with Theme Blocks\n\nTheme blocks use the same magic comment pattern as sections:\n\n```liquid\n{%- comment -%} schematic {%- endcomment -%}\n```\n\nOr specify the schema file name:\n\n```liquid\n{%- comment -%} schematic myBlockSchema {%- endcomment -%}\n```\n\n**Example theme block:**\n\n```js\n// ./src/schema/theme-blocks/announcement.js\n\nconst { app } = require('@anchovie/schematic');\n\nmodule.exports = {\n  name: 'Announcement',\n  settings: [\n    app.make('text', {\n      id: 'message',\n      label: 'Announcement message',\n      default: 'Welcome to our store!'\n    }),\n    app.colorSelector,\n  ],\n};\n```\n\n```liquid\n{%- comment -%} ./blocks/announcement.liquid {%- endcomment -%}\n\n<div class=\"announcement\" style=\"background-color: {{ block.settings.color }}\">\n  {{ block.settings.message }}\n</div>\n\n{%- comment -%} schematic {%- endcomment -%}\n```\n\n### Processing\n\nSchematic processes theme blocks **after** sections to prevent upload conflicts when using `shopify theme dev`. This ensures all dependencies are written completely before dependent files.\n\n**Note:** Theme blocks don't support `writeCode` or `writeCodeShort` options, as they use `block.settings` instead of `section.settings` and don't follow the section/snippet pattern.\n\n## Other ways to use\nThe approach is simple and can be worked into whatever setup you have for dev. Because it writes back to the existing `.liquid` files, be wary of infinite loops when including this in an automatic build step.\n\n### Shopify CLI integration\n\nSchematic plays well with `shopify theme dev`. When a build produces byte-identical output to what's already on disk — which happens on any run where no schemas actually changed — Schematic skips the write entirely instead of touching the file's mtime. This prevents Shopify CLI from re-uploading files that haven't actually changed, so schema-only builds don't trigger a storm of unnecessary theme syncs.\n\nIf nothing needed to be written on a given run, the summary reads `Schematic ran: no files changed` instead of the usual generation count.\n\n### Running on a single section file\nSchematic supports [running](https://github.com/AlleyFord/schematic/issues/4) on a single section file instead of scanning the entire contents of the project. To invoke, run:\n```bash\nnpx schematic section path/to/file\n```\n\nThis can also be invoked in code through `Schematic.runSection(filePath)`.\n\n\n## Compile-time validation\n\nBefore writing schema to your `.liquid` files, Schematic validates a few Shopify hard-error rules so you catch mistakes at build time instead of at theme upload:\n\n- **Duplicate setting IDs** — Shopify requires setting IDs to be unique within a section's settings and within each block's settings. Schematic flags duplicates with file name, setting ID, label, and positions.\n- **Duplicate block `type` or `name`** — Shopify rejects sections whose `blocks[]` contains two blocks with the same `type` or the same `name`. Schematic catches this before you push.\n\nAll checks mirror rules Shopify itself enforces. Schematic does not flag patterns that Shopify accepts — for example, setting IDs reused across different block types, or setting IDs shared between a section and its blocks, which are treated as distinct scopes by Shopify and work correctly at runtime.\n\n\n## Using Schematic for settings_schema.json\nSchematic will automatically write `config/settings_schema.json` for you if it detects the presence of a `settings_schema.js` file in your `schema` directory.\n\nThe file should export an array of objects that match what would be manually defined in `settings_schema.json`:\n\n```js\n// ./src/schema/settings_schema.js\n\nconst { app } = require('@anchovie/schematic');\n\nmodule.exports = [\n  {\n    name: 'theme_info',\n    theme_name: 'Magic fungus',\n    //...\n  },\n  {\n    name: 'Globals',\n    settings: {\n      app.header('Free shipping threshold'),\n      app.make(app.types.range, {\n        id: 'free_shipping_threshold',\n        label: 'Amount to trigger free shipping',\n        min: 0,\n        max: 500,\n        step: 10,\n        unit: '$',\n        default: 150,\n      }),\n      //...\n    },\n  },\n  //...\n];\n```\n\n## Using Schematic for localization features\nSchematic will automatically write locale JSON for you if it detects the presence of `locales/[lang].js` in your `schema` directory.\n\nThe files should export an object that matches what would be manually defined in a locale file:\n\n```js\n// ./src/schema/locales/en.js\n\nmodule.exports = {\n  cart: {\n    error: \"Something went wrong -- please try again.\",\n    quantityError: \"You may only add {{ quantity }} of this item to your cart.\",\n    //...\n  },\n  //...\n};\n```\n\nSchematic will also try to find a magic comment and replace it with localized strings. This works as follows:\n1. Schematic looks at the `localization.file` and scans for a liquid comment with `schematicLocalization`\n2. It then writes JSON into the `localization.expression` string so client side code can consume it\n\nBefore running Schematic:\n```liquid\n// ./snippets/p-app-localization.liquid\n\n{%- comment -%} schematicLocalization {%- endcomment -%}\n```\n\nAfter:\n```liquid\n// ./snippets/p-app-localization.liquid\n\n{%- comment -%} schematicLocalization {%- endcomment -%}\nwindow.app.copy = {\n  \"cart.error\": {{ 'cart.error' | t | json }},\n  \"cart.quantityError\": {{ 'cart.quantityError' | t | json }},\n  // ...\n};\n```\n\nIn the above example, `window.app.copy` is coming from the Schematic configuration option for `localization.expression`. The `%%json%%` value in that expression is needed and will be replaced with the localization strings.\n\n\n## About this fork\nThis is a maintained fork of the original [schematic project](https://github.com/AlleyFord/schematic) by [AlleyFord](https://github.com/AlleyFord). Published as `@anchovie/schematic` on npm.\n\n## Thanks\n- [AlleyFord](https://github.com/AlleyFord) for creating the original schematic project\n- David Warrington for initial inspiration: [liquid-schema-plugin](https://github.com/davidwarrington/liquid-schema-plugin)\n- [Jacob Kossman](https://github.com/jacobkossman) for contributions & feature dev\n","readmeFilename":"README.md"}