{"_id":"@cristianglezm/flower-evolver-wasm","_rev":"16-dd46da8cbbfdee3d2f6018d5b10bf6a0","name":"@cristianglezm/flower-evolver-wasm","dist-tags":{"latest":"4.0.2"},"versions":{"1.0.2":{"name":"@cristianglezm/flower-evolver-wasm","version":"1.0.2","keywords":["genetic-algorithms","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@1.0.2","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"596f03b4ee435e383e241a1450078399b19b8b17","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-1.0.2.tgz","fileCount":7,"integrity":"sha512-nGqfhvq2L6fqSHKPSXCUbZd72bNCiZwW0Yq1GQmMx0DeTheg+Ql/YqvS6mXF3zkQ9E1ficZGPsjlg0s+pQZ72w==","signatures":[{"sig":"MEYCIQCVDe8ftgPiLzg/BHvUlwAN2eUs2oC9MUW57Bw1hlFpIAIhANTiDtHlG3YYpvRNBN1Oh5G1W0sBjVX0jXSoNN3EYJWH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":549111},"main":"index.js","gitHead":"8b9ff762ae840034b7edeab09ffc5eca35a9bb63","scripts":{"build":"npm run build:emscripten","serve":"cp index.html build/index.html && cd build && emrun index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.2.3","description":"wasm module to make flowers that evolve using NEAT","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_1.0.2_1704842086453_0.15107791835180606","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@cristianglezm/flower-evolver-wasm","version":"1.0.3","keywords":["genetic-algorithms","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@1.0.3","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"9cab2796bbb91d015be66e46accee91a84a34796","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-1.0.3.tgz","fileCount":7,"integrity":"sha512-qFrXNlK89HEC3a65fJegoumeBjdZqecs2mu4KrWMVcsy7RZ8ZElkGlPWQvm9lcssOccCgVcHFSsULikN6v/QOw==","signatures":[{"sig":"MEYCIQDvZ5sEs8pWJWoEIz7zM1RwV4jWzCyPckadRNjEqIruEQIhANFv4kDRjXQ8POs5n2itWLCvKyWL8jD2M5vttYwDOZWO","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":549111},"main":"index.js","gitHead":"b3619495a194de640d2900631946731d950a5d83","scripts":{"build":"npm run build:emscripten","serve":"cp index.html build/index.html && cd build && emrun index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.2.3","description":"wasm module to make flowers that evolve using NEAT","directories":{},"_nodeVersion":"20.10.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_1.0.3_1704842949214_0.4217183362099657","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"@cristianglezm/flower-evolver-wasm","version":"1.0.4","keywords":["genetic-algorithms","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@1.0.4","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"35099e8eb806f714a158a6b119bbf8109b6c8bd3","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-1.0.4.tgz","fileCount":7,"integrity":"sha512-KeesOU+pv9gbywWqZvKJ51f+t/VJavPjL5z8NsKhByBmQ5RCvULG4QAOtGirY1cmAYLZHLHIFZqOr5jGWQWDfA==","signatures":[{"sig":"MEUCIQChuV9uSb+fyGQNO4q3JwB652nUdJHUgsTI2DZ020NVdwIgdY4kexTztCGG6OGq4V/c3VMuRtvv2K2Gso0HtKxBJ/I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":549170},"main":"index.js","gitHead":"31efcf2fd10ff9c7825681842a156a27eecc1e61","scripts":{"build":"npm run build:emscripten","serve":"emrun --serve_root build index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.2.4","description":"wasm module to make flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"20.11.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_1.0.4_1706541962401_0.93039735185186","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"@cristianglezm/flower-evolver-wasm","version":"1.0.5","keywords":["genetic-algorithms","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@1.0.5","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"ea380217466ed606baa6b7e5ccff0d12f68e52ca","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-1.0.5.tgz","fileCount":7,"integrity":"sha512-dK1Gr3cmSwMGXK/lSPvlAIcHcEiC+nT6MJl5BIPPM2MfbuBCGMEexzGNfw2DSqibcN5pF5b5mLHAqkYsCt4Nyw==","signatures":[{"sig":"MEUCICNTusa6/P7X6zvfKusz4+2ZGI4pXTzRc9nbdXFTN8c2AiEA946jIa1WX0KGSF1h6bG2UvC3uSZwMXFP1WD16tQij/E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":551118},"main":"index.js","gitHead":"f67bf229b243c6496c292ccd387b083d2cd977e0","scripts":{"build":"npm run build:emscripten","serve":"emrun --serve_root build index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.2.4","description":"wasm module to make flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_1.0.5_1708605533973_0.21926513974120576","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"@cristianglezm/flower-evolver-wasm","version":"1.0.6","keywords":["genetic-algorithms","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@1.0.6","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"511864e6f31463cd67dfc28d55a5578f1e86b6f4","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-1.0.6.tgz","fileCount":7,"integrity":"sha512-0w8kHXDbbA92gqSPhQ79cOwsCQYO/5kJMlJug9aRIZTzXfUGxwXHAI3/4D/PRWMvmdC7amXfaP5nAqO5Kcug9g==","signatures":[{"sig":"MEUCIQC8g4NaHACNjnnGmpXI0+TBr8ZAJU/uFlzGkQMGRm9xdAIgEtoG17xpp6+4ArDdBWHjnDy9Kc5zmIKIZf/Yt1R4iEQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":540540},"main":"index.js","gitHead":"e10f0bc9d3055562cd1eceba5b8203074aa98e07","scripts":{"build":"npm run build:emscripten","serve":"emrun --serve_root build index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.8.1","description":"wasm module to make flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"20.16.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_1.0.6_1723470148096_0.41418025392639146","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@cristianglezm/flower-evolver-wasm","version":"1.1.0","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@1.1.0","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"20a80129025fbcddea7851b0a798de2892ee466c","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-1.1.0.tgz","fileCount":7,"integrity":"sha512-upIocccvoKVp1uNPM7eClKZbLgUU9lMEzQm/Ubh3W3ZScLkmcIpqatEuV1ACqqGs1bkPsSUYHKv0HIvDwGBghQ==","signatures":[{"sig":"MEYCIQDqLaYnSfkoOwRarzE9HYT20eUrtNC+wUuVl/0p5OVrmgIhAOBK1cOVnlngdX4nTp/bpfuMlDzrlfTh4Y961CL0k+dI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":544091},"main":"index.js","gitHead":"9e25b013e20e6b524b9940ab53f5b92d0d24bd24","scripts":{"build":"npm run build:emscripten","serve":"emrun --serve_root build index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.8.2","description":"wasm module to make flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_1.1.0_1744201022715_0.6877200312261176","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@cristianglezm/flower-evolver-wasm","version":"2.0.1","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@2.0.1","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"4fbe6f7c135ad42a551ab3d7c3e8c9e27e1ac390","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-2.0.1.tgz","fileCount":7,"integrity":"sha512-53S1fswc5z6nlU8gGC+4Wc5QNvkuK4yknE1OG8f+7X40CNB7ddZuqQTGarNPgHenDwyn+yuPTlh0tQmmNC1Qqg==","signatures":[{"sig":"MEUCIDWszsR2R+b4J6Rfl4lxFjje0hLLoslb41b5s6tdvfHYAiEAkyqGcTp4rtL6671IT1WKHGB/jhXaeHFn2HZKjLsDgpw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556888},"main":"index.js","gitHead":"5327999b5a82cb9abf5cfa7079c47cdaf0a94531","scripts":{"build":"npm run build:emscripten","serve":"emrun --serve_root build index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"11.3.0","description":"wasm module to make flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_2.0.1_1745173473716_0.6443725082971994","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@cristianglezm/flower-evolver-wasm","version":"3.0.0","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@3.0.0","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"20c34df081a96a22153ac0e167cd1899eae0c3e5","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-3.0.0.tgz","fileCount":7,"integrity":"sha512-H54Pb+kVyNkAX7R1tvSQi/CjvrcZWsmVdM4JLsFthhL7VEZK08t3WUOMfNfLAg2Kw+sXhTqfY4xuI5m7ERFGrA==","signatures":[{"sig":"MEUCIQC68QzPaYe+XFgZonZXBbegJ1MepSXkhiERA60RR40V6gIgRwu80ZNblR8G39/hXUhcGByHI7qcwZ7lDF9NDv2HMeE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":763232},"main":"index.js","gitHead":"23e92bf31c19ec25a843f4ff74450ecef47a0dac","scripts":{"build":"npm run build:emscripten","serve":"emrun --serve_root build index.html","build:emscripten":"bash .devops/dist.sh FALSE"},"typings":"./public/FlowerEvolver.d.ts","_npmUser":{"name":"cristianglezm","email":"cristianglezm@gmail.com"},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"10.8.2","description":"wasm module to make 2D / 3D flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"20.19.4","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_3.0.0_1754236459939_0.2083424072089335","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@cristianglezm/flower-evolver-wasm","version":"4.0.0","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez","email":"cristian.glez.m@gmail.com"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@4.0.0","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"e6714d309be4b477be48687e76ade027f6ee67fe","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-4.0.0.tgz","fileCount":10,"integrity":"sha512-D1FpNfB6T4wph6bXlbaaSItXIfdSIY5vSvTgNBysCkvNnr7rNf+OVfvdCuXCKICqGMQ2e8pR0v/Qk7Vt+OMTVg==","signatures":[{"sig":"MEYCIQCkGlMEKMju1JPFdgbg4vNQ8RyLR/e2466jnpOldqZMkQIhAK50wi4Hl2tZEb34R+zyUqsPrfW0IgA7Flqjigl4Mr2G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cristianglezm%2fflower-evolver-wasm@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":709411},"main":"index.js","type":"module","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./wasm":{"types":"./types/wasm-module.d.ts","import":"./public/FlowerEvolver.js","default":"./public/FlowerEvolver.js"},"./package.json":"./package.json"},"gitHead":"83025e9f5cd398f45bc33f5d1402407b17537f15","scripts":{"prep":"bash .devops/prep.sh","test":"vitest run","build":"bash .devops/build.sh","clean":"rm -rf build dist","serve":"bash .devops/serve.sh","build:ts":"tsc","test:cpp":"ctest --test-dir build/native/fe --output-on-failure","test:e2e":"playwright test","build:docs":"bash .devops/build.sh docs","test:watch":"vitest","prep:native":"bash .devops/prep.sh native","test:e2e:ui":"playwright test --ui","test:python":"pytest python/tests/","build:native":"bash .devops/build.sh native","build:python":"bash .devops/build.sh python","prep:android":"bash .devops/prep.sh android","build:android":"bash .devops/build.sh android","build:docs:js":"typedoc","build:docs:cpp":"cmake -S docs -B build/docs && cmake --build build/docs","build:docs:python":"python -m sphinx -b html -q docs/python-conf build/docs-python","build:native:fuzz":"bash .devops/build.sh fuzz","build:native:test":"bash .devops/build.sh native -DFlowerEvolver_BUILD_TESTS=ON"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ca90b7f-c50f-4597-bd0c-ac4f0892fe9f"}},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"12.0.2","description":"wasm module to make 2D / 3D flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.5","vitest":"^4.0.8","typedoc":"^0.28.20","typescript":"^5.9.3","@playwright/test":"^1.61.1"},"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_4.0.0_1789003080329_0.09835067718163004","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@cristianglezm/flower-evolver-wasm","version":"4.0.1","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"author":{"name":"Cristian Gonzalez","email":"cristian.glez.m@gmail.com"},"license":"Apache-2.0","_id":"@cristianglezm/flower-evolver-wasm@4.0.1","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"4db78c91a74c98cb29d8171d4c6ddcdea1bdba7b","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-4.0.1.tgz","fileCount":10,"integrity":"sha512-eBmzTnnPeDxUfa2uTxE3GBHlYWUw4ddvbbUzhOZaIOfvtSWGN9zee513JgsaF+GWfEK4kA21uAvLRUuoSXZwLg==","signatures":[{"sig":"MEUCIDq0MshkUeO4MPghlG/Gn7qjGFSOoqpxH66NOy2tcH1MAiEAooZ056fDtH+GC0zeWmhWwjbu4A5tANh+sYMrqJJLb/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDYPFPLkc+VEkURHC4/lM8shdC1r36CeRMYUcSHQ9eyUAIhAOiDn7ENAD5BNvutDHGWb4Gm5sr3WCxqEzL00MVEFh2W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cristianglezm%2fflower-evolver-wasm@4.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":709153},"main":"index.js","type":"module","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./wasm":{"types":"./types/wasm-module.d.ts","import":"./public/FlowerEvolver.js","default":"./public/FlowerEvolver.js"},"./package.json":"./package.json"},"gitHead":"7bf97eca8b3f757c7fa98a70b36a8c2b4607e2e5","scripts":{"prep":"bash .devops/prep.sh","test":"vitest run","build":"bash .devops/build.sh","clean":"rm -rf build dist","serve":"bash .devops/serve.sh","build:ts":"tsc","test:cpp":"ctest --test-dir build/native/fe --output-on-failure","test:e2e":"playwright test","build:docs":"bash .devops/build.sh docs","test:watch":"vitest","prep:native":"bash .devops/prep.sh native","test:e2e:ui":"playwright test --ui","test:python":"pytest python/tests/","build:native":"bash .devops/build.sh native","build:python":"bash .devops/build.sh python","prep:android":"bash .devops/prep.sh android","build:android":"bash .devops/build.sh android","build:docs:js":"typedoc","build:docs:cpp":"cmake -S docs -B build/docs && cmake --build build/docs","build:docs:python":"python -m sphinx -b html -q docs/python-conf build/docs-python","build:native:fuzz":"bash .devops/build.sh fuzz","build:native:test":"bash .devops/build.sh native -DFlowerEvolver_BUILD_TESTS=ON"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ca90b7f-c50f-4597-bd0c-ac4f0892fe9f"}},"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"12.0.2","description":"wasm module to make 2D / 3D flowers that evolve using EvoAI library","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.5","vitest":"^5.0.0","typedoc":"^0.28.20","typescript":"^5.9.3","@playwright/test":"^1.61.1"},"_npmOperationalInternal":{"tmp":"tmp/flower-evolver-wasm_4.0.1_1789574212003_0.05585836443018555","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"_id":"@cristianglezm/flower-evolver-wasm@4.0.2","bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"dist":{"shasum":"0ce7d5f2b4e8462eedcec8fcc1771dd93c67cea1","tarball":"https://registry.npmjs.org/@cristianglezm/flower-evolver-wasm/-/flower-evolver-wasm-4.0.2.tgz","fileCount":10,"integrity":"sha512-dTwsdP80nL/WVw+iw0Pi/i20PWCzIkl8zHJo73XmiJly85g3uMtgU7oIG9lsJNJf9dgCXp7xdMdEh7bCpBTYFg==","signatures":[{"sig":"MEYCIQCPNANQ1TL7tenn8y3CrV0vgs4FLY5eYzJBf2RUK+tjIAIhAKh7mrxBtwhmIdPajWYxbA31vgbZdxElW1AXPWvsqL1E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIH0LeOwtEho2DK/o5/2f5JeP+Vkrac7ZhOCBKpXivmPvAiEAvmKVxQT7f751F9C0FKyjbbSE+y4Hu6c/rh1krw42RMk="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cristianglezm%2fflower-evolver-wasm@4.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":709160},"main":"index.js","name":"@cristianglezm/flower-evolver-wasm","type":"module","types":"./index.d.ts","author":{"name":"Cristian Gonzalez","email":"cristian.glez.m@gmail.com"},"exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./wasm":{"types":"./types/wasm-module.d.ts","import":"./public/FlowerEvolver.js","default":"./public/FlowerEvolver.js"},"./package.json":"./package.json"},"gitHead":"91cf0c0a1cb5d343ff84ec5c1cc5b15f0e2f0bc2","license":"Apache-2.0","scripts":{"prep":"bash .devops/prep.sh","test":"vitest run","build":"bash .devops/build.sh","clean":"rm -rf build dist","serve":"bash .devops/serve.sh","build:ts":"tsc","test:cpp":"ctest --test-dir build/native/fe --output-on-failure","test:e2e":"playwright test","build:docs":"bash .devops/build.sh docs","test:watch":"vitest","prep:native":"bash .devops/prep.sh native","test:e2e:ui":"playwright test --ui","test:python":"pytest python/tests/","build:native":"bash .devops/build.sh native","build:python":"bash .devops/build.sh python","prep:android":"bash .devops/prep.sh android","build:android":"bash .devops/build.sh android","build:docs:js":"typedoc","build:docs:cpp":"cmake -S docs -B build/docs && cmake --build build/docs","build:docs:python":"python -m sphinx -b html -q docs/python-conf build/docs-python","build:native:fuzz":"bash .devops/build.sh fuzz","build:native:test":"bash .devops/build.sh native -DFlowerEvolver_BUILD_TESTS=ON"},"version":"4.0.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ca90b7f-c50f-4597-bd0c-ac4f0892fe9f"}},"homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"_npmVersion":"12.0.2","description":"wasm module to make 2D / 3D flowers that evolve using EvoAI library","directories":{},"maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.5","vitest":"^5.0.0","typedoc":"^0.28.20","typescript":"^5.9.3","@playwright/test":"^1.61.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/flower-evolver-wasm_4.0.2_1789817621040_0.32368635230137976"}}},"time":{"created":"2024-01-09T23:14:46.357Z","modified":"2026-09-19T11:33:41.444Z","1.0.0":"2024-01-09T17:38:27.917Z","1.0.2":"2024-01-09T23:14:46.663Z","1.0.3":"2024-01-09T23:29:09.409Z","1.0.4":"2024-01-29T15:26:02.570Z","1.0.5":"2024-02-22T12:38:54.206Z","1.0.6":"2024-08-12T13:42:28.369Z","1.1.0":"2025-04-09T12:17:03.017Z","2.0.0":"2025-04-20T14:41:27.084Z","2.0.1":"2025-04-20T18:24:33.927Z","3.0.0":"2025-08-03T15:54:20.243Z","4.0.0":"2026-09-10T01:18:00.486Z","4.0.1":"2026-09-16T15:56:52.094Z","4.0.2":"2026-09-19T11:33:41.133Z"},"bugs":{"url":"https://github.com/cristianglezm/FlowerEvolver-WASM/issues"},"author":{"name":"Cristian Gonzalez","email":"cristian.glez.m@gmail.com"},"license":"Apache-2.0","homepage":"https://github.com/cristianglezm/FlowerEvolver-WASM#readme","keywords":["genetic-algorithms","evolution","FlowerEvolver","NEAT","EvoAI"],"repository":{"url":"git+https://github.com/cristianglezm/FlowerEvolver-WASM.git","type":"git"},"description":"wasm module to make 2D / 3D flowers that evolve using EvoAI library","maintainers":[{"name":"cristianglezm","email":"cristianglezm@gmail.com"}],"readme":"# FlowerEvolver-WASM\n\n[![ci](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/ci.yml)\n[![cd](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/cd.yml/badge.svg?branch=master)](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/cd.yml)\n[![pkg](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/pkg.yml/badge.svg?branch=master)](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/pkg.yml)\n[![pkg-python](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/pkg-python.yml/badge.svg?branch=master)](https://github.com/cristianglezm/FlowerEvolver-WASM/actions/workflows/pkg-python.yml)\n[![NPM Version](https://img.shields.io/npm/v/%40cristianglezm%2Fflower-evolver-wasm?logo=npm)](https://www.npmjs.com/package/@cristianglezm/flower-evolver-wasm)\n[![PyPI Version](https://img.shields.io/pypi/v/flowerevolver?logo=pypi)](https://pypi.org/project/flowerevolver/)\n[![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/cristianglezm/flowerEvolver-wasm/master?logo=github)](https://github.com/cristianglezm/FlowerEvolver-WASM/pkgs/npm/flower-evolver-wasm)\n\nGenerates, mutates, and reproduces 2D/3D flowers from CPPN genomes evolved via [EvoAI](https://github.com/cristianglezm/EvoAI) - adapted from [EcoSystem](https://github.com/cristianglezm/EcoSystem.git). The core is a single C++17 library (`fe::`) shipped as a WebAssembly module for the browser, a native static/shared library for C++ apps, native Python bindings, and an Android build - one implementation, four ways to consume it.\n\nThe CPPN-encoded, evolvable flower approach the project implements follows the one introduced by Risi et al. in *Petalz* - see [Acknowledgments](#acknowledgments).\n\nCheck the live demo [here](https://cristianglezm.github.io/FlowerEvolver-WASM/).\n\n## Contents\n\n* [News](#news)\n* [Building](#building)\n* [Browser Usage](#browser-usage)\n* [Framework Usage](#framework-usage)\n* [Worker Usage](#worker-usage)\n* [Android](#android)\n* [Native C++ Library](#native-c-library)\n* [Python Bindings](#python-bindings)\n* [Documentation](#documentation)\n* [Testing](#testing)\n* [API Reference](#api-reference)\n* [Acknowledgments](#acknowledgments)\n* [License](#license)\n\n## News\n\n<details>\n<summary><strong>v4.0.0</strong> - native CMake build, Python bindings, TypeScript rewrite, docs site, and more (click to expand)</summary>\n\n**Additions**\n* Native CMake build (Linux/macOS/Windows) alongside the Emscripten/WASM target, so `fe::` can be linked directly into a C++ app -- see \"Building\" below.\n* Native Python bindings (nanobind) plus a `flower-evolver` CLI - see [python/README.md](python/README.md).\n* Android build via CMake.\n* `index.ts`: the JS-facing `FEService` wrapper is now TypeScript, shipping its own generated `index.d.ts`.\n* Full API docs site (Doxygen+Sphinx for C++, TypeDoc for JS/WASM, Sphinx+autodoc for Python) - linked from the demo page.\n* Test coverage: C++ (Catch2), JS/Node (vitest), e2e (Playwright), Python (pytest), and libFuzzer fuzzing harnesses.\n* CI/CD: a native x wasm x Android build matrix, plus tag-triggered release automation for npm, GitHub Packages, and PyPI.\n\n**Breaking changes**\n* WASM no longer touches `document`/`OffscreenCanvas` at all -- `{genome, image}` (image as a base64 PNG data URL) comes back directly from the module. If you were reading pixels off an injected `<canvas id=\"canvas\">` or `self.canvas`, switch to `FEService` (or read `.image` off its JS/WASM module's own JSON result) instead.\n* The `FE_EXPORT` TRUE/FALSE build split is gone -- there's one Emscripten build now (ES6 module + `SINGLE_FILE`). `dist/public/FlowerEvolver.mjs` is now `dist/public/FlowerEvolver.js`, and `dist/index.js` is compiled from `index.ts` rather than hand-written.\n* The native C++ API (`include/fe/FlowerEvolver.hpp`) now takes/returns typed `fe::DNA`/`fe::Flower`/`fe::Image` instead of stringified JSON -- only affects native (non-WASM) consumers; the JS/WASM API's own shape is unchanged.\n\n</details>\n\n<details>\n<summary><strong>v3.0.0</strong> - 3D flower generation and stats (click to expand)</summary>\n\n* 3D flower generation pipeline: 2D petal layers go through contour extraction, contour simplification, and mesh generation, and come out as a glTF 2.0 scene (mesh, material, texture, node) with petal droop, a generated pistil and stamens, and lighting extras.\n* Procedural normal maps (from a noise function) and emissive textures for glowing flowers, plus `adjustParams`/`adjustStem` so stem/pistil proportions and per-layer petal droop scale adaptively with the flower's own size instead of using fixed constants.\n* Layered radius scaling (`applyLayeredRadiusScaling` in `drawLayer()`) reuses the same petal image at progressively lower resolutions in 2D mode and pre-scales textures in 3D mode -- measured to cut VRAM use from 22MB to 2.2MB and file size from 1MB to 0.7MB at radius 256 / 20 layers.\n* In-memory PNG encoding and base64 encoding, so textures can be embedded directly in the glTF file instead of round-tripping through the DOM.\n* `Image` split into its own header/source file; `numLayers` is now clamped based on `radius` to avoid excessive memory allocation.\n* Flower `Stats` generation (health, stamina, temperature range, maturation, toxicity, and per-stat effects) derived from a flower's genome.\n* A companion Blender plugin, and 3D examples added to the demo page.\n\n</details>\n\n<details>\n<summary><strong>v2.0.0 / v2.0.1</strong> - FEService wrapper (click to expand)</summary>\n\n* Added `FEService`, `FEParams`, and `Flower` to `index.js` -- a documented JS wrapper around the raw embind calls (`makeFlower`/`reproduce`/`mutate`/etc.), instead of consumers calling the wasm module's exported functions directly and reading the canvas by hand.\n* Added `getDataUrl`, a small helper to read the (real or offscreen) canvas back as a data URL, used internally by `FEService` and safe to call from a Web Worker.\n* v2.0.1: explicitly exported `HEAPU8` from the Emscripten build, a same-day bugfix so `FEService` could reliably read pixel data back out of the wasm heap.\n\n</details>\n\n<details>\n<summary><strong>v1.1.0</strong> - partial rendering (click to expand)</summary>\n\n* Added `makePetals`/`makePetalLayer`/`makeStem` and their `draw*` counterparts, so a consumer can generate or redraw just the petals, a single petal layer, or just the stem, instead of always paying for a full flower render.\n\n</details>\n\n<details>\n<summary><strong>v1.0.0 / v1.0.1</strong> - initial Emscripten module (click to expand)</summary>\n\n* Initial release: the flower generator (genome, petals, drawing) compiled to WebAssembly via Emscripten/embind, driven against a `<canvas id=\"canvas\">` element in the page.\n* v1.0.1 added npm packaging (`package.json`, `.devops/dist.sh`, `pkg.yml`) with an `FE_EXPORT` flag to build either a plain global script or an ES6 module, and auto-publish to npm and GitHub Packages on release.\n\n</details>\n\n## Building\n\nFollow these steps to download, build, and run the project.\n\n### Automated Build Process\n\nRun `npm run prep` once to set up the dependencies (Emscripten SDK, JsonBox, EvoAI, all under `build/wasm/`), then `npm run build` to configure and build the project. `npm run build` is safe to re-run as often as you like -- it doesn't redo the dependency setup, so it's fast for iterating. It also compiles `index.ts` (via `npm run build:ts`, run automatically as part of `npm run build`) -- run `npm run build:ts` on its own if you're only iterating on the JS-facing `FEService` wrapper and don't need a full wasm rebuild.\n\nThat's genuinely all most people need for the browser/npm package -- the table below covers the other targets (native, Android, Python, docs, fuzzing), and the rest of this section is only for readers who want to see what those two commands do underneath.\n\n### Other build targets\n\nEvery target follows the same two-step shape: a one-time `prep` (clones and builds JsonBox/EvoAI for that target) and a repeatable `build`.\n\n| Target | Setup (once) | Build | Notes |\n|---|---|---|---|\n| WASM (browser/npm) | `npm run prep` | `npm run build` | Default target; produces `dist/` |\n| Native C++ library | `npm run prep:native` | `npm run build:native` | Add `-DFlowerEvolver_BUILD_TESTS=ON` (or use `npm run build:native:test`) to also build the Catch2 suite |\n| Android (all 4 ABIs) | `npm run prep:android` | `npm run build:android -- <abi>` | One ABI per `build` invocation; needs `$ANDROID_NDK` -- see [Android](#android) |\n| Python bindings | `npm run prep:native` | `npm run build:python` | nanobind; installs the `flowerevolver` package + `flower-evolver` CLI -- see [Python Bindings](#python-bindings) |\n| Docs (C++ + JS + Python) | `npm run prep:native && npm run build:python` + `pip install -r docs/requirements.txt` | `npm run build:docs` | Doxygen+Sphinx (C++), TypeDoc (JS/WASM), Sphinx+autodoc (Python) -- Python docs need `build:python` first, see [Documentation](#documentation) |\n| Fuzzing | `npm run prep:native` | `npm run build:native:fuzz` | Needs Clang -- see `tests/fuzz/README.md` |\n\n`npm run prep` and `npm run build` are themselves just `bash .devops/prep.sh` and `bash .devops/build.sh` -- there's no separate manual recipe to keep in sync with those scripts, so if you want to see (or run) each underlying step individually, read `.devops/prep.sh` and `.devops/build.sh` directly. Both document every mode (`wasm`/`native`/`android`/`docs`/`python`/`fuzz`) in a comment block at the top, and both are safe to re-run as often as you like. For a manual, non-npm `cmake`/`cmake --build` invocation, see `cmake/modules/{FindEvoAI,FindJsonBox}.cmake` for the `_ROOT` variables it expects.\n\n### Using npm run serve\n\nAfter running `npm run prep` (once) and `npm run build`, run `npm run serve` to view the demo website.\n\n## Browser usage\n\nThe build is a single self-contained ES module (the wasm binary is inlined as base64, no separate `.wasm` file to fetch) -- use it directly with an import map, no bundler required. For the full function reference (native C++ API), see `include/fe/FlowerEvolver.hpp`.\n\n### Example Code\n\nBelow is a sample JavaScript snippet to load and use the module in your project:\n\n```html\n<script type=\"importmap\">\n{\n  \"imports\": {\n    \"@cristianglezm/flower-evolver-wasm\": \"./node_modules/@cristianglezm/flower-evolver-wasm/index.js\"\n  }\n}\n</script>\n<script type=\"module\">\n    import { FEService } from '@cristianglezm/flower-evolver-wasm';\n\n    const fes = new FEService();\n    await fes.init();\n\n    // Example: create a flower\n    const flower = await fes.makeFlower();\n    // flower.genome - stringified genome, feed back into reproduce/mutate/draw*\n    // flower.image  - base64-encoded PNG data URL, ready for an <img src=\"...\">\n</script>\n```\n\n### Notes\n\n* **Reference FlowerEvolver.hpp:** This header file contains detailed documentation on all functions and their parameters (native C++ API). `index.ts`'s `FEService` is the recommended JS-facing wrapper -- see [API Reference](#api-reference) below.\n* Written in TypeScript (`index.ts`), the published package ships its own `index.d.ts` (generated straight from that source) alongside `index.js`, so TypeScript consumers get full type checking and autocomplete with no extra `@types` package to install.\n\n## Framework Usage\n\ninstall it\n\n```bash\nnpm install @cristianglezm/flower-evolver-wasm\n```\n\n```javascript\nimport { FEService } from '@cristianglezm/flower-evolver-wasm';\n\nlet fes = new FEService();\nawait fes.init();\n```\n\nYou can integrate the service into a state manager like Pinia for better state management. Here's an example setup:\n\n```javascript\nimport { defineStore } from 'pinia';\nimport { FEParams, FEService } from '@cristianglezm/flower-evolver-wasm';\n\nexport const useFlowersStore = defineStore('FlowersStore', {\n    state: () => ({\n        fe: null,\n        flowers: [],\n    }),\n    getters: {},\n    actions: {\n        async loadFE() {\n            this.fe = new FEService();\n            await this.fe.init();\n        },\n        setParams(params) {\n            // only called when you actually want to change something --\n            // makeFlower() below reuses whatever was set last (or the\n            // FEService default, if this was never called).\n            this.fe.setParams(params);\n        },\n        async makeFlower() {\n            const flower = await this.fe.makeFlower();\n            this.flowers.push(flower);\n            return flower;\n        },\n    },\n});\n\n// Example Usage:\nconst store = useFlowersStore();\nawait store.loadFE();\nstore.setParams(new FEParams(128, 2, 5.0, -1.0));\nawait store.makeFlower();\n//...\n```\n\n## Worker Usage\n\n### App Code\n\nIn your main application file, set up the worker and handle communication:\n\n```javascript\nimport { FEParams } from '@cristianglezm/flower-evolver-wasm';\n\n// Create a new Worker instance\nlet worker = new Worker('worker.js');\n\n// Handle messages from the worker\nworker.onmessage = (e) => {\n    // Perform actions with the received data\n};\n\n// Send data to the worker\nconst fn = () => {\n    worker.postMessage({ params: new FEParams(radius, numLayers, P, bias) });\n};\n```\n\n### Worker code\n\nIn worker.js, initialize the FlowerEvolver service and process incoming messages:\n\n```javascript\nimport { FEParams, FEService } from '@cristianglezm/flower-evolver-wasm';\n\nlet FE;\n\nself.onmessage = async (e) => {\n    /// validate params to avoid OOM errors.\n    let params = e.data.params;\n    // Initialize FlowerEvolver service if not already initialized\n    if(!FE){\n        FE = new FEService();\n        await FE.init();\n    }\n    FE.setParams(new FEParams(params.radius, params.numLayers, \n                                params.P, params.bias));\n    // Use the methods from the FEService instance\n    let flower;\n    try{\n        // Create a flower (Flower class contains genome and image)\n        flower = await FE.makeFlower();\n    }catch(e){\n        // Handle errors\n        console.error(e);\n    }\n\n    // flower.genome and flower.image (base64 PNG data URL) are both ready\n    // to use directly -- no canvas readback needed.\n    self.postMessage({\n        genome: flower.genome,\n        image: flower.image\n    });\n};\n```\n\n### Notes\n\n* Use FE.makeFlower and other methods from FEService for creating flowers or reproduce them or mutate them.\n* Always validate the params passed to the worker to avoid unexpected errors.\n\n## Android\n\nThe native library also cross-compiles for Android via CMake's own `CMAKE_SYSTEM_NAME=Android` support (no Android Studio/Gradle project needed).\n\n```bash\n# needs $ANDROID_NDK pointing at a real NDK install\nnpm run prep:android                 # all 4 Play-Store-relevant ABIs by default\nnpm run prep:android -- arm64-v8a    # or just the ABI(s) you need\n\nnpm run build:android -- arm64-v8a -DFlowerEvolver_BUILD_STATIC=FALSE\n```\n\nThis produces `build/android/fe-<abi>/`, packaged with `cpack -G ZIP` in CI (see the `android`/`android-merge` jobs in `.github/workflows/ci.yml`), and a merged `FlowerEvolver-Android.zip` with all four ABIs side by side for release tags. `src/Android.mk` is included for classic `ndk-build` consumers who'd rather drop the prebuilt `.so`/`.a` straight into an existing NDK project than adopt CMake.\n\n## Native C++ Library\n\nLink `libFlowerEvolver` directly into a C++ app once it's built and installed (`npm run prep:native && npm run build:native`, then `cmake --install`):\n\n```cmake\nfind_package(FlowerEvolver 4 REQUIRED)\ntarget_link_libraries(myApp PRIVATE FlowerEvolver::FlowerEvolver)\n```\n\n```cpp\n#include <fe/FlowerEvolver.hpp>\n\nint main(){\n    fe::Flower flower = makeFlower(64, 3, 6.0f, 1.0f);\n    auto png = fe::encodeImageToPngInMemory(flower.petals.image);\n    // flower.dna.toJson() for the genome; reproduce()/mutate() take fe::DNA in, fe::Flower out.\n}\n```\n\nSee `include/fe/FlowerEvolver.hpp` for the full documented API (same generation logic the WASM, Android, and Python bindings all call through `fe::detail::impl_*`), and `cmake/modules/{FindEvoAI,FindJsonBox}.cmake` for the dependency `_ROOT` variables a manual configure needs.\n\n## Python Bindings\n\nNative Python bindings (via [nanobind](https://github.com/wjakob/nanobind)) around the same C++ core -- same `Flower.to_json()`/`from_json()` wire format as the JS/WASM API above, so genomes round-trip between both. Also installs a `flower-evolver` CLI matching the native desktop app's own single-flower flags.\n\n```bash\nnpm run prep:native   # once\nnpm run build:python\n```\n\n```python\nfrom flowerevolver import make_flower\n\nflower = make_flower(radius=64, num_layers=3, P=6.0, bias=1.0)\nflower.petals.image.to_png_bytes()  # -> bytes\nflower.to_json()                    # -> str, the genome\n```\n\n`npm run test:python` runs its pytest suite. See [python/README.md](python/README.md) for the manual `pip install` invocation, the CLI, and more usage examples; the C++ glue itself lives in `src/bindings/python/`.\n\n## Documentation\n\nThree cross-linked API reference sites, built from the same source the demo page itself links to:\n\n* [C++ docs](https://cristianglezm.github.io/FlowerEvolver-WASM/docs/cpp/) - Doxygen + Breathe + Sphinx, from `include/fe/FlowerEvolver.hpp` and the rest of the public `fe::` headers.\n* [JS/WASM docs](https://cristianglezm.github.io/FlowerEvolver-WASM/docs/js/) - TypeDoc, from `index.ts` and `types/wasm-module.d.ts`.\n* [Python docs](https://cristianglezm.github.io/FlowerEvolver-WASM/docs/python/) - Sphinx + autodoc, from the installed `flowerevolver` package's own docstrings.\n\nBuild them locally with `npm run build:docs` (needs `npm run prep:native` first, plus Doxygen/Graphviz and `pip install -r docs/requirements.txt`); output lands in `dist/docs/{cpp,js,python}/`. The Python site additionally needs the `flowerevolver` package itself importable -- run `npm run build:python` before `npm run build:docs`, or the C++ and JS sites build normally while the Python site is silently skipped (with a warning) instead of failing the whole command. Each site can also be built on its own -- `npm run build:docs:cpp`, `npm run build:docs:js`, `npm run build:docs:python` (the last one assumes `build:python` has already run).\n\n## Testing\n\n| Suite | Setup | Run |\n|---|---|---|\n| C++ (Catch2) | `npm run prep:native && npm run build:native:test` | `npm run test:cpp` |\n| JS/Node (vitest, against a real build) | `npm run prep && npm run build` | `npm test` |\n| e2e (Playwright, drives the built demo) | `npm run prep && npm run build` | `npm run test:e2e` |\n| Python (pytest) | `npm run prep:native && npm run build:python` | `npm run test:python` |\n| Fuzzing (libFuzzer, Clang) | `npm run prep:native && npm run build:native:fuzz` | see `tests/fuzz/README.md` |\n\n## API Reference\n\n* JS/WASM: [`index.ts`](https://github.com/cristianglezm/FlowerEvolver-WASM/blob/master/index.ts), or the browsable [JS/WASM docs](https://cristianglezm.github.io/FlowerEvolver-WASM/docs/js/).\n* Native C++: [`include/fe/FlowerEvolver.hpp`](https://github.com/cristianglezm/FlowerEvolver-WASM/blob/master/include/fe/FlowerEvolver.hpp), or the browsable [C++ docs](https://cristianglezm.github.io/FlowerEvolver-WASM/docs/cpp/).\n* Python: the browsable [Python docs](https://cristianglezm.github.io/FlowerEvolver-WASM/docs/python/), or [python/README.md](python/README.md) for the CLI.\n\n## Acknowledgments\n\nThe CPPN-encoded, breedable-flower approach implemented here follows the one introduced by:\n\n> Risi, S., Lehman, J., D'Ambrosio, D., Hall, R., & Stanley, K. (2012). Combining Search-Based Procedural Content Generation and Social Gaming in the Petalz Video Game. *Proceedings of the AAAI Conference on Artificial Intelligence and Interactive Digital Entertainment*, 8(1). [https://doi.org/10.1609/aiide.v8i1.12502](https://doi.org/10.1609/aiide.v8i1.12502)\n\nGenome evolution (NEAT/CPPN) itself is provided by [EvoAI](https://github.com/cristianglezm/EvoAI).\n\n## License\n\nSFML-derived parts (`fe::Color`/`fe::Rect`/`fe::Vector2`, adapted from SFML and merged into the `fe::` namespace) are under SFML's own [license](include/fe/SFML-LICENSE.md).\n\nstb_image_write is under its own [license](include/stb_image_write.h)\n\nthe rest of the code is licensed under apache 2.0\n\n```\n   Copyright 2023-2026 Cristian Gonzalez <cristian.glez.m@gmail.com>\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n```\n","readmeFilename":"README.md"}