@bkincz/clutch 1.0.2 โ†’ 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/.tsbuildinfo CHANGED
@@ -1 +1 @@
1
- {"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react/jsx-runtime.d.ts","../node_modules/immer/dist/immer.d.ts","../src/machine.ts","../src/hooks.ts","../src/index.ts","../node_modules/@vitest/pretty-format/dist/index.d.ts","../node_modules/@vitest/utils/dist/types.d.ts","../node_modules/@vitest/utils/dist/helpers.d.ts","../node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../node_modules/tinyrainbow/dist/node.d.ts","../node_modules/@vitest/utils/dist/index.d.ts","../node_modules/@vitest/runner/dist/tasks.d-CkscK4of.d.ts","../node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","../node_modules/@vitest/utils/dist/diff.d.ts","../node_modules/@vitest/utils/diff.d.ts","../node_modules/@vitest/runner/dist/types.d.ts","../node_modules/@vitest/utils/dist/error.d.ts","../node_modules/@vitest/utils/error.d.ts","../node_modules/@vitest/runner/dist/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/parse5/dist/common/html.d.ts","../node_modules/parse5/dist/common/token.d.ts","../node_modules/parse5/dist/common/error-codes.d.ts","../node_modules/parse5/dist/tokenizer/preprocessor.d.ts","../node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts","../node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts","../node_modules/entities/dist/commonjs/decode-codepoint.d.ts","../node_modules/entities/dist/commonjs/decode.d.ts","../node_modules/entities/decode.d.ts","../node_modules/parse5/dist/tokenizer/index.d.ts","../node_modules/parse5/dist/tree-adapters/interface.d.ts","../node_modules/parse5/dist/parser/open-element-stack.d.ts","../node_modules/parse5/dist/parser/formatting-element-list.d.ts","../node_modules/parse5/dist/parser/index.d.ts","../node_modules/parse5/dist/tree-adapters/default.d.ts","../node_modules/parse5/dist/serializer/index.d.ts","../node_modules/parse5/dist/common/foreign-content.d.ts","../node_modules/parse5/dist/index.d.ts","../node_modules/tough-cookie/dist/cookie/constants.d.ts","../node_modules/tough-cookie/dist/cookie/cookie.d.ts","../node_modules/tough-cookie/dist/utils.d.ts","../node_modules/tough-cookie/dist/store.d.ts","../node_modules/tough-cookie/dist/memstore.d.ts","../node_modules/tough-cookie/dist/pathMatch.d.ts","../node_modules/tough-cookie/dist/permuteDomain.d.ts","../node_modules/tough-cookie/dist/getPublicSuffix.d.ts","../node_modules/tough-cookie/dist/validators.d.ts","../node_modules/tough-cookie/dist/version.d.ts","../node_modules/tough-cookie/dist/cookie/canonicalDomain.d.ts","../node_modules/tough-cookie/dist/cookie/cookieCompare.d.ts","../node_modules/tough-cookie/dist/cookie/cookieJar.d.ts","../node_modules/tough-cookie/dist/cookie/defaultPath.d.ts","../node_modules/tough-cookie/dist/cookie/domainMatch.d.ts","../node_modules/tough-cookie/dist/cookie/formatDate.d.ts","../node_modules/tough-cookie/dist/cookie/parseDate.d.ts","../node_modules/tough-cookie/dist/cookie/permutePath.d.ts","../node_modules/tough-cookie/dist/cookie/index.d.ts","../node_modules/@types/jsdom/base.d.ts","../node_modules/@types/jsdom/index.d.ts","../node_modules/vitest/optional-types.d.ts","../node_modules/vitest/dist/chunks/environment.d.cL3nLXbE.d.ts","../node_modules/vite/types/hmrPayload.d.ts","../node_modules/vite/dist/node/moduleRunnerTransport-BWUZBVLX.d.ts","../node_modules/vite/types/customEvent.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/rollup/dist/rollup.d.ts","../node_modules/vite/types/hot.d.ts","../node_modules/vite/dist/node/module-runner.d.ts","../node_modules/esbuild/lib/main.d.ts","../node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts","../node_modules/@jridgewell/trace-mapping/types/types.d.cts","../node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts","../node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts","../node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts","../node_modules/@jridgewell/gen-mapping/types/types.d.cts","../node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts","../node_modules/@jridgewell/source-map/types/source-map.d.cts","../node_modules/terser/tools/terser.d.ts","../node_modules/vite/types/internal/terserOptions.d.ts","../node_modules/source-map-js/source-map.d.ts","../node_modules/postcss/lib/previous-map.d.ts","../node_modules/postcss/lib/input.d.ts","../node_modules/postcss/lib/css-syntax-error.d.ts","../node_modules/postcss/lib/declaration.d.ts","../node_modules/postcss/lib/root.d.ts","../node_modules/postcss/lib/warning.d.ts","../node_modules/postcss/lib/lazy-result.d.ts","../node_modules/postcss/lib/no-work-result.d.ts","../node_modules/postcss/lib/processor.d.ts","../node_modules/postcss/lib/result.d.ts","../node_modules/postcss/lib/document.d.ts","../node_modules/postcss/lib/rule.d.ts","../node_modules/postcss/lib/node.d.ts","../node_modules/postcss/lib/comment.d.ts","../node_modules/postcss/lib/container.d.ts","../node_modules/postcss/lib/at-rule.d.ts","../node_modules/postcss/lib/list.d.ts","../node_modules/postcss/lib/postcss.d.ts","../node_modules/vite/types/internal/lightningcssOptions.d.ts","../node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","../node_modules/vite/types/importGlob.d.ts","../node_modules/vite/types/metadata.d.ts","../node_modules/vite/dist/node/index.d.ts","../node_modules/@vitest/mocker/dist/registry.d-D765pazg.d.ts","../node_modules/@vitest/mocker/dist/types.d-D_aRZRdy.d.ts","../node_modules/@vitest/mocker/dist/index.d.ts","../node_modules/@vitest/utils/dist/source-map.d.ts","../node_modules/vite-node/dist/trace-mapping.d-DLVdEqOp.d.ts","../node_modules/vite-node/dist/index.d-DGmxD2U7.d.ts","../node_modules/vite-node/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts","../node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts","../node_modules/@vitest/snapshot/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d.ts","../node_modules/@vitest/snapshot/environment.d.ts","../node_modules/vitest/dist/chunks/config.d.D2ROskhv.d.ts","../node_modules/vitest/dist/chunks/worker.d.1GmBbd7G.d.ts","../node_modules/@types/deep-eql/index.d.ts","../node_modules/@types/chai/index.d.ts","../node_modules/@vitest/runner/dist/utils.d.ts","../node_modules/@vitest/runner/utils.d.ts","../node_modules/tinybench/dist/index.d.cts","../node_modules/vitest/dist/chunks/benchmark.d.BwvBVTda.d.ts","../node_modules/vite-node/dist/client.d.ts","../node_modules/vitest/dist/chunks/coverage.d.S9RMNXIe.d.ts","../node_modules/@vitest/snapshot/dist/manager.d.ts","../node_modules/@vitest/snapshot/manager.d.ts","../node_modules/vitest/dist/chunks/reporters.d.BFLkQcL6.d.ts","../node_modules/vitest/dist/chunks/worker.d.CKwWzBSj.d.ts","../node_modules/@vitest/spy/dist/index.d.ts","../node_modules/@vitest/expect/dist/index.d.ts","../node_modules/vitest/dist/chunks/global.d.MAmajcmJ.d.ts","../node_modules/vitest/dist/chunks/vite.d.CMLlLIFP.d.ts","../node_modules/vitest/dist/chunks/mocker.d.BE_2ls6u.d.ts","../node_modules/vitest/dist/chunks/suite.d.FvehnV49.d.ts","../node_modules/expect-type/dist/utils.d.ts","../node_modules/expect-type/dist/overloads.d.ts","../node_modules/expect-type/dist/branding.d.ts","../node_modules/expect-type/dist/messages.d.ts","../node_modules/expect-type/dist/index.d.ts","../node_modules/vitest/dist/index.d.ts","../src/__tests__/setup.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/semver/classes/semver.d.ts","../node_modules/@types/semver/functions/parse.d.ts","../node_modules/@types/semver/functions/valid.d.ts","../node_modules/@types/semver/functions/clean.d.ts","../node_modules/@types/semver/functions/inc.d.ts","../node_modules/@types/semver/functions/diff.d.ts","../node_modules/@types/semver/functions/major.d.ts","../node_modules/@types/semver/functions/minor.d.ts","../node_modules/@types/semver/functions/patch.d.ts","../node_modules/@types/semver/functions/prerelease.d.ts","../node_modules/@types/semver/functions/compare.d.ts","../node_modules/@types/semver/functions/rcompare.d.ts","../node_modules/@types/semver/functions/compare-loose.d.ts","../node_modules/@types/semver/functions/compare-build.d.ts","../node_modules/@types/semver/functions/sort.d.ts","../node_modules/@types/semver/functions/rsort.d.ts","../node_modules/@types/semver/functions/gt.d.ts","../node_modules/@types/semver/functions/lt.d.ts","../node_modules/@types/semver/functions/eq.d.ts","../node_modules/@types/semver/functions/neq.d.ts","../node_modules/@types/semver/functions/gte.d.ts","../node_modules/@types/semver/functions/lte.d.ts","../node_modules/@types/semver/functions/cmp.d.ts","../node_modules/@types/semver/functions/coerce.d.ts","../node_modules/@types/semver/classes/comparator.d.ts","../node_modules/@types/semver/classes/range.d.ts","../node_modules/@types/semver/functions/satisfies.d.ts","../node_modules/@types/semver/ranges/max-satisfying.d.ts","../node_modules/@types/semver/ranges/min-satisfying.d.ts","../node_modules/@types/semver/ranges/to-comparators.d.ts","../node_modules/@types/semver/ranges/min-version.d.ts","../node_modules/@types/semver/ranges/valid.d.ts","../node_modules/@types/semver/ranges/outside.d.ts","../node_modules/@types/semver/ranges/gtr.d.ts","../node_modules/@types/semver/ranges/ltr.d.ts","../node_modules/@types/semver/ranges/intersects.d.ts","../node_modules/@types/semver/ranges/simplify.d.ts","../node_modules/@types/semver/ranges/subset.d.ts","../node_modules/@types/semver/internals/identifiers.d.ts","../node_modules/@types/semver/index.d.ts","../node_modules/@types/tough-cookie/index.d.ts"],"fileIdsList":[[75,117,219,221],[75,117],[75,117,220],[75,117,219,222],[75,117,217,219],[75,117,216,217,218],[75,117,216,219],[75,117,264],[75,117,129,162,166,184,203,205],[75,117,204],[75,114,117],[75,116,117],[117],[75,117,122,151],[75,117,118,123,129,130,137,148,159],[75,117,118,119,129,137],[70,71,72,75,117],[75,117,120,160],[75,117,121,122,130,138],[75,117,122,148,156],[75,117,123,125,129,137],[75,116,117,124],[75,117,125,126],[75,117,127,129],[75,116,117,129],[75,117,129,130,131,148,159],[75,117,129,130,131,144,148,151],[75,112,117],[75,117,125,129,132,137,148,159],[75,117,129,130,132,133,137,148,156,159],[75,117,132,134,148,156,159],[73,74,75,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[75,117,129,135],[75,117,136,159,164],[75,117,125,129,137,148],[75,117,138],[75,117,139],[75,116,117,140],[75,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[75,117,142],[75,117,143],[75,117,129,144,145],[75,117,144,146,160,162],[75,117,129,148,149,151],[75,117,150,151],[75,117,148,149],[75,117,151],[75,117,152],[75,114,117,148,153],[75,117,129,154,155],[75,117,154,155],[75,117,122,137,148,156],[75,117,157],[75,117,137,158],[75,117,132,143,159],[75,117,122,160],[75,117,148,161],[75,117,136,162],[75,117,163],[75,117,129,131,140,148,151,159,162,164],[75,117,148,165],[48,49,75,117],[50,75,117],[75,117,290,329],[75,117,290,314,329],[75,117,329],[75,117,290],[75,117,290,315,329],[75,117,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328],[75,117,315,329],[60,61,65,75,117,276],[75,117,250,251],[61,62,65,66,68,75,117],[61,75,117],[61,62,65,75,117],[61,62,75,117],[75,117,266],[75,117,257],[56,75,117,257,258],[56,75,117,257],[75,117,260],[75,117,272],[64,75,117],[56,63,75,117],[57,75,117],[56,57,58,60,75,117],[56,75,117],[67,75,117],[75,117,174],[75,117,171,172,173],[75,117,282,283],[75,117,282,283,284,285],[75,117,282,284],[75,117,282],[75,117,168],[75,117,167,168],[75,117,167],[75,117,167,168,169,176,177,180,181,182,183],[75,117,168,177],[75,117,167,168,169,176,177,178,179],[75,117,167,177],[75,117,177,181],[75,117,168,169,170,175],[75,117,169],[75,117,167,168,177],[75,117,241],[75,117,239,241],[75,117,230,238,239,240,242,244],[75,117,228],[75,117,231,236,241,244],[75,117,227,244],[75,117,231,232,235,236,237,244],[75,117,231,232,233,235,236,244],[75,117,228,229,230,231,232,236,237,238,240,241,242,244],[75,117,226,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243],[75,117,226,244],[75,117,231,233,234,236,237,244],[75,117,235,244],[75,117,236,237,241,244],[75,117,229,239],[75,117,211,212],[75,117,223],[59,75,117],[75,117,187],[75,117,185],[75,117,186],[75,117,185,186,187,188],[75,117,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],[75,117,186,187,188],[75,117,187,203],[75,84,88,117,159],[75,84,117,148,159],[75,79,117],[75,81,84,117,156,159],[75,117,137,156],[75,117,166],[75,79,117,166],[75,81,84,117,137,159],[75,76,77,80,83,117,129,148,159],[75,84,91,117],[75,76,82,117],[75,84,105,106,117],[75,80,84,117,151,159,166],[75,105,117,166],[75,78,79,117,166],[75,84,117],[75,78,79,80,81,82,83,84,85,86,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,117],[75,84,99,117],[75,84,91,92,117],[75,82,84,92,93,117],[75,83,117],[75,76,79,84,117],[75,84,88,92,93,117],[75,88,117],[75,82,84,87,117,159],[75,76,81,84,91,117],[75,117,148],[75,79,84,105,117,164,166],[75,117,254,255],[75,117,254],[75,117,129,130,132,133,134,137,148,156,159,165,166,208,209,210,212,214,215,225,244,245,246,247,248,249],[75,117,208,209,210,213],[75,117,208],[75,117,210],[75,117,224],[75,117,212,249],[69,75,117,267,268,278],[56,65,69,75,117,259,261,278],[75,117,270],[75,117,206],[56,69,75,117,207,259,269,277,278],[75,117,252],[56,61,65,69,75,117,120,130,148,207,249,252,253,256,259,262,263,265,269,271,273,278,279],[69,75,117,267,268,269,278],[75,117,249,274,279],[69,75,117,207,256,259,262,278],[75,117,164,263],[56,61,65,69,75,117,120,130,148,164,206,207,249,252,253,256,259,261,262,263,265,267,268,269,270,271,273,274,275,276,277,278,279,280,281,286],[75,117,204,205],[51,75,117,287],[50,51,52,53,75,117],[51,52,53,54,75,117],[51,52,75,117]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"9dd1cf136b687969888de067d0384593097f32e9a378b187d150d9405151c6cb","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"07cbc706c24fa086bcc20daee910b9afa5dc5294e14771355861686c9d5235fd","impliedFormat":1},"46d18e54c399d1f16a6111eef7751e428e55c0356ff0b42ff1d4a05f092e026f","5bb1e83affb3455b77b2d3a9af42d10484f3c0731a41afa00a296a74c9c72f5b","775a51a7c61e9c779c2c15f94e2b5891a682acfb60a6d6b68d44b84a61ec5b6b",{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"05c7aef6a4e496b93c2e682cced8903c0dfe6340d04f3fe616176e2782193435","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"500a67e158e4025f27570ab6a99831680852bb45a44d4c3647ab7567feb1fb4c","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55","impliedFormat":1},{"version":"b5895e6353a5d708f55d8685c38a235c3a6d8138e374dee8ceb8ffde5aa8002a","impliedFormat":1},{"version":"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c","impliedFormat":1},{"version":"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"0225ecb9ed86bdb7a2c7fd01f1556906902929377b44483dc4b83e03b3ef227d","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"19990350fca066265b2c190c9b6cde1229f35002ea2d4df8c9e397e9942f6c89","impliedFormat":99},{"version":"8fb8fdda477cd7382477ffda92c2bb7d9f7ef583b1aa531eb6b2dc2f0a206c10","impliedFormat":99},{"version":"66995b0c991b5c5d42eff1d950733f85482c7419f7296ab8952e03718169e379","impliedFormat":99},{"version":"9863f888da357e35e013ca3465b794a490a198226bd8232c2f81fb44e16ff323","impliedFormat":99},{"version":"84bc2d80326a83ee4a6e7cba2fd480b86502660770c0e24da96535af597c9f1e","impliedFormat":1},{"version":"ea27768379b866ee3f5da2419650acdb01125479f7af73580a4bceb25b79e372","impliedFormat":1},{"version":"598931eeb4362542cae5845f95c5f0e45ac668925a40ce201e244d7fe808e965","impliedFormat":1},{"version":"da9ef88cde9f715756da642ad80c4cd87a987f465d325462d6bc2a0b11d202c8","impliedFormat":1},{"version":"9462ab013df86c16a2a69ca0a3b6f31d4fd86dd29a947e14b590eb20806f220b","impliedFormat":99},{"version":"b4c6184d78303b0816e779a48bef779b15aea4a66028eb819aac0abee8407dea","impliedFormat":99},{"version":"db085d2171d48938a99e851dafe0e486dce9859e5dfa73c21de5ed3d4d6fb0c5","impliedFormat":99},{"version":"62a3ad1ddd1f5974b3bf105680b3e09420f2230711d6520a521fab2be1a32838","impliedFormat":99},{"version":"a77be6fc44c876bc10c897107f84eaba10790913ebdcad40fcda7e47469b2160","impliedFormat":99},{"version":"06cf55b6da5cef54eaaf51cdc3d4e5ebf16adfdd9ebd20cec7fe719be9ced017","impliedFormat":99},{"version":"91f5dbcdb25d145a56cffe957ec665256827892d779ef108eb2f3864faff523b","impliedFormat":99},{"version":"052ba354bab8fb943e0bc05a0769f7b81d7c3b3c6cd0f5cfa53c7b2da2a525c5","impliedFormat":99},{"version":"927955a3de5857e0a1c575ced5a4245e74e6821d720ed213141347dd1870197f","impliedFormat":99},{"version":"fec804d54cd97dd77e956232fc37dc13f53e160d4bbeeb5489e86eeaa91f7ebd","impliedFormat":99},{"version":"c1d53a14aad7cda2cb0b91f5daccd06c8e3f25cb26c09e008f46ad2896c80bf1","impliedFormat":1},{"version":"c789127b81f23a44e7cd20eaff043bb8ddd8b75aca955504b81217d6347709d8","impliedFormat":1},{"version":"1e13bda0589d714493973ae87a135aadb8bdadc2b8ba412a62d6a8f05f13ae76","impliedFormat":1},{"version":"9e9217786bc4dced2d11b82eaf62c77f172a2b4671f1a6353835dcbf7eef0843","impliedFormat":1},{"version":"8c18473f354a9648fd8798196f520b3c3868181c315ab6a726177e5b5d2ada1c","impliedFormat":1},{"version":"067fe0fe11f79aa3eef819ee2f1d7beecc7a6d9e95ee1b2b84553495fb61b2fe","impliedFormat":1},{"version":"65e7aa0d38b9513dad1d66fa622ca0897efd8f6e11cb3887231451eb1dde719a","impliedFormat":1},{"version":"cf8d966c5b46aa3b4e2bc55aeaf5932253a734d2c09fc9e05867d47f7fc3fe31","impliedFormat":1},{"version":"e11fb3c6b0788cddcda16e472a173c03d8729201dc325beb1251f54d2630ebbb","impliedFormat":1},{"version":"9034c961e85ef73bdd4e07e2c56d7adfa4c00ee6cf568dcfc13d059575aac8a8","impliedFormat":1},{"version":"48676769d0f4904e916425f778ae25c140370fb90b33ad85151c7ebab166a0cc","impliedFormat":1},{"version":"b70a8d1c0d9628260158c2e96982f5ffb415ca87f97388ea743e52bd6ef37a9c","impliedFormat":1},{"version":"709bae51a9b0263a888c6adf48fb1380634e37267abcea46a52eb02a14b76292","impliedFormat":1},{"version":"7a625afe5721361715736bc3f9548206e1f173dcdc43eecaf7f70557f5151361","impliedFormat":1},{"version":"4d114e382693704d3792d2d6da45adc1aa2d8a86c1b8ebe5fc225dccd30aaf36","impliedFormat":1},{"version":"329760175a249a5e13e16f281ede4d8da4a4a72d511bf631bf7e5bd363146a80","impliedFormat":1},{"version":"9fbdb40eb68109a83dcc5f19c450556b20699b4fa19783dabdfc06a9937c9c30","impliedFormat":1},{"version":"afb75becf7075fc3673a6f1f7b669b5bb909ae67609284ce6548ec44d8038a61","impliedFormat":1},{"version":"4018b7fb337b14d2a40dd091208fbd39b3400136dfda00e9995b51cf64783a9f","impliedFormat":1},{"version":"6f5a9b68ce8608014210f5a777f8dd82e6382285f6278c811b7b0214bbcac5bd","impliedFormat":1},{"version":"af11413ffc8c34a2a2475cb9d2982b4cc87a9317bf474474eedaacc4aaab4582","affectsGlobalScope":true,"impliedFormat":1},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"5c31dea483b64cbb341ea8a7073c457720d1574f87837e71cccb70ce91196211","impliedFormat":99},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ffb518fc55181aefd066c690dbc0f8fa6a1533c8ddac595469c8c5f7fda2d756","affectsGlobalScope":true,"impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"217d7b67dacf8438f0be82b846f933981a1e6527e63c082c56adaf4782d62ab4","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"971f12a5fc236419ced0b7b9f23a53c1758233713f565635bbf4b85e2b23f55a","impliedFormat":1},{"version":"cd8d979f7bcefa59a3e47b8bc2831ca18d9ba3884047af4e01619e7e26a1d97b","impliedFormat":1},{"version":"3069d75a5e097c551e60e80b8196fbe8c7acdf367029ffc08a78f84528c5e78a","impliedFormat":1},{"version":"22b08025bd335c6a37c8ba4c7a171ed203e55347cab3c0556f1994f2e255ad41","impliedFormat":1},{"version":"604887bbd5b0a93234ce882543a465f008636185c52e0f0353330e2bc38b03b6","impliedFormat":1},{"version":"4da981eebce36323b081a8d56239a91dfb05b31eddb508bf144a13edea6c9264","impliedFormat":1},{"version":"4749218b4d25aefa8d6d4d3641789094c3b204e47267a5f6af6643d4fb7306ef","impliedFormat":1},{"version":"43bba542e50e19241ec64bc13cfc0d9273e6198f36563cecad1f4e4b78ad47f3","impliedFormat":1},{"version":"b8cb3b69c0e8114f758bb8ef8efeef1cc80f8911bfd21126def73d2174ce479e","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"a5d643092d2f16cb861872357b12ab844f33fc1181f7c5aed447b3424b4f5668","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"f2d1a59a658165341b0e2b7879aa2e19ea6a709146b2d3f70ee8a07159d3d08e","impliedFormat":99},{"version":"81e634f1c5e1ca309e7e3dc69e2732eea932ef07b8b34517d452e5a3e9a36fa3","impliedFormat":99},{"version":"34f39f75f2b5aa9c84a9f8157abbf8322e6831430e402badeaf58dd284f9b9a6","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"c8905dbea83f3220676a669366cd8c1acef56af4d9d72a8b2241b1d044bb4302","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"e666e31d323fef5642f87db0da48a83e58f0aaf9e3823e87eabd8ec7e0441a36","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":1},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"b7e28e06011460436d5c2ec2996846ac0c451e135357fc5a7269e5665a32fbd7","impliedFormat":99},{"version":"13497c0d73306e27f70634c424cd2f3b472187164f36140b504b3756b0ff476d","impliedFormat":99},{"version":"bf7a2d0f6d9e72d59044079d61000c38da50328ccdff28c47528a1a139c610ec","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"a23a08b626aa4d4a1924957bd8c4d38a7ffc032e21407bbd2c97413e1d8c3dbd","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"4c8ca51077f382498f47074cf304d654aba5d362416d4f809dfdd5d4f6b3aaca","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"13573a613314e40482386fe9c7934f9d86f3e06f19b840466c75391fb833b99b","impliedFormat":99},"1b5379bdf801e04736766a09785f3d71c0e34da75dadca81b03109b7a4866f2f",{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"03c258e060b7da220973f84b89615e4e9850e9b5d30b3a8e4840b3e3268ae8eb","impliedFormat":1}],"root":[[53,55],288],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"composite":false,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"experimentalDecorators":true,"jsx":4,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noPropertyAccessFromIndexSignature":false,"noUncheckedIndexedAccess":true,"outDir":"./","preserveConstEnums":true,"removeComments":false,"rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":7,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[222,1],[220,2],[221,3],[223,4],[218,5],[216,2],[219,6],[217,7],[265,8],[264,2],[211,2],[204,9],[205,10],[289,2],[114,11],[115,11],[116,12],[75,13],[117,14],[118,15],[119,16],[70,2],[73,17],[71,2],[72,2],[120,18],[121,19],[122,20],[123,21],[124,22],[125,23],[126,23],[128,2],[127,24],[129,25],[130,26],[131,27],[113,28],[74,2],[132,29],[133,30],[134,31],[166,32],[135,33],[136,34],[137,35],[138,36],[139,37],[140,38],[141,39],[142,40],[143,41],[144,42],[145,42],[146,43],[147,2],[148,44],[150,45],[149,46],[151,47],[152,48],[153,49],[154,50],[155,51],[156,52],[157,53],[158,54],[159,55],[160,56],[161,57],[162,58],[163,59],[164,60],[165,61],[48,2],[50,62],[51,63],[314,64],[315,65],[290,66],[293,66],[312,64],[313,64],[303,64],[302,67],[300,64],[295,64],[308,64],[306,64],[310,64],[294,64],[307,64],[311,64],[296,64],[297,64],[309,64],[291,64],[298,64],[299,64],[301,64],[305,64],[316,68],[304,64],[292,64],[329,69],[328,2],[323,68],[325,70],[324,68],[317,68],[318,68],[320,68],[322,68],[326,70],[327,70],[319,70],[321,70],[330,2],[277,71],[252,72],[250,2],[251,2],[56,2],[69,73],[62,74],[66,75],[266,76],[267,77],[257,2],[260,78],[259,79],[272,79],[258,80],[261,81],[273,82],[276,2],[65,83],[64,84],[67,84],[58,85],[61,86],[253,85],[63,87],[57,2],[68,88],[49,2],[175,89],[173,2],[174,90],[171,2],[172,2],[215,2],[284,91],[286,92],[285,93],[283,94],[282,2],[52,2],[169,95],[183,96],[167,2],[168,97],[184,98],[179,99],[180,100],[178,101],[182,102],[176,103],[170,104],[181,105],[177,96],[242,106],[240,107],[241,108],[229,109],[230,107],[237,110],[228,111],[233,112],[243,2],[234,113],[239,114],[244,115],[227,116],[235,117],[236,118],[231,119],[238,106],[232,120],[212,121],[226,2],[224,122],[268,2],[59,2],[60,123],[195,124],[185,2],[186,125],[196,126],[197,127],[198,124],[199,124],[200,2],[203,128],[201,124],[202,2],[192,2],[189,129],[190,2],[191,2],[188,130],[187,2],[193,124],[194,2],[46,2],[47,2],[8,2],[9,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[1,2],[91,131],[101,132],[90,131],[111,133],[82,134],[81,135],[110,136],[104,137],[109,138],[84,139],[98,140],[83,141],[107,142],[79,143],[78,136],[108,144],[80,145],[85,146],[86,2],[89,146],[76,2],[112,147],[102,148],[93,149],[94,150],[96,151],[92,152],[95,153],[105,136],[87,154],[88,155],[97,156],[77,157],[100,148],[99,146],[103,2],[106,158],[270,159],[255,160],[256,159],[254,2],[249,161],[214,162],[209,163],[210,163],[208,2],[213,164],[247,2],[246,2],[245,2],[225,165],[248,166],[269,167],[262,168],[271,169],[207,170],[278,171],[280,172],[274,173],[281,174],[279,175],[263,176],[275,177],[287,178],[206,179],[288,180],[54,181],[55,182],[53,183]],"affectedFilesPendingEmit":[[288,51],[54,51],[55,51],[53,51]],"version":"5.9.2"}
1
+ {"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react/jsx-runtime.d.ts","../node_modules/immer/dist/immer.d.ts","../src/machine.ts","../src/hooks.ts","../src/index.ts","../node_modules/@vitest/pretty-format/dist/index.d.ts","../node_modules/@vitest/utils/dist/types.d.ts","../node_modules/@vitest/utils/dist/helpers.d.ts","../node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../node_modules/tinyrainbow/dist/node.d.ts","../node_modules/@vitest/utils/dist/index.d.ts","../node_modules/@vitest/runner/dist/tasks.d-CkscK4of.d.ts","../node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","../node_modules/@vitest/utils/dist/diff.d.ts","../node_modules/@vitest/utils/diff.d.ts","../node_modules/@vitest/runner/dist/types.d.ts","../node_modules/@vitest/utils/dist/error.d.ts","../node_modules/@vitest/utils/error.d.ts","../node_modules/@vitest/runner/dist/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/parse5/dist/common/html.d.ts","../node_modules/parse5/dist/common/token.d.ts","../node_modules/parse5/dist/common/error-codes.d.ts","../node_modules/parse5/dist/tokenizer/preprocessor.d.ts","../node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts","../node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts","../node_modules/entities/dist/commonjs/decode-codepoint.d.ts","../node_modules/entities/dist/commonjs/decode.d.ts","../node_modules/entities/decode.d.ts","../node_modules/parse5/dist/tokenizer/index.d.ts","../node_modules/parse5/dist/tree-adapters/interface.d.ts","../node_modules/parse5/dist/parser/open-element-stack.d.ts","../node_modules/parse5/dist/parser/formatting-element-list.d.ts","../node_modules/parse5/dist/parser/index.d.ts","../node_modules/parse5/dist/tree-adapters/default.d.ts","../node_modules/parse5/dist/serializer/index.d.ts","../node_modules/parse5/dist/common/foreign-content.d.ts","../node_modules/parse5/dist/index.d.ts","../node_modules/tough-cookie/dist/cookie/constants.d.ts","../node_modules/tough-cookie/dist/cookie/cookie.d.ts","../node_modules/tough-cookie/dist/utils.d.ts","../node_modules/tough-cookie/dist/store.d.ts","../node_modules/tough-cookie/dist/memstore.d.ts","../node_modules/tough-cookie/dist/pathMatch.d.ts","../node_modules/tough-cookie/dist/permuteDomain.d.ts","../node_modules/tough-cookie/dist/getPublicSuffix.d.ts","../node_modules/tough-cookie/dist/validators.d.ts","../node_modules/tough-cookie/dist/version.d.ts","../node_modules/tough-cookie/dist/cookie/canonicalDomain.d.ts","../node_modules/tough-cookie/dist/cookie/cookieCompare.d.ts","../node_modules/tough-cookie/dist/cookie/cookieJar.d.ts","../node_modules/tough-cookie/dist/cookie/defaultPath.d.ts","../node_modules/tough-cookie/dist/cookie/domainMatch.d.ts","../node_modules/tough-cookie/dist/cookie/formatDate.d.ts","../node_modules/tough-cookie/dist/cookie/parseDate.d.ts","../node_modules/tough-cookie/dist/cookie/permutePath.d.ts","../node_modules/tough-cookie/dist/cookie/index.d.ts","../node_modules/@types/jsdom/base.d.ts","../node_modules/@types/jsdom/index.d.ts","../node_modules/vitest/optional-types.d.ts","../node_modules/vitest/dist/chunks/environment.d.cL3nLXbE.d.ts","../node_modules/vite/types/hmrPayload.d.ts","../node_modules/vite/dist/node/moduleRunnerTransport-BWUZBVLX.d.ts","../node_modules/vite/types/customEvent.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/rollup/dist/rollup.d.ts","../node_modules/vite/types/hot.d.ts","../node_modules/vite/dist/node/module-runner.d.ts","../node_modules/esbuild/lib/main.d.ts","../node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts","../node_modules/@jridgewell/trace-mapping/types/types.d.cts","../node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts","../node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts","../node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts","../node_modules/@jridgewell/gen-mapping/types/types.d.cts","../node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts","../node_modules/@jridgewell/source-map/types/source-map.d.cts","../node_modules/terser/tools/terser.d.ts","../node_modules/vite/types/internal/terserOptions.d.ts","../node_modules/source-map-js/source-map.d.ts","../node_modules/postcss/lib/previous-map.d.ts","../node_modules/postcss/lib/input.d.ts","../node_modules/postcss/lib/css-syntax-error.d.ts","../node_modules/postcss/lib/declaration.d.ts","../node_modules/postcss/lib/root.d.ts","../node_modules/postcss/lib/warning.d.ts","../node_modules/postcss/lib/lazy-result.d.ts","../node_modules/postcss/lib/no-work-result.d.ts","../node_modules/postcss/lib/processor.d.ts","../node_modules/postcss/lib/result.d.ts","../node_modules/postcss/lib/document.d.ts","../node_modules/postcss/lib/rule.d.ts","../node_modules/postcss/lib/node.d.ts","../node_modules/postcss/lib/comment.d.ts","../node_modules/postcss/lib/container.d.ts","../node_modules/postcss/lib/at-rule.d.ts","../node_modules/postcss/lib/list.d.ts","../node_modules/postcss/lib/postcss.d.ts","../node_modules/vite/types/internal/lightningcssOptions.d.ts","../node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","../node_modules/vite/types/importGlob.d.ts","../node_modules/vite/types/metadata.d.ts","../node_modules/vite/dist/node/index.d.ts","../node_modules/@vitest/mocker/dist/registry.d-D765pazg.d.ts","../node_modules/@vitest/mocker/dist/types.d-D_aRZRdy.d.ts","../node_modules/@vitest/mocker/dist/index.d.ts","../node_modules/@vitest/utils/dist/source-map.d.ts","../node_modules/vite-node/dist/trace-mapping.d-DLVdEqOp.d.ts","../node_modules/vite-node/dist/index.d-DGmxD2U7.d.ts","../node_modules/vite-node/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts","../node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts","../node_modules/@vitest/snapshot/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d.ts","../node_modules/@vitest/snapshot/environment.d.ts","../node_modules/vitest/dist/chunks/config.d.D2ROskhv.d.ts","../node_modules/vitest/dist/chunks/worker.d.1GmBbd7G.d.ts","../node_modules/@types/deep-eql/index.d.ts","../node_modules/@types/chai/index.d.ts","../node_modules/@vitest/runner/dist/utils.d.ts","../node_modules/@vitest/runner/utils.d.ts","../node_modules/tinybench/dist/index.d.cts","../node_modules/vitest/dist/chunks/benchmark.d.BwvBVTda.d.ts","../node_modules/vite-node/dist/client.d.ts","../node_modules/vitest/dist/chunks/coverage.d.S9RMNXIe.d.ts","../node_modules/@vitest/snapshot/dist/manager.d.ts","../node_modules/@vitest/snapshot/manager.d.ts","../node_modules/vitest/dist/chunks/reporters.d.BFLkQcL6.d.ts","../node_modules/vitest/dist/chunks/worker.d.CKwWzBSj.d.ts","../node_modules/@vitest/spy/dist/index.d.ts","../node_modules/@vitest/expect/dist/index.d.ts","../node_modules/vitest/dist/chunks/global.d.MAmajcmJ.d.ts","../node_modules/vitest/dist/chunks/vite.d.CMLlLIFP.d.ts","../node_modules/vitest/dist/chunks/mocker.d.BE_2ls6u.d.ts","../node_modules/vitest/dist/chunks/suite.d.FvehnV49.d.ts","../node_modules/expect-type/dist/utils.d.ts","../node_modules/expect-type/dist/overloads.d.ts","../node_modules/expect-type/dist/branding.d.ts","../node_modules/expect-type/dist/messages.d.ts","../node_modules/expect-type/dist/index.d.ts","../node_modules/vitest/dist/index.d.ts","../src/__tests__/setup.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/semver/classes/semver.d.ts","../node_modules/@types/semver/functions/parse.d.ts","../node_modules/@types/semver/functions/valid.d.ts","../node_modules/@types/semver/functions/clean.d.ts","../node_modules/@types/semver/functions/inc.d.ts","../node_modules/@types/semver/functions/diff.d.ts","../node_modules/@types/semver/functions/major.d.ts","../node_modules/@types/semver/functions/minor.d.ts","../node_modules/@types/semver/functions/patch.d.ts","../node_modules/@types/semver/functions/prerelease.d.ts","../node_modules/@types/semver/functions/compare.d.ts","../node_modules/@types/semver/functions/rcompare.d.ts","../node_modules/@types/semver/functions/compare-loose.d.ts","../node_modules/@types/semver/functions/compare-build.d.ts","../node_modules/@types/semver/functions/sort.d.ts","../node_modules/@types/semver/functions/rsort.d.ts","../node_modules/@types/semver/functions/gt.d.ts","../node_modules/@types/semver/functions/lt.d.ts","../node_modules/@types/semver/functions/eq.d.ts","../node_modules/@types/semver/functions/neq.d.ts","../node_modules/@types/semver/functions/gte.d.ts","../node_modules/@types/semver/functions/lte.d.ts","../node_modules/@types/semver/functions/cmp.d.ts","../node_modules/@types/semver/functions/coerce.d.ts","../node_modules/@types/semver/classes/comparator.d.ts","../node_modules/@types/semver/classes/range.d.ts","../node_modules/@types/semver/functions/satisfies.d.ts","../node_modules/@types/semver/ranges/max-satisfying.d.ts","../node_modules/@types/semver/ranges/min-satisfying.d.ts","../node_modules/@types/semver/ranges/to-comparators.d.ts","../node_modules/@types/semver/ranges/min-version.d.ts","../node_modules/@types/semver/ranges/valid.d.ts","../node_modules/@types/semver/ranges/outside.d.ts","../node_modules/@types/semver/ranges/gtr.d.ts","../node_modules/@types/semver/ranges/ltr.d.ts","../node_modules/@types/semver/ranges/intersects.d.ts","../node_modules/@types/semver/ranges/simplify.d.ts","../node_modules/@types/semver/ranges/subset.d.ts","../node_modules/@types/semver/internals/identifiers.d.ts","../node_modules/@types/semver/index.d.ts","../node_modules/@types/tough-cookie/index.d.ts"],"fileIdsList":[[75,117,219,221],[75,117],[75,117,220],[75,117,219,222],[75,117,217,219],[75,117,216,217,218],[75,117,216,219],[75,117,264],[75,117,129,162,166,184,203,205],[75,117,204],[75,114,117],[75,116,117],[117],[75,117,122,151],[75,117,118,123,129,130,137,148,159],[75,117,118,119,129,137],[70,71,72,75,117],[75,117,120,160],[75,117,121,122,130,138],[75,117,122,148,156],[75,117,123,125,129,137],[75,116,117,124],[75,117,125,126],[75,117,127,129],[75,116,117,129],[75,117,129,130,131,148,159],[75,117,129,130,131,144,148,151],[75,112,117],[75,117,125,129,132,137,148,159],[75,117,129,130,132,133,137,148,156,159],[75,117,132,134,148,156,159],[73,74,75,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[75,117,129,135],[75,117,136,159,164],[75,117,125,129,137,148],[75,117,138],[75,117,139],[75,116,117,140],[75,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[75,117,142],[75,117,143],[75,117,129,144,145],[75,117,144,146,160,162],[75,117,129,148,149,151],[75,117,150,151],[75,117,148,149],[75,117,151],[75,117,152],[75,114,117,148,153],[75,117,129,154,155],[75,117,154,155],[75,117,122,137,148,156],[75,117,157],[75,117,137,158],[75,117,132,143,159],[75,117,122,160],[75,117,148,161],[75,117,136,162],[75,117,163],[75,117,129,131,140,148,151,159,162,164],[75,117,148,165],[48,49,75,117],[50,75,117],[75,117,290,329],[75,117,290,314,329],[75,117,329],[75,117,290],[75,117,290,315,329],[75,117,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328],[75,117,315,329],[60,61,65,75,117,276],[75,117,250,251],[61,62,65,66,68,75,117],[61,75,117],[61,62,65,75,117],[61,62,75,117],[75,117,266],[75,117,257],[56,75,117,257,258],[56,75,117,257],[75,117,260],[75,117,272],[64,75,117],[56,63,75,117],[57,75,117],[56,57,58,60,75,117],[56,75,117],[67,75,117],[75,117,174],[75,117,171,172,173],[75,117,282,283],[75,117,282,283,284,285],[75,117,282,284],[75,117,282],[75,117,168],[75,117,167,168],[75,117,167],[75,117,167,168,169,176,177,180,181,182,183],[75,117,168,177],[75,117,167,168,169,176,177,178,179],[75,117,167,177],[75,117,177,181],[75,117,168,169,170,175],[75,117,169],[75,117,167,168,177],[75,117,241],[75,117,239,241],[75,117,230,238,239,240,242,244],[75,117,228],[75,117,231,236,241,244],[75,117,227,244],[75,117,231,232,235,236,237,244],[75,117,231,232,233,235,236,244],[75,117,228,229,230,231,232,236,237,238,240,241,242,244],[75,117,226,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243],[75,117,226,244],[75,117,231,233,234,236,237,244],[75,117,235,244],[75,117,236,237,241,244],[75,117,229,239],[75,117,211,212],[75,117,223],[59,75,117],[75,117,187],[75,117,185],[75,117,186],[75,117,185,186,187,188],[75,117,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],[75,117,186,187,188],[75,117,187,203],[75,84,88,117,159],[75,84,117,148,159],[75,79,117],[75,81,84,117,156,159],[75,117,137,156],[75,117,166],[75,79,117,166],[75,81,84,117,137,159],[75,76,77,80,83,117,129,148,159],[75,84,91,117],[75,76,82,117],[75,84,105,106,117],[75,80,84,117,151,159,166],[75,105,117,166],[75,78,79,117,166],[75,84,117],[75,78,79,80,81,82,83,84,85,86,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,117],[75,84,99,117],[75,84,91,92,117],[75,82,84,92,93,117],[75,83,117],[75,76,79,84,117],[75,84,88,92,93,117],[75,88,117],[75,82,84,87,117,159],[75,76,81,84,91,117],[75,117,148],[75,79,84,105,117,164,166],[75,117,254,255],[75,117,254],[75,117,129,130,132,133,134,137,148,156,159,165,166,208,209,210,212,214,215,225,244,245,246,247,248,249],[75,117,208,209,210,213],[75,117,208],[75,117,210],[75,117,224],[75,117,212,249],[69,75,117,267,268,278],[56,65,69,75,117,259,261,278],[75,117,270],[75,117,206],[56,69,75,117,207,259,269,277,278],[75,117,252],[56,61,65,69,75,117,120,130,148,207,249,252,253,256,259,262,263,265,269,271,273,278,279],[69,75,117,267,268,269,278],[75,117,249,274,279],[69,75,117,207,256,259,262,278],[75,117,164,263],[56,61,65,69,75,117,120,130,148,164,206,207,249,252,253,256,259,261,262,263,265,267,268,269,270,271,273,274,275,276,277,278,279,280,281,286],[75,117,204,205],[51,75,117,287],[50,51,52,53,75,117],[51,52,53,54,75,117],[51,52,75,117]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"9dd1cf136b687969888de067d0384593097f32e9a378b187d150d9405151c6cb","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"07cbc706c24fa086bcc20daee910b9afa5dc5294e14771355861686c9d5235fd","impliedFormat":1},"0221e00639dae039aa811816a008edafa3782d72a734a2b7d41da4a14a9d21bf","5bb1e83affb3455b77b2d3a9af42d10484f3c0731a41afa00a296a74c9c72f5b","775a51a7c61e9c779c2c15f94e2b5891a682acfb60a6d6b68d44b84a61ec5b6b",{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"05c7aef6a4e496b93c2e682cced8903c0dfe6340d04f3fe616176e2782193435","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"500a67e158e4025f27570ab6a99831680852bb45a44d4c3647ab7567feb1fb4c","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55","impliedFormat":1},{"version":"b5895e6353a5d708f55d8685c38a235c3a6d8138e374dee8ceb8ffde5aa8002a","impliedFormat":1},{"version":"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c","impliedFormat":1},{"version":"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"0225ecb9ed86bdb7a2c7fd01f1556906902929377b44483dc4b83e03b3ef227d","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"19990350fca066265b2c190c9b6cde1229f35002ea2d4df8c9e397e9942f6c89","impliedFormat":99},{"version":"8fb8fdda477cd7382477ffda92c2bb7d9f7ef583b1aa531eb6b2dc2f0a206c10","impliedFormat":99},{"version":"66995b0c991b5c5d42eff1d950733f85482c7419f7296ab8952e03718169e379","impliedFormat":99},{"version":"9863f888da357e35e013ca3465b794a490a198226bd8232c2f81fb44e16ff323","impliedFormat":99},{"version":"84bc2d80326a83ee4a6e7cba2fd480b86502660770c0e24da96535af597c9f1e","impliedFormat":1},{"version":"ea27768379b866ee3f5da2419650acdb01125479f7af73580a4bceb25b79e372","impliedFormat":1},{"version":"598931eeb4362542cae5845f95c5f0e45ac668925a40ce201e244d7fe808e965","impliedFormat":1},{"version":"da9ef88cde9f715756da642ad80c4cd87a987f465d325462d6bc2a0b11d202c8","impliedFormat":1},{"version":"9462ab013df86c16a2a69ca0a3b6f31d4fd86dd29a947e14b590eb20806f220b","impliedFormat":99},{"version":"b4c6184d78303b0816e779a48bef779b15aea4a66028eb819aac0abee8407dea","impliedFormat":99},{"version":"db085d2171d48938a99e851dafe0e486dce9859e5dfa73c21de5ed3d4d6fb0c5","impliedFormat":99},{"version":"62a3ad1ddd1f5974b3bf105680b3e09420f2230711d6520a521fab2be1a32838","impliedFormat":99},{"version":"a77be6fc44c876bc10c897107f84eaba10790913ebdcad40fcda7e47469b2160","impliedFormat":99},{"version":"06cf55b6da5cef54eaaf51cdc3d4e5ebf16adfdd9ebd20cec7fe719be9ced017","impliedFormat":99},{"version":"91f5dbcdb25d145a56cffe957ec665256827892d779ef108eb2f3864faff523b","impliedFormat":99},{"version":"052ba354bab8fb943e0bc05a0769f7b81d7c3b3c6cd0f5cfa53c7b2da2a525c5","impliedFormat":99},{"version":"927955a3de5857e0a1c575ced5a4245e74e6821d720ed213141347dd1870197f","impliedFormat":99},{"version":"fec804d54cd97dd77e956232fc37dc13f53e160d4bbeeb5489e86eeaa91f7ebd","impliedFormat":99},{"version":"c1d53a14aad7cda2cb0b91f5daccd06c8e3f25cb26c09e008f46ad2896c80bf1","impliedFormat":1},{"version":"c789127b81f23a44e7cd20eaff043bb8ddd8b75aca955504b81217d6347709d8","impliedFormat":1},{"version":"1e13bda0589d714493973ae87a135aadb8bdadc2b8ba412a62d6a8f05f13ae76","impliedFormat":1},{"version":"9e9217786bc4dced2d11b82eaf62c77f172a2b4671f1a6353835dcbf7eef0843","impliedFormat":1},{"version":"8c18473f354a9648fd8798196f520b3c3868181c315ab6a726177e5b5d2ada1c","impliedFormat":1},{"version":"067fe0fe11f79aa3eef819ee2f1d7beecc7a6d9e95ee1b2b84553495fb61b2fe","impliedFormat":1},{"version":"65e7aa0d38b9513dad1d66fa622ca0897efd8f6e11cb3887231451eb1dde719a","impliedFormat":1},{"version":"cf8d966c5b46aa3b4e2bc55aeaf5932253a734d2c09fc9e05867d47f7fc3fe31","impliedFormat":1},{"version":"e11fb3c6b0788cddcda16e472a173c03d8729201dc325beb1251f54d2630ebbb","impliedFormat":1},{"version":"9034c961e85ef73bdd4e07e2c56d7adfa4c00ee6cf568dcfc13d059575aac8a8","impliedFormat":1},{"version":"48676769d0f4904e916425f778ae25c140370fb90b33ad85151c7ebab166a0cc","impliedFormat":1},{"version":"b70a8d1c0d9628260158c2e96982f5ffb415ca87f97388ea743e52bd6ef37a9c","impliedFormat":1},{"version":"709bae51a9b0263a888c6adf48fb1380634e37267abcea46a52eb02a14b76292","impliedFormat":1},{"version":"7a625afe5721361715736bc3f9548206e1f173dcdc43eecaf7f70557f5151361","impliedFormat":1},{"version":"4d114e382693704d3792d2d6da45adc1aa2d8a86c1b8ebe5fc225dccd30aaf36","impliedFormat":1},{"version":"329760175a249a5e13e16f281ede4d8da4a4a72d511bf631bf7e5bd363146a80","impliedFormat":1},{"version":"9fbdb40eb68109a83dcc5f19c450556b20699b4fa19783dabdfc06a9937c9c30","impliedFormat":1},{"version":"afb75becf7075fc3673a6f1f7b669b5bb909ae67609284ce6548ec44d8038a61","impliedFormat":1},{"version":"4018b7fb337b14d2a40dd091208fbd39b3400136dfda00e9995b51cf64783a9f","impliedFormat":1},{"version":"6f5a9b68ce8608014210f5a777f8dd82e6382285f6278c811b7b0214bbcac5bd","impliedFormat":1},{"version":"af11413ffc8c34a2a2475cb9d2982b4cc87a9317bf474474eedaacc4aaab4582","affectsGlobalScope":true,"impliedFormat":1},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"5c31dea483b64cbb341ea8a7073c457720d1574f87837e71cccb70ce91196211","impliedFormat":99},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ffb518fc55181aefd066c690dbc0f8fa6a1533c8ddac595469c8c5f7fda2d756","affectsGlobalScope":true,"impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"217d7b67dacf8438f0be82b846f933981a1e6527e63c082c56adaf4782d62ab4","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"971f12a5fc236419ced0b7b9f23a53c1758233713f565635bbf4b85e2b23f55a","impliedFormat":1},{"version":"cd8d979f7bcefa59a3e47b8bc2831ca18d9ba3884047af4e01619e7e26a1d97b","impliedFormat":1},{"version":"3069d75a5e097c551e60e80b8196fbe8c7acdf367029ffc08a78f84528c5e78a","impliedFormat":1},{"version":"22b08025bd335c6a37c8ba4c7a171ed203e55347cab3c0556f1994f2e255ad41","impliedFormat":1},{"version":"604887bbd5b0a93234ce882543a465f008636185c52e0f0353330e2bc38b03b6","impliedFormat":1},{"version":"4da981eebce36323b081a8d56239a91dfb05b31eddb508bf144a13edea6c9264","impliedFormat":1},{"version":"4749218b4d25aefa8d6d4d3641789094c3b204e47267a5f6af6643d4fb7306ef","impliedFormat":1},{"version":"43bba542e50e19241ec64bc13cfc0d9273e6198f36563cecad1f4e4b78ad47f3","impliedFormat":1},{"version":"b8cb3b69c0e8114f758bb8ef8efeef1cc80f8911bfd21126def73d2174ce479e","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"a5d643092d2f16cb861872357b12ab844f33fc1181f7c5aed447b3424b4f5668","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"f2d1a59a658165341b0e2b7879aa2e19ea6a709146b2d3f70ee8a07159d3d08e","impliedFormat":99},{"version":"81e634f1c5e1ca309e7e3dc69e2732eea932ef07b8b34517d452e5a3e9a36fa3","impliedFormat":99},{"version":"34f39f75f2b5aa9c84a9f8157abbf8322e6831430e402badeaf58dd284f9b9a6","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"c8905dbea83f3220676a669366cd8c1acef56af4d9d72a8b2241b1d044bb4302","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"e666e31d323fef5642f87db0da48a83e58f0aaf9e3823e87eabd8ec7e0441a36","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":1},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"b7e28e06011460436d5c2ec2996846ac0c451e135357fc5a7269e5665a32fbd7","impliedFormat":99},{"version":"13497c0d73306e27f70634c424cd2f3b472187164f36140b504b3756b0ff476d","impliedFormat":99},{"version":"bf7a2d0f6d9e72d59044079d61000c38da50328ccdff28c47528a1a139c610ec","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"a23a08b626aa4d4a1924957bd8c4d38a7ffc032e21407bbd2c97413e1d8c3dbd","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"4c8ca51077f382498f47074cf304d654aba5d362416d4f809dfdd5d4f6b3aaca","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"13573a613314e40482386fe9c7934f9d86f3e06f19b840466c75391fb833b99b","impliedFormat":99},"1b5379bdf801e04736766a09785f3d71c0e34da75dadca81b03109b7a4866f2f",{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"03c258e060b7da220973f84b89615e4e9850e9b5d30b3a8e4840b3e3268ae8eb","impliedFormat":1}],"root":[[53,55],288],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"composite":false,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"experimentalDecorators":true,"jsx":4,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noPropertyAccessFromIndexSignature":false,"noUncheckedIndexedAccess":true,"noUnusedParameters":false,"outDir":"./","preserveConstEnums":true,"removeComments":false,"rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":7,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[222,1],[220,2],[221,3],[223,4],[218,5],[216,2],[219,6],[217,7],[265,8],[264,2],[211,2],[204,9],[205,10],[289,2],[114,11],[115,11],[116,12],[75,13],[117,14],[118,15],[119,16],[70,2],[73,17],[71,2],[72,2],[120,18],[121,19],[122,20],[123,21],[124,22],[125,23],[126,23],[128,2],[127,24],[129,25],[130,26],[131,27],[113,28],[74,2],[132,29],[133,30],[134,31],[166,32],[135,33],[136,34],[137,35],[138,36],[139,37],[140,38],[141,39],[142,40],[143,41],[144,42],[145,42],[146,43],[147,2],[148,44],[150,45],[149,46],[151,47],[152,48],[153,49],[154,50],[155,51],[156,52],[157,53],[158,54],[159,55],[160,56],[161,57],[162,58],[163,59],[164,60],[165,61],[48,2],[50,62],[51,63],[314,64],[315,65],[290,66],[293,66],[312,64],[313,64],[303,64],[302,67],[300,64],[295,64],[308,64],[306,64],[310,64],[294,64],[307,64],[311,64],[296,64],[297,64],[309,64],[291,64],[298,64],[299,64],[301,64],[305,64],[316,68],[304,64],[292,64],[329,69],[328,2],[323,68],[325,70],[324,68],[317,68],[318,68],[320,68],[322,68],[326,70],[327,70],[319,70],[321,70],[330,2],[277,71],[252,72],[250,2],[251,2],[56,2],[69,73],[62,74],[66,75],[266,76],[267,77],[257,2],[260,78],[259,79],[272,79],[258,80],[261,81],[273,82],[276,2],[65,83],[64,84],[67,84],[58,85],[61,86],[253,85],[63,87],[57,2],[68,88],[49,2],[175,89],[173,2],[174,90],[171,2],[172,2],[215,2],[284,91],[286,92],[285,93],[283,94],[282,2],[52,2],[169,95],[183,96],[167,2],[168,97],[184,98],[179,99],[180,100],[178,101],[182,102],[176,103],[170,104],[181,105],[177,96],[242,106],[240,107],[241,108],[229,109],[230,107],[237,110],[228,111],[233,112],[243,2],[234,113],[239,114],[244,115],[227,116],[235,117],[236,118],[231,119],[238,106],[232,120],[212,121],[226,2],[224,122],[268,2],[59,2],[60,123],[195,124],[185,2],[186,125],[196,126],[197,127],[198,124],[199,124],[200,2],[203,128],[201,124],[202,2],[192,2],[189,129],[190,2],[191,2],[188,130],[187,2],[193,124],[194,2],[46,2],[47,2],[8,2],[9,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[1,2],[91,131],[101,132],[90,131],[111,133],[82,134],[81,135],[110,136],[104,137],[109,138],[84,139],[98,140],[83,141],[107,142],[79,143],[78,136],[108,144],[80,145],[85,146],[86,2],[89,146],[76,2],[112,147],[102,148],[93,149],[94,150],[96,151],[92,152],[95,153],[105,136],[87,154],[88,155],[97,156],[77,157],[100,148],[99,146],[103,2],[106,158],[270,159],[255,160],[256,159],[254,2],[249,161],[214,162],[209,163],[210,163],[208,2],[213,164],[247,2],[246,2],[245,2],[225,165],[248,166],[269,167],[262,168],[271,169],[207,170],[278,171],[280,172],[274,173],[281,174],[279,175],[263,176],[275,177],[287,178],[206,179],[288,180],[54,181],[55,182],[53,183]],"affectedFilesPendingEmit":[[288,51],[54,51],[55,51],[53,51]],"version":"5.9.2"}
package/dist/index.d.mts CHANGED
@@ -70,8 +70,8 @@ declare abstract class StateMachine<T extends object> {
70
70
  protected logger: ReturnType<typeof createLogger>;
71
71
  protected debouncedNotify: () => void;
72
72
  constructor(config: StateConfig<T>);
73
- protected abstract saveToServer(state: T): Promise<void>;
74
- protected abstract loadFromServer(): Promise<T | null>;
73
+ protected saveToServer(_state: T): Promise<void>;
74
+ protected loadFromServer(): Promise<T | null>;
75
75
  getState(): T;
76
76
  subscribe(listener: (state: T) => void): () => void;
77
77
  mutate(recipe: (draft: Draft<T>) => void, description?: string): void;
package/dist/index.d.ts CHANGED
@@ -70,8 +70,8 @@ declare abstract class StateMachine<T extends object> {
70
70
  protected logger: ReturnType<typeof createLogger>;
71
71
  protected debouncedNotify: () => void;
72
72
  constructor(config: StateConfig<T>);
73
- protected abstract saveToServer(state: T): Promise<void>;
74
- protected abstract loadFromServer(): Promise<T | null>;
73
+ protected saveToServer(_state: T): Promise<void>;
74
+ protected loadFromServer(): Promise<T | null>;
75
75
  getState(): T;
76
76
  subscribe(listener: (state: T) => void): () => void;
77
77
  mutate(recipe: (draft: Draft<T>) => void, description?: string): void;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var t=require("immer"),e=require("react");t.enablePatches();var s=class extends Error{constructor(t,e){super(t),this.name="StateMachineError",this.code=e}},i=class extends s{constructor(t){super(t,"VALIDATION_ERROR")}},r=class extends s{constructor(t){super(t,"PERSISTENCE_ERROR")}},n=t=>{try{return new Blob([JSON.stringify(t)]).size}catch{return 0}},a=t=>{try{const e=JSON.stringify(t);let s=0;for(let t=0;t<e.length;t++)s=(s<<5)-s+e.charCodeAt(t)&s;return s.toString(36)}catch{return""}};function o(t){const[s,i]=e.useState(()=>t.getState());return e.useEffect(()=>t.subscribe(i),[t]),{state:s,mutate:e.useCallback((e,s)=>{t.mutate(e,s)},[t]),batch:e.useCallback((e,s)=>{t.batch(e,s)},[t])}}function h(t,s,i){const[r,n]=e.useState(()=>s(t.getState()));return e.useEffect(()=>t.subscribe(t=>{const e=s(t);i?i(r,e)||n(e):r!==e&&n(e)}),[t,s,r,i]),r}function c(t){return{mutate:e.useCallback((e,s)=>{t.mutate(e,s)},[t]),batch:e.useCallback((e,s)=>{t.batch(e,s)},[t]),undo:e.useCallback(()=>t.undo(),[t]),redo:e.useCallback(()=>t.redo(),[t]),forceSave:e.useCallback(async()=>t.forceSave(),[t]),loadFromServer:e.useCallback(async()=>t.loadFromServerManually(),[t]),clearHistory:e.useCallback(()=>{t.clearHistory()},[t])}}function u(t){const[s,i]=e.useState(()=>t.getHistoryInfo());return e.useEffect(()=>t.subscribe(()=>{i(t.getHistoryInfo())}),[t]),{...s,undo:e.useCallback(()=>{const e=t.undo();return e&&i(t.getHistoryInfo()),e},[t]),redo:e.useCallback(()=>{const e=t.redo();return e&&i(t.getHistoryInfo()),e},[t]),clearHistory:e.useCallback(()=>{t.clearHistory(),i(t.getHistoryInfo())},[t])}}function l(t){const[s,i]=e.useState(!1),[r,n]=e.useState(!1),[a,o]=e.useState(null),[h,c]=e.useState(null),[u,l]=e.useState(null),d=t.hasUnsavedChanges(),f=e.useCallback(async()=>{if(s)return!1;i(!0),c(null);try{return await t.forceSave(),o(new Date),!0}catch(t){const e=t instanceof Error?t.message:"Save failed";return c(e),!1}finally{i(!1)}},[t,s]),p=e.useCallback(async()=>{if(r)return!1;n(!0),l(null);try{const e=await t.loadFromServerManually();return e&&o(new Date),e}catch(t){const e=t instanceof Error?t.message:"Load failed";return l(e),!1}finally{n(!1)}},[t,r]),v=e.useCallback(()=>{c(null)},[]),y=e.useCallback(()=>{l(null)},[]);return{isSaving:s,isLoading:r,hasUnsavedChanges:d,lastSaved:a,saveError:h,loadError:u,clearSaveError:v,clearLoadError:y,save:f,load:p}}function d(t){const{state:e,mutate:s,batch:i}=o(t),r=c(t),n=u(t),a=l(t);return{state:e,mutate:s,batch:i,history:{canUndo:n.canUndo,canRedo:n.canRedo,historyLength:n.historyLength,currentIndex:n.currentIndex,lastAction:n.lastAction,memoryUsage:n.memoryUsage,undo:n.undo,redo:n.redo,clearHistory:n.clearHistory},persistence:{isSaving:a.isSaving,isLoading:a.isLoading,hasUnsavedChanges:a.hasUnsavedChanges,lastSaved:a.lastSaved,saveError:a.saveError,loadError:a.loadError,save:a.save,load:a.load,clearSaveError:a.clearSaveError,clearLoadError:a.clearLoadError},forceSave:r.forceSave,loadFromServer:r.loadFromServer}}function f(t){return{mutateOptimistic:e.useCallback(async(e,s,i)=>{t.mutate(e,`${i} (optimistic)`);try{await s()}catch(e){throw t.undo(),e}},[t])}}function p(t,s=300){const[i]=e.useState(()=>{let e;return(i,r)=>{clearTimeout(e),e=setTimeout(()=>{t.mutate(i,r)},s)}});return e.useEffect(()=>()=>{clearTimeout(i)},[i]),{debouncedMutate:i}}function v(t,s,i=[]){e.useEffect(()=>t.subscribe(s),[t,s,...i])}exports.StateMachine=class{constructor(t){var e;this.listeners=new Set,this.history=[],this.historyIndex=-1,this.isDirty=!1,this.autoSaveTimer=null,this.isDestroyed=!1,this.validateConfig(t),this.config={initialState:t.initialState,persistenceKey:t.persistenceKey||null,autoSaveInterval:t.autoSaveInterval??5,maxHistorySize:t.maxHistorySize??50,enablePersistence:t.enablePersistence??!0,enableAutoSave:t.enableAutoSave??!0,enableLogging:t.enableLogging??!1,validateState:t.validateState??(()=>!0)},this.logger={debug:(e=this.config.enableLogging)?(t,...e)=>{}:()=>{},info:e?(t,...e)=>{}:()=>{},warn:e?(t,...e)=>{}:()=>{},error:e?(t,...e)=>{}:()=>{}},this.debouncedNotify=function(t){let e;return(...s)=>{clearTimeout(e),e=setTimeout(()=>t(...s),16)}}(()=>this.notifyListeners());try{this.state=this.loadPersistedState()||t.initialState,this.validateCurrentState()}catch(e){this.logger.warn("Failed to load persisted state, using initial state",e),this.state=t.initialState,this.validateCurrentState()}this.config.enableAutoSave&&this.startAutoSave(),this.logger.info("StateMachine initialized",{persistenceKey:this.config.persistenceKey,autoSaveInterval:this.config.autoSaveInterval,maxHistorySize:this.config.maxHistorySize})}getState(){return this.assertNotDestroyed(),this.state}subscribe(t){if(this.assertNotDestroyed(),"function"!=typeof t)throw new i("Listener must be a function");this.listeners.add(t);try{t(this.state)}catch(t){this.logger.error("Initial listener call failed",t)}return this.logger.debug("Listener subscribed",{totalListeners:this.listeners.size}),()=>{this.listeners.delete(t),this.logger.debug("Listener unsubscribed",{totalListeners:this.listeners.size})}}mutate(e,r){if(this.assertNotDestroyed(),"function"!=typeof e)throw new i("Recipe must be a function");try{let s=[],i=[];const n=t.produce(this.state,e,(t,e)=>{s=t,i=e});s.length>0&&(this.validateState(n),this.saveToHistory(s,i,r),this.setState(n),this.logger.debug("State mutated",{description:r,patchCount:s.length,historySize:this.history.length}))}catch(t){if(this.logger.error("State mutation failed",{description:r,error:t}),t instanceof i)throw t;throw new s(`State mutation failed: ${t instanceof Error?t.message:"Unknown error"}`,"MUTATION_ERROR")}}batch(e,r){if(this.assertNotDestroyed(),!Array.isArray(e))throw new i("Mutations must be an array");if(0!==e.length)try{const s=[],n=[],a=e.reduce((e,r,a)=>{if("function"!=typeof r)throw new i(`Mutation at index ${a} must be a function`);let o=[],h=[];const c=t.produce(e,r,(t,e)=>{o=t,h=e});return s.push(...o),n.unshift(...h),c},this.state);s.length>0&&(this.validateState(a),this.saveToHistory(s,n,r||"Batch operation"),this.setState(a),this.logger.debug("Batch operation completed",{description:r,mutationCount:e.length,patchCount:s.length}))}catch(t){throw this.logger.error("Batch operation failed",{description:r,error:t}),new s(`Batch operation failed: ${t instanceof Error?t.message:"Unknown error"}`,"BATCH_ERROR")}else this.logger.debug("Empty batch operation ignored")}undo(){if(this.assertNotDestroyed(),!this.canUndo())return this.logger.debug("Undo operation ignored - no history available"),!1;try{const e=this.history[this.historyIndex];if(!e)return!1;const s=t.applyPatches(this.state,e.inversePatches);return this.validateState(s),this.historyIndex--,this.setState(s,!1),this.logger.debug("Undo operation completed",{description:e.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Undo operation failed",t),!1}}redo(){if(this.assertNotDestroyed(),!this.canRedo())return this.logger.debug("Redo operation ignored - no future history available"),!1;try{this.historyIndex++;const e=this.history[this.historyIndex];if(!e)return this.historyIndex--,!1;const s=t.applyPatches(this.state,e.patches);return this.validateState(s),this.setState(s,!1),this.logger.debug("Redo operation completed",{description:e.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Redo operation failed",t),this.historyIndex--,!1}}canUndo(){return this.historyIndex>=0}canRedo(){return this.historyIndex<this.history.length-1}getHistoryInfo(){return{canUndo:this.canUndo(),canRedo:this.canRedo(),historyLength:this.history.length,currentIndex:this.historyIndex,lastAction:this.history[this.historyIndex]?.description||null,memoryUsage:n(this.history)}}clearHistory(){this.assertNotDestroyed();const t=this.history.length;this.history=[],this.historyIndex=-1,this.logger.info("History cleared",{previousLength:t})}async forceSave(){if(this.assertNotDestroyed(),this.isDirty)try{this.logger.debug("Force save started"),await this.saveToServer(this.state),this.persistToLocal(),this.isDirty=!1,this.logger.info("Force save completed successfully")}catch(t){throw this.logger.error("Force save failed",t),new r(`Force save failed: ${t instanceof Error?t.message:"Unknown error"}`)}else this.logger.debug("Force save skipped - no changes")}hasUnsavedChanges(){return this.isDirty}setAutoSaveInterval(t){if(this.assertNotDestroyed(),"number"!=typeof t||t<=0)throw new i("Auto-save interval must be a positive number");this.config.autoSaveInterval=t,this.restartAutoSave(),this.logger.info("Auto-save interval updated",{minutes:t})}async loadFromServerManually(){this.assertNotDestroyed();try{this.logger.debug("Manual server load started");const t=await this.loadFromServer();return t?(this.validateState(t),this.state=t,this.isDirty=!1,this.clearHistory(),this.notifyListeners(),this.persistToLocal(),this.logger.info("Manual server load completed successfully"),!0):(this.logger.debug("No server state available"),!1)}catch(t){return this.logger.error("Manual server load failed",t),!1}}destroy(){this.isDestroyed||(this.logger.info("Destroying StateMachine"),this.isDestroyed=!0,this.listeners.clear(),this.autoSaveTimer&&(clearInterval(this.autoSaveTimer),this.autoSaveTimer=null),this.history=[],this.listeners=new Set,this.logger.info("StateMachine destroyed"))}setState(t,e=!0){this.state=t,e&&(this.isDirty=!0),this.debouncedNotify(),this.persistToLocal()}assertNotDestroyed(){if(this.isDestroyed)throw new s("Cannot operate on destroyed StateMachine","DESTROYED")}validateConfig(t){if(!t.initialState||"object"!=typeof t.initialState||null===t.initialState)throw new i("Initial state must be an object");if(void 0!==t.autoSaveInterval&&t.autoSaveInterval<=0)throw new i("Auto-save interval must be positive");if(void 0!==t.maxHistorySize&&t.maxHistorySize<=0)throw new i("Max history size must be positive")}validateCurrentState(){this.validateState(this.state)}validateState(t){if(!this.config.validateState(t))throw new i("State validation failed")}notifyListeners(){if(0===this.listeners.size)return;const t=this.state;let e=0;this.listeners.forEach(s=>{try{s(t)}catch(t){e++,this.logger.error("Listener notification failed",t)}}),e>0&&this.logger.warn(`${e} listener(s) failed during notification`)}saveToHistory(t,e,s){this.historyIndex<this.history.length-1&&(this.history=this.history.slice(0,this.historyIndex+1));const i={patches:t,inversePatches:e,timestamp:Date.now()};s&&(i.description=s),this.history.push(i),this.historyIndex++,this.history.length>this.config.maxHistorySize&&(this.history.shift(),this.historyIndex--,this.logger.debug("History trimmed to max size",{maxSize:this.config.maxHistorySize}))}persistToLocal(){if(this.config.enablePersistence&&this.config.persistenceKey)try{const t={state:this.state,timestamp:Date.now(),version:"1.0.0",checksum:a(this.state)};localStorage.setItem(this.config.persistenceKey,JSON.stringify(t))}catch(t){this.logger.warn("Failed to persist state to localStorage",t)}}loadPersistedState(){if(!this.config.enablePersistence||!this.config.persistenceKey)return null;try{const t=localStorage.getItem(this.config.persistenceKey);if(!t)return null;const e=JSON.parse(t);if(e.checksum){const t=a(e.state);if(e.checksum!==t)return this.logger.warn("Persisted state checksum mismatch, ignoring"),null}return this.logger.debug("Loaded persisted state",{timestamp:e.timestamp,version:e.version}),e.state}catch(t){return this.logger.warn("Failed to load persisted state",t),null}}startAutoSave(){if(!this.config.enableAutoSave)return;const t=60*this.config.autoSaveInterval*1e3;this.autoSaveTimer=setInterval(async()=>{if(this.isDirty&&!this.isDestroyed)try{await this.forceSave()}catch(t){this.logger.error("Auto-save failed",t)}},t),this.logger.debug("Auto-save started",{intervalMinutes:this.config.autoSaveInterval})}restartAutoSave(){this.autoSaveTimer&&clearInterval(this.autoSaveTimer),this.startAutoSave()}},exports.StateMachineError=s,exports.StatePersistenceError=r,exports.StateValidationError=i,exports.createStateMachineHooks=function(t){return{useState:()=>o(t),useSlice:(e,s)=>h(t,e,s),useActions:()=>c(t),useHistory:()=>u(t),usePersistence:()=>l(t),useComplete:()=>d(t),useOptimistic:()=>f(t),useDebounced:e=>p(t,e),useSubscription:(e,s)=>v(t,e,s)}},exports.useDebouncedStateUpdate=p,exports.useOptimisticUpdate=f,exports.useShallowEqual=function(t){const[s,i]=e.useState(t);return e.useEffect(()=>{if("object"==typeof t&&null!==t){const e=Object.keys(s),r=Object.keys(t);if(e.length!==r.length)return void i(t);for(const r of e)if(s[r]!==t[r])return void i(t)}else s!==t&&i(t)},[t,s]),s},exports.useStateActions=c,exports.useStateHistory=u,exports.useStateMachine=o,exports.useStateMachineFull=d,exports.useStatePersist=l,exports.useStateSlice=h,exports.useStateSubscription=v;//# sourceMappingURL=index.js.map
1
+ var t=require("immer"),e=require("react");t.enablePatches();var s=class extends Error{constructor(t,e){super(t),this.name="StateMachineError",this.code=e}},i=class extends s{constructor(t){super(t,"VALIDATION_ERROR")}},r=class extends s{constructor(t){super(t,"PERSISTENCE_ERROR")}},n=t=>{try{return new Blob([JSON.stringify(t)]).size}catch{return 0}},a=t=>{try{const e=JSON.stringify(t);let s=0;for(let t=0;t<e.length;t++)s=(s<<5)-s+e.charCodeAt(t)&s;return s.toString(36)}catch{return""}};function o(t){const[s,i]=e.useState(()=>t.getState());return e.useEffect(()=>t.subscribe(i),[t]),{state:s,mutate:e.useCallback((e,s)=>{t.mutate(e,s)},[t]),batch:e.useCallback((e,s)=>{t.batch(e,s)},[t])}}function h(t,s,i){const[r,n]=e.useState(()=>s(t.getState()));return e.useEffect(()=>t.subscribe(t=>{const e=s(t);i?i(r,e)||n(e):r!==e&&n(e)}),[t,s,r,i]),r}function c(t){return{mutate:e.useCallback((e,s)=>{t.mutate(e,s)},[t]),batch:e.useCallback((e,s)=>{t.batch(e,s)},[t]),undo:e.useCallback(()=>t.undo(),[t]),redo:e.useCallback(()=>t.redo(),[t]),forceSave:e.useCallback(async()=>t.forceSave(),[t]),loadFromServer:e.useCallback(async()=>t.loadFromServerManually(),[t]),clearHistory:e.useCallback(()=>{t.clearHistory()},[t])}}function u(t){const[s,i]=e.useState(()=>t.getHistoryInfo());return e.useEffect(()=>t.subscribe(()=>{i(t.getHistoryInfo())}),[t]),{...s,undo:e.useCallback(()=>{const e=t.undo();return e&&i(t.getHistoryInfo()),e},[t]),redo:e.useCallback(()=>{const e=t.redo();return e&&i(t.getHistoryInfo()),e},[t]),clearHistory:e.useCallback(()=>{t.clearHistory(),i(t.getHistoryInfo())},[t])}}function l(t){const[s,i]=e.useState(!1),[r,n]=e.useState(!1),[a,o]=e.useState(null),[h,c]=e.useState(null),[u,l]=e.useState(null),d=t.hasUnsavedChanges(),f=e.useCallback(async()=>{if(s)return!1;i(!0),c(null);try{return await t.forceSave(),o(new Date),!0}catch(t){const e=t instanceof Error?t.message:"Save failed";return c(e),!1}finally{i(!1)}},[t,s]),v=e.useCallback(async()=>{if(r)return!1;n(!0),l(null);try{const e=await t.loadFromServerManually();return e&&o(new Date),e}catch(t){const e=t instanceof Error?t.message:"Load failed";return l(e),!1}finally{n(!1)}},[t,r]),p=e.useCallback(()=>{c(null)},[]),y=e.useCallback(()=>{l(null)},[]);return{isSaving:s,isLoading:r,hasUnsavedChanges:d,lastSaved:a,saveError:h,loadError:u,clearSaveError:p,clearLoadError:y,save:f,load:v}}function d(t){const{state:e,mutate:s,batch:i}=o(t),r=c(t),n=u(t),a=l(t);return{state:e,mutate:s,batch:i,history:{canUndo:n.canUndo,canRedo:n.canRedo,historyLength:n.historyLength,currentIndex:n.currentIndex,lastAction:n.lastAction,memoryUsage:n.memoryUsage,undo:n.undo,redo:n.redo,clearHistory:n.clearHistory},persistence:{isSaving:a.isSaving,isLoading:a.isLoading,hasUnsavedChanges:a.hasUnsavedChanges,lastSaved:a.lastSaved,saveError:a.saveError,loadError:a.loadError,save:a.save,load:a.load,clearSaveError:a.clearSaveError,clearLoadError:a.clearLoadError},forceSave:r.forceSave,loadFromServer:r.loadFromServer}}function f(t){return{mutateOptimistic:e.useCallback(async(e,s,i)=>{t.mutate(e,`${i} (optimistic)`);try{await s()}catch(e){throw t.undo(),e}},[t])}}function v(t,s=300){const[i]=e.useState(()=>{let e;return(i,r)=>{clearTimeout(e),e=setTimeout(()=>{t.mutate(i,r)},s)}});return e.useEffect(()=>()=>{clearTimeout(i)},[i]),{debouncedMutate:i}}function p(t,s,i=[]){e.useEffect(()=>t.subscribe(s),[t,s,...i])}exports.StateMachine=class{constructor(t){var e;this.listeners=new Set,this.history=[],this.historyIndex=-1,this.isDirty=!1,this.autoSaveTimer=null,this.isDestroyed=!1,this.validateConfig(t),this.config={initialState:t.initialState,persistenceKey:t.persistenceKey||null,autoSaveInterval:t.autoSaveInterval??5,maxHistorySize:t.maxHistorySize??50,enablePersistence:t.enablePersistence??!0,enableAutoSave:t.enableAutoSave??!0,enableLogging:t.enableLogging??!1,validateState:t.validateState??(()=>!0)},this.logger={debug:(e=this.config.enableLogging)?(t,...e)=>{}:()=>{},info:e?(t,...e)=>{}:()=>{},warn:e?(t,...e)=>{}:()=>{},error:e?(t,...e)=>{}:()=>{}},this.debouncedNotify=function(t){let e;return(...s)=>{clearTimeout(e),e=setTimeout(()=>t(...s),16)}}(()=>this.notifyListeners());try{this.state=this.loadPersistedState()||t.initialState,this.validateCurrentState()}catch(e){this.logger.warn("Failed to load persisted state, using initial state",e),this.state=t.initialState,this.validateCurrentState()}this.config.enableAutoSave&&this.startAutoSave(),this.logger.info("StateMachine initialized",{persistenceKey:this.config.persistenceKey,autoSaveInterval:this.config.autoSaveInterval,maxHistorySize:this.config.maxHistorySize})}async saveToServer(t){}async loadFromServer(){return null}getState(){return this.assertNotDestroyed(),this.state}subscribe(t){if(this.assertNotDestroyed(),"function"!=typeof t)throw new i("Listener must be a function");this.listeners.add(t);try{t(this.state)}catch(t){this.logger.error("Initial listener call failed",t)}return this.logger.debug("Listener subscribed",{totalListeners:this.listeners.size}),()=>{this.listeners.delete(t),this.logger.debug("Listener unsubscribed",{totalListeners:this.listeners.size})}}mutate(e,r){if(this.assertNotDestroyed(),"function"!=typeof e)throw new i("Recipe must be a function");try{let s=[],i=[];const n=t.produce(this.state,e,(t,e)=>{s=t,i=e});s.length>0&&(this.validateState(n),this.saveToHistory(s,i,r),this.setState(n),this.logger.debug("State mutated",{description:r,patchCount:s.length,historySize:this.history.length}))}catch(t){if(this.logger.error("State mutation failed",{description:r,error:t}),t instanceof i)throw t;throw new s(`State mutation failed: ${t instanceof Error?t.message:"Unknown error"}`,"MUTATION_ERROR")}}batch(e,r){if(this.assertNotDestroyed(),!Array.isArray(e))throw new i("Mutations must be an array");if(0!==e.length)try{const s=[],n=[],a=e.reduce((e,r,a)=>{if("function"!=typeof r)throw new i(`Mutation at index ${a} must be a function`);let o=[],h=[];const c=t.produce(e,r,(t,e)=>{o=t,h=e});return s.push(...o),n.unshift(...h),c},this.state);s.length>0&&(this.validateState(a),this.saveToHistory(s,n,r||"Batch operation"),this.setState(a),this.logger.debug("Batch operation completed",{description:r,mutationCount:e.length,patchCount:s.length}))}catch(t){throw this.logger.error("Batch operation failed",{description:r,error:t}),new s(`Batch operation failed: ${t instanceof Error?t.message:"Unknown error"}`,"BATCH_ERROR")}else this.logger.debug("Empty batch operation ignored")}undo(){if(this.assertNotDestroyed(),!this.canUndo())return this.logger.debug("Undo operation ignored - no history available"),!1;try{const e=this.history[this.historyIndex];if(!e)return!1;const s=t.applyPatches(this.state,e.inversePatches);return this.validateState(s),this.historyIndex--,this.setState(s,!1),this.logger.debug("Undo operation completed",{description:e.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Undo operation failed",t),!1}}redo(){if(this.assertNotDestroyed(),!this.canRedo())return this.logger.debug("Redo operation ignored - no future history available"),!1;try{this.historyIndex++;const e=this.history[this.historyIndex];if(!e)return this.historyIndex--,!1;const s=t.applyPatches(this.state,e.patches);return this.validateState(s),this.setState(s,!1),this.logger.debug("Redo operation completed",{description:e.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Redo operation failed",t),this.historyIndex--,!1}}canUndo(){return this.historyIndex>=0}canRedo(){return this.historyIndex<this.history.length-1}getHistoryInfo(){return{canUndo:this.canUndo(),canRedo:this.canRedo(),historyLength:this.history.length,currentIndex:this.historyIndex,lastAction:this.history[this.historyIndex]?.description||null,memoryUsage:n(this.history)}}clearHistory(){this.assertNotDestroyed();const t=this.history.length;this.history=[],this.historyIndex=-1,this.logger.info("History cleared",{previousLength:t})}async forceSave(){if(this.assertNotDestroyed(),this.isDirty)try{this.logger.debug("Force save started"),await this.saveToServer(this.state),this.persistToLocal(),this.isDirty=!1,this.logger.info("Force save completed successfully")}catch(t){throw this.logger.error("Force save failed",t),new r(`Force save failed: ${t instanceof Error?t.message:"Unknown error"}`)}else this.logger.debug("Force save skipped - no changes")}hasUnsavedChanges(){return this.isDirty}setAutoSaveInterval(t){if(this.assertNotDestroyed(),"number"!=typeof t||t<=0)throw new i("Auto-save interval must be a positive number");this.config.autoSaveInterval=t,this.restartAutoSave(),this.logger.info("Auto-save interval updated",{minutes:t})}async loadFromServerManually(){this.assertNotDestroyed();try{this.logger.debug("Manual server load started");const t=await this.loadFromServer();return t?(this.validateState(t),this.state=t,this.isDirty=!1,this.clearHistory(),this.notifyListeners(),this.persistToLocal(),this.logger.info("Manual server load completed successfully"),!0):(this.logger.debug("No server state available"),!1)}catch(t){return this.logger.error("Manual server load failed",t),!1}}destroy(){this.isDestroyed||(this.logger.info("Destroying StateMachine"),this.isDestroyed=!0,this.listeners.clear(),this.autoSaveTimer&&(clearInterval(this.autoSaveTimer),this.autoSaveTimer=null),this.history=[],this.listeners=new Set,this.logger.info("StateMachine destroyed"))}setState(t,e=!0){this.state=t,e&&(this.isDirty=!0),this.debouncedNotify(),this.persistToLocal()}assertNotDestroyed(){if(this.isDestroyed)throw new s("Cannot operate on destroyed StateMachine","DESTROYED")}validateConfig(t){if(!t.initialState||"object"!=typeof t.initialState||null===t.initialState)throw new i("Initial state must be an object");if(void 0!==t.autoSaveInterval&&t.autoSaveInterval<=0)throw new i("Auto-save interval must be positive");if(void 0!==t.maxHistorySize&&t.maxHistorySize<=0)throw new i("Max history size must be positive")}validateCurrentState(){this.validateState(this.state)}validateState(t){if(!this.config.validateState(t))throw new i("State validation failed")}notifyListeners(){if(0===this.listeners.size)return;const t=this.state;let e=0;this.listeners.forEach(s=>{try{s(t)}catch(t){e++,this.logger.error("Listener notification failed",t)}}),e>0&&this.logger.warn(`${e} listener(s) failed during notification`)}saveToHistory(t,e,s){this.historyIndex<this.history.length-1&&(this.history=this.history.slice(0,this.historyIndex+1));const i={patches:t,inversePatches:e,timestamp:Date.now()};s&&(i.description=s),this.history.push(i),this.historyIndex++,this.history.length>this.config.maxHistorySize&&(this.history.shift(),this.historyIndex--,this.logger.debug("History trimmed to max size",{maxSize:this.config.maxHistorySize}))}persistToLocal(){if(this.config.enablePersistence&&this.config.persistenceKey)try{const t={state:this.state,timestamp:Date.now(),version:"1.0.0",checksum:a(this.state)};localStorage.setItem(this.config.persistenceKey,JSON.stringify(t))}catch(t){this.logger.warn("Failed to persist state to localStorage",t)}}loadPersistedState(){if(!this.config.enablePersistence||!this.config.persistenceKey)return null;try{const t=localStorage.getItem(this.config.persistenceKey);if(!t)return null;const e=JSON.parse(t);if(e.checksum){const t=a(e.state);if(e.checksum!==t)return this.logger.warn("Persisted state checksum mismatch, ignoring"),null}return this.logger.debug("Loaded persisted state",{timestamp:e.timestamp,version:e.version}),e.state}catch(t){return this.logger.warn("Failed to load persisted state",t),null}}startAutoSave(){if(!this.config.enableAutoSave)return;const t=60*this.config.autoSaveInterval*1e3;this.autoSaveTimer=setInterval(async()=>{if(this.isDirty&&!this.isDestroyed)try{await this.forceSave()}catch(t){this.logger.error("Auto-save failed",t)}},t),this.logger.debug("Auto-save started",{intervalMinutes:this.config.autoSaveInterval})}restartAutoSave(){this.autoSaveTimer&&clearInterval(this.autoSaveTimer),this.startAutoSave()}},exports.StateMachineError=s,exports.StatePersistenceError=r,exports.StateValidationError=i,exports.createStateMachineHooks=function(t){return{useState:()=>o(t),useSlice:(e,s)=>h(t,e,s),useActions:()=>c(t),useHistory:()=>u(t),usePersistence:()=>l(t),useComplete:()=>d(t),useOptimistic:()=>f(t),useDebounced:e=>v(t,e),useSubscription:(e,s)=>p(t,e,s)}},exports.useDebouncedStateUpdate=v,exports.useOptimisticUpdate=f,exports.useShallowEqual=function(t){const[s,i]=e.useState(t);return e.useEffect(()=>{if("object"==typeof t&&null!==t){const e=Object.keys(s),r=Object.keys(t);if(e.length!==r.length)return void i(t);for(const r of e)if(s[r]!==t[r])return void i(t)}else s!==t&&i(t)},[t,s]),s},exports.useStateActions=c,exports.useStateHistory=u,exports.useStateMachine=o,exports.useStateMachineFull=d,exports.useStatePersist=l,exports.useStateSlice=h,exports.useStateSubscription=p;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/machine.ts","../src/hooks.ts"],"names":["enablePatches","produce","applyPatches","useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * IMPORTS\n ***************************************************************************************************/\nimport { produce, enablePatches, applyPatches, type Patch, type Draft } from 'immer'\n\nenablePatches()\n\n/*\n * CONSTANTS\n ***************************************************************************************************/\nconst DEFAULT_AUTO_SAVE_INTERVAL = 5 // in minutes\nconst DEFAULT_MAX_HISTORY_SIZE = 50\nconst DEFAULT_VERSION = '1.0.0'\nconst NOTIFICATION_DEBOUNCE_MS = 16\n\n/*\n * ERROR TYPES\n ***************************************************************************************************/\nexport class StateMachineError extends Error {\n\tpublic readonly code: string\n\n\tconstructor(message: string, code: string) {\n\t\tsuper(message)\n\t\tthis.name = 'StateMachineError'\n\t\tthis.code = code\n\t}\n}\n\nexport class StateValidationError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALIDATION_ERROR')\n\t}\n}\n\nexport class StatePersistenceError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'PERSISTENCE_ERROR')\n\t}\n}\n\n/*\n * TYPES\n ***************************************************************************************************/\nexport interface StateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey?: string\n\tautoSaveInterval?: number\n\tmaxHistorySize?: number\n\tenablePersistence?: boolean\n\tenableAutoSave?: boolean\n\tenableLogging?: boolean\n\tvalidateState?: (state: T) => boolean\n}\n\ninterface InternalStateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey: string | null\n\tautoSaveInterval: number\n\tmaxHistorySize: number\n\tenablePersistence: boolean\n\tenableAutoSave: boolean\n\tenableLogging: boolean\n\tvalidateState: (state: T) => boolean\n}\n\nexport interface StateSnapshot {\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\ttimestamp: number\n\tdescription?: string\n}\n\nexport interface PersistedState<T> {\n\tstate: T\n\ttimestamp: number\n\tversion: string\n\tchecksum?: string\n}\n\nexport interface StateHistoryInfo {\n\tcanUndo: boolean\n\tcanRedo: boolean\n\thistoryLength: number\n\tcurrentIndex: number\n\tlastAction: string | null\n\tmemoryUsage: number\n}\n\n// Compact logger - will be optimized out in production builds\n/* eslint-disable no-console */\nconst createLogger = (enabled: boolean) => ({\n\tdebug: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.debug(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\tinfo: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.info(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\twarn: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.warn(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\terror: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.error(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n})\n/* eslint-enable no-console */\n\n/*\n * FUNCTIONS\n ***************************************************************************************************/\nfunction debounce<T extends (...args: unknown[]) => void>(func: T, wait: number): T {\n\tlet timeout: ReturnType<typeof setTimeout>\n\treturn ((...args: Parameters<T>) => {\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(() => func(...args), wait)\n\t}) as T\n}\n\n// Compact utility functions\nconst calculateMemoryUsage = (data: unknown): number => {\n\ttry {\n\t\treturn new Blob([JSON.stringify(data)]).size\n\t} catch {\n\t\treturn 0\n\t}\n}\n\nconst generateChecksum = (data: unknown): string => {\n\ttry {\n\t\tconst str = JSON.stringify(data)\n\t\tlet hash = 0\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\thash = ((hash << 5) - hash + str.charCodeAt(i)) & hash\n\t\t}\n\t\treturn hash.toString(36)\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/*\n * STATE MACHINE\n ***************************************************************************************************/\nexport abstract class StateMachine<T extends object> {\n\tprotected state: T\n\tprotected config: InternalStateConfig<T>\n\tprotected listeners: Set<(state: T) => void> = new Set()\n\tprotected history: StateSnapshot[] = []\n\tprotected historyIndex = -1\n\tprotected isDirty = false\n\tprotected autoSaveTimer: ReturnType<typeof setInterval> | null = null\n\tprotected isDestroyed = false\n\tprotected logger: ReturnType<typeof createLogger>\n\tprotected debouncedNotify: () => void\n\n\tconstructor(config: StateConfig<T>) {\n\t\tthis.validateConfig(config)\n\n\t\tthis.config = {\n\t\t\tinitialState: config.initialState,\n\t\t\tpersistenceKey: config.persistenceKey || null,\n\t\t\tautoSaveInterval: config.autoSaveInterval ?? DEFAULT_AUTO_SAVE_INTERVAL,\n\t\t\tmaxHistorySize: config.maxHistorySize ?? DEFAULT_MAX_HISTORY_SIZE,\n\t\t\tenablePersistence: config.enablePersistence ?? true,\n\t\t\tenableAutoSave: config.enableAutoSave ?? true,\n\t\t\tenableLogging: config.enableLogging ?? false,\n\t\t\tvalidateState: config.validateState ?? (() => true),\n\t\t}\n\n\t\tthis.logger = createLogger(this.config.enableLogging)\n\t\tthis.debouncedNotify = debounce(() => this.notifyListeners(), NOTIFICATION_DEBOUNCE_MS)\n\n\t\ttry {\n\t\t\tthis.state = this.loadPersistedState() || config.initialState\n\t\t\tthis.validateCurrentState()\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state, using initial state', error)\n\t\t\tthis.state = config.initialState\n\t\t\t// Validate the fallback initial state\n\t\t\tthis.validateCurrentState()\n\t\t}\n\n\t\tif (this.config.enableAutoSave) {\n\t\t\tthis.startAutoSave()\n\t\t}\n\n\t\tthis.logger.info('StateMachine initialized', {\n\t\t\tpersistenceKey: this.config.persistenceKey,\n\t\t\tautoSaveInterval: this.config.autoSaveInterval,\n\t\t\tmaxHistorySize: this.config.maxHistorySize,\n\t\t})\n\t}\n\n\t// TODO: Remove this and separate it from class in the future\n\tprotected abstract saveToServer(state: T): Promise<void>\n\tprotected abstract loadFromServer(): Promise<T | null>\n\n\t/*\n\t * PUBLIC\n\t ***************************************************************************************************/\n\n\t/*\n\t * CORE METHODS\n\t */\n\tpublic getState(): T {\n\t\tthis.assertNotDestroyed()\n\t\treturn this.state\n\t}\n\n\tpublic subscribe(listener: (state: T) => void): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof listener !== 'function') {\n\t\t\tthrow new StateValidationError('Listener must be a function')\n\t\t}\n\n\t\tthis.listeners.add(listener)\n\n\t\ttry {\n\t\t\tlistener(this.state)\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Initial listener call failed', error)\n\t\t}\n\n\t\tthis.logger.debug('Listener subscribed', {\n\t\t\ttotalListeners: this.listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t\tthis.logger.debug('Listener unsubscribed', {\n\t\t\t\ttotalListeners: this.listeners.size,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic mutate(recipe: (draft: Draft<T>) => void, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof recipe !== 'function') {\n\t\t\tthrow new StateValidationError('Recipe must be a function')\n\t\t}\n\n\t\ttry {\n\t\t\tlet patches: Patch[] = []\n\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\tconst nextState = produce(this.state, recipe, (p, ip) => {\n\t\t\t\tpatches = p\n\t\t\t\tinversePatches = ip\n\t\t\t})\n\n\t\t\tif (patches.length > 0) {\n\t\t\t\tthis.validateState(nextState)\n\t\t\t\tthis.saveToHistory(patches, inversePatches, description)\n\t\t\t\tthis.setState(nextState)\n\n\t\t\t\tthis.logger.debug('State mutated', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tpatchCount: patches.length,\n\t\t\t\t\thistorySize: this.history.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('State mutation failed', { description, error })\n\n\t\t\t// Re-throw validation errors without wrapping them\n\t\t\tif (error instanceof StateValidationError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`State mutation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'MUTATION_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic batch(mutations: Array<(draft: Draft<T>) => void>, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!Array.isArray(mutations)) {\n\t\t\tthrow new StateValidationError('Mutations must be an array')\n\t\t}\n\n\t\tif (mutations.length === 0) {\n\t\t\tthis.logger.debug('Empty batch operation ignored')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst allPatches: Patch[] = []\n\t\t\tconst allInversePatches: Patch[] = []\n\n\t\t\tconst finalState = mutations.reduce((currentState, recipe, index) => {\n\t\t\t\tif (typeof recipe !== 'function') {\n\t\t\t\t\tthrow new StateValidationError(`Mutation at index ${index} must be a function`)\n\t\t\t\t}\n\n\t\t\t\tlet patches: Patch[] = []\n\t\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\t\tconst nextState = produce(currentState, recipe, (p, ip) => {\n\t\t\t\t\tpatches = p\n\t\t\t\t\tinversePatches = ip\n\t\t\t\t})\n\n\t\t\t\tallPatches.push(...patches)\n\t\t\t\tallInversePatches.unshift(...inversePatches)\n\n\t\t\t\treturn nextState\n\t\t\t}, this.state)\n\n\t\t\tif (allPatches.length > 0) {\n\t\t\t\tthis.validateState(finalState)\n\t\t\t\tthis.saveToHistory(allPatches, allInversePatches, description || 'Batch operation')\n\t\t\t\tthis.setState(finalState)\n\n\t\t\t\tthis.logger.debug('Batch operation completed', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tmutationCount: mutations.length,\n\t\t\t\t\tpatchCount: allPatches.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Batch operation failed', { description, error })\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`Batch operation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'BATCH_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\t/*\n\t * UNDO/REDO METHODS\n\t */\n\tpublic undo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canUndo()) {\n\t\t\tthis.logger.debug('Undo operation ignored - no history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.inversePatches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.historyIndex--\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Undo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Undo operation failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic redo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canRedo()) {\n\t\t\tthis.logger.debug('Redo operation ignored - no future history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.historyIndex++\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\tthis.historyIndex--\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.patches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Redo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Redo operation failed', error)\n\t\t\tthis.historyIndex--\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic canUndo(): boolean {\n\t\treturn this.historyIndex >= 0\n\t}\n\n\tpublic canRedo(): boolean {\n\t\treturn this.historyIndex < this.history.length - 1\n\t}\n\n\t/*\n\t * HISTORY METHODS\n\t */\n\tpublic getHistoryInfo(): StateHistoryInfo {\n\t\treturn {\n\t\t\tcanUndo: this.canUndo(),\n\t\t\tcanRedo: this.canRedo(),\n\t\t\thistoryLength: this.history.length,\n\t\t\tcurrentIndex: this.historyIndex,\n\t\t\tlastAction: this.history[this.historyIndex]?.description || null,\n\t\t\tmemoryUsage: calculateMemoryUsage(this.history),\n\t\t}\n\t}\n\n\tpublic clearHistory(): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tconst oldLength = this.history.length\n\t\tthis.history = []\n\t\tthis.historyIndex = -1\n\n\t\tthis.logger.info('History cleared', { previousLength: oldLength })\n\t}\n\n\t/*\n\t * SAVE/LOAD METHODS\n\t */\n\tpublic async forceSave(): Promise<void> {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.isDirty) {\n\t\t\tthis.logger.debug('Force save skipped - no changes')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.logger.debug('Force save started')\n\n\t\t\tawait this.saveToServer(this.state)\n\t\t\tthis.persistToLocal()\n\t\t\tthis.isDirty = false\n\n\t\t\tthis.logger.info('Force save completed successfully')\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Force save failed', error)\n\t\t\tthrow new StatePersistenceError(\n\t\t\t\t`Force save failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic hasUnsavedChanges(): boolean {\n\t\treturn this.isDirty\n\t}\n\n\tpublic setAutoSaveInterval(minutes: number): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof minutes !== 'number' || minutes <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be a positive number')\n\t\t}\n\n\t\tthis.config.autoSaveInterval = minutes\n\t\tthis.restartAutoSave()\n\n\t\tthis.logger.info('Auto-save interval updated', { minutes })\n\t}\n\n\tpublic async loadFromServerManually(): Promise<boolean> {\n\t\tthis.assertNotDestroyed()\n\n\t\ttry {\n\t\t\tthis.logger.debug('Manual server load started')\n\n\t\t\tconst serverState = await this.loadFromServer()\n\t\t\tif (serverState) {\n\t\t\t\tthis.validateState(serverState)\n\t\t\t\tthis.state = serverState\n\t\t\t\tthis.isDirty = false\n\t\t\t\tthis.clearHistory()\n\t\t\t\tthis.notifyListeners()\n\t\t\t\tthis.persistToLocal()\n\n\t\t\t\tthis.logger.info('Manual server load completed successfully')\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.logger.debug('No server state available')\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Manual server load failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/*\n\t * CLEANUP METHODS\n\t */\n\tpublic destroy(): void {\n\t\tif (this.isDestroyed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.logger.info('Destroying StateMachine')\n\n\t\tthis.isDestroyed = true\n\t\tthis.listeners.clear()\n\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t\tthis.autoSaveTimer = null\n\t\t}\n\n\t\t// Clear references to help garbage collection\n\t\tthis.history = []\n\t\tthis.listeners = new Set()\n\n\t\tthis.logger.info('StateMachine destroyed')\n\t}\n\n\t/*\n\t * PROTECTED METHODS\n\t ***************************************************************************************************/\n\n\tprotected setState(newState: T, markDirty = true): void {\n\t\tthis.state = newState\n\n\t\tif (markDirty) {\n\t\t\tthis.isDirty = true\n\t\t}\n\n\t\tthis.debouncedNotify()\n\t\tthis.persistToLocal()\n\t}\n\n\t/*\n\t * PRIVATE METHODS\n\t ***************************************************************************************************/\n\n\t/*\n\t * STATE VALIDATION\n\t */\n\tprivate assertNotDestroyed(): void {\n\t\tif (this.isDestroyed) {\n\t\t\tthrow new StateMachineError('Cannot operate on destroyed StateMachine', 'DESTROYED')\n\t\t}\n\t}\n\n\tprivate validateConfig(config: StateConfig<T>): void {\n\t\tif (\n\t\t\t!config.initialState ||\n\t\t\ttypeof config.initialState !== 'object' ||\n\t\t\tconfig.initialState === null\n\t\t) {\n\t\t\tthrow new StateValidationError('Initial state must be an object')\n\t\t}\n\n\t\tif (config.autoSaveInterval !== undefined && config.autoSaveInterval <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be positive')\n\t\t}\n\n\t\tif (config.maxHistorySize !== undefined && config.maxHistorySize <= 0) {\n\t\t\tthrow new StateValidationError('Max history size must be positive')\n\t\t}\n\t}\n\n\tprivate validateCurrentState(): void {\n\t\tthis.validateState(this.state)\n\t}\n\n\tprotected validateState(state: T): void {\n\t\tif (!this.config.validateState(state)) {\n\t\t\tthrow new StateValidationError('State validation failed')\n\t\t}\n\t}\n\n\tprivate notifyListeners(): void {\n\t\tif (this.listeners.size === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frozenState = this.state\n\t\tlet errorCount = 0\n\n\t\tthis.listeners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(frozenState)\n\t\t\t} catch (error) {\n\t\t\t\terrorCount++\n\t\t\t\tthis.logger.error('Listener notification failed', error)\n\t\t\t}\n\t\t})\n\n\t\tif (errorCount > 0) {\n\t\t\tthis.logger.warn(`${errorCount} listener(s) failed during notification`)\n\t\t}\n\t}\n\n\t/*\n\t * HISTORY\n\t */\n\tprivate saveToHistory(patches: Patch[], inversePatches: Patch[], description?: string): void {\n\t\tif (this.historyIndex < this.history.length - 1) {\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1)\n\t\t}\n\n\t\tconst snapshot: StateSnapshot = {\n\t\t\tpatches,\n\t\t\tinversePatches,\n\t\t\ttimestamp: Date.now(),\n\t\t}\n\n\t\tif (description) {\n\t\t\tsnapshot.description = description\n\t\t}\n\n\t\tthis.history.push(snapshot)\n\n\t\tthis.historyIndex++\n\n\t\tif (this.history.length > this.config.maxHistorySize) {\n\t\t\tthis.history.shift()\n\t\t\tthis.historyIndex--\n\t\t\tthis.logger.debug('History trimmed to max size', {\n\t\t\t\tmaxSize: this.config.maxHistorySize,\n\t\t\t})\n\t\t}\n\t}\n\n\t/*\n\t * PERSISTENCE\n\t */\n\tprivate persistToLocal(): void {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedState: PersistedState<T> = {\n\t\t\t\tstate: this.state,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tversion: DEFAULT_VERSION,\n\t\t\t\tchecksum: generateChecksum(this.state),\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(this.config.persistenceKey, JSON.stringify(persistedState))\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to persist state to localStorage', error)\n\t\t}\n\t}\n\n\tprivate loadPersistedState(): T | null {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(this.config.persistenceKey)\n\t\t\tif (!stored) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst persistedState: PersistedState<T> = JSON.parse(stored)\n\n\t\t\t// Validate checksum if present\n\t\t\tif (persistedState.checksum) {\n\t\t\t\tconst expectedChecksum = generateChecksum(persistedState.state)\n\t\t\t\tif (persistedState.checksum !== expectedChecksum) {\n\t\t\t\t\tthis.logger.warn('Persisted state checksum mismatch, ignoring')\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.debug('Loaded persisted state', {\n\t\t\t\ttimestamp: persistedState.timestamp,\n\t\t\t\tversion: persistedState.version,\n\t\t\t})\n\n\t\t\treturn persistedState.state\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state', error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/*\n\t * AUTO SAVE\n\t */\n\tprivate startAutoSave(): void {\n\t\tif (!this.config.enableAutoSave) {\n\t\t\treturn\n\t\t}\n\n\t\tconst interval = this.config.autoSaveInterval * 60 * 1000\n\n\t\tthis.autoSaveTimer = setInterval(async () => {\n\t\t\tif (this.isDirty && !this.isDestroyed) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.forceSave()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error('Auto-save failed', error)\n\t\t\t\t}\n\t\t\t}\n\t\t}, interval)\n\n\t\tthis.logger.debug('Auto-save started', {\n\t\t\tintervalMinutes: this.config.autoSaveInterval,\n\t\t})\n\t}\n\n\tprivate restartAutoSave(): void {\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t}\n\t\tthis.startAutoSave()\n\t}\n}\n","/*\n * IMPORTS\n ***************************************************************************************************/\nimport { type DependencyList, useEffect, useState, useCallback } from 'react'\nimport { StateMachine, type StateHistoryInfo } from './machine'\n\n/*\n * TYPES\n ***************************************************************************************************/\nimport type { Draft } from 'immer'\n\n/*\n * HOOKS\n ***************************************************************************************************/\n\n/**\n * Basic hook to subscribe to a StateMachine instance\n */\nexport function useStateMachine<T extends object>(engine: StateMachine<T>) {\n\tconst [state, setState] = useState(() => engine.getState())\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(setState)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t}\n}\n\n/**\n * Hook to subscribe to a specific slice of state with a selector function\n */\nexport function useStateSlice<T extends object, TSelected>(\n\tengine: StateMachine<T>,\n\tselector: (state: T) => TSelected,\n\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n) {\n\tconst [selectedState, setSelectedState] = useState(() => selector(engine.getState()))\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(newState => {\n\t\t\tconst newSelected = selector(newState)\n\n\t\t\tif (equalityFn) {\n\t\t\t\tif (!equalityFn(selectedState, newSelected)) {\n\t\t\t\t\tsetSelectedState(newSelected)\n\t\t\t\t}\n\t\t\t} else if (selectedState !== newSelected) {\n\t\t\t\tsetSelectedState(newSelected)\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [engine, selector, selectedState, equalityFn])\n\n\treturn selectedState\n}\n\n/**\n * Hook that provides StateMachine actions/methods\n */\nexport function useStateActions<T extends object>(engine: StateMachine<T>) {\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst undo = useCallback(() => {\n\t\treturn engine.undo()\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\treturn engine.redo()\n\t}, [engine])\n\n\tconst forceSave = useCallback(async () => {\n\t\treturn engine.forceSave()\n\t}, [engine])\n\n\tconst loadFromServer = useCallback(async () => {\n\t\treturn engine.loadFromServerManually()\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t}, [engine])\n\n\treturn {\n\t\tmutate,\n\t\tbatch,\n\t\tundo,\n\t\tredo,\n\t\tforceSave,\n\t\tloadFromServer,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook specifically for undo/redo functionality\n */\nexport function useStateHistory<T extends object>(engine: StateMachine<T>) {\n\tconst [historyInfo, setHistoryInfo] = useState<StateHistoryInfo>(() => engine.getHistoryInfo())\n\n\tuseEffect(() => {\n\t\tconst updateHistory = () => {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\n\t\tconst unsubscribe = engine.subscribe(updateHistory)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst undo = useCallback(() => {\n\t\tconst success = engine.undo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\tconst success = engine.redo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t}, [engine])\n\n\treturn {\n\t\t...historyInfo,\n\t\tundo,\n\t\tredo,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for managing save/load state and persistence\n */\nexport function useStatePersist<T extends object>(engine: StateMachine<T>) {\n\tconst [isSaving, setIsSaving] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [lastSaved, setLastSaved] = useState<Date | null>(null)\n\tconst [saveError, setSaveError] = useState<string | null>(null)\n\tconst [loadError, setLoadError] = useState<string | null>(null)\n\n\tconst hasUnsavedChanges = engine.hasUnsavedChanges()\n\n\tconst save = useCallback(async () => {\n\t\tif (isSaving) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsSaving(true)\n\t\tsetSaveError(null)\n\n\t\ttry {\n\t\t\tawait engine.forceSave()\n\t\t\tsetLastSaved(new Date())\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Save failed'\n\t\t\tsetSaveError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsSaving(false)\n\t\t}\n\t}, [engine, isSaving])\n\n\tconst load = useCallback(async () => {\n\t\tif (isLoading) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsLoading(true)\n\t\tsetLoadError(null)\n\n\t\ttry {\n\t\t\tconst success = await engine.loadFromServerManually()\n\t\t\tif (success) {\n\t\t\t\tsetLastSaved(new Date())\n\t\t\t}\n\t\t\treturn success\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Load failed'\n\t\t\tsetLoadError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [engine, isLoading])\n\n\tconst clearSaveError = useCallback(() => {\n\t\tsetSaveError(null)\n\t}, [])\n\n\tconst clearLoadError = useCallback(() => {\n\t\tsetLoadError(null)\n\t}, [])\n\n\treturn {\n\t\tisSaving,\n\t\tisLoading,\n\t\thasUnsavedChanges,\n\t\tlastSaved,\n\t\tsaveError,\n\t\tloadError,\n\t\tclearSaveError,\n\t\tclearLoadError,\n\t\tsave,\n\t\tload,\n\t}\n}\n\n/**\n * Comprehensive hook that combines all StateMachine functionality\n */\nexport function useStateMachineFull<T extends object>(engine: StateMachine<T>) {\n\tconst { state, mutate, batch } = useStateMachine(engine)\n\tconst actions = useStateActions(engine)\n\tconst history = useStateHistory(engine)\n\tconst persistence = useStatePersist(engine)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t\thistory: {\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\thistoryLength: history.historyLength,\n\t\t\tcurrentIndex: history.currentIndex,\n\t\t\tlastAction: history.lastAction,\n\t\t\tmemoryUsage: history.memoryUsage,\n\t\t\tundo: history.undo,\n\t\t\tredo: history.redo,\n\t\t\tclearHistory: history.clearHistory,\n\t\t},\n\t\tpersistence: {\n\t\t\tisSaving: persistence.isSaving,\n\t\t\tisLoading: persistence.isLoading,\n\t\t\thasUnsavedChanges: persistence.hasUnsavedChanges,\n\t\t\tlastSaved: persistence.lastSaved,\n\t\t\tsaveError: persistence.saveError,\n\t\t\tloadError: persistence.loadError,\n\t\t\tsave: persistence.save,\n\t\t\tload: persistence.load,\n\t\t\tclearSaveError: persistence.clearSaveError,\n\t\t\tclearLoadError: persistence.clearLoadError,\n\t\t},\n\t\tforceSave: actions.forceSave,\n\t\tloadFromServer: actions.loadFromServer,\n\t}\n}\n\n/**\n * Hook for creating optimistic updates with automatic rollback on failure\n * -- Still testing this, I'm not sure if this is a good solution.\n */\nexport function useOptimisticUpdate<T extends object>(engine: StateMachine<T>) {\n\tconst mutateOptimistic = useCallback(\n\t\tasync (\n\t\t\toptimisticUpdate: (draft: Draft<T>) => void,\n\t\t\tserverUpdate: () => Promise<void>,\n\t\t\tdescription?: string\n\t\t) => {\n\t\t\t// Apply optimistic update\n\t\t\tengine.mutate(optimisticUpdate, `${description} (optimistic)`)\n\n\t\t\ttry {\n\t\t\t\t// Attempt server update\n\t\t\t\tawait serverUpdate()\n\t\t\t\t// If successful, the optimistic update stands\n\t\t\t} catch (error) {\n\t\t\t\t// If failed, undo the optimistic update\n\t\t\t\tengine.undo()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn { mutateOptimistic }\n}\n\n/**\n * Hook for debounced state updates (useful for search inputs, etc.)\n */\nexport function useDebouncedStateUpdate<T extends object>(engine: StateMachine<T>, delay = 300) {\n\tconst [debouncedMutate] = useState(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\treturn (recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tengine.mutate(recipe, description)\n\t\t\t}, delay)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearTimeout(debouncedMutate as unknown as ReturnType<typeof setTimeout>)\n\t\t}\n\t}, [debouncedMutate])\n\n\treturn { debouncedMutate }\n}\n\n/**\n * Hook for subscribing to state changes with cleanup on component unmount\n */\nexport function useStateSubscription<T extends object>(\n\tengine: StateMachine<T>,\n\tcallback: (state: T) => void,\n\tdeps: DependencyList = []\n) {\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(callback)\n\t\treturn unsubscribe\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [engine, callback, ...deps])\n}\n\n/**\n * Utility hook for shallow equality comparison\n */\nexport function useShallowEqual<T>(value: T): T {\n\tconst [state, setState] = useState(value)\n\n\tuseEffect(() => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tconst keys1 = Object.keys(state as Record<string, unknown>)\n\t\t\tconst keys2 = Object.keys(value as Record<string, unknown>)\n\n\t\t\tif (keys1.length !== keys2.length) {\n\t\t\t\tsetState(value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor (const key of keys1) {\n\t\t\t\tif (\n\t\t\t\t\t(state as Record<string, unknown>)[key] !==\n\t\t\t\t\t(value as Record<string, unknown>)[key]\n\t\t\t\t) {\n\t\t\t\t\tsetState(value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state !== value) {\n\t\t\tsetState(value)\n\t\t}\n\t}, [value, state])\n\n\treturn state\n}\n\n/**\n * Factory function to create typed hooks for a specific StateMachine\n */\nexport function createStateMachineHooks<T extends object>(engine: StateMachine<T>) {\n\treturn {\n\t\tuseState: () => useStateMachine(engine),\n\t\tuseSlice: <TSelected>(\n\t\t\tselector: (state: T) => TSelected,\n\t\t\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n\t\t) => useStateSlice(engine, selector, equalityFn),\n\t\tuseActions: () => useStateActions(engine),\n\t\tuseHistory: () => useStateHistory(engine),\n\t\tusePersistence: () => useStatePersist(engine),\n\t\tuseComplete: () => useStateMachineFull(engine),\n\t\tuseOptimistic: () => useOptimisticUpdate(engine),\n\t\tuseDebounced: (delay?: number) => useDebouncedStateUpdate(engine, delay),\n\t\tuseSubscription: (callback: (state: T) => void, deps?: DependencyList) =>\n\t\t\tuseStateSubscription(engine, callback, deps),\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/machine.ts","../src/hooks.ts"],"names":["enablePatches","produce","applyPatches","useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * IMPORTS\n ***************************************************************************************************/\nimport { produce, enablePatches, applyPatches, type Patch, type Draft } from 'immer'\n\nenablePatches()\n\n/*\n * CONSTANTS\n ***************************************************************************************************/\nconst DEFAULT_AUTO_SAVE_INTERVAL = 5 // in minutes\nconst DEFAULT_MAX_HISTORY_SIZE = 50\nconst DEFAULT_VERSION = '1.0.0'\nconst NOTIFICATION_DEBOUNCE_MS = 16\n\n/*\n * ERROR TYPES\n ***************************************************************************************************/\nexport class StateMachineError extends Error {\n\tpublic readonly code: string\n\n\tconstructor(message: string, code: string) {\n\t\tsuper(message)\n\t\tthis.name = 'StateMachineError'\n\t\tthis.code = code\n\t}\n}\n\nexport class StateValidationError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALIDATION_ERROR')\n\t}\n}\n\nexport class StatePersistenceError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'PERSISTENCE_ERROR')\n\t}\n}\n\n/*\n * TYPES\n ***************************************************************************************************/\nexport interface StateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey?: string\n\tautoSaveInterval?: number\n\tmaxHistorySize?: number\n\tenablePersistence?: boolean\n\tenableAutoSave?: boolean\n\tenableLogging?: boolean\n\tvalidateState?: (state: T) => boolean\n}\n\ninterface InternalStateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey: string | null\n\tautoSaveInterval: number\n\tmaxHistorySize: number\n\tenablePersistence: boolean\n\tenableAutoSave: boolean\n\tenableLogging: boolean\n\tvalidateState: (state: T) => boolean\n}\n\nexport interface StateSnapshot {\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\ttimestamp: number\n\tdescription?: string\n}\n\nexport interface PersistedState<T> {\n\tstate: T\n\ttimestamp: number\n\tversion: string\n\tchecksum?: string\n}\n\nexport interface StateHistoryInfo {\n\tcanUndo: boolean\n\tcanRedo: boolean\n\thistoryLength: number\n\tcurrentIndex: number\n\tlastAction: string | null\n\tmemoryUsage: number\n}\n\n// Compact logger - will be optimized out in production builds\n/* eslint-disable no-console */\nconst createLogger = (enabled: boolean) => ({\n\tdebug: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.debug(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\tinfo: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.info(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\twarn: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.warn(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\terror: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.error(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n})\n/* eslint-enable no-console */\n\n/*\n * FUNCTIONS\n ***************************************************************************************************/\nfunction debounce<T extends (...args: unknown[]) => void>(func: T, wait: number): T {\n\tlet timeout: ReturnType<typeof setTimeout>\n\treturn ((...args: Parameters<T>) => {\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(() => func(...args), wait)\n\t}) as T\n}\n\n// Compact utility functions\nconst calculateMemoryUsage = (data: unknown): number => {\n\ttry {\n\t\treturn new Blob([JSON.stringify(data)]).size\n\t} catch {\n\t\treturn 0\n\t}\n}\n\nconst generateChecksum = (data: unknown): string => {\n\ttry {\n\t\tconst str = JSON.stringify(data)\n\t\tlet hash = 0\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\thash = ((hash << 5) - hash + str.charCodeAt(i)) & hash\n\t\t}\n\t\treturn hash.toString(36)\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/*\n * STATE MACHINE\n ***************************************************************************************************/\nexport abstract class StateMachine<T extends object> {\n\tprotected state: T\n\tprotected config: InternalStateConfig<T>\n\tprotected listeners: Set<(state: T) => void> = new Set()\n\tprotected history: StateSnapshot[] = []\n\tprotected historyIndex = -1\n\tprotected isDirty = false\n\tprotected autoSaveTimer: ReturnType<typeof setInterval> | null = null\n\tprotected isDestroyed = false\n\tprotected logger: ReturnType<typeof createLogger>\n\tprotected debouncedNotify: () => void\n\n\tconstructor(config: StateConfig<T>) {\n\t\tthis.validateConfig(config)\n\n\t\tthis.config = {\n\t\t\tinitialState: config.initialState,\n\t\t\tpersistenceKey: config.persistenceKey || null,\n\t\t\tautoSaveInterval: config.autoSaveInterval ?? DEFAULT_AUTO_SAVE_INTERVAL,\n\t\t\tmaxHistorySize: config.maxHistorySize ?? DEFAULT_MAX_HISTORY_SIZE,\n\t\t\tenablePersistence: config.enablePersistence ?? true,\n\t\t\tenableAutoSave: config.enableAutoSave ?? true,\n\t\t\tenableLogging: config.enableLogging ?? false,\n\t\t\tvalidateState: config.validateState ?? (() => true),\n\t\t}\n\n\t\tthis.logger = createLogger(this.config.enableLogging)\n\t\tthis.debouncedNotify = debounce(() => this.notifyListeners(), NOTIFICATION_DEBOUNCE_MS)\n\n\t\ttry {\n\t\t\tthis.state = this.loadPersistedState() || config.initialState\n\t\t\tthis.validateCurrentState()\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state, using initial state', error)\n\t\t\tthis.state = config.initialState\n\t\t\t// Validate the fallback initial state\n\t\t\tthis.validateCurrentState()\n\t\t}\n\n\t\tif (this.config.enableAutoSave) {\n\t\t\tthis.startAutoSave()\n\t\t}\n\n\t\tthis.logger.info('StateMachine initialized', {\n\t\t\tpersistenceKey: this.config.persistenceKey,\n\t\t\tautoSaveInterval: this.config.autoSaveInterval,\n\t\t\tmaxHistorySize: this.config.maxHistorySize,\n\t\t})\n\t}\n\n\tprotected async saveToServer(_state: T): Promise<void> {}\n\tprotected async loadFromServer(): Promise<T | null> {\n\t\treturn null\n\t}\n\n\t/*\n\t * PUBLIC\n\t ***************************************************************************************************/\n\n\t/*\n\t * CORE METHODS\n\t */\n\tpublic getState(): T {\n\t\tthis.assertNotDestroyed()\n\t\treturn this.state\n\t}\n\n\tpublic subscribe(listener: (state: T) => void): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof listener !== 'function') {\n\t\t\tthrow new StateValidationError('Listener must be a function')\n\t\t}\n\n\t\tthis.listeners.add(listener)\n\n\t\ttry {\n\t\t\tlistener(this.state)\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Initial listener call failed', error)\n\t\t}\n\n\t\tthis.logger.debug('Listener subscribed', {\n\t\t\ttotalListeners: this.listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t\tthis.logger.debug('Listener unsubscribed', {\n\t\t\t\ttotalListeners: this.listeners.size,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic mutate(recipe: (draft: Draft<T>) => void, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof recipe !== 'function') {\n\t\t\tthrow new StateValidationError('Recipe must be a function')\n\t\t}\n\n\t\ttry {\n\t\t\tlet patches: Patch[] = []\n\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\tconst nextState = produce(this.state, recipe, (p, ip) => {\n\t\t\t\tpatches = p\n\t\t\t\tinversePatches = ip\n\t\t\t})\n\n\t\t\tif (patches.length > 0) {\n\t\t\t\tthis.validateState(nextState)\n\t\t\t\tthis.saveToHistory(patches, inversePatches, description)\n\t\t\t\tthis.setState(nextState)\n\n\t\t\t\tthis.logger.debug('State mutated', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tpatchCount: patches.length,\n\t\t\t\t\thistorySize: this.history.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('State mutation failed', { description, error })\n\n\t\t\t// Re-throw validation errors without wrapping them\n\t\t\tif (error instanceof StateValidationError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`State mutation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'MUTATION_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic batch(mutations: Array<(draft: Draft<T>) => void>, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!Array.isArray(mutations)) {\n\t\t\tthrow new StateValidationError('Mutations must be an array')\n\t\t}\n\n\t\tif (mutations.length === 0) {\n\t\t\tthis.logger.debug('Empty batch operation ignored')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst allPatches: Patch[] = []\n\t\t\tconst allInversePatches: Patch[] = []\n\n\t\t\tconst finalState = mutations.reduce((currentState, recipe, index) => {\n\t\t\t\tif (typeof recipe !== 'function') {\n\t\t\t\t\tthrow new StateValidationError(`Mutation at index ${index} must be a function`)\n\t\t\t\t}\n\n\t\t\t\tlet patches: Patch[] = []\n\t\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\t\tconst nextState = produce(currentState, recipe, (p, ip) => {\n\t\t\t\t\tpatches = p\n\t\t\t\t\tinversePatches = ip\n\t\t\t\t})\n\n\t\t\t\tallPatches.push(...patches)\n\t\t\t\tallInversePatches.unshift(...inversePatches)\n\n\t\t\t\treturn nextState\n\t\t\t}, this.state)\n\n\t\t\tif (allPatches.length > 0) {\n\t\t\t\tthis.validateState(finalState)\n\t\t\t\tthis.saveToHistory(allPatches, allInversePatches, description || 'Batch operation')\n\t\t\t\tthis.setState(finalState)\n\n\t\t\t\tthis.logger.debug('Batch operation completed', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tmutationCount: mutations.length,\n\t\t\t\t\tpatchCount: allPatches.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Batch operation failed', { description, error })\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`Batch operation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'BATCH_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\t/*\n\t * UNDO/REDO METHODS\n\t */\n\tpublic undo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canUndo()) {\n\t\t\tthis.logger.debug('Undo operation ignored - no history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.inversePatches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.historyIndex--\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Undo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Undo operation failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic redo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canRedo()) {\n\t\t\tthis.logger.debug('Redo operation ignored - no future history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.historyIndex++\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\tthis.historyIndex--\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.patches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Redo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Redo operation failed', error)\n\t\t\tthis.historyIndex--\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic canUndo(): boolean {\n\t\treturn this.historyIndex >= 0\n\t}\n\n\tpublic canRedo(): boolean {\n\t\treturn this.historyIndex < this.history.length - 1\n\t}\n\n\t/*\n\t * HISTORY METHODS\n\t */\n\tpublic getHistoryInfo(): StateHistoryInfo {\n\t\treturn {\n\t\t\tcanUndo: this.canUndo(),\n\t\t\tcanRedo: this.canRedo(),\n\t\t\thistoryLength: this.history.length,\n\t\t\tcurrentIndex: this.historyIndex,\n\t\t\tlastAction: this.history[this.historyIndex]?.description || null,\n\t\t\tmemoryUsage: calculateMemoryUsage(this.history),\n\t\t}\n\t}\n\n\tpublic clearHistory(): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tconst oldLength = this.history.length\n\t\tthis.history = []\n\t\tthis.historyIndex = -1\n\n\t\tthis.logger.info('History cleared', { previousLength: oldLength })\n\t}\n\n\t/*\n\t * SAVE/LOAD METHODS\n\t */\n\tpublic async forceSave(): Promise<void> {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.isDirty) {\n\t\t\tthis.logger.debug('Force save skipped - no changes')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.logger.debug('Force save started')\n\n\t\t\tawait this.saveToServer(this.state)\n\t\t\tthis.persistToLocal()\n\t\t\tthis.isDirty = false\n\n\t\t\tthis.logger.info('Force save completed successfully')\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Force save failed', error)\n\t\t\tthrow new StatePersistenceError(\n\t\t\t\t`Force save failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic hasUnsavedChanges(): boolean {\n\t\treturn this.isDirty\n\t}\n\n\tpublic setAutoSaveInterval(minutes: number): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof minutes !== 'number' || minutes <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be a positive number')\n\t\t}\n\n\t\tthis.config.autoSaveInterval = minutes\n\t\tthis.restartAutoSave()\n\n\t\tthis.logger.info('Auto-save interval updated', { minutes })\n\t}\n\n\tpublic async loadFromServerManually(): Promise<boolean> {\n\t\tthis.assertNotDestroyed()\n\n\t\ttry {\n\t\t\tthis.logger.debug('Manual server load started')\n\n\t\t\tconst serverState = await this.loadFromServer()\n\t\t\tif (serverState) {\n\t\t\t\tthis.validateState(serverState)\n\t\t\t\tthis.state = serverState\n\t\t\t\tthis.isDirty = false\n\t\t\t\tthis.clearHistory()\n\t\t\t\tthis.notifyListeners()\n\t\t\t\tthis.persistToLocal()\n\n\t\t\t\tthis.logger.info('Manual server load completed successfully')\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.logger.debug('No server state available')\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Manual server load failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/*\n\t * CLEANUP METHODS\n\t */\n\tpublic destroy(): void {\n\t\tif (this.isDestroyed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.logger.info('Destroying StateMachine')\n\n\t\tthis.isDestroyed = true\n\t\tthis.listeners.clear()\n\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t\tthis.autoSaveTimer = null\n\t\t}\n\n\t\t// Clear references to help garbage collection\n\t\tthis.history = []\n\t\tthis.listeners = new Set()\n\n\t\tthis.logger.info('StateMachine destroyed')\n\t}\n\n\t/*\n\t * PROTECTED METHODS\n\t ***************************************************************************************************/\n\n\tprotected setState(newState: T, markDirty = true): void {\n\t\tthis.state = newState\n\n\t\tif (markDirty) {\n\t\t\tthis.isDirty = true\n\t\t}\n\n\t\tthis.debouncedNotify()\n\t\tthis.persistToLocal()\n\t}\n\n\t/*\n\t * PRIVATE METHODS\n\t ***************************************************************************************************/\n\n\t/*\n\t * STATE VALIDATION\n\t */\n\tprivate assertNotDestroyed(): void {\n\t\tif (this.isDestroyed) {\n\t\t\tthrow new StateMachineError('Cannot operate on destroyed StateMachine', 'DESTROYED')\n\t\t}\n\t}\n\n\tprivate validateConfig(config: StateConfig<T>): void {\n\t\tif (\n\t\t\t!config.initialState ||\n\t\t\ttypeof config.initialState !== 'object' ||\n\t\t\tconfig.initialState === null\n\t\t) {\n\t\t\tthrow new StateValidationError('Initial state must be an object')\n\t\t}\n\n\t\tif (config.autoSaveInterval !== undefined && config.autoSaveInterval <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be positive')\n\t\t}\n\n\t\tif (config.maxHistorySize !== undefined && config.maxHistorySize <= 0) {\n\t\t\tthrow new StateValidationError('Max history size must be positive')\n\t\t}\n\t}\n\n\tprivate validateCurrentState(): void {\n\t\tthis.validateState(this.state)\n\t}\n\n\tprotected validateState(state: T): void {\n\t\tif (!this.config.validateState(state)) {\n\t\t\tthrow new StateValidationError('State validation failed')\n\t\t}\n\t}\n\n\tprivate notifyListeners(): void {\n\t\tif (this.listeners.size === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frozenState = this.state\n\t\tlet errorCount = 0\n\n\t\tthis.listeners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(frozenState)\n\t\t\t} catch (error) {\n\t\t\t\terrorCount++\n\t\t\t\tthis.logger.error('Listener notification failed', error)\n\t\t\t}\n\t\t})\n\n\t\tif (errorCount > 0) {\n\t\t\tthis.logger.warn(`${errorCount} listener(s) failed during notification`)\n\t\t}\n\t}\n\n\t/*\n\t * HISTORY\n\t */\n\tprivate saveToHistory(patches: Patch[], inversePatches: Patch[], description?: string): void {\n\t\tif (this.historyIndex < this.history.length - 1) {\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1)\n\t\t}\n\n\t\tconst snapshot: StateSnapshot = {\n\t\t\tpatches,\n\t\t\tinversePatches,\n\t\t\ttimestamp: Date.now(),\n\t\t}\n\n\t\tif (description) {\n\t\t\tsnapshot.description = description\n\t\t}\n\n\t\tthis.history.push(snapshot)\n\n\t\tthis.historyIndex++\n\n\t\tif (this.history.length > this.config.maxHistorySize) {\n\t\t\tthis.history.shift()\n\t\t\tthis.historyIndex--\n\t\t\tthis.logger.debug('History trimmed to max size', {\n\t\t\t\tmaxSize: this.config.maxHistorySize,\n\t\t\t})\n\t\t}\n\t}\n\n\t/*\n\t * PERSISTENCE\n\t */\n\tprivate persistToLocal(): void {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedState: PersistedState<T> = {\n\t\t\t\tstate: this.state,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tversion: DEFAULT_VERSION,\n\t\t\t\tchecksum: generateChecksum(this.state),\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(this.config.persistenceKey, JSON.stringify(persistedState))\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to persist state to localStorage', error)\n\t\t}\n\t}\n\n\tprivate loadPersistedState(): T | null {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(this.config.persistenceKey)\n\t\t\tif (!stored) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst persistedState: PersistedState<T> = JSON.parse(stored)\n\n\t\t\t// Validate checksum if present\n\t\t\tif (persistedState.checksum) {\n\t\t\t\tconst expectedChecksum = generateChecksum(persistedState.state)\n\t\t\t\tif (persistedState.checksum !== expectedChecksum) {\n\t\t\t\t\tthis.logger.warn('Persisted state checksum mismatch, ignoring')\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.debug('Loaded persisted state', {\n\t\t\t\ttimestamp: persistedState.timestamp,\n\t\t\t\tversion: persistedState.version,\n\t\t\t})\n\n\t\t\treturn persistedState.state\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state', error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/*\n\t * AUTO SAVE\n\t */\n\tprivate startAutoSave(): void {\n\t\tif (!this.config.enableAutoSave) {\n\t\t\treturn\n\t\t}\n\n\t\tconst interval = this.config.autoSaveInterval * 60 * 1000\n\n\t\tthis.autoSaveTimer = setInterval(async () => {\n\t\t\tif (this.isDirty && !this.isDestroyed) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.forceSave()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error('Auto-save failed', error)\n\t\t\t\t}\n\t\t\t}\n\t\t}, interval)\n\n\t\tthis.logger.debug('Auto-save started', {\n\t\t\tintervalMinutes: this.config.autoSaveInterval,\n\t\t})\n\t}\n\n\tprivate restartAutoSave(): void {\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t}\n\t\tthis.startAutoSave()\n\t}\n}\n","/*\n * IMPORTS\n ***************************************************************************************************/\nimport { type DependencyList, useEffect, useState, useCallback } from 'react'\nimport { StateMachine, type StateHistoryInfo } from './machine'\n\n/*\n * TYPES\n ***************************************************************************************************/\nimport type { Draft } from 'immer'\n\n/*\n * HOOKS\n ***************************************************************************************************/\n\n/**\n * Basic hook to subscribe to a StateMachine instance\n */\nexport function useStateMachine<T extends object>(engine: StateMachine<T>) {\n\tconst [state, setState] = useState(() => engine.getState())\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(setState)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t}\n}\n\n/**\n * Hook to subscribe to a specific slice of state with a selector function\n */\nexport function useStateSlice<T extends object, TSelected>(\n\tengine: StateMachine<T>,\n\tselector: (state: T) => TSelected,\n\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n) {\n\tconst [selectedState, setSelectedState] = useState(() => selector(engine.getState()))\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(newState => {\n\t\t\tconst newSelected = selector(newState)\n\n\t\t\tif (equalityFn) {\n\t\t\t\tif (!equalityFn(selectedState, newSelected)) {\n\t\t\t\t\tsetSelectedState(newSelected)\n\t\t\t\t}\n\t\t\t} else if (selectedState !== newSelected) {\n\t\t\t\tsetSelectedState(newSelected)\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [engine, selector, selectedState, equalityFn])\n\n\treturn selectedState\n}\n\n/**\n * Hook that provides StateMachine actions/methods\n */\nexport function useStateActions<T extends object>(engine: StateMachine<T>) {\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst undo = useCallback(() => {\n\t\treturn engine.undo()\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\treturn engine.redo()\n\t}, [engine])\n\n\tconst forceSave = useCallback(async () => {\n\t\treturn engine.forceSave()\n\t}, [engine])\n\n\tconst loadFromServer = useCallback(async () => {\n\t\treturn engine.loadFromServerManually()\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t}, [engine])\n\n\treturn {\n\t\tmutate,\n\t\tbatch,\n\t\tundo,\n\t\tredo,\n\t\tforceSave,\n\t\tloadFromServer,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook specifically for undo/redo functionality\n */\nexport function useStateHistory<T extends object>(engine: StateMachine<T>) {\n\tconst [historyInfo, setHistoryInfo] = useState<StateHistoryInfo>(() => engine.getHistoryInfo())\n\n\tuseEffect(() => {\n\t\tconst updateHistory = () => {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\n\t\tconst unsubscribe = engine.subscribe(updateHistory)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst undo = useCallback(() => {\n\t\tconst success = engine.undo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\tconst success = engine.redo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t}, [engine])\n\n\treturn {\n\t\t...historyInfo,\n\t\tundo,\n\t\tredo,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for managing save/load state and persistence\n */\nexport function useStatePersist<T extends object>(engine: StateMachine<T>) {\n\tconst [isSaving, setIsSaving] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [lastSaved, setLastSaved] = useState<Date | null>(null)\n\tconst [saveError, setSaveError] = useState<string | null>(null)\n\tconst [loadError, setLoadError] = useState<string | null>(null)\n\n\tconst hasUnsavedChanges = engine.hasUnsavedChanges()\n\n\tconst save = useCallback(async () => {\n\t\tif (isSaving) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsSaving(true)\n\t\tsetSaveError(null)\n\n\t\ttry {\n\t\t\tawait engine.forceSave()\n\t\t\tsetLastSaved(new Date())\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Save failed'\n\t\t\tsetSaveError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsSaving(false)\n\t\t}\n\t}, [engine, isSaving])\n\n\tconst load = useCallback(async () => {\n\t\tif (isLoading) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsLoading(true)\n\t\tsetLoadError(null)\n\n\t\ttry {\n\t\t\tconst success = await engine.loadFromServerManually()\n\t\t\tif (success) {\n\t\t\t\tsetLastSaved(new Date())\n\t\t\t}\n\t\t\treturn success\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Load failed'\n\t\t\tsetLoadError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [engine, isLoading])\n\n\tconst clearSaveError = useCallback(() => {\n\t\tsetSaveError(null)\n\t}, [])\n\n\tconst clearLoadError = useCallback(() => {\n\t\tsetLoadError(null)\n\t}, [])\n\n\treturn {\n\t\tisSaving,\n\t\tisLoading,\n\t\thasUnsavedChanges,\n\t\tlastSaved,\n\t\tsaveError,\n\t\tloadError,\n\t\tclearSaveError,\n\t\tclearLoadError,\n\t\tsave,\n\t\tload,\n\t}\n}\n\n/**\n * Comprehensive hook that combines all StateMachine functionality\n */\nexport function useStateMachineFull<T extends object>(engine: StateMachine<T>) {\n\tconst { state, mutate, batch } = useStateMachine(engine)\n\tconst actions = useStateActions(engine)\n\tconst history = useStateHistory(engine)\n\tconst persistence = useStatePersist(engine)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t\thistory: {\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\thistoryLength: history.historyLength,\n\t\t\tcurrentIndex: history.currentIndex,\n\t\t\tlastAction: history.lastAction,\n\t\t\tmemoryUsage: history.memoryUsage,\n\t\t\tundo: history.undo,\n\t\t\tredo: history.redo,\n\t\t\tclearHistory: history.clearHistory,\n\t\t},\n\t\tpersistence: {\n\t\t\tisSaving: persistence.isSaving,\n\t\t\tisLoading: persistence.isLoading,\n\t\t\thasUnsavedChanges: persistence.hasUnsavedChanges,\n\t\t\tlastSaved: persistence.lastSaved,\n\t\t\tsaveError: persistence.saveError,\n\t\t\tloadError: persistence.loadError,\n\t\t\tsave: persistence.save,\n\t\t\tload: persistence.load,\n\t\t\tclearSaveError: persistence.clearSaveError,\n\t\t\tclearLoadError: persistence.clearLoadError,\n\t\t},\n\t\tforceSave: actions.forceSave,\n\t\tloadFromServer: actions.loadFromServer,\n\t}\n}\n\n/**\n * Hook for creating optimistic updates with automatic rollback on failure\n * -- Still testing this, I'm not sure if this is a good solution.\n */\nexport function useOptimisticUpdate<T extends object>(engine: StateMachine<T>) {\n\tconst mutateOptimistic = useCallback(\n\t\tasync (\n\t\t\toptimisticUpdate: (draft: Draft<T>) => void,\n\t\t\tserverUpdate: () => Promise<void>,\n\t\t\tdescription?: string\n\t\t) => {\n\t\t\t// Apply optimistic update\n\t\t\tengine.mutate(optimisticUpdate, `${description} (optimistic)`)\n\n\t\t\ttry {\n\t\t\t\t// Attempt server update\n\t\t\t\tawait serverUpdate()\n\t\t\t\t// If successful, the optimistic update stands\n\t\t\t} catch (error) {\n\t\t\t\t// If failed, undo the optimistic update\n\t\t\t\tengine.undo()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn { mutateOptimistic }\n}\n\n/**\n * Hook for debounced state updates (useful for search inputs, etc.)\n */\nexport function useDebouncedStateUpdate<T extends object>(engine: StateMachine<T>, delay = 300) {\n\tconst [debouncedMutate] = useState(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\treturn (recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tengine.mutate(recipe, description)\n\t\t\t}, delay)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearTimeout(debouncedMutate as unknown as ReturnType<typeof setTimeout>)\n\t\t}\n\t}, [debouncedMutate])\n\n\treturn { debouncedMutate }\n}\n\n/**\n * Hook for subscribing to state changes with cleanup on component unmount\n */\nexport function useStateSubscription<T extends object>(\n\tengine: StateMachine<T>,\n\tcallback: (state: T) => void,\n\tdeps: DependencyList = []\n) {\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(callback)\n\t\treturn unsubscribe\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [engine, callback, ...deps])\n}\n\n/**\n * Utility hook for shallow equality comparison\n */\nexport function useShallowEqual<T>(value: T): T {\n\tconst [state, setState] = useState(value)\n\n\tuseEffect(() => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tconst keys1 = Object.keys(state as Record<string, unknown>)\n\t\t\tconst keys2 = Object.keys(value as Record<string, unknown>)\n\n\t\t\tif (keys1.length !== keys2.length) {\n\t\t\t\tsetState(value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor (const key of keys1) {\n\t\t\t\tif (\n\t\t\t\t\t(state as Record<string, unknown>)[key] !==\n\t\t\t\t\t(value as Record<string, unknown>)[key]\n\t\t\t\t) {\n\t\t\t\t\tsetState(value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state !== value) {\n\t\t\tsetState(value)\n\t\t}\n\t}, [value, state])\n\n\treturn state\n}\n\n/**\n * Factory function to create typed hooks for a specific StateMachine\n */\nexport function createStateMachineHooks<T extends object>(engine: StateMachine<T>) {\n\treturn {\n\t\tuseState: () => useStateMachine(engine),\n\t\tuseSlice: <TSelected>(\n\t\t\tselector: (state: T) => TSelected,\n\t\t\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n\t\t) => useStateSlice(engine, selector, equalityFn),\n\t\tuseActions: () => useStateActions(engine),\n\t\tuseHistory: () => useStateHistory(engine),\n\t\tusePersistence: () => useStatePersist(engine),\n\t\tuseComplete: () => useStateMachineFull(engine),\n\t\tuseOptimistic: () => useOptimisticUpdate(engine),\n\t\tuseDebounced: (delay?: number) => useDebouncedStateUpdate(engine, delay),\n\t\tuseSubscription: (callback: (state: T) => void, deps?: DependencyList) =>\n\t\t\tuseStateSubscription(engine, callback, deps),\n\t}\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{enablePatches as t,produce as e,applyPatches as i}from"immer";import{useState as s,useEffect as r,useCallback as n}from"react";t();var a=class extends Error{constructor(t,e){super(t),this.name="StateMachineError",this.code=e}},o=class extends a{constructor(t){super(t,"VALIDATION_ERROR")}},h=class extends a{constructor(t){super(t,"PERSISTENCE_ERROR")}},c=t=>{try{return new Blob([JSON.stringify(t)]).size}catch{return 0}},u=t=>{try{const e=JSON.stringify(t);let i=0;for(let t=0;t<e.length;t++)i=(i<<5)-i+e.charCodeAt(t)&i;return i.toString(36)}catch{return""}},l=class{constructor(t){var e;this.listeners=new Set,this.history=[],this.historyIndex=-1,this.isDirty=!1,this.autoSaveTimer=null,this.isDestroyed=!1,this.validateConfig(t),this.config={initialState:t.initialState,persistenceKey:t.persistenceKey||null,autoSaveInterval:t.autoSaveInterval??5,maxHistorySize:t.maxHistorySize??50,enablePersistence:t.enablePersistence??!0,enableAutoSave:t.enableAutoSave??!0,enableLogging:t.enableLogging??!1,validateState:t.validateState??(()=>!0)},this.logger={debug:(e=this.config.enableLogging)?(t,...e)=>{}:()=>{},info:e?(t,...e)=>{}:()=>{},warn:e?(t,...e)=>{}:()=>{},error:e?(t,...e)=>{}:()=>{}},this.debouncedNotify=function(t){let e;return(...i)=>{clearTimeout(e),e=setTimeout(()=>t(...i),16)}}(()=>this.notifyListeners());try{this.state=this.loadPersistedState()||t.initialState,this.validateCurrentState()}catch(e){this.logger.warn("Failed to load persisted state, using initial state",e),this.state=t.initialState,this.validateCurrentState()}this.config.enableAutoSave&&this.startAutoSave(),this.logger.info("StateMachine initialized",{persistenceKey:this.config.persistenceKey,autoSaveInterval:this.config.autoSaveInterval,maxHistorySize:this.config.maxHistorySize})}getState(){return this.assertNotDestroyed(),this.state}subscribe(t){if(this.assertNotDestroyed(),"function"!=typeof t)throw new o("Listener must be a function");this.listeners.add(t);try{t(this.state)}catch(t){this.logger.error("Initial listener call failed",t)}return this.logger.debug("Listener subscribed",{totalListeners:this.listeners.size}),()=>{this.listeners.delete(t),this.logger.debug("Listener unsubscribed",{totalListeners:this.listeners.size})}}mutate(t,i){if(this.assertNotDestroyed(),"function"!=typeof t)throw new o("Recipe must be a function");try{let s=[],r=[];const n=e(this.state,t,(t,e)=>{s=t,r=e});s.length>0&&(this.validateState(n),this.saveToHistory(s,r,i),this.setState(n),this.logger.debug("State mutated",{description:i,patchCount:s.length,historySize:this.history.length}))}catch(t){if(this.logger.error("State mutation failed",{description:i,error:t}),t instanceof o)throw t;throw new a(`State mutation failed: ${t instanceof Error?t.message:"Unknown error"}`,"MUTATION_ERROR")}}batch(t,i){if(this.assertNotDestroyed(),!Array.isArray(t))throw new o("Mutations must be an array");if(0!==t.length)try{const s=[],r=[],n=t.reduce((t,i,n)=>{if("function"!=typeof i)throw new o(`Mutation at index ${n} must be a function`);let a=[],h=[];const c=e(t,i,(t,e)=>{a=t,h=e});return s.push(...a),r.unshift(...h),c},this.state);s.length>0&&(this.validateState(n),this.saveToHistory(s,r,i||"Batch operation"),this.setState(n),this.logger.debug("Batch operation completed",{description:i,mutationCount:t.length,patchCount:s.length}))}catch(t){throw this.logger.error("Batch operation failed",{description:i,error:t}),new a(`Batch operation failed: ${t instanceof Error?t.message:"Unknown error"}`,"BATCH_ERROR")}else this.logger.debug("Empty batch operation ignored")}undo(){if(this.assertNotDestroyed(),!this.canUndo())return this.logger.debug("Undo operation ignored - no history available"),!1;try{const t=this.history[this.historyIndex];if(!t)return!1;const e=i(this.state,t.inversePatches);return this.validateState(e),this.historyIndex--,this.setState(e,!1),this.logger.debug("Undo operation completed",{description:t.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Undo operation failed",t),!1}}redo(){if(this.assertNotDestroyed(),!this.canRedo())return this.logger.debug("Redo operation ignored - no future history available"),!1;try{this.historyIndex++;const t=this.history[this.historyIndex];if(!t)return this.historyIndex--,!1;const e=i(this.state,t.patches);return this.validateState(e),this.setState(e,!1),this.logger.debug("Redo operation completed",{description:t.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Redo operation failed",t),this.historyIndex--,!1}}canUndo(){return this.historyIndex>=0}canRedo(){return this.historyIndex<this.history.length-1}getHistoryInfo(){return{canUndo:this.canUndo(),canRedo:this.canRedo(),historyLength:this.history.length,currentIndex:this.historyIndex,lastAction:this.history[this.historyIndex]?.description||null,memoryUsage:c(this.history)}}clearHistory(){this.assertNotDestroyed();const t=this.history.length;this.history=[],this.historyIndex=-1,this.logger.info("History cleared",{previousLength:t})}async forceSave(){if(this.assertNotDestroyed(),this.isDirty)try{this.logger.debug("Force save started"),await this.saveToServer(this.state),this.persistToLocal(),this.isDirty=!1,this.logger.info("Force save completed successfully")}catch(t){throw this.logger.error("Force save failed",t),new h(`Force save failed: ${t instanceof Error?t.message:"Unknown error"}`)}else this.logger.debug("Force save skipped - no changes")}hasUnsavedChanges(){return this.isDirty}setAutoSaveInterval(t){if(this.assertNotDestroyed(),"number"!=typeof t||t<=0)throw new o("Auto-save interval must be a positive number");this.config.autoSaveInterval=t,this.restartAutoSave(),this.logger.info("Auto-save interval updated",{minutes:t})}async loadFromServerManually(){this.assertNotDestroyed();try{this.logger.debug("Manual server load started");const t=await this.loadFromServer();return t?(this.validateState(t),this.state=t,this.isDirty=!1,this.clearHistory(),this.notifyListeners(),this.persistToLocal(),this.logger.info("Manual server load completed successfully"),!0):(this.logger.debug("No server state available"),!1)}catch(t){return this.logger.error("Manual server load failed",t),!1}}destroy(){this.isDestroyed||(this.logger.info("Destroying StateMachine"),this.isDestroyed=!0,this.listeners.clear(),this.autoSaveTimer&&(clearInterval(this.autoSaveTimer),this.autoSaveTimer=null),this.history=[],this.listeners=new Set,this.logger.info("StateMachine destroyed"))}setState(t,e=!0){this.state=t,e&&(this.isDirty=!0),this.debouncedNotify(),this.persistToLocal()}assertNotDestroyed(){if(this.isDestroyed)throw new a("Cannot operate on destroyed StateMachine","DESTROYED")}validateConfig(t){if(!t.initialState||"object"!=typeof t.initialState||null===t.initialState)throw new o("Initial state must be an object");if(void 0!==t.autoSaveInterval&&t.autoSaveInterval<=0)throw new o("Auto-save interval must be positive");if(void 0!==t.maxHistorySize&&t.maxHistorySize<=0)throw new o("Max history size must be positive")}validateCurrentState(){this.validateState(this.state)}validateState(t){if(!this.config.validateState(t))throw new o("State validation failed")}notifyListeners(){if(0===this.listeners.size)return;const t=this.state;let e=0;this.listeners.forEach(i=>{try{i(t)}catch(t){e++,this.logger.error("Listener notification failed",t)}}),e>0&&this.logger.warn(`${e} listener(s) failed during notification`)}saveToHistory(t,e,i){this.historyIndex<this.history.length-1&&(this.history=this.history.slice(0,this.historyIndex+1));const s={patches:t,inversePatches:e,timestamp:Date.now()};i&&(s.description=i),this.history.push(s),this.historyIndex++,this.history.length>this.config.maxHistorySize&&(this.history.shift(),this.historyIndex--,this.logger.debug("History trimmed to max size",{maxSize:this.config.maxHistorySize}))}persistToLocal(){if(this.config.enablePersistence&&this.config.persistenceKey)try{const t={state:this.state,timestamp:Date.now(),version:"1.0.0",checksum:u(this.state)};localStorage.setItem(this.config.persistenceKey,JSON.stringify(t))}catch(t){this.logger.warn("Failed to persist state to localStorage",t)}}loadPersistedState(){if(!this.config.enablePersistence||!this.config.persistenceKey)return null;try{const t=localStorage.getItem(this.config.persistenceKey);if(!t)return null;const e=JSON.parse(t);if(e.checksum){const t=u(e.state);if(e.checksum!==t)return this.logger.warn("Persisted state checksum mismatch, ignoring"),null}return this.logger.debug("Loaded persisted state",{timestamp:e.timestamp,version:e.version}),e.state}catch(t){return this.logger.warn("Failed to load persisted state",t),null}}startAutoSave(){if(!this.config.enableAutoSave)return;const t=60*this.config.autoSaveInterval*1e3;this.autoSaveTimer=setInterval(async()=>{if(this.isDirty&&!this.isDestroyed)try{await this.forceSave()}catch(t){this.logger.error("Auto-save failed",t)}},t),this.logger.debug("Auto-save started",{intervalMinutes:this.config.autoSaveInterval})}restartAutoSave(){this.autoSaveTimer&&clearInterval(this.autoSaveTimer),this.startAutoSave()}};function d(t){const[e,i]=s(()=>t.getState());return r(()=>t.subscribe(i),[t]),{state:e,mutate:n((e,i)=>{t.mutate(e,i)},[t]),batch:n((e,i)=>{t.batch(e,i)},[t])}}function f(t,e,i){const[n,a]=s(()=>e(t.getState()));return r(()=>t.subscribe(t=>{const s=e(t);i?i(n,s)||a(s):n!==s&&a(s)}),[t,e,n,i]),n}function v(t){return{mutate:n((e,i)=>{t.mutate(e,i)},[t]),batch:n((e,i)=>{t.batch(e,i)},[t]),undo:n(()=>t.undo(),[t]),redo:n(()=>t.redo(),[t]),forceSave:n(async()=>t.forceSave(),[t]),loadFromServer:n(async()=>t.loadFromServerManually(),[t]),clearHistory:n(()=>{t.clearHistory()},[t])}}function y(t){const[e,i]=s(()=>t.getHistoryInfo());return r(()=>t.subscribe(()=>{i(t.getHistoryInfo())}),[t]),{...e,undo:n(()=>{const e=t.undo();return e&&i(t.getHistoryInfo()),e},[t]),redo:n(()=>{const e=t.redo();return e&&i(t.getHistoryInfo()),e},[t]),clearHistory:n(()=>{t.clearHistory(),i(t.getHistoryInfo())},[t])}}function m(t){const[e,i]=s(!1),[r,a]=s(!1),[o,h]=s(null),[c,u]=s(null),[l,d]=s(null),f=t.hasUnsavedChanges(),v=n(async()=>{if(e)return!1;i(!0),u(null);try{return await t.forceSave(),h(new Date),!0}catch(t){const e=t instanceof Error?t.message:"Save failed";return u(e),!1}finally{i(!1)}},[t,e]),y=n(async()=>{if(r)return!1;a(!0),d(null);try{const e=await t.loadFromServerManually();return e&&h(new Date),e}catch(t){const e=t instanceof Error?t.message:"Load failed";return d(e),!1}finally{a(!1)}},[t,r]),m=n(()=>{u(null)},[]),p=n(()=>{d(null)},[]);return{isSaving:e,isLoading:r,hasUnsavedChanges:f,lastSaved:o,saveError:c,loadError:l,clearSaveError:m,clearLoadError:p,save:v,load:y}}function p(t){const{state:e,mutate:i,batch:s}=d(t),r=v(t),n=y(t),a=m(t);return{state:e,mutate:i,batch:s,history:{canUndo:n.canUndo,canRedo:n.canRedo,historyLength:n.historyLength,currentIndex:n.currentIndex,lastAction:n.lastAction,memoryUsage:n.memoryUsage,undo:n.undo,redo:n.redo,clearHistory:n.clearHistory},persistence:{isSaving:a.isSaving,isLoading:a.isLoading,hasUnsavedChanges:a.hasUnsavedChanges,lastSaved:a.lastSaved,saveError:a.saveError,loadError:a.loadError,save:a.save,load:a.load,clearSaveError:a.clearSaveError,clearLoadError:a.clearLoadError},forceSave:r.forceSave,loadFromServer:r.loadFromServer}}function S(t){return{mutateOptimistic:n(async(e,i,s)=>{t.mutate(e,`${s} (optimistic)`);try{await i()}catch(e){throw t.undo(),e}},[t])}}function w(t,e=300){const[i]=s(()=>{let i;return(s,r)=>{clearTimeout(i),i=setTimeout(()=>{t.mutate(s,r)},e)}});return r(()=>()=>{clearTimeout(i)},[i]),{debouncedMutate:i}}function b(t,e,i=[]){r(()=>t.subscribe(e),[t,e,...i])}function g(t){const[e,i]=s(t);return r(()=>{if("object"==typeof t&&null!==t){const s=Object.keys(e),r=Object.keys(t);if(s.length!==r.length)return void i(t);for(const r of s)if(e[r]!==t[r])return void i(t)}else e!==t&&i(t)},[t,e]),e}function E(t){return{useState:()=>d(t),useSlice:(e,i)=>f(t,e,i),useActions:()=>v(t),useHistory:()=>y(t),usePersistence:()=>m(t),useComplete:()=>p(t),useOptimistic:()=>S(t),useDebounced:e=>w(t,e),useSubscription:(e,i)=>b(t,e,i)}}export{l as StateMachine,a as StateMachineError,h as StatePersistenceError,o as StateValidationError,E as createStateMachineHooks,w as useDebouncedStateUpdate,S as useOptimisticUpdate,g as useShallowEqual,v as useStateActions,y as useStateHistory,d as useStateMachine,p as useStateMachineFull,m as useStatePersist,f as useStateSlice,b as useStateSubscription};//# sourceMappingURL=index.mjs.map
1
+ import{enablePatches as t,produce as e,applyPatches as i}from"immer";import{useState as s,useEffect as r,useCallback as n}from"react";t();var a=class extends Error{constructor(t,e){super(t),this.name="StateMachineError",this.code=e}},o=class extends a{constructor(t){super(t,"VALIDATION_ERROR")}},h=class extends a{constructor(t){super(t,"PERSISTENCE_ERROR")}},c=t=>{try{return new Blob([JSON.stringify(t)]).size}catch{return 0}},u=t=>{try{const e=JSON.stringify(t);let i=0;for(let t=0;t<e.length;t++)i=(i<<5)-i+e.charCodeAt(t)&i;return i.toString(36)}catch{return""}},l=class{constructor(t){var e;this.listeners=new Set,this.history=[],this.historyIndex=-1,this.isDirty=!1,this.autoSaveTimer=null,this.isDestroyed=!1,this.validateConfig(t),this.config={initialState:t.initialState,persistenceKey:t.persistenceKey||null,autoSaveInterval:t.autoSaveInterval??5,maxHistorySize:t.maxHistorySize??50,enablePersistence:t.enablePersistence??!0,enableAutoSave:t.enableAutoSave??!0,enableLogging:t.enableLogging??!1,validateState:t.validateState??(()=>!0)},this.logger={debug:(e=this.config.enableLogging)?(t,...e)=>{}:()=>{},info:e?(t,...e)=>{}:()=>{},warn:e?(t,...e)=>{}:()=>{},error:e?(t,...e)=>{}:()=>{}},this.debouncedNotify=function(t){let e;return(...i)=>{clearTimeout(e),e=setTimeout(()=>t(...i),16)}}(()=>this.notifyListeners());try{this.state=this.loadPersistedState()||t.initialState,this.validateCurrentState()}catch(e){this.logger.warn("Failed to load persisted state, using initial state",e),this.state=t.initialState,this.validateCurrentState()}this.config.enableAutoSave&&this.startAutoSave(),this.logger.info("StateMachine initialized",{persistenceKey:this.config.persistenceKey,autoSaveInterval:this.config.autoSaveInterval,maxHistorySize:this.config.maxHistorySize})}async saveToServer(t){}async loadFromServer(){return null}getState(){return this.assertNotDestroyed(),this.state}subscribe(t){if(this.assertNotDestroyed(),"function"!=typeof t)throw new o("Listener must be a function");this.listeners.add(t);try{t(this.state)}catch(t){this.logger.error("Initial listener call failed",t)}return this.logger.debug("Listener subscribed",{totalListeners:this.listeners.size}),()=>{this.listeners.delete(t),this.logger.debug("Listener unsubscribed",{totalListeners:this.listeners.size})}}mutate(t,i){if(this.assertNotDestroyed(),"function"!=typeof t)throw new o("Recipe must be a function");try{let s=[],r=[];const n=e(this.state,t,(t,e)=>{s=t,r=e});s.length>0&&(this.validateState(n),this.saveToHistory(s,r,i),this.setState(n),this.logger.debug("State mutated",{description:i,patchCount:s.length,historySize:this.history.length}))}catch(t){if(this.logger.error("State mutation failed",{description:i,error:t}),t instanceof o)throw t;throw new a(`State mutation failed: ${t instanceof Error?t.message:"Unknown error"}`,"MUTATION_ERROR")}}batch(t,i){if(this.assertNotDestroyed(),!Array.isArray(t))throw new o("Mutations must be an array");if(0!==t.length)try{const s=[],r=[],n=t.reduce((t,i,n)=>{if("function"!=typeof i)throw new o(`Mutation at index ${n} must be a function`);let a=[],h=[];const c=e(t,i,(t,e)=>{a=t,h=e});return s.push(...a),r.unshift(...h),c},this.state);s.length>0&&(this.validateState(n),this.saveToHistory(s,r,i||"Batch operation"),this.setState(n),this.logger.debug("Batch operation completed",{description:i,mutationCount:t.length,patchCount:s.length}))}catch(t){throw this.logger.error("Batch operation failed",{description:i,error:t}),new a(`Batch operation failed: ${t instanceof Error?t.message:"Unknown error"}`,"BATCH_ERROR")}else this.logger.debug("Empty batch operation ignored")}undo(){if(this.assertNotDestroyed(),!this.canUndo())return this.logger.debug("Undo operation ignored - no history available"),!1;try{const t=this.history[this.historyIndex];if(!t)return!1;const e=i(this.state,t.inversePatches);return this.validateState(e),this.historyIndex--,this.setState(e,!1),this.logger.debug("Undo operation completed",{description:t.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Undo operation failed",t),!1}}redo(){if(this.assertNotDestroyed(),!this.canRedo())return this.logger.debug("Redo operation ignored - no future history available"),!1;try{this.historyIndex++;const t=this.history[this.historyIndex];if(!t)return this.historyIndex--,!1;const e=i(this.state,t.patches);return this.validateState(e),this.setState(e,!1),this.logger.debug("Redo operation completed",{description:t.description,newHistoryIndex:this.historyIndex}),!0}catch(t){return this.logger.error("Redo operation failed",t),this.historyIndex--,!1}}canUndo(){return this.historyIndex>=0}canRedo(){return this.historyIndex<this.history.length-1}getHistoryInfo(){return{canUndo:this.canUndo(),canRedo:this.canRedo(),historyLength:this.history.length,currentIndex:this.historyIndex,lastAction:this.history[this.historyIndex]?.description||null,memoryUsage:c(this.history)}}clearHistory(){this.assertNotDestroyed();const t=this.history.length;this.history=[],this.historyIndex=-1,this.logger.info("History cleared",{previousLength:t})}async forceSave(){if(this.assertNotDestroyed(),this.isDirty)try{this.logger.debug("Force save started"),await this.saveToServer(this.state),this.persistToLocal(),this.isDirty=!1,this.logger.info("Force save completed successfully")}catch(t){throw this.logger.error("Force save failed",t),new h(`Force save failed: ${t instanceof Error?t.message:"Unknown error"}`)}else this.logger.debug("Force save skipped - no changes")}hasUnsavedChanges(){return this.isDirty}setAutoSaveInterval(t){if(this.assertNotDestroyed(),"number"!=typeof t||t<=0)throw new o("Auto-save interval must be a positive number");this.config.autoSaveInterval=t,this.restartAutoSave(),this.logger.info("Auto-save interval updated",{minutes:t})}async loadFromServerManually(){this.assertNotDestroyed();try{this.logger.debug("Manual server load started");const t=await this.loadFromServer();return t?(this.validateState(t),this.state=t,this.isDirty=!1,this.clearHistory(),this.notifyListeners(),this.persistToLocal(),this.logger.info("Manual server load completed successfully"),!0):(this.logger.debug("No server state available"),!1)}catch(t){return this.logger.error("Manual server load failed",t),!1}}destroy(){this.isDestroyed||(this.logger.info("Destroying StateMachine"),this.isDestroyed=!0,this.listeners.clear(),this.autoSaveTimer&&(clearInterval(this.autoSaveTimer),this.autoSaveTimer=null),this.history=[],this.listeners=new Set,this.logger.info("StateMachine destroyed"))}setState(t,e=!0){this.state=t,e&&(this.isDirty=!0),this.debouncedNotify(),this.persistToLocal()}assertNotDestroyed(){if(this.isDestroyed)throw new a("Cannot operate on destroyed StateMachine","DESTROYED")}validateConfig(t){if(!t.initialState||"object"!=typeof t.initialState||null===t.initialState)throw new o("Initial state must be an object");if(void 0!==t.autoSaveInterval&&t.autoSaveInterval<=0)throw new o("Auto-save interval must be positive");if(void 0!==t.maxHistorySize&&t.maxHistorySize<=0)throw new o("Max history size must be positive")}validateCurrentState(){this.validateState(this.state)}validateState(t){if(!this.config.validateState(t))throw new o("State validation failed")}notifyListeners(){if(0===this.listeners.size)return;const t=this.state;let e=0;this.listeners.forEach(i=>{try{i(t)}catch(t){e++,this.logger.error("Listener notification failed",t)}}),e>0&&this.logger.warn(`${e} listener(s) failed during notification`)}saveToHistory(t,e,i){this.historyIndex<this.history.length-1&&(this.history=this.history.slice(0,this.historyIndex+1));const s={patches:t,inversePatches:e,timestamp:Date.now()};i&&(s.description=i),this.history.push(s),this.historyIndex++,this.history.length>this.config.maxHistorySize&&(this.history.shift(),this.historyIndex--,this.logger.debug("History trimmed to max size",{maxSize:this.config.maxHistorySize}))}persistToLocal(){if(this.config.enablePersistence&&this.config.persistenceKey)try{const t={state:this.state,timestamp:Date.now(),version:"1.0.0",checksum:u(this.state)};localStorage.setItem(this.config.persistenceKey,JSON.stringify(t))}catch(t){this.logger.warn("Failed to persist state to localStorage",t)}}loadPersistedState(){if(!this.config.enablePersistence||!this.config.persistenceKey)return null;try{const t=localStorage.getItem(this.config.persistenceKey);if(!t)return null;const e=JSON.parse(t);if(e.checksum){const t=u(e.state);if(e.checksum!==t)return this.logger.warn("Persisted state checksum mismatch, ignoring"),null}return this.logger.debug("Loaded persisted state",{timestamp:e.timestamp,version:e.version}),e.state}catch(t){return this.logger.warn("Failed to load persisted state",t),null}}startAutoSave(){if(!this.config.enableAutoSave)return;const t=60*this.config.autoSaveInterval*1e3;this.autoSaveTimer=setInterval(async()=>{if(this.isDirty&&!this.isDestroyed)try{await this.forceSave()}catch(t){this.logger.error("Auto-save failed",t)}},t),this.logger.debug("Auto-save started",{intervalMinutes:this.config.autoSaveInterval})}restartAutoSave(){this.autoSaveTimer&&clearInterval(this.autoSaveTimer),this.startAutoSave()}};function d(t){const[e,i]=s(()=>t.getState());return r(()=>t.subscribe(i),[t]),{state:e,mutate:n((e,i)=>{t.mutate(e,i)},[t]),batch:n((e,i)=>{t.batch(e,i)},[t])}}function f(t,e,i){const[n,a]=s(()=>e(t.getState()));return r(()=>t.subscribe(t=>{const s=e(t);i?i(n,s)||a(s):n!==s&&a(s)}),[t,e,n,i]),n}function v(t){return{mutate:n((e,i)=>{t.mutate(e,i)},[t]),batch:n((e,i)=>{t.batch(e,i)},[t]),undo:n(()=>t.undo(),[t]),redo:n(()=>t.redo(),[t]),forceSave:n(async()=>t.forceSave(),[t]),loadFromServer:n(async()=>t.loadFromServerManually(),[t]),clearHistory:n(()=>{t.clearHistory()},[t])}}function y(t){const[e,i]=s(()=>t.getHistoryInfo());return r(()=>t.subscribe(()=>{i(t.getHistoryInfo())}),[t]),{...e,undo:n(()=>{const e=t.undo();return e&&i(t.getHistoryInfo()),e},[t]),redo:n(()=>{const e=t.redo();return e&&i(t.getHistoryInfo()),e},[t]),clearHistory:n(()=>{t.clearHistory(),i(t.getHistoryInfo())},[t])}}function m(t){const[e,i]=s(!1),[r,a]=s(!1),[o,h]=s(null),[c,u]=s(null),[l,d]=s(null),f=t.hasUnsavedChanges(),v=n(async()=>{if(e)return!1;i(!0),u(null);try{return await t.forceSave(),h(new Date),!0}catch(t){const e=t instanceof Error?t.message:"Save failed";return u(e),!1}finally{i(!1)}},[t,e]),y=n(async()=>{if(r)return!1;a(!0),d(null);try{const e=await t.loadFromServerManually();return e&&h(new Date),e}catch(t){const e=t instanceof Error?t.message:"Load failed";return d(e),!1}finally{a(!1)}},[t,r]),m=n(()=>{u(null)},[]),p=n(()=>{d(null)},[]);return{isSaving:e,isLoading:r,hasUnsavedChanges:f,lastSaved:o,saveError:c,loadError:l,clearSaveError:m,clearLoadError:p,save:v,load:y}}function p(t){const{state:e,mutate:i,batch:s}=d(t),r=v(t),n=y(t),a=m(t);return{state:e,mutate:i,batch:s,history:{canUndo:n.canUndo,canRedo:n.canRedo,historyLength:n.historyLength,currentIndex:n.currentIndex,lastAction:n.lastAction,memoryUsage:n.memoryUsage,undo:n.undo,redo:n.redo,clearHistory:n.clearHistory},persistence:{isSaving:a.isSaving,isLoading:a.isLoading,hasUnsavedChanges:a.hasUnsavedChanges,lastSaved:a.lastSaved,saveError:a.saveError,loadError:a.loadError,save:a.save,load:a.load,clearSaveError:a.clearSaveError,clearLoadError:a.clearLoadError},forceSave:r.forceSave,loadFromServer:r.loadFromServer}}function S(t){return{mutateOptimistic:n(async(e,i,s)=>{t.mutate(e,`${s} (optimistic)`);try{await i()}catch(e){throw t.undo(),e}},[t])}}function w(t,e=300){const[i]=s(()=>{let i;return(s,r)=>{clearTimeout(i),i=setTimeout(()=>{t.mutate(s,r)},e)}});return r(()=>()=>{clearTimeout(i)},[i]),{debouncedMutate:i}}function b(t,e,i=[]){r(()=>t.subscribe(e),[t,e,...i])}function g(t){const[e,i]=s(t);return r(()=>{if("object"==typeof t&&null!==t){const s=Object.keys(e),r=Object.keys(t);if(s.length!==r.length)return void i(t);for(const r of s)if(e[r]!==t[r])return void i(t)}else e!==t&&i(t)},[t,e]),e}function E(t){return{useState:()=>d(t),useSlice:(e,i)=>f(t,e,i),useActions:()=>v(t),useHistory:()=>y(t),usePersistence:()=>m(t),useComplete:()=>p(t),useOptimistic:()=>S(t),useDebounced:e=>w(t,e),useSubscription:(e,i)=>b(t,e,i)}}export{l as StateMachine,a as StateMachineError,h as StatePersistenceError,o as StateValidationError,E as createStateMachineHooks,w as useDebouncedStateUpdate,S as useOptimisticUpdate,g as useShallowEqual,v as useStateActions,y as useStateHistory,d as useStateMachine,p as useStateMachineFull,m as useStatePersist,f as useStateSlice,b as useStateSubscription};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/machine.ts","../src/hooks.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * IMPORTS\n ***************************************************************************************************/\nimport { produce, enablePatches, applyPatches, type Patch, type Draft } from 'immer'\n\nenablePatches()\n\n/*\n * CONSTANTS\n ***************************************************************************************************/\nconst DEFAULT_AUTO_SAVE_INTERVAL = 5 // in minutes\nconst DEFAULT_MAX_HISTORY_SIZE = 50\nconst DEFAULT_VERSION = '1.0.0'\nconst NOTIFICATION_DEBOUNCE_MS = 16\n\n/*\n * ERROR TYPES\n ***************************************************************************************************/\nexport class StateMachineError extends Error {\n\tpublic readonly code: string\n\n\tconstructor(message: string, code: string) {\n\t\tsuper(message)\n\t\tthis.name = 'StateMachineError'\n\t\tthis.code = code\n\t}\n}\n\nexport class StateValidationError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALIDATION_ERROR')\n\t}\n}\n\nexport class StatePersistenceError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'PERSISTENCE_ERROR')\n\t}\n}\n\n/*\n * TYPES\n ***************************************************************************************************/\nexport interface StateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey?: string\n\tautoSaveInterval?: number\n\tmaxHistorySize?: number\n\tenablePersistence?: boolean\n\tenableAutoSave?: boolean\n\tenableLogging?: boolean\n\tvalidateState?: (state: T) => boolean\n}\n\ninterface InternalStateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey: string | null\n\tautoSaveInterval: number\n\tmaxHistorySize: number\n\tenablePersistence: boolean\n\tenableAutoSave: boolean\n\tenableLogging: boolean\n\tvalidateState: (state: T) => boolean\n}\n\nexport interface StateSnapshot {\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\ttimestamp: number\n\tdescription?: string\n}\n\nexport interface PersistedState<T> {\n\tstate: T\n\ttimestamp: number\n\tversion: string\n\tchecksum?: string\n}\n\nexport interface StateHistoryInfo {\n\tcanUndo: boolean\n\tcanRedo: boolean\n\thistoryLength: number\n\tcurrentIndex: number\n\tlastAction: string | null\n\tmemoryUsage: number\n}\n\n// Compact logger - will be optimized out in production builds\n/* eslint-disable no-console */\nconst createLogger = (enabled: boolean) => ({\n\tdebug: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.debug(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\tinfo: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.info(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\twarn: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.warn(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\terror: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.error(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n})\n/* eslint-enable no-console */\n\n/*\n * FUNCTIONS\n ***************************************************************************************************/\nfunction debounce<T extends (...args: unknown[]) => void>(func: T, wait: number): T {\n\tlet timeout: ReturnType<typeof setTimeout>\n\treturn ((...args: Parameters<T>) => {\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(() => func(...args), wait)\n\t}) as T\n}\n\n// Compact utility functions\nconst calculateMemoryUsage = (data: unknown): number => {\n\ttry {\n\t\treturn new Blob([JSON.stringify(data)]).size\n\t} catch {\n\t\treturn 0\n\t}\n}\n\nconst generateChecksum = (data: unknown): string => {\n\ttry {\n\t\tconst str = JSON.stringify(data)\n\t\tlet hash = 0\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\thash = ((hash << 5) - hash + str.charCodeAt(i)) & hash\n\t\t}\n\t\treturn hash.toString(36)\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/*\n * STATE MACHINE\n ***************************************************************************************************/\nexport abstract class StateMachine<T extends object> {\n\tprotected state: T\n\tprotected config: InternalStateConfig<T>\n\tprotected listeners: Set<(state: T) => void> = new Set()\n\tprotected history: StateSnapshot[] = []\n\tprotected historyIndex = -1\n\tprotected isDirty = false\n\tprotected autoSaveTimer: ReturnType<typeof setInterval> | null = null\n\tprotected isDestroyed = false\n\tprotected logger: ReturnType<typeof createLogger>\n\tprotected debouncedNotify: () => void\n\n\tconstructor(config: StateConfig<T>) {\n\t\tthis.validateConfig(config)\n\n\t\tthis.config = {\n\t\t\tinitialState: config.initialState,\n\t\t\tpersistenceKey: config.persistenceKey || null,\n\t\t\tautoSaveInterval: config.autoSaveInterval ?? DEFAULT_AUTO_SAVE_INTERVAL,\n\t\t\tmaxHistorySize: config.maxHistorySize ?? DEFAULT_MAX_HISTORY_SIZE,\n\t\t\tenablePersistence: config.enablePersistence ?? true,\n\t\t\tenableAutoSave: config.enableAutoSave ?? true,\n\t\t\tenableLogging: config.enableLogging ?? false,\n\t\t\tvalidateState: config.validateState ?? (() => true),\n\t\t}\n\n\t\tthis.logger = createLogger(this.config.enableLogging)\n\t\tthis.debouncedNotify = debounce(() => this.notifyListeners(), NOTIFICATION_DEBOUNCE_MS)\n\n\t\ttry {\n\t\t\tthis.state = this.loadPersistedState() || config.initialState\n\t\t\tthis.validateCurrentState()\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state, using initial state', error)\n\t\t\tthis.state = config.initialState\n\t\t\t// Validate the fallback initial state\n\t\t\tthis.validateCurrentState()\n\t\t}\n\n\t\tif (this.config.enableAutoSave) {\n\t\t\tthis.startAutoSave()\n\t\t}\n\n\t\tthis.logger.info('StateMachine initialized', {\n\t\t\tpersistenceKey: this.config.persistenceKey,\n\t\t\tautoSaveInterval: this.config.autoSaveInterval,\n\t\t\tmaxHistorySize: this.config.maxHistorySize,\n\t\t})\n\t}\n\n\t// TODO: Remove this and separate it from class in the future\n\tprotected abstract saveToServer(state: T): Promise<void>\n\tprotected abstract loadFromServer(): Promise<T | null>\n\n\t/*\n\t * PUBLIC\n\t ***************************************************************************************************/\n\n\t/*\n\t * CORE METHODS\n\t */\n\tpublic getState(): T {\n\t\tthis.assertNotDestroyed()\n\t\treturn this.state\n\t}\n\n\tpublic subscribe(listener: (state: T) => void): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof listener !== 'function') {\n\t\t\tthrow new StateValidationError('Listener must be a function')\n\t\t}\n\n\t\tthis.listeners.add(listener)\n\n\t\ttry {\n\t\t\tlistener(this.state)\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Initial listener call failed', error)\n\t\t}\n\n\t\tthis.logger.debug('Listener subscribed', {\n\t\t\ttotalListeners: this.listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t\tthis.logger.debug('Listener unsubscribed', {\n\t\t\t\ttotalListeners: this.listeners.size,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic mutate(recipe: (draft: Draft<T>) => void, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof recipe !== 'function') {\n\t\t\tthrow new StateValidationError('Recipe must be a function')\n\t\t}\n\n\t\ttry {\n\t\t\tlet patches: Patch[] = []\n\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\tconst nextState = produce(this.state, recipe, (p, ip) => {\n\t\t\t\tpatches = p\n\t\t\t\tinversePatches = ip\n\t\t\t})\n\n\t\t\tif (patches.length > 0) {\n\t\t\t\tthis.validateState(nextState)\n\t\t\t\tthis.saveToHistory(patches, inversePatches, description)\n\t\t\t\tthis.setState(nextState)\n\n\t\t\t\tthis.logger.debug('State mutated', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tpatchCount: patches.length,\n\t\t\t\t\thistorySize: this.history.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('State mutation failed', { description, error })\n\n\t\t\t// Re-throw validation errors without wrapping them\n\t\t\tif (error instanceof StateValidationError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`State mutation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'MUTATION_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic batch(mutations: Array<(draft: Draft<T>) => void>, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!Array.isArray(mutations)) {\n\t\t\tthrow new StateValidationError('Mutations must be an array')\n\t\t}\n\n\t\tif (mutations.length === 0) {\n\t\t\tthis.logger.debug('Empty batch operation ignored')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst allPatches: Patch[] = []\n\t\t\tconst allInversePatches: Patch[] = []\n\n\t\t\tconst finalState = mutations.reduce((currentState, recipe, index) => {\n\t\t\t\tif (typeof recipe !== 'function') {\n\t\t\t\t\tthrow new StateValidationError(`Mutation at index ${index} must be a function`)\n\t\t\t\t}\n\n\t\t\t\tlet patches: Patch[] = []\n\t\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\t\tconst nextState = produce(currentState, recipe, (p, ip) => {\n\t\t\t\t\tpatches = p\n\t\t\t\t\tinversePatches = ip\n\t\t\t\t})\n\n\t\t\t\tallPatches.push(...patches)\n\t\t\t\tallInversePatches.unshift(...inversePatches)\n\n\t\t\t\treturn nextState\n\t\t\t}, this.state)\n\n\t\t\tif (allPatches.length > 0) {\n\t\t\t\tthis.validateState(finalState)\n\t\t\t\tthis.saveToHistory(allPatches, allInversePatches, description || 'Batch operation')\n\t\t\t\tthis.setState(finalState)\n\n\t\t\t\tthis.logger.debug('Batch operation completed', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tmutationCount: mutations.length,\n\t\t\t\t\tpatchCount: allPatches.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Batch operation failed', { description, error })\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`Batch operation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'BATCH_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\t/*\n\t * UNDO/REDO METHODS\n\t */\n\tpublic undo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canUndo()) {\n\t\t\tthis.logger.debug('Undo operation ignored - no history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.inversePatches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.historyIndex--\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Undo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Undo operation failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic redo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canRedo()) {\n\t\t\tthis.logger.debug('Redo operation ignored - no future history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.historyIndex++\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\tthis.historyIndex--\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.patches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Redo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Redo operation failed', error)\n\t\t\tthis.historyIndex--\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic canUndo(): boolean {\n\t\treturn this.historyIndex >= 0\n\t}\n\n\tpublic canRedo(): boolean {\n\t\treturn this.historyIndex < this.history.length - 1\n\t}\n\n\t/*\n\t * HISTORY METHODS\n\t */\n\tpublic getHistoryInfo(): StateHistoryInfo {\n\t\treturn {\n\t\t\tcanUndo: this.canUndo(),\n\t\t\tcanRedo: this.canRedo(),\n\t\t\thistoryLength: this.history.length,\n\t\t\tcurrentIndex: this.historyIndex,\n\t\t\tlastAction: this.history[this.historyIndex]?.description || null,\n\t\t\tmemoryUsage: calculateMemoryUsage(this.history),\n\t\t}\n\t}\n\n\tpublic clearHistory(): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tconst oldLength = this.history.length\n\t\tthis.history = []\n\t\tthis.historyIndex = -1\n\n\t\tthis.logger.info('History cleared', { previousLength: oldLength })\n\t}\n\n\t/*\n\t * SAVE/LOAD METHODS\n\t */\n\tpublic async forceSave(): Promise<void> {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.isDirty) {\n\t\t\tthis.logger.debug('Force save skipped - no changes')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.logger.debug('Force save started')\n\n\t\t\tawait this.saveToServer(this.state)\n\t\t\tthis.persistToLocal()\n\t\t\tthis.isDirty = false\n\n\t\t\tthis.logger.info('Force save completed successfully')\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Force save failed', error)\n\t\t\tthrow new StatePersistenceError(\n\t\t\t\t`Force save failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic hasUnsavedChanges(): boolean {\n\t\treturn this.isDirty\n\t}\n\n\tpublic setAutoSaveInterval(minutes: number): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof minutes !== 'number' || minutes <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be a positive number')\n\t\t}\n\n\t\tthis.config.autoSaveInterval = minutes\n\t\tthis.restartAutoSave()\n\n\t\tthis.logger.info('Auto-save interval updated', { minutes })\n\t}\n\n\tpublic async loadFromServerManually(): Promise<boolean> {\n\t\tthis.assertNotDestroyed()\n\n\t\ttry {\n\t\t\tthis.logger.debug('Manual server load started')\n\n\t\t\tconst serverState = await this.loadFromServer()\n\t\t\tif (serverState) {\n\t\t\t\tthis.validateState(serverState)\n\t\t\t\tthis.state = serverState\n\t\t\t\tthis.isDirty = false\n\t\t\t\tthis.clearHistory()\n\t\t\t\tthis.notifyListeners()\n\t\t\t\tthis.persistToLocal()\n\n\t\t\t\tthis.logger.info('Manual server load completed successfully')\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.logger.debug('No server state available')\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Manual server load failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/*\n\t * CLEANUP METHODS\n\t */\n\tpublic destroy(): void {\n\t\tif (this.isDestroyed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.logger.info('Destroying StateMachine')\n\n\t\tthis.isDestroyed = true\n\t\tthis.listeners.clear()\n\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t\tthis.autoSaveTimer = null\n\t\t}\n\n\t\t// Clear references to help garbage collection\n\t\tthis.history = []\n\t\tthis.listeners = new Set()\n\n\t\tthis.logger.info('StateMachine destroyed')\n\t}\n\n\t/*\n\t * PROTECTED METHODS\n\t ***************************************************************************************************/\n\n\tprotected setState(newState: T, markDirty = true): void {\n\t\tthis.state = newState\n\n\t\tif (markDirty) {\n\t\t\tthis.isDirty = true\n\t\t}\n\n\t\tthis.debouncedNotify()\n\t\tthis.persistToLocal()\n\t}\n\n\t/*\n\t * PRIVATE METHODS\n\t ***************************************************************************************************/\n\n\t/*\n\t * STATE VALIDATION\n\t */\n\tprivate assertNotDestroyed(): void {\n\t\tif (this.isDestroyed) {\n\t\t\tthrow new StateMachineError('Cannot operate on destroyed StateMachine', 'DESTROYED')\n\t\t}\n\t}\n\n\tprivate validateConfig(config: StateConfig<T>): void {\n\t\tif (\n\t\t\t!config.initialState ||\n\t\t\ttypeof config.initialState !== 'object' ||\n\t\t\tconfig.initialState === null\n\t\t) {\n\t\t\tthrow new StateValidationError('Initial state must be an object')\n\t\t}\n\n\t\tif (config.autoSaveInterval !== undefined && config.autoSaveInterval <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be positive')\n\t\t}\n\n\t\tif (config.maxHistorySize !== undefined && config.maxHistorySize <= 0) {\n\t\t\tthrow new StateValidationError('Max history size must be positive')\n\t\t}\n\t}\n\n\tprivate validateCurrentState(): void {\n\t\tthis.validateState(this.state)\n\t}\n\n\tprotected validateState(state: T): void {\n\t\tif (!this.config.validateState(state)) {\n\t\t\tthrow new StateValidationError('State validation failed')\n\t\t}\n\t}\n\n\tprivate notifyListeners(): void {\n\t\tif (this.listeners.size === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frozenState = this.state\n\t\tlet errorCount = 0\n\n\t\tthis.listeners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(frozenState)\n\t\t\t} catch (error) {\n\t\t\t\terrorCount++\n\t\t\t\tthis.logger.error('Listener notification failed', error)\n\t\t\t}\n\t\t})\n\n\t\tif (errorCount > 0) {\n\t\t\tthis.logger.warn(`${errorCount} listener(s) failed during notification`)\n\t\t}\n\t}\n\n\t/*\n\t * HISTORY\n\t */\n\tprivate saveToHistory(patches: Patch[], inversePatches: Patch[], description?: string): void {\n\t\tif (this.historyIndex < this.history.length - 1) {\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1)\n\t\t}\n\n\t\tconst snapshot: StateSnapshot = {\n\t\t\tpatches,\n\t\t\tinversePatches,\n\t\t\ttimestamp: Date.now(),\n\t\t}\n\n\t\tif (description) {\n\t\t\tsnapshot.description = description\n\t\t}\n\n\t\tthis.history.push(snapshot)\n\n\t\tthis.historyIndex++\n\n\t\tif (this.history.length > this.config.maxHistorySize) {\n\t\t\tthis.history.shift()\n\t\t\tthis.historyIndex--\n\t\t\tthis.logger.debug('History trimmed to max size', {\n\t\t\t\tmaxSize: this.config.maxHistorySize,\n\t\t\t})\n\t\t}\n\t}\n\n\t/*\n\t * PERSISTENCE\n\t */\n\tprivate persistToLocal(): void {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedState: PersistedState<T> = {\n\t\t\t\tstate: this.state,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tversion: DEFAULT_VERSION,\n\t\t\t\tchecksum: generateChecksum(this.state),\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(this.config.persistenceKey, JSON.stringify(persistedState))\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to persist state to localStorage', error)\n\t\t}\n\t}\n\n\tprivate loadPersistedState(): T | null {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(this.config.persistenceKey)\n\t\t\tif (!stored) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst persistedState: PersistedState<T> = JSON.parse(stored)\n\n\t\t\t// Validate checksum if present\n\t\t\tif (persistedState.checksum) {\n\t\t\t\tconst expectedChecksum = generateChecksum(persistedState.state)\n\t\t\t\tif (persistedState.checksum !== expectedChecksum) {\n\t\t\t\t\tthis.logger.warn('Persisted state checksum mismatch, ignoring')\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.debug('Loaded persisted state', {\n\t\t\t\ttimestamp: persistedState.timestamp,\n\t\t\t\tversion: persistedState.version,\n\t\t\t})\n\n\t\t\treturn persistedState.state\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state', error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/*\n\t * AUTO SAVE\n\t */\n\tprivate startAutoSave(): void {\n\t\tif (!this.config.enableAutoSave) {\n\t\t\treturn\n\t\t}\n\n\t\tconst interval = this.config.autoSaveInterval * 60 * 1000\n\n\t\tthis.autoSaveTimer = setInterval(async () => {\n\t\t\tif (this.isDirty && !this.isDestroyed) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.forceSave()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error('Auto-save failed', error)\n\t\t\t\t}\n\t\t\t}\n\t\t}, interval)\n\n\t\tthis.logger.debug('Auto-save started', {\n\t\t\tintervalMinutes: this.config.autoSaveInterval,\n\t\t})\n\t}\n\n\tprivate restartAutoSave(): void {\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t}\n\t\tthis.startAutoSave()\n\t}\n}\n","/*\n * IMPORTS\n ***************************************************************************************************/\nimport { type DependencyList, useEffect, useState, useCallback } from 'react'\nimport { StateMachine, type StateHistoryInfo } from './machine'\n\n/*\n * TYPES\n ***************************************************************************************************/\nimport type { Draft } from 'immer'\n\n/*\n * HOOKS\n ***************************************************************************************************/\n\n/**\n * Basic hook to subscribe to a StateMachine instance\n */\nexport function useStateMachine<T extends object>(engine: StateMachine<T>) {\n\tconst [state, setState] = useState(() => engine.getState())\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(setState)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t}\n}\n\n/**\n * Hook to subscribe to a specific slice of state with a selector function\n */\nexport function useStateSlice<T extends object, TSelected>(\n\tengine: StateMachine<T>,\n\tselector: (state: T) => TSelected,\n\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n) {\n\tconst [selectedState, setSelectedState] = useState(() => selector(engine.getState()))\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(newState => {\n\t\t\tconst newSelected = selector(newState)\n\n\t\t\tif (equalityFn) {\n\t\t\t\tif (!equalityFn(selectedState, newSelected)) {\n\t\t\t\t\tsetSelectedState(newSelected)\n\t\t\t\t}\n\t\t\t} else if (selectedState !== newSelected) {\n\t\t\t\tsetSelectedState(newSelected)\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [engine, selector, selectedState, equalityFn])\n\n\treturn selectedState\n}\n\n/**\n * Hook that provides StateMachine actions/methods\n */\nexport function useStateActions<T extends object>(engine: StateMachine<T>) {\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst undo = useCallback(() => {\n\t\treturn engine.undo()\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\treturn engine.redo()\n\t}, [engine])\n\n\tconst forceSave = useCallback(async () => {\n\t\treturn engine.forceSave()\n\t}, [engine])\n\n\tconst loadFromServer = useCallback(async () => {\n\t\treturn engine.loadFromServerManually()\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t}, [engine])\n\n\treturn {\n\t\tmutate,\n\t\tbatch,\n\t\tundo,\n\t\tredo,\n\t\tforceSave,\n\t\tloadFromServer,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook specifically for undo/redo functionality\n */\nexport function useStateHistory<T extends object>(engine: StateMachine<T>) {\n\tconst [historyInfo, setHistoryInfo] = useState<StateHistoryInfo>(() => engine.getHistoryInfo())\n\n\tuseEffect(() => {\n\t\tconst updateHistory = () => {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\n\t\tconst unsubscribe = engine.subscribe(updateHistory)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst undo = useCallback(() => {\n\t\tconst success = engine.undo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\tconst success = engine.redo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t}, [engine])\n\n\treturn {\n\t\t...historyInfo,\n\t\tundo,\n\t\tredo,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for managing save/load state and persistence\n */\nexport function useStatePersist<T extends object>(engine: StateMachine<T>) {\n\tconst [isSaving, setIsSaving] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [lastSaved, setLastSaved] = useState<Date | null>(null)\n\tconst [saveError, setSaveError] = useState<string | null>(null)\n\tconst [loadError, setLoadError] = useState<string | null>(null)\n\n\tconst hasUnsavedChanges = engine.hasUnsavedChanges()\n\n\tconst save = useCallback(async () => {\n\t\tif (isSaving) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsSaving(true)\n\t\tsetSaveError(null)\n\n\t\ttry {\n\t\t\tawait engine.forceSave()\n\t\t\tsetLastSaved(new Date())\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Save failed'\n\t\t\tsetSaveError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsSaving(false)\n\t\t}\n\t}, [engine, isSaving])\n\n\tconst load = useCallback(async () => {\n\t\tif (isLoading) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsLoading(true)\n\t\tsetLoadError(null)\n\n\t\ttry {\n\t\t\tconst success = await engine.loadFromServerManually()\n\t\t\tif (success) {\n\t\t\t\tsetLastSaved(new Date())\n\t\t\t}\n\t\t\treturn success\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Load failed'\n\t\t\tsetLoadError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [engine, isLoading])\n\n\tconst clearSaveError = useCallback(() => {\n\t\tsetSaveError(null)\n\t}, [])\n\n\tconst clearLoadError = useCallback(() => {\n\t\tsetLoadError(null)\n\t}, [])\n\n\treturn {\n\t\tisSaving,\n\t\tisLoading,\n\t\thasUnsavedChanges,\n\t\tlastSaved,\n\t\tsaveError,\n\t\tloadError,\n\t\tclearSaveError,\n\t\tclearLoadError,\n\t\tsave,\n\t\tload,\n\t}\n}\n\n/**\n * Comprehensive hook that combines all StateMachine functionality\n */\nexport function useStateMachineFull<T extends object>(engine: StateMachine<T>) {\n\tconst { state, mutate, batch } = useStateMachine(engine)\n\tconst actions = useStateActions(engine)\n\tconst history = useStateHistory(engine)\n\tconst persistence = useStatePersist(engine)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t\thistory: {\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\thistoryLength: history.historyLength,\n\t\t\tcurrentIndex: history.currentIndex,\n\t\t\tlastAction: history.lastAction,\n\t\t\tmemoryUsage: history.memoryUsage,\n\t\t\tundo: history.undo,\n\t\t\tredo: history.redo,\n\t\t\tclearHistory: history.clearHistory,\n\t\t},\n\t\tpersistence: {\n\t\t\tisSaving: persistence.isSaving,\n\t\t\tisLoading: persistence.isLoading,\n\t\t\thasUnsavedChanges: persistence.hasUnsavedChanges,\n\t\t\tlastSaved: persistence.lastSaved,\n\t\t\tsaveError: persistence.saveError,\n\t\t\tloadError: persistence.loadError,\n\t\t\tsave: persistence.save,\n\t\t\tload: persistence.load,\n\t\t\tclearSaveError: persistence.clearSaveError,\n\t\t\tclearLoadError: persistence.clearLoadError,\n\t\t},\n\t\tforceSave: actions.forceSave,\n\t\tloadFromServer: actions.loadFromServer,\n\t}\n}\n\n/**\n * Hook for creating optimistic updates with automatic rollback on failure\n * -- Still testing this, I'm not sure if this is a good solution.\n */\nexport function useOptimisticUpdate<T extends object>(engine: StateMachine<T>) {\n\tconst mutateOptimistic = useCallback(\n\t\tasync (\n\t\t\toptimisticUpdate: (draft: Draft<T>) => void,\n\t\t\tserverUpdate: () => Promise<void>,\n\t\t\tdescription?: string\n\t\t) => {\n\t\t\t// Apply optimistic update\n\t\t\tengine.mutate(optimisticUpdate, `${description} (optimistic)`)\n\n\t\t\ttry {\n\t\t\t\t// Attempt server update\n\t\t\t\tawait serverUpdate()\n\t\t\t\t// If successful, the optimistic update stands\n\t\t\t} catch (error) {\n\t\t\t\t// If failed, undo the optimistic update\n\t\t\t\tengine.undo()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn { mutateOptimistic }\n}\n\n/**\n * Hook for debounced state updates (useful for search inputs, etc.)\n */\nexport function useDebouncedStateUpdate<T extends object>(engine: StateMachine<T>, delay = 300) {\n\tconst [debouncedMutate] = useState(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\treturn (recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tengine.mutate(recipe, description)\n\t\t\t}, delay)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearTimeout(debouncedMutate as unknown as ReturnType<typeof setTimeout>)\n\t\t}\n\t}, [debouncedMutate])\n\n\treturn { debouncedMutate }\n}\n\n/**\n * Hook for subscribing to state changes with cleanup on component unmount\n */\nexport function useStateSubscription<T extends object>(\n\tengine: StateMachine<T>,\n\tcallback: (state: T) => void,\n\tdeps: DependencyList = []\n) {\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(callback)\n\t\treturn unsubscribe\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [engine, callback, ...deps])\n}\n\n/**\n * Utility hook for shallow equality comparison\n */\nexport function useShallowEqual<T>(value: T): T {\n\tconst [state, setState] = useState(value)\n\n\tuseEffect(() => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tconst keys1 = Object.keys(state as Record<string, unknown>)\n\t\t\tconst keys2 = Object.keys(value as Record<string, unknown>)\n\n\t\t\tif (keys1.length !== keys2.length) {\n\t\t\t\tsetState(value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor (const key of keys1) {\n\t\t\t\tif (\n\t\t\t\t\t(state as Record<string, unknown>)[key] !==\n\t\t\t\t\t(value as Record<string, unknown>)[key]\n\t\t\t\t) {\n\t\t\t\t\tsetState(value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state !== value) {\n\t\t\tsetState(value)\n\t\t}\n\t}, [value, state])\n\n\treturn state\n}\n\n/**\n * Factory function to create typed hooks for a specific StateMachine\n */\nexport function createStateMachineHooks<T extends object>(engine: StateMachine<T>) {\n\treturn {\n\t\tuseState: () => useStateMachine(engine),\n\t\tuseSlice: <TSelected>(\n\t\t\tselector: (state: T) => TSelected,\n\t\t\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n\t\t) => useStateSlice(engine, selector, equalityFn),\n\t\tuseActions: () => useStateActions(engine),\n\t\tuseHistory: () => useStateHistory(engine),\n\t\tusePersistence: () => useStatePersist(engine),\n\t\tuseComplete: () => useStateMachineFull(engine),\n\t\tuseOptimistic: () => useOptimisticUpdate(engine),\n\t\tuseDebounced: (delay?: number) => useDebouncedStateUpdate(engine, delay),\n\t\tuseSubscription: (callback: (state: T) => void, deps?: DependencyList) =>\n\t\t\tuseStateSubscription(engine, callback, deps),\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/machine.ts","../src/hooks.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * IMPORTS\n ***************************************************************************************************/\nimport { produce, enablePatches, applyPatches, type Patch, type Draft } from 'immer'\n\nenablePatches()\n\n/*\n * CONSTANTS\n ***************************************************************************************************/\nconst DEFAULT_AUTO_SAVE_INTERVAL = 5 // in minutes\nconst DEFAULT_MAX_HISTORY_SIZE = 50\nconst DEFAULT_VERSION = '1.0.0'\nconst NOTIFICATION_DEBOUNCE_MS = 16\n\n/*\n * ERROR TYPES\n ***************************************************************************************************/\nexport class StateMachineError extends Error {\n\tpublic readonly code: string\n\n\tconstructor(message: string, code: string) {\n\t\tsuper(message)\n\t\tthis.name = 'StateMachineError'\n\t\tthis.code = code\n\t}\n}\n\nexport class StateValidationError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALIDATION_ERROR')\n\t}\n}\n\nexport class StatePersistenceError extends StateMachineError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'PERSISTENCE_ERROR')\n\t}\n}\n\n/*\n * TYPES\n ***************************************************************************************************/\nexport interface StateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey?: string\n\tautoSaveInterval?: number\n\tmaxHistorySize?: number\n\tenablePersistence?: boolean\n\tenableAutoSave?: boolean\n\tenableLogging?: boolean\n\tvalidateState?: (state: T) => boolean\n}\n\ninterface InternalStateConfig<T extends object> {\n\tinitialState: T\n\tpersistenceKey: string | null\n\tautoSaveInterval: number\n\tmaxHistorySize: number\n\tenablePersistence: boolean\n\tenableAutoSave: boolean\n\tenableLogging: boolean\n\tvalidateState: (state: T) => boolean\n}\n\nexport interface StateSnapshot {\n\tpatches: Patch[]\n\tinversePatches: Patch[]\n\ttimestamp: number\n\tdescription?: string\n}\n\nexport interface PersistedState<T> {\n\tstate: T\n\ttimestamp: number\n\tversion: string\n\tchecksum?: string\n}\n\nexport interface StateHistoryInfo {\n\tcanUndo: boolean\n\tcanRedo: boolean\n\thistoryLength: number\n\tcurrentIndex: number\n\tlastAction: string | null\n\tmemoryUsage: number\n}\n\n// Compact logger - will be optimized out in production builds\n/* eslint-disable no-console */\nconst createLogger = (enabled: boolean) => ({\n\tdebug: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.debug(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\tinfo: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.info(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\twarn: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.warn(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n\terror: enabled\n\t\t? (msg: string, ...args: unknown[]) => console.error(`[StateMachine] ${msg}`, ...args)\n\t\t: () => {},\n})\n/* eslint-enable no-console */\n\n/*\n * FUNCTIONS\n ***************************************************************************************************/\nfunction debounce<T extends (...args: unknown[]) => void>(func: T, wait: number): T {\n\tlet timeout: ReturnType<typeof setTimeout>\n\treturn ((...args: Parameters<T>) => {\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(() => func(...args), wait)\n\t}) as T\n}\n\n// Compact utility functions\nconst calculateMemoryUsage = (data: unknown): number => {\n\ttry {\n\t\treturn new Blob([JSON.stringify(data)]).size\n\t} catch {\n\t\treturn 0\n\t}\n}\n\nconst generateChecksum = (data: unknown): string => {\n\ttry {\n\t\tconst str = JSON.stringify(data)\n\t\tlet hash = 0\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\thash = ((hash << 5) - hash + str.charCodeAt(i)) & hash\n\t\t}\n\t\treturn hash.toString(36)\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/*\n * STATE MACHINE\n ***************************************************************************************************/\nexport abstract class StateMachine<T extends object> {\n\tprotected state: T\n\tprotected config: InternalStateConfig<T>\n\tprotected listeners: Set<(state: T) => void> = new Set()\n\tprotected history: StateSnapshot[] = []\n\tprotected historyIndex = -1\n\tprotected isDirty = false\n\tprotected autoSaveTimer: ReturnType<typeof setInterval> | null = null\n\tprotected isDestroyed = false\n\tprotected logger: ReturnType<typeof createLogger>\n\tprotected debouncedNotify: () => void\n\n\tconstructor(config: StateConfig<T>) {\n\t\tthis.validateConfig(config)\n\n\t\tthis.config = {\n\t\t\tinitialState: config.initialState,\n\t\t\tpersistenceKey: config.persistenceKey || null,\n\t\t\tautoSaveInterval: config.autoSaveInterval ?? DEFAULT_AUTO_SAVE_INTERVAL,\n\t\t\tmaxHistorySize: config.maxHistorySize ?? DEFAULT_MAX_HISTORY_SIZE,\n\t\t\tenablePersistence: config.enablePersistence ?? true,\n\t\t\tenableAutoSave: config.enableAutoSave ?? true,\n\t\t\tenableLogging: config.enableLogging ?? false,\n\t\t\tvalidateState: config.validateState ?? (() => true),\n\t\t}\n\n\t\tthis.logger = createLogger(this.config.enableLogging)\n\t\tthis.debouncedNotify = debounce(() => this.notifyListeners(), NOTIFICATION_DEBOUNCE_MS)\n\n\t\ttry {\n\t\t\tthis.state = this.loadPersistedState() || config.initialState\n\t\t\tthis.validateCurrentState()\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state, using initial state', error)\n\t\t\tthis.state = config.initialState\n\t\t\t// Validate the fallback initial state\n\t\t\tthis.validateCurrentState()\n\t\t}\n\n\t\tif (this.config.enableAutoSave) {\n\t\t\tthis.startAutoSave()\n\t\t}\n\n\t\tthis.logger.info('StateMachine initialized', {\n\t\t\tpersistenceKey: this.config.persistenceKey,\n\t\t\tautoSaveInterval: this.config.autoSaveInterval,\n\t\t\tmaxHistorySize: this.config.maxHistorySize,\n\t\t})\n\t}\n\n\tprotected async saveToServer(_state: T): Promise<void> {}\n\tprotected async loadFromServer(): Promise<T | null> {\n\t\treturn null\n\t}\n\n\t/*\n\t * PUBLIC\n\t ***************************************************************************************************/\n\n\t/*\n\t * CORE METHODS\n\t */\n\tpublic getState(): T {\n\t\tthis.assertNotDestroyed()\n\t\treturn this.state\n\t}\n\n\tpublic subscribe(listener: (state: T) => void): () => void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof listener !== 'function') {\n\t\t\tthrow new StateValidationError('Listener must be a function')\n\t\t}\n\n\t\tthis.listeners.add(listener)\n\n\t\ttry {\n\t\t\tlistener(this.state)\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Initial listener call failed', error)\n\t\t}\n\n\t\tthis.logger.debug('Listener subscribed', {\n\t\t\ttotalListeners: this.listeners.size,\n\t\t})\n\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t\tthis.logger.debug('Listener unsubscribed', {\n\t\t\t\ttotalListeners: this.listeners.size,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic mutate(recipe: (draft: Draft<T>) => void, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof recipe !== 'function') {\n\t\t\tthrow new StateValidationError('Recipe must be a function')\n\t\t}\n\n\t\ttry {\n\t\t\tlet patches: Patch[] = []\n\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\tconst nextState = produce(this.state, recipe, (p, ip) => {\n\t\t\t\tpatches = p\n\t\t\t\tinversePatches = ip\n\t\t\t})\n\n\t\t\tif (patches.length > 0) {\n\t\t\t\tthis.validateState(nextState)\n\t\t\t\tthis.saveToHistory(patches, inversePatches, description)\n\t\t\t\tthis.setState(nextState)\n\n\t\t\t\tthis.logger.debug('State mutated', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tpatchCount: patches.length,\n\t\t\t\t\thistorySize: this.history.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('State mutation failed', { description, error })\n\n\t\t\t// Re-throw validation errors without wrapping them\n\t\t\tif (error instanceof StateValidationError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`State mutation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'MUTATION_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic batch(mutations: Array<(draft: Draft<T>) => void>, description?: string): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!Array.isArray(mutations)) {\n\t\t\tthrow new StateValidationError('Mutations must be an array')\n\t\t}\n\n\t\tif (mutations.length === 0) {\n\t\t\tthis.logger.debug('Empty batch operation ignored')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst allPatches: Patch[] = []\n\t\t\tconst allInversePatches: Patch[] = []\n\n\t\t\tconst finalState = mutations.reduce((currentState, recipe, index) => {\n\t\t\t\tif (typeof recipe !== 'function') {\n\t\t\t\t\tthrow new StateValidationError(`Mutation at index ${index} must be a function`)\n\t\t\t\t}\n\n\t\t\t\tlet patches: Patch[] = []\n\t\t\t\tlet inversePatches: Patch[] = []\n\n\t\t\t\tconst nextState = produce(currentState, recipe, (p, ip) => {\n\t\t\t\t\tpatches = p\n\t\t\t\t\tinversePatches = ip\n\t\t\t\t})\n\n\t\t\t\tallPatches.push(...patches)\n\t\t\t\tallInversePatches.unshift(...inversePatches)\n\n\t\t\t\treturn nextState\n\t\t\t}, this.state)\n\n\t\t\tif (allPatches.length > 0) {\n\t\t\t\tthis.validateState(finalState)\n\t\t\t\tthis.saveToHistory(allPatches, allInversePatches, description || 'Batch operation')\n\t\t\t\tthis.setState(finalState)\n\n\t\t\t\tthis.logger.debug('Batch operation completed', {\n\t\t\t\t\tdescription,\n\t\t\t\t\tmutationCount: mutations.length,\n\t\t\t\t\tpatchCount: allPatches.length,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Batch operation failed', { description, error })\n\t\t\tthrow new StateMachineError(\n\t\t\t\t`Batch operation failed: ${\n\t\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t}`,\n\t\t\t\t'BATCH_ERROR'\n\t\t\t)\n\t\t}\n\t}\n\n\t/*\n\t * UNDO/REDO METHODS\n\t */\n\tpublic undo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canUndo()) {\n\t\t\tthis.logger.debug('Undo operation ignored - no history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.inversePatches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.historyIndex--\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Undo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Undo operation failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic redo(): boolean {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.canRedo()) {\n\t\t\tthis.logger.debug('Redo operation ignored - no future history available')\n\t\t\treturn false\n\t\t}\n\n\t\ttry {\n\t\t\tthis.historyIndex++\n\t\t\tconst snapshot = this.history[this.historyIndex]\n\t\t\tif (!snapshot) {\n\t\t\t\tthis.historyIndex--\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst newState = applyPatches(this.state, snapshot.patches) as T\n\n\t\t\tthis.validateState(newState)\n\t\t\tthis.setState(newState, false)\n\n\t\t\tthis.logger.debug('Redo operation completed', {\n\t\t\t\tdescription: snapshot.description,\n\t\t\t\tnewHistoryIndex: this.historyIndex,\n\t\t\t})\n\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Redo operation failed', error)\n\t\t\tthis.historyIndex--\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpublic canUndo(): boolean {\n\t\treturn this.historyIndex >= 0\n\t}\n\n\tpublic canRedo(): boolean {\n\t\treturn this.historyIndex < this.history.length - 1\n\t}\n\n\t/*\n\t * HISTORY METHODS\n\t */\n\tpublic getHistoryInfo(): StateHistoryInfo {\n\t\treturn {\n\t\t\tcanUndo: this.canUndo(),\n\t\t\tcanRedo: this.canRedo(),\n\t\t\thistoryLength: this.history.length,\n\t\t\tcurrentIndex: this.historyIndex,\n\t\t\tlastAction: this.history[this.historyIndex]?.description || null,\n\t\t\tmemoryUsage: calculateMemoryUsage(this.history),\n\t\t}\n\t}\n\n\tpublic clearHistory(): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tconst oldLength = this.history.length\n\t\tthis.history = []\n\t\tthis.historyIndex = -1\n\n\t\tthis.logger.info('History cleared', { previousLength: oldLength })\n\t}\n\n\t/*\n\t * SAVE/LOAD METHODS\n\t */\n\tpublic async forceSave(): Promise<void> {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (!this.isDirty) {\n\t\t\tthis.logger.debug('Force save skipped - no changes')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.logger.debug('Force save started')\n\n\t\t\tawait this.saveToServer(this.state)\n\t\t\tthis.persistToLocal()\n\t\t\tthis.isDirty = false\n\n\t\t\tthis.logger.info('Force save completed successfully')\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Force save failed', error)\n\t\t\tthrow new StatePersistenceError(\n\t\t\t\t`Force save failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic hasUnsavedChanges(): boolean {\n\t\treturn this.isDirty\n\t}\n\n\tpublic setAutoSaveInterval(minutes: number): void {\n\t\tthis.assertNotDestroyed()\n\n\t\tif (typeof minutes !== 'number' || minutes <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be a positive number')\n\t\t}\n\n\t\tthis.config.autoSaveInterval = minutes\n\t\tthis.restartAutoSave()\n\n\t\tthis.logger.info('Auto-save interval updated', { minutes })\n\t}\n\n\tpublic async loadFromServerManually(): Promise<boolean> {\n\t\tthis.assertNotDestroyed()\n\n\t\ttry {\n\t\t\tthis.logger.debug('Manual server load started')\n\n\t\t\tconst serverState = await this.loadFromServer()\n\t\t\tif (serverState) {\n\t\t\t\tthis.validateState(serverState)\n\t\t\t\tthis.state = serverState\n\t\t\t\tthis.isDirty = false\n\t\t\t\tthis.clearHistory()\n\t\t\t\tthis.notifyListeners()\n\t\t\t\tthis.persistToLocal()\n\n\t\t\t\tthis.logger.info('Manual server load completed successfully')\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.logger.debug('No server state available')\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Manual server load failed', error)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/*\n\t * CLEANUP METHODS\n\t */\n\tpublic destroy(): void {\n\t\tif (this.isDestroyed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.logger.info('Destroying StateMachine')\n\n\t\tthis.isDestroyed = true\n\t\tthis.listeners.clear()\n\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t\tthis.autoSaveTimer = null\n\t\t}\n\n\t\t// Clear references to help garbage collection\n\t\tthis.history = []\n\t\tthis.listeners = new Set()\n\n\t\tthis.logger.info('StateMachine destroyed')\n\t}\n\n\t/*\n\t * PROTECTED METHODS\n\t ***************************************************************************************************/\n\n\tprotected setState(newState: T, markDirty = true): void {\n\t\tthis.state = newState\n\n\t\tif (markDirty) {\n\t\t\tthis.isDirty = true\n\t\t}\n\n\t\tthis.debouncedNotify()\n\t\tthis.persistToLocal()\n\t}\n\n\t/*\n\t * PRIVATE METHODS\n\t ***************************************************************************************************/\n\n\t/*\n\t * STATE VALIDATION\n\t */\n\tprivate assertNotDestroyed(): void {\n\t\tif (this.isDestroyed) {\n\t\t\tthrow new StateMachineError('Cannot operate on destroyed StateMachine', 'DESTROYED')\n\t\t}\n\t}\n\n\tprivate validateConfig(config: StateConfig<T>): void {\n\t\tif (\n\t\t\t!config.initialState ||\n\t\t\ttypeof config.initialState !== 'object' ||\n\t\t\tconfig.initialState === null\n\t\t) {\n\t\t\tthrow new StateValidationError('Initial state must be an object')\n\t\t}\n\n\t\tif (config.autoSaveInterval !== undefined && config.autoSaveInterval <= 0) {\n\t\t\tthrow new StateValidationError('Auto-save interval must be positive')\n\t\t}\n\n\t\tif (config.maxHistorySize !== undefined && config.maxHistorySize <= 0) {\n\t\t\tthrow new StateValidationError('Max history size must be positive')\n\t\t}\n\t}\n\n\tprivate validateCurrentState(): void {\n\t\tthis.validateState(this.state)\n\t}\n\n\tprotected validateState(state: T): void {\n\t\tif (!this.config.validateState(state)) {\n\t\t\tthrow new StateValidationError('State validation failed')\n\t\t}\n\t}\n\n\tprivate notifyListeners(): void {\n\t\tif (this.listeners.size === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst frozenState = this.state\n\t\tlet errorCount = 0\n\n\t\tthis.listeners.forEach(listener => {\n\t\t\ttry {\n\t\t\t\tlistener(frozenState)\n\t\t\t} catch (error) {\n\t\t\t\terrorCount++\n\t\t\t\tthis.logger.error('Listener notification failed', error)\n\t\t\t}\n\t\t})\n\n\t\tif (errorCount > 0) {\n\t\t\tthis.logger.warn(`${errorCount} listener(s) failed during notification`)\n\t\t}\n\t}\n\n\t/*\n\t * HISTORY\n\t */\n\tprivate saveToHistory(patches: Patch[], inversePatches: Patch[], description?: string): void {\n\t\tif (this.historyIndex < this.history.length - 1) {\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1)\n\t\t}\n\n\t\tconst snapshot: StateSnapshot = {\n\t\t\tpatches,\n\t\t\tinversePatches,\n\t\t\ttimestamp: Date.now(),\n\t\t}\n\n\t\tif (description) {\n\t\t\tsnapshot.description = description\n\t\t}\n\n\t\tthis.history.push(snapshot)\n\n\t\tthis.historyIndex++\n\n\t\tif (this.history.length > this.config.maxHistorySize) {\n\t\t\tthis.history.shift()\n\t\t\tthis.historyIndex--\n\t\t\tthis.logger.debug('History trimmed to max size', {\n\t\t\t\tmaxSize: this.config.maxHistorySize,\n\t\t\t})\n\t\t}\n\t}\n\n\t/*\n\t * PERSISTENCE\n\t */\n\tprivate persistToLocal(): void {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedState: PersistedState<T> = {\n\t\t\t\tstate: this.state,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tversion: DEFAULT_VERSION,\n\t\t\t\tchecksum: generateChecksum(this.state),\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(this.config.persistenceKey, JSON.stringify(persistedState))\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to persist state to localStorage', error)\n\t\t}\n\t}\n\n\tprivate loadPersistedState(): T | null {\n\t\tif (!this.config.enablePersistence || !this.config.persistenceKey) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem(this.config.persistenceKey)\n\t\t\tif (!stored) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst persistedState: PersistedState<T> = JSON.parse(stored)\n\n\t\t\t// Validate checksum if present\n\t\t\tif (persistedState.checksum) {\n\t\t\t\tconst expectedChecksum = generateChecksum(persistedState.state)\n\t\t\t\tif (persistedState.checksum !== expectedChecksum) {\n\t\t\t\t\tthis.logger.warn('Persisted state checksum mismatch, ignoring')\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.debug('Loaded persisted state', {\n\t\t\t\ttimestamp: persistedState.timestamp,\n\t\t\t\tversion: persistedState.version,\n\t\t\t})\n\n\t\t\treturn persistedState.state\n\t\t} catch (error) {\n\t\t\tthis.logger.warn('Failed to load persisted state', error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/*\n\t * AUTO SAVE\n\t */\n\tprivate startAutoSave(): void {\n\t\tif (!this.config.enableAutoSave) {\n\t\t\treturn\n\t\t}\n\n\t\tconst interval = this.config.autoSaveInterval * 60 * 1000\n\n\t\tthis.autoSaveTimer = setInterval(async () => {\n\t\t\tif (this.isDirty && !this.isDestroyed) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.forceSave()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error('Auto-save failed', error)\n\t\t\t\t}\n\t\t\t}\n\t\t}, interval)\n\n\t\tthis.logger.debug('Auto-save started', {\n\t\t\tintervalMinutes: this.config.autoSaveInterval,\n\t\t})\n\t}\n\n\tprivate restartAutoSave(): void {\n\t\tif (this.autoSaveTimer) {\n\t\t\tclearInterval(this.autoSaveTimer)\n\t\t}\n\t\tthis.startAutoSave()\n\t}\n}\n","/*\n * IMPORTS\n ***************************************************************************************************/\nimport { type DependencyList, useEffect, useState, useCallback } from 'react'\nimport { StateMachine, type StateHistoryInfo } from './machine'\n\n/*\n * TYPES\n ***************************************************************************************************/\nimport type { Draft } from 'immer'\n\n/*\n * HOOKS\n ***************************************************************************************************/\n\n/**\n * Basic hook to subscribe to a StateMachine instance\n */\nexport function useStateMachine<T extends object>(engine: StateMachine<T>) {\n\tconst [state, setState] = useState(() => engine.getState())\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(setState)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t}\n}\n\n/**\n * Hook to subscribe to a specific slice of state with a selector function\n */\nexport function useStateSlice<T extends object, TSelected>(\n\tengine: StateMachine<T>,\n\tselector: (state: T) => TSelected,\n\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n) {\n\tconst [selectedState, setSelectedState] = useState(() => selector(engine.getState()))\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(newState => {\n\t\t\tconst newSelected = selector(newState)\n\n\t\t\tif (equalityFn) {\n\t\t\t\tif (!equalityFn(selectedState, newSelected)) {\n\t\t\t\t\tsetSelectedState(newSelected)\n\t\t\t\t}\n\t\t\t} else if (selectedState !== newSelected) {\n\t\t\t\tsetSelectedState(newSelected)\n\t\t\t}\n\t\t})\n\n\t\treturn unsubscribe\n\t}, [engine, selector, selectedState, equalityFn])\n\n\treturn selectedState\n}\n\n/**\n * Hook that provides StateMachine actions/methods\n */\nexport function useStateActions<T extends object>(engine: StateMachine<T>) {\n\tconst mutate = useCallback(\n\t\t(recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tengine.mutate(recipe, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst batch = useCallback(\n\t\t(mutations: Array<(draft: Draft<T>) => void>, description?: string) => {\n\t\t\tengine.batch(mutations, description)\n\t\t},\n\t\t[engine]\n\t)\n\n\tconst undo = useCallback(() => {\n\t\treturn engine.undo()\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\treturn engine.redo()\n\t}, [engine])\n\n\tconst forceSave = useCallback(async () => {\n\t\treturn engine.forceSave()\n\t}, [engine])\n\n\tconst loadFromServer = useCallback(async () => {\n\t\treturn engine.loadFromServerManually()\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t}, [engine])\n\n\treturn {\n\t\tmutate,\n\t\tbatch,\n\t\tundo,\n\t\tredo,\n\t\tforceSave,\n\t\tloadFromServer,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook specifically for undo/redo functionality\n */\nexport function useStateHistory<T extends object>(engine: StateMachine<T>) {\n\tconst [historyInfo, setHistoryInfo] = useState<StateHistoryInfo>(() => engine.getHistoryInfo())\n\n\tuseEffect(() => {\n\t\tconst updateHistory = () => {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\n\t\tconst unsubscribe = engine.subscribe(updateHistory)\n\t\treturn unsubscribe\n\t}, [engine])\n\n\tconst undo = useCallback(() => {\n\t\tconst success = engine.undo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst redo = useCallback(() => {\n\t\tconst success = engine.redo()\n\t\tif (success) {\n\t\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t\t}\n\t\treturn success\n\t}, [engine])\n\n\tconst clearHistory = useCallback(() => {\n\t\tengine.clearHistory()\n\t\tsetHistoryInfo(engine.getHistoryInfo())\n\t}, [engine])\n\n\treturn {\n\t\t...historyInfo,\n\t\tundo,\n\t\tredo,\n\t\tclearHistory,\n\t}\n}\n\n/**\n * Hook for managing save/load state and persistence\n */\nexport function useStatePersist<T extends object>(engine: StateMachine<T>) {\n\tconst [isSaving, setIsSaving] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [lastSaved, setLastSaved] = useState<Date | null>(null)\n\tconst [saveError, setSaveError] = useState<string | null>(null)\n\tconst [loadError, setLoadError] = useState<string | null>(null)\n\n\tconst hasUnsavedChanges = engine.hasUnsavedChanges()\n\n\tconst save = useCallback(async () => {\n\t\tif (isSaving) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsSaving(true)\n\t\tsetSaveError(null)\n\n\t\ttry {\n\t\t\tawait engine.forceSave()\n\t\t\tsetLastSaved(new Date())\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Save failed'\n\t\t\tsetSaveError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsSaving(false)\n\t\t}\n\t}, [engine, isSaving])\n\n\tconst load = useCallback(async () => {\n\t\tif (isLoading) {\n\t\t\treturn false\n\t\t}\n\n\t\tsetIsLoading(true)\n\t\tsetLoadError(null)\n\n\t\ttry {\n\t\t\tconst success = await engine.loadFromServerManually()\n\t\t\tif (success) {\n\t\t\t\tsetLastSaved(new Date())\n\t\t\t}\n\t\t\treturn success\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Load failed'\n\t\t\tsetLoadError(errorMessage)\n\t\t\treturn false\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [engine, isLoading])\n\n\tconst clearSaveError = useCallback(() => {\n\t\tsetSaveError(null)\n\t}, [])\n\n\tconst clearLoadError = useCallback(() => {\n\t\tsetLoadError(null)\n\t}, [])\n\n\treturn {\n\t\tisSaving,\n\t\tisLoading,\n\t\thasUnsavedChanges,\n\t\tlastSaved,\n\t\tsaveError,\n\t\tloadError,\n\t\tclearSaveError,\n\t\tclearLoadError,\n\t\tsave,\n\t\tload,\n\t}\n}\n\n/**\n * Comprehensive hook that combines all StateMachine functionality\n */\nexport function useStateMachineFull<T extends object>(engine: StateMachine<T>) {\n\tconst { state, mutate, batch } = useStateMachine(engine)\n\tconst actions = useStateActions(engine)\n\tconst history = useStateHistory(engine)\n\tconst persistence = useStatePersist(engine)\n\n\treturn {\n\t\tstate,\n\t\tmutate,\n\t\tbatch,\n\t\thistory: {\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\thistoryLength: history.historyLength,\n\t\t\tcurrentIndex: history.currentIndex,\n\t\t\tlastAction: history.lastAction,\n\t\t\tmemoryUsage: history.memoryUsage,\n\t\t\tundo: history.undo,\n\t\t\tredo: history.redo,\n\t\t\tclearHistory: history.clearHistory,\n\t\t},\n\t\tpersistence: {\n\t\t\tisSaving: persistence.isSaving,\n\t\t\tisLoading: persistence.isLoading,\n\t\t\thasUnsavedChanges: persistence.hasUnsavedChanges,\n\t\t\tlastSaved: persistence.lastSaved,\n\t\t\tsaveError: persistence.saveError,\n\t\t\tloadError: persistence.loadError,\n\t\t\tsave: persistence.save,\n\t\t\tload: persistence.load,\n\t\t\tclearSaveError: persistence.clearSaveError,\n\t\t\tclearLoadError: persistence.clearLoadError,\n\t\t},\n\t\tforceSave: actions.forceSave,\n\t\tloadFromServer: actions.loadFromServer,\n\t}\n}\n\n/**\n * Hook for creating optimistic updates with automatic rollback on failure\n * -- Still testing this, I'm not sure if this is a good solution.\n */\nexport function useOptimisticUpdate<T extends object>(engine: StateMachine<T>) {\n\tconst mutateOptimistic = useCallback(\n\t\tasync (\n\t\t\toptimisticUpdate: (draft: Draft<T>) => void,\n\t\t\tserverUpdate: () => Promise<void>,\n\t\t\tdescription?: string\n\t\t) => {\n\t\t\t// Apply optimistic update\n\t\t\tengine.mutate(optimisticUpdate, `${description} (optimistic)`)\n\n\t\t\ttry {\n\t\t\t\t// Attempt server update\n\t\t\t\tawait serverUpdate()\n\t\t\t\t// If successful, the optimistic update stands\n\t\t\t} catch (error) {\n\t\t\t\t// If failed, undo the optimistic update\n\t\t\t\tengine.undo()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t[engine]\n\t)\n\n\treturn { mutateOptimistic }\n}\n\n/**\n * Hook for debounced state updates (useful for search inputs, etc.)\n */\nexport function useDebouncedStateUpdate<T extends object>(engine: StateMachine<T>, delay = 300) {\n\tconst [debouncedMutate] = useState(() => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\treturn (recipe: (draft: Draft<T>) => void, description?: string) => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tengine.mutate(recipe, description)\n\t\t\t}, delay)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclearTimeout(debouncedMutate as unknown as ReturnType<typeof setTimeout>)\n\t\t}\n\t}, [debouncedMutate])\n\n\treturn { debouncedMutate }\n}\n\n/**\n * Hook for subscribing to state changes with cleanup on component unmount\n */\nexport function useStateSubscription<T extends object>(\n\tengine: StateMachine<T>,\n\tcallback: (state: T) => void,\n\tdeps: DependencyList = []\n) {\n\tuseEffect(() => {\n\t\tconst unsubscribe = engine.subscribe(callback)\n\t\treturn unsubscribe\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [engine, callback, ...deps])\n}\n\n/**\n * Utility hook for shallow equality comparison\n */\nexport function useShallowEqual<T>(value: T): T {\n\tconst [state, setState] = useState(value)\n\n\tuseEffect(() => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tconst keys1 = Object.keys(state as Record<string, unknown>)\n\t\t\tconst keys2 = Object.keys(value as Record<string, unknown>)\n\n\t\t\tif (keys1.length !== keys2.length) {\n\t\t\t\tsetState(value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor (const key of keys1) {\n\t\t\t\tif (\n\t\t\t\t\t(state as Record<string, unknown>)[key] !==\n\t\t\t\t\t(value as Record<string, unknown>)[key]\n\t\t\t\t) {\n\t\t\t\t\tsetState(value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (state !== value) {\n\t\t\tsetState(value)\n\t\t}\n\t}, [value, state])\n\n\treturn state\n}\n\n/**\n * Factory function to create typed hooks for a specific StateMachine\n */\nexport function createStateMachineHooks<T extends object>(engine: StateMachine<T>) {\n\treturn {\n\t\tuseState: () => useStateMachine(engine),\n\t\tuseSlice: <TSelected>(\n\t\t\tselector: (state: T) => TSelected,\n\t\t\tequalityFn?: (a: TSelected, b: TSelected) => boolean\n\t\t) => useStateSlice(engine, selector, equalityFn),\n\t\tuseActions: () => useStateActions(engine),\n\t\tuseHistory: () => useStateHistory(engine),\n\t\tusePersistence: () => useStatePersist(engine),\n\t\tuseComplete: () => useStateMachineFull(engine),\n\t\tuseOptimistic: () => useOptimisticUpdate(engine),\n\t\tuseDebounced: (delay?: number) => useDebouncedStateUpdate(engine, delay),\n\t\tuseSubscription: (callback: (state: T) => void, deps?: DependencyList) =>\n\t\t\tuseStateSubscription(engine, callback, deps),\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bkincz/clutch",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "A production-ready, TypeScript-first state management library built on Immer with advanced features",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
package/readme.md CHANGED
@@ -13,14 +13,14 @@ Thought I'd put it here for anyone that might want to use it as well.
13
13
 
14
14
  ## Features
15
15
 
16
- - ๐Ÿ”„ **Immutable Updates** - Powered by Immer for clean, mutable-style code that produces immutable state
17
- - โช **Undo/Redo** - Built-in history management using efficient patch-based storage
18
- - ๐Ÿ’พ **Persistence** - Automatic localStorage backup with optional server synchronization
19
- - ๐Ÿš€ **Performance** - Debounced notifications, memory tracking, and efficient batch operations
20
- - ๐Ÿ›ก๏ธ **Type Safety** - Full TypeScript support with runtime validation
21
- - ๐Ÿ” **Debugging** - Comprehensive logging system with structured output
22
- - ๐Ÿงน **Memory Management** - Automatic cleanup and configurable history limits
23
- - โšก **Auto-Save** - Configurable automatic persistence to prevent data loss
16
+ - **Immutable Updates** - Powered by Immer for clean, mutable-style code that produces immutable state
17
+ - **Undo/Redo** - Built-in history management using efficient patch-based storage
18
+ - **Persistence** - Automatic localStorage backup with optional server synchronization
19
+ - **Performance** - Debounced notifications, memory tracking, and efficient batch operations
20
+ - **Type Safety** - Full TypeScript support with runtime validation
21
+ - **Debugging** - Comprehensive logging system with structured output
22
+ - **Memory Management** - Automatic cleanup and configurable history limits
23
+ - **Auto-Save** - Configurable automatic persistence to prevent data loss
24
24
 
25
25
  ## Installation
26
26
 
@@ -65,7 +65,7 @@ class TodoState extends StateMachine<AppState> {
65
65
  });
66
66
  }
67
67
 
68
- // Optional: implement server persistence
68
+ // Optional: Override these methods only if you need server persistence
69
69
  protected async saveToServer(state: AppState): Promise<void> {
70
70
  await fetch("/api/state", {
71
71
  method: "POST",
@@ -181,7 +181,7 @@ function UndoRedoButtons() {
181
181
 
182
182
  ### Batch Operations
183
183
 
184
- Group multiple changes into a single undo operation:
184
+ Group multiple changes into a single operation:
185
185
 
186
186
  ```typescript
187
187
  state.batch([