{"_id":"@depla/reka-core","_rev":"8-e641513a0c50047e4634260a9f95acf6","name":"@depla/reka-core","dist-tags":{"latest":"0.1.18"},"versions":{"0.1.10":{"name":"@depla/reka-core","version":"0.1.10","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@rekajs/types":"workspace:*","@rekajs/parser":"workspace:*","@types/lodash":"^4.14.185"},"peerDependencies":{"@rekajs/types":">=0.1.0"},"dependencies":{"@rekajs/utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"gitHead":"4f7c08073465e46cd5fc20e41249fac6541e8bd8","_id":"@depla/reka-core@0.1.10","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-ZhiB0g1gNsuOWDZw+wASVzZ1jZou36NRzL5pU8XY/hSJa8RRQ+IZhyBZmJk9PKK3tSKS3vXTX5zhNwnZse2aBQ==","shasum":"0cace6f254fc3a0ed82117d13dfd56422c4d5026","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.10.tgz","fileCount":55,"unpackedSize":322756,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEYC3O8owYXAfC0OtnIWMu8i9g0DD4IhgWXbkUe7+LAQIhAOZfm6asfeAx+3N1COZ49vaKZPhNnSdKvv5ABqJpll+6"}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.10_1687090006917_0.7957561052724049"},"_hasShrinkwrap":false},"0.1.11":{"name":"@depla/reka-core","version":"0.1.11","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.11","_integrity":"sha512-dmWvuWEFxIvqVd7XcHKw17Q0gFbNUdCdKgRmHFIYU23FrTU/fQInZc92eVyNOpxaThxbPz/RCIk/Lf7fV4keHQ==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/5f4bb792cd1067c36b788c905f6c9219/depla-reka-core-0.1.11.tgz","_from":"file:depla-reka-core-0.1.11.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-dmWvuWEFxIvqVd7XcHKw17Q0gFbNUdCdKgRmHFIYU23FrTU/fQInZc92eVyNOpxaThxbPz/RCIk/Lf7fV4keHQ==","shasum":"7cb8eb7dcd0069a4b9500e7f9495b66e4cd44241","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.11.tgz","fileCount":57,"unpackedSize":216367,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrWk9CfA9o5fydoVy9qp7mw73cNwFW4LLomEVVA5E/MQIhAPfGI9MHM871Hy4zvv1JGQinKf0xHURxNjzC4d7jvVmU"}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.11_1687243019346_0.014080937312166864"},"_hasShrinkwrap":false},"0.1.12":{"name":"@depla/reka-core","version":"0.1.12","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.12","_integrity":"sha512-JC6oiwUK9w+FW8zMCsqy/pqyn8yvA+pdpvoygP3bpKm/CfMTaRl5XND/ae0q/E6Uu1zkqCEe/ss+S3hipL00zg==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/c61fab58dbb1cea636d028ce4a8bdc29/depla-reka-core-0.1.12.tgz","_from":"file:depla-reka-core-0.1.12.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-JC6oiwUK9w+FW8zMCsqy/pqyn8yvA+pdpvoygP3bpKm/CfMTaRl5XND/ae0q/E6Uu1zkqCEe/ss+S3hipL00zg==","shasum":"59016272e2477be34a74deef4c50793f1a877799","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.12.tgz","fileCount":57,"unpackedSize":216843,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEUms3WqZJwE27v+FD1xvQexlHjSsifmwwvOoyIT0wM2AiEA4Q9eQxRgUCFArzDEOu5XHvTxcNu8tBHpUWzeY0QSioM="}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.12_1687455432061_0.09568642077940104"},"_hasShrinkwrap":false},"0.1.13":{"name":"@depla/reka-core","version":"0.1.13","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@depla/reka-types":"workspace:*","@depla/reka-parser":"workspace:*","@types/lodash":"^4.14.185"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"gitHead":"ecf48339c1a3ea8837f75a2ec7ae5cec92eae0d7","_id":"@depla/reka-core@0.1.13","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-zWJ4QcbtTFR1pfbqqWrJKg39VKxfy1OwGhasKtzqKZRAUKy72oiMwCFz/smfPD2Qd1gUwUFn//It09mlHLTb0A==","shasum":"c9f5b3c63084499bb9f9adce4ef537988d67b37d","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.13.tgz","fileCount":30,"unpackedSize":106808,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGSbpCaiqwWZRPMH0MhucvhYYhnigu0kkqrvOsipapOZAiEAoScc62md40FuYdZkYkrt6CPFRSpjsDqr/OfmSqiZ21c="}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.13_1687493598128_0.18633764314391899"},"_hasShrinkwrap":false},"0.1.14":{"name":"@depla/reka-core","version":"0.1.14","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.14","_integrity":"sha512-A6M7wqHiXzNcftSFRJmHPD4YmXwTzmsxbmwfIMJXdG3sudYGcHFb1Djp2WawnyyrFkj+2cas8mtp3ZFQqhdb4g==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/9a6c3655eb914d60dd1dd0224693fe9c/depla-reka-core-0.1.14.tgz","_from":"file:depla-reka-core-0.1.14.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-A6M7wqHiXzNcftSFRJmHPD4YmXwTzmsxbmwfIMJXdG3sudYGcHFb1Djp2WawnyyrFkj+2cas8mtp3ZFQqhdb4g==","shasum":"006b07381382d62ab9dee3a33eec1ec722e436ff","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.14.tgz","fileCount":31,"unpackedSize":107877,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/x2HlOI7sQ+dyXndhQ0v5zI2LMg2iDwlTaAyOl5rRMgIgQaXksPTQED9WjNz353ikAWJjAsslE7BMYb51xfKfJEc="}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.14_1687493843910_0.6914878038322008"},"_hasShrinkwrap":false},"0.1.15":{"name":"@depla/reka-core","version":"0.1.15","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.15","_integrity":"sha512-G1Ovi41vuY1HG4YuHfjPCkYnvE6L1p94E7ulV/AOUJyK4YKXFUV8CsfnoE13Jksu+dXPNby3H6OdBg8ej0M/fw==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/13fed630091f3e0939b876b6859cd51b/depla-reka-core-0.1.15.tgz","_from":"file:depla-reka-core-0.1.15.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-G1Ovi41vuY1HG4YuHfjPCkYnvE6L1p94E7ulV/AOUJyK4YKXFUV8CsfnoE13Jksu+dXPNby3H6OdBg8ej0M/fw==","shasum":"b3719d427e5d88d4609b51a9f3c640a24dedaaf2","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.15.tgz","fileCount":57,"unpackedSize":221218,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyAjl0fYWcCeHTZuj11Ktz8hwAE8UucK9QivYVzLgkpQIgMBPWiCrVBXI4DCXkrIg4bL3C+7zCNqcZBae7oq7uRQw="}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.15_1687494163882_0.8157140515043029"},"_hasShrinkwrap":false},"0.1.16":{"name":"@depla/reka-core","version":"0.1.16","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.16","_integrity":"sha512-JjGuCwvVbe5KrtDuMTQ70myM0XwRP4z0AwQIN0wshE90iy8m5/UtyhdLF5Kt/XuimZvw7c02vyOC3c+fyOZyFg==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/ee4cb8970e1c120727529760b977ef7a/depla-reka-core-0.1.16.tgz","_from":"file:depla-reka-core-0.1.16.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-JjGuCwvVbe5KrtDuMTQ70myM0XwRP4z0AwQIN0wshE90iy8m5/UtyhdLF5Kt/XuimZvw7c02vyOC3c+fyOZyFg==","shasum":"c8fa10937ea6b2acd24cc17b16e18e647c42bb74","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.16.tgz","fileCount":57,"unpackedSize":221218,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAZnaSwTd3xrd+LzHlf5PlkpBBi4NjdWJjktyRPyScyMAiBygF5HAxqGwhti9DLZxqqIt5nKT48JTtngnpDE5JhKTw=="}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.16_1687494363631_0.9551544111180998"},"_hasShrinkwrap":false},"0.1.17":{"name":"@depla/reka-core","version":"0.1.17","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.17","_integrity":"sha512-P90YxRjJg+9V6fEGd0PSBeVNqjOLU0z5sSUnKcNvVKP9g+5NKqQpo4FyqAO0/OizpQk0wewROf0ZsZ6rRQtEuA==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/806576d26690f1a069ee8ed19cba8f0f/depla-reka-core-0.1.17.tgz","_from":"file:depla-reka-core-0.1.17.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-P90YxRjJg+9V6fEGd0PSBeVNqjOLU0z5sSUnKcNvVKP9g+5NKqQpo4FyqAO0/OizpQk0wewROf0ZsZ6rRQtEuA==","shasum":"d683b66df695d9f62c3db10b07a9e0be049a71f8","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.17.tgz","fileCount":57,"unpackedSize":331123,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFKgfuspWn9BsfTAtKUTKB1MX3fHAitsqI/mz1hhAWqAIgGpIPUfYOT4/VfSfi3gE6WP/nJuhvq/s/rzHVlauc2ZE="}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.17_1687570213736_0.19896648458059385"},"_hasShrinkwrap":false},"0.1.18":{"name":"@depla/reka-core","version":"0.1.18","description":"State management system for building no-code page editors","main":"./dist/cjs/index.js","module":"./dist/esm/index.mjs","types":"./dist/index.d.ts","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","devDependencies":{"@types/lodash":"^4.14.185","@depla/reka-types":"0.1.10","@depla/reka-parser":"0.1.5"},"peerDependencies":{"@depla/reka-types":">=0.1.0"},"dependencies":{"@depla/reka-utils":"^0.1.2","lodash":"^4.17.21","mobx":"^6.3.13"},"volta":{"node":"16.16.0"},"publishConfig":{"access":"public"},"scripts":{"build:types":"tsc -p .","dev":"../../scripts/build.sh -w","build":"cross-env NODE_ENV=production ../../scripts/build.sh"},"_id":"@depla/reka-core@0.1.18","_integrity":"sha512-dz8Yp0a3fY6HBmhNGV9kpy+LnMmHeHrDgY+388qZy0Uk6L4FAJ/URJCri8GefYw8llV49/2tyTPHEUuQS6d1BQ==","_resolved":"/private/var/folders/96/d2_cqgd55s9g06sqvyyzhytr0000gn/T/6c18e78d24a1c3ee23f2d53146d0868c/depla-reka-core-0.1.18.tgz","_from":"file:depla-reka-core-0.1.18.tgz","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-dz8Yp0a3fY6HBmhNGV9kpy+LnMmHeHrDgY+388qZy0Uk6L4FAJ/URJCri8GefYw8llV49/2tyTPHEUuQS6d1BQ==","shasum":"05ed45c826888a366adc66bf417be4166c5fdcc5","tarball":"https://registry.npmjs.org/@depla/reka-core/-/reka-core-0.1.18.tgz","fileCount":57,"unpackedSize":331308,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSS9ixRdjqWly1ojQLaZwXtLQuya/Bwp30FHtrDXsQGwIhAKoWcihDmHr3T+lVBxCsxZsaJisDAOOAXnDKd8/Pqfhx"}]},"_npmUser":{"name":"sergeylukin","email":"contact@sergeylukin.com"},"directories":{},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reka-core_0.1.18_1687570324298_0.12862702207445054"},"_hasShrinkwrap":false}},"time":{"created":"2023-06-18T12:06:46.863Z","0.1.10":"2023-06-18T12:06:47.107Z","modified":"2023-06-24T01:32:04.675Z","0.1.11":"2023-06-20T06:36:59.545Z","0.1.12":"2023-06-22T17:37:12.289Z","0.1.13":"2023-06-23T04:13:18.339Z","0.1.14":"2023-06-23T04:17:24.367Z","0.1.15":"2023-06-23T04:22:44.129Z","0.1.16":"2023-06-23T04:26:03.810Z","0.1.17":"2023-06-24T01:30:13.999Z","0.1.18":"2023-06-24T01:32:04.552Z"},"maintainers":[{"name":"sergeylukin","email":"contact@sergeylukin.com"}],"description":"State management system for building no-code page editors","keywords":[],"author":{"name":"Prev Wong"},"license":"MIT","readme":"# reka.js\n\nReka is a state management system for building no-code editors.\n\n![banner-min](https://user-images.githubusercontent.com/16416929/227709589-ab15ae78-d8eb-4ce8-b4e6-8ebbb3cff73b.png)\n\n## Why?\n\nMuch of the complexity surrounding building no-code editors comes from architecting the state management system to power such editors (ie: how should the end user designs be stored and edited in a page editor?)\n\nReka solves this by providing an AST-powered state system that enables end-users to create UI components that are nearly as complex as ones that developers could write in code; along with an interpreter to efficiently compute an output that could be rendered on the browser.\n\nIt's primarily built to serve as the new state management system to power [Craft.js](https://craft.js.org) and its page builders.\n\n## Features\n\n### AST-based State :zap:\n\nAt the core of Reka is the State data structure which is an Abstract Syntax Tree (AST). This enables end-users to build complex UI components with features that developers are familiar with from UI frameworks such as React:\n\n```tsx\n[\n  {\n    type: 'RekaComponent',\n    name: 'Counter',\n    props: [\n      {\n        type: 'ComponentProp',\n        name: 'initalValue',\n        init: { type: 'Literal', value: 0 },\n      },\n    ],\n    state: [\n      {\n        type: 'Val',\n        name: 'counter',\n        init: { type: 'Identifier', name: 'initialValue' },\n      },\n    ],\n    template: {\n      type: 'TagTemplate',\n      tag: 'p',\n      props: {},\n      children: [\n        {\n          type: 'TagTemplate',\n          tag: 'text',\n          props: { value: { type: 'Literal', value: 'My counter: ' } },\n        },\n        {\n          type: 'TagTemplate',\n          tag: 'text',\n          props: { value: { type: 'Identifier', value: 'counter' } },\n        },\n      ],\n    },\n  },\n  {\n    type: 'RekaComponent',\n    name: 'App',\n    state: [],\n    template: {\n      type: 'TagTemplate',\n      tag: 'div',\n      props: {},\n      children: [{ type: 'TagTemplate', component: 'Counter', props: {} }],\n    },\n  },\n];\n\n// which is the equivalent of the following React code:\nconst Counter = ({ initialValue = 0 }) => {\n  const [counter, setCounter] = useState(initialValue);\n\n  return <p>My Counter: {counter}</p>;\n};\n\nconst App = () => {\n  return (\n    <div>\n      <Counter initalValue={10} />\n    </div>\n  );\n};\n```\n\nThis means you could build page editors where your end-users are able to design entire UI components with stateful values and templating capabilities (ie: conditionally rendering elements, expressions as props, rendering elements from a list etc)\n\n### Portable :car:\n\nReka computes a Component instance from its State by generating a `View` tree:\n\n```tsx\n// Compute a View for the Counter component\nconst frame = await reka.createFrame({\n  id: 'my-basic-counter-instance',\n  component: {\n    name: 'Counter',\n    props: { initialValue: t.literal({ value: 10 }) }\n  }\n});\n\nconsole.log(frame.view);\n// console:\n{\n    type: \"RekaComponentView\",\n    component: { type: \"RekaComponent\", component: \"Counter\" },\n    root: {\n        type: \"TagView\",\n        tag: \"p\",\n        props: {},\n        children: [\n            { type: \"TagView\", tag: \"text\", props: { value: \"My counter: \" }},\n            { type: \"TagView\", tag: \"text\", props: { value: 10 }}\n        ]\n    }\n}\n```\n\nWhenever there's a change made to the State (eg: adding a new child to a parent template), Reka efficiently recomputes the updated `View`.\n\nThe `View` tree is a simple serializable JSON structure. So regardless of what UI framework you're working with to build your page builder - whether it's React, Vue or Svelte; building a renderer for Reka simply means taking this JSON structure and rendering it in your preferred UI framework.\n\n### Extensible State :hammer:\n\nOf course, page builders oftentimes may require additional data to be stored as part of the `State`. For example, let's say you want your end-users to be able to leave a comment on a template element; you can store these comments directly as part of the `State`:\n\n```tsx\nimport { createExtension } from '@depla/reka-core';\n\ntype CommentState = {\n  comments: Array<{\n    templateId: string; // Id of the Template element associated with the comment\n    content: string;\n  }>;\n};\n\nconst CommentExtension = createExtension<CommentState>({\n  key: 'comments',\n  state: {\n    // initial state\n    comments: [],\n  },\n  init: (extension) => {\n    // do whatever your extension may have to do here\n    // ie: send some data to the backend or listen to some changes made in State\n  },\n});\n\n// Usage\nreka.change(() => {\n  reka.getExtension(CommentExtension).state.comments.push({\n    templateId: '...',\n    content: 'This button tag should be larger!!',\n  });\n});\n```\n\n### External Functionalities :fire:\n\nYou may also want to expose additional functionalities for the end-users of your page builder to use. For example, let's say you want your end-users to have the ability to output the current date time:\n\n```tsx\n// 1) Expose function to return current time\nconst reka = Reka.create({\n  externals: {\n    functions: (self) => ({\n      getDateTime: () => {\n        return Date.now();\n      },\n    }),\n  },\n});\n\n// 2) External function is now accessible throughout the State:\nreka.load(\n  t.state({\n    program: t.program({\n      components: [\n        t.rekaComponent({\n          name: 'App',\n          states: [],\n          props: [],\n          template: t.tagTemplate({\n            tag: 'text',\n            props: {\n              value: t.binaryExpression({\n                left: t.literal({ value: 'Current date time is: ' }),\n                operator: '+',\n                right: t.callExpression({\n                  identifier: {\n                    name: 'getDateTime', // <-- access exposed function to return current time\n                    external: true,\n                  },\n                  params: {},\n                }),\n              }),\n            },\n          }),\n        }),\n      ],\n    }),\n  })\n);\n```\n\n### Realtime Collaboration :tada:\n\nOh, you need multiplayer in your page editor too? No problem, Reka provides an external package that allows real-time collaboration via a fully-featured CRDT backed by [Yjs](https://github.com/yjs/yjs)\n\n```tsx\nimport { Reka } from '@depla/reka-core';\nimport * as t from '@depla/reka-types';\nimport { createCollabExtension } from '@depla/reka-collaboration';\n\nimport * as Y from 'yjs';\nimport { WebrtcProvider } from 'y-webrtc';\n\nconst doc = new Y.Doc();\nconst type = doc.getMap('my-collaborative-editor');\n\nconst reka = Reka.create({\n  extensions: [createCollabExtension(type)],\n});\n\nreka.load(t.unflatten(type.getMap('document')));\n\nnew WebrtcProvider('collab-room', doc);\n```\n\n## Acknowledgments :raised_hands:\n\nReka is inspired by [Plasmic](https://www.plasmic.app/), [Builder.io](https://builder.io) and [Mitosis](https://github.com/BuilderIO/mitosis)\n","readmeFilename":"README.md"}