@saws/powersync-service 2.0.0-beta.3 → 2.0.0-beta.4

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.
@@ -0,0 +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.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2024.d.ts","../../../node_modules/typescript/lib/lib.es2025.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.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../../node_modules/typescript/lib/lib.es2025.collection.d.ts","../../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../../node_modules/typescript/lib/lib.es2025.intl.d.ts","../../../node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../../node_modules/typescript/lib/lib.es2025.promise.d.ts","../../../node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../core/dist/utils/stage-outputs.d.ts","../../core/dist/secrets-manager.d.ts","../../core/dist/servicedefinition.d.ts","../../core/dist/find-service-definition.d.ts","../../core/dist/get-saws-config.d.ts","../../core/dist/host-readiness.d.ts","../../core/dist/host.d.ts","../../core/dist/index.d.ts","../../core/dist/utils/dependency-management.d.ts","../../core/dist/utils/file-exists.d.ts","../../docker-service/dist/dockerservice.d.ts","../../docker-service/dist/index.d.ts","../../../node_modules/commander/typings/index.d.ts","../../postgres-service/dist/postgresservice.d.ts","../../postgres-service/dist/index.d.ts","../src/powersync-command.ts","../src/powersyncservice.ts","../src/index.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/blob.d.ts","../../../node_modules/@types/node/web-globals/console.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/encoding.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.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-stats.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/round-robin-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/dispatcher1-wrapper.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.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/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/socks5-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/cache-interceptor.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/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/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/importmeta.d.ts","../../../node_modules/@types/node/web-globals/messaging.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/performance.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/web-globals/timers.d.ts","../../../node_modules/@types/node/web-globals/url.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/events.d.ts","../../../node_modules/@types/node/ffi.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/inspector.generated.d.ts","../../../node_modules/@types/node/inspector/promises.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/path/posix.d.ts","../../../node_modules/@types/node/path/win32.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/quic.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/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/iter.d.ts","../../../node_modules/@types/node/stream/promises.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/test/reporters.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/util/types.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/zlib/iter.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/find-package-json/package-json.d.ts","../../../node_modules/@types/find-package-json/index.d.ts"],"fileIdsList":[[99,164,172,177,180,182,183,184,196,223,224],[99,164,172,177,180,182,183,184,196],[99,161,162,164,172,177,180,182,183,184,196],[99,163,164,172,177,180,182,183,184,196],[164,172,177,180,182,183,184,196],[99,164,172,177,180,182,183,184,196,205],[99,164,165,170,172,175,177,180,182,183,184,186,196,201,214],[99,164,165,166,172,175,177,180,182,183,184,196],[99,164,167,172,177,180,182,183,184,196,215],[99,164,168,169,172,177,180,182,183,184,187,196],[99,164,169,172,177,180,182,183,184,196,201,211],[99,164,170,172,175,177,180,182,183,184,186,196],[99,163,164,171,172,177,180,182,183,184,196],[99,164,172,173,177,180,182,183,184,196],[99,164,172,174,175,177,180,182,183,184,196],[99,163,164,172,175,177,180,182,183,184,196],[99,164,172,175,177,178,180,182,183,184,196,201,214],[99,164,172,175,177,178,180,182,183,184,196,201,203,205],[99,151,164,172,175,177,179,180,182,183,184,186,196,201,214],[99,164,172,175,177,179,180,182,183,184,186,196,201,211,214],[99,164,172,177,179,180,181,182,183,184,196,201,211,214],[98,99,100,101,102,103,104,105,106,107,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222],[99,164,172,175,177,180,182,183,184,196],[99,164,172,177,180,182,184,196],[99,164,172,177,180,182,183,184,185,196,214],[99,164,172,175,177,180,182,183,184,186,196,201],[99,164,172,177,180,182,183,184,187,196],[99,164,172,177,180,182,183,184,188,196],[99,164,172,175,177,180,182,183,184,191,196],[99,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221],[99,164,172,177,180,182,183,184,193,196],[99,164,172,177,180,182,183,184,194,196],[99,164,169,172,177,180,182,183,184,186,196,205],[99,164,172,175,177,180,182,183,184,196,197],[99,164,172,177,180,182,183,184,196,198,215,218],[99,164,172,175,177,180,182,183,184,196,201,203,204,205],[99,164,172,177,180,182,183,184,196,202,205],[99,164,172,175,177,180,182,183,184,196,201,203],[99,164,172,175,177,180,182,183,184,196,201,204,205],[99,164,172,177,180,182,183,184,196,205,215],[99,164,172,177,180,182,183,184,196,206],[99,161,164,172,177,180,182,183,184,196,201,208,214],[99,164,172,177,180,182,183,184,196,201,207],[99,164,172,175,177,180,182,183,184,196,209,210],[99,164,172,177,180,182,183,184,196,209,210],[99,164,169,172,177,180,182,183,184,186,196,201,211],[99,164,172,177,180,182,183,184,196,212],[99,164,172,177,180,182,183,184,186,196,213],[99,164,172,177,179,180,182,183,184,194,196,214],[99,164,172,177,180,182,183,184,196,215,216],[99,164,169,172,177,180,182,183,184,196,216],[99,164,172,177,180,182,183,184,196,201,217],[99,164,172,177,180,182,183,184,185,196,218],[99,164,172,177,180,182,183,184,196,219],[99,164,167,172,177,180,182,183,184,196],[99,164,169,172,177,180,182,183,184,196],[99,164,172,177,180,182,183,184,196,215],[99,151,164,172,177,180,182,183,184,196],[99,164,172,177,180,182,183,184,196,214],[99,164,172,177,180,182,183,184,196,220],[99,164,172,177,180,182,183,184,191,196],[99,164,172,177,180,182,183,184,196,210],[99,151,164,172,175,177,178,180,182,183,184,191,196,201,205,214,217,218,220],[99,164,172,177,180,182,183,184,196,201,221],[99,164,172,177,180,182,183,184,196,203,222],[99,114,117,120,121,164,172,177,180,182,183,184,196,214],[99,117,164,172,177,180,182,183,184,196,201,214],[99,117,121,164,172,177,180,182,183,184,196,214],[99,164,172,177,180,182,183,184,196,201],[99,111,164,172,177,180,182,183,184,196],[99,115,164,172,177,180,182,183,184,196],[99,113,114,117,164,172,177,180,182,183,184,196,214],[99,164,172,177,180,182,183,184,186,196,211],[99,164,172,177,180,182,183,184,196,223],[99,111,164,172,177,180,182,183,184,196,223],[99,113,117,164,172,177,180,182,183,184,186,196,214],[99,108,109,110,112,116,164,172,175,177,180,182,183,184,196,201,214],[99,117,164,172,177,180,182,183,184,196],[99,117,126,135,164,172,177,180,182,183,184,196],[99,109,115,164,172,177,180,182,183,184,196],[99,117,145,146,164,172,177,180,182,183,184,196],[99,109,112,117,164,172,177,180,182,183,184,196,205,214,223],[99,113,117,164,172,177,180,182,183,184,196,214],[99,108,164,172,177,180,182,183,184,196],[99,111,112,113,115,116,117,118,119,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,146,147,148,149,150,164,172,177,180,182,183,184,196],[99,117,138,141,164,172,177,180,182,183,184,196],[99,117,126,128,129,164,172,177,180,182,183,184,196],[99,115,117,128,130,164,172,177,180,182,183,184,196],[99,116,164,172,177,180,182,183,184,196],[99,109,111,117,164,172,177,180,182,183,184,196],[99,117,121,128,130,164,172,177,180,182,183,184,196],[99,121,164,172,177,180,182,183,184,196],[99,115,117,120,164,172,177,180,182,183,184,196,214],[99,109,113,117,126,164,172,177,180,182,183,184,196],[99,117,138,164,172,177,180,182,183,184,196],[99,130,164,172,177,180,182,183,184,196],[99,109,113,117,121,164,172,177,180,182,183,184,196],[99,111,117,145,164,172,177,180,182,183,184,196,205,220,223],[82,99,164,172,177,180,182,183,184,196],[81,85,99,164,172,177,180,182,183,184,196],[81,82,83,84,85,86,99,164,172,177,180,182,183,184,196],[80,81,99,164,172,177,180,182,183,184,196,201],[87,99,164,165,172,177,180,182,183,184,196],[90,99,164,172,177,180,182,183,184,196],[93,99,164,172,177,180,182,183,184,196],[87,91,92,99,164,172,177,180,182,183,184,196],[96,99,164,172,177,180,182,183,184,196],[92,96,99,164,165,172,177,180,182,183,184,188,196],[87,88,89,91,94,95,99,164,172,177,178,180,182,183,184,188,196]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"b507173a7718609bb52011f33e6fc61b0f3de62ec38c935b38dcfbb68223dea9","impliedFormat":99},{"version":"b9d885dfb75202756c7faa24450a3ea7060f90fc117304d795259e2d5efe005f","impliedFormat":99},{"version":"3789554e1c1858074a46986f5dba69fba14bc649e2e26ad63f4d32e30c7d0467","impliedFormat":99},{"version":"d5f72b73663996558032aae95128fd1c003dbc2a3c7c9616a4b9582885554547","impliedFormat":99},{"version":"e57056025ca2a90d0a3af80fca4a0b31e83e5325c80b4207cee4546521bad645","impliedFormat":99},{"version":"d096b43d56e50a815348abdc7f505bff20b7326edd25d5ceab70be8ae550b216","impliedFormat":99},{"version":"f4b14039ec5893b0c7691e5695493a13207b5a6e7ea07e9d58fe3f112e9e87fd","impliedFormat":99},{"version":"b83a9041067ced394f3cd30aa56868504af4110a549c98f236671c6d2d9e08b6","impliedFormat":99},{"version":"f65327e250d4fbac1ad1b516c28c5ec07e112cde36839a71ff88712c0bf67a9e","impliedFormat":99},{"version":"cb5c7d71525f231186e6533d1777efaca83cc03f270ba9f723ee8e4eb6e502d2","impliedFormat":99},{"version":"6ded66792fd0074ca73e8e18c4a9b6bef729f9d25b125b1d6af94a793c6fd836","impliedFormat":99},{"version":"41c2effc93c4a7c1143353cdd450d9f8b91c091630764c5654727bcb5af3cfce","impliedFormat":99},{"version":"a6005262ef9ae5d7325a381df594d6b35babfb6df4a89c4febd06e6101d05bc1","impliedFormat":99},{"version":"9694552ae6739725fca4e20caa855f657a9dd893c37372a154b43472abc3c94d","impliedFormat":99},{"version":"6263cce5dbfb94becf003f5fe050254e82ab24d218222cbed30b2e4e5df7ce24","impliedFormat":99},{"version":"05565403decf2a78a40641f475548dbad0cbd1db6d9e8ed1792ef33eba6928d7","signature":"781d65f4fc4361c544566c445fa1577bf7ae58eef2e37d91d4bd4715e9e21eff","impliedFormat":99},{"version":"4ed72b34dd9cb98e80fdc7a1f2279a08cc6e147e7c464a5b5d12e0e6985b753c","signature":"b108d0350d9b7d03795d7c26a3c94aa5243ee667a39457c8f2a4fb058e304ed1","impliedFormat":99},{"version":"fb6fc24e5c7b0025320f3a1ab680ef9478a63c934f9779a801fcf813a4b4c96d","impliedFormat":99},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"3ac40516c33b87f751f7507346933081a26cdb8a3e11a6b3aa07d23f803c85db","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"14e9acf826baba0ef4b5665704084896e7bcc06f65a9ab13af7e93d27d6b7069","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"829bc57ee8f287b490ab5bbc5a962fca57e432c1e38ec680ecd3ecaf12800613","impliedFormat":1},{"version":"eec76bf6b9346f3f95fa402621b889489e96930e72295b0369022f332e9b4a6a","impliedFormat":1},{"version":"3a3ff14da53d5013f3e6d8c4ad55225e3649c08786c4421ce639c00d8d589b7d","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"d243db6b25788f439e7e2f03c05688e92f46764351673bb0e7b2f3631232e186","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"9ac977503f15bf13ca7c82ad9a32a782f42d43e474824e8b3bffe228fd5f2639","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"7cb4f431a4591b0e23002bed805dc871a874dfed6b9a3994dce68a6df73e6739","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"2e6fca0024dd8a076a886d9ec031a936ea59ad878a25b944820495d92f8381dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"177459cba484e2f1e08872a3d2fdbca3162d9d43ca5ec9dc0c946835b55f74be","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"0e312260895afc9de021ce9de3c8a857392f0ccc7f19d3a030e4d6136a4ac91e","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"98fc7231d6c846a8ed19bdef026ddffe5e2182cc818be74899287421ad370a87","impliedFormat":1},{"version":"3a40b5d34e014017539acb92f04cf2bc0aa71e49efb33c66039df93be97842a1","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"79a85c64bf083c5f4dd7074e804d1000c0c47301b84d48417a224decd681be30","impliedFormat":1},{"version":"9f1e3a76d5f509b5579e567de522b402cb79e201c4f47dcd014451c0580b290d","impliedFormat":1},{"version":"2ddab5b6932f9a6327f71baeb82a1d6b0824e0d23a4c7a5de5d355857113c22f","impliedFormat":1},{"version":"70f3f8b2dcaf7388f26731a59c79437813e3620b594903525a303cb2a7901016","impliedFormat":1},{"version":"62e8f884c3bc6dff6189b6e662ebe8b238a645938f2df7a97b8a82fca56773a4","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"57a0d1b3d59063d4af2d3f8aac27cfe3c20a0f5d1faf0f8598ccf0b779637939","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"93ecf87143cac7b9d05cffc1d6bdc075b7e4fdd48ff05f1fad85043f6ae678d3","impliedFormat":1},{"version":"6f200afcb82b3e9a54bed6db23f2edf2508cd266801257312c0f124b47f2bdb9","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"39338f84e8c4d0e3de7b3c4a7024fb3925f42100eed5cbe73be58902799dff4d","impliedFormat":1},{"version":"fbf83eb33bf5e329527add92acc65da59323876c702ddccf5f4bf1e848c92369","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"515318bc6e656f75e9e34db625316bfafbafd800dfb1642574af93735a24ad38","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"03b7804d69cecd66850abada858ed6d4a59001f8c228a9fe212306ee860a4ff6","impliedFormat":1},{"version":"5b26c4dd672d88336bb929787c9bfb55119e80ba89ec6dc923da1c063892843e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"987fd1f85dc36f4b2c927aa3db814ac6b452e970f4f55d24ed4ecbb7df09be00","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"b4769767f13a1692a66186e01c3aa186ff808d5ff72ed36eda8c37738fb2ac92","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"683edfc4f2b411ebe04729cb6dc09ddd26fbac2c57771a6d7c55964af776e176","impliedFormat":1},{"version":"1ec3f3a5f04cc42df33274fbe5c0937d9a9e06f249a7a26288d7d54f0763ffd4","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"e47f532d6e1617833f13a5b0710c0089d402c89c2f2b54f324e5a20e418d287a","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"7ec8d7d483f7394f9da611b10d3a0e402f76ff5c991261e6ce43a15f81ca4258","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"82c3cc48c692438e41b94d936b8acd75ca97b18c50fa1af8a0715eb9d07d18cd","impliedFormat":1},{"version":"045a210189ec63c5488410b33f9fca53d77d051599d0d6506d8048551399c5f3","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"632c45ccb4cdc2c3a80c7a36a63dd7763016e59cac5e07bfb3e37e3548957028","impliedFormat":1},{"version":"c9a2daf6cd1eb854cd5b9e424247c5e306692055738c2effd35f7871d942b76e","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"e50a7130339a951e6da9e968ed5521b0997a5b0479e148914087213839b5474c","impliedFormat":1},{"version":"990db7c9743d636fd3b2820ec8c40b512879da4c82e00488e7a352e2d005fc39","impliedFormat":1},{"version":"f091ed534c92e6408336f94323ecfe1890c0b5e0166154120712ed97ac9754a1","impliedFormat":1}],"root":[[95,97]],"options":{"composite":true,"esModuleInterop":true,"module":199,"outDir":"./","rootDir":"../src","skipLibCheck":true,"target":12,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[225,1],[224,2],[161,3],[162,3],[163,4],[99,5],[164,6],[165,7],[166,8],[167,9],[168,10],[169,11],[170,12],[171,13],[172,14],[173,14],[174,15],[175,16],[176,2],[177,17],[178,18],[100,2],[98,2],[179,19],[180,20],[181,21],[223,22],[182,23],[183,24],[184,23],[185,25],[186,26],[187,27],[188,28],[189,28],[190,28],[191,29],[192,30],[193,31],[194,32],[195,33],[196,34],[197,34],[198,35],[199,2],[200,2],[201,36],[202,37],[203,38],[204,39],[205,40],[206,41],[207,42],[208,43],[209,44],[210,45],[211,46],[212,47],[213,48],[214,49],[215,50],[216,51],[217,52],[218,53],[219,54],[101,23],[102,2],[103,55],[104,56],[105,2],[106,57],[107,2],[152,58],[153,59],[154,60],[155,60],[156,61],[157,2],[158,6],[159,62],[160,59],[220,63],[221,64],[222,65],[92,2],[78,2],[79,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[8,2],[52,2],[49,2],[50,2],[51,2],[53,2],[9,2],[54,2],[55,2],[56,2],[58,2],[57,2],[59,2],[60,2],[10,2],[61,2],[62,2],[63,2],[11,2],[64,2],[65,2],[66,2],[67,2],[68,2],[69,2],[12,2],[70,2],[71,2],[72,2],[73,2],[74,2],[1,2],[75,2],[76,2],[77,2],[126,66],[140,67],[123,68],[141,69],[150,70],[114,71],[115,72],[113,73],[149,74],[144,75],[148,76],[117,77],[127,78],[137,79],[116,80],[147,81],[111,82],[112,75],[118,78],[119,2],[125,83],[122,78],[109,84],[151,85],[142,86],[130,87],[129,78],[131,88],[134,89],[128,90],[132,91],[145,74],[120,92],[121,93],[135,94],[110,69],[139,95],[138,78],[124,93],[133,96],[136,97],[143,2],[108,2],[146,98],[83,99],[84,99],[85,2],[86,100],[87,101],[81,2],[82,102],[88,99],[89,2],[80,2],[90,103],[91,104],[94,105],[93,106],[97,107],[95,108],[96,109]],"latestChangedDtsFile":"./index.d.ts","version":"6.0.3"}
@@ -0,0 +1,45 @@
1
+ import { ServiceDefinition } from "@saws/core";
2
+ import { DockerService, type DockerServiceConfig } from "@saws/docker-service";
3
+ import type { PostgresService } from "@saws/postgres-service";
4
+ export interface PowerSyncServiceConfig extends Omit<DockerServiceConfig, "image" | "dockerfile" | "buildContext" | "volumes" | "ports" | "command"> {
5
+ image?: string;
6
+ /** Application database replicated by PowerSync. */
7
+ applicationDatabase: PostgresService;
8
+ /** PowerSync storage database. */
9
+ powersyncDatabase: PostgresService;
10
+ /** Host port to expose PowerSync on. Defaults to PS_PORT or 8080. */
11
+ port?: number;
12
+ /** Node heap size passed through NODE_OPTIONS. */
13
+ maxOldSpaceSize?: number;
14
+ }
15
+ export declare class PowerSyncService extends DockerService {
16
+ static getCommands(services?: ServiceDefinition[]): import("commander").Command[];
17
+ readonly applicationDatabase: PostgresService;
18
+ readonly powersyncDatabase: PostgresService;
19
+ readonly port: number;
20
+ readonly maxOldSpaceSize: number;
21
+ protected readonly serviceType = "powersync";
22
+ constructor(config: PowerSyncServiceConfig);
23
+ init(): Promise<void>;
24
+ deploy(stage: string): Promise<void>;
25
+ runPowerSyncCli(powersyncArgs: string[]): Promise<void>;
26
+ protected getContainerEnvironment(stage: string): Promise<Record<string, string>>;
27
+ protected getDockerRunConfig(stage: string, deploy: boolean): Promise<{
28
+ volumes: string[];
29
+ ports: string[];
30
+ name: string;
31
+ image: string;
32
+ network: string;
33
+ env?: Record<string, string>;
34
+ envFiles?: string[];
35
+ command?: string[];
36
+ labels?: Record<string, string>;
37
+ restart?: import("@saws/docker-service").RestartConfig;
38
+ healthCheck?: import("@saws/docker-service").DockerHealthCheckConfig | false;
39
+ pull?: boolean;
40
+ configHash?: string;
41
+ }>;
42
+ private getConfigVolumes;
43
+ private getLocalPowerSyncFilePath;
44
+ private configureGeneratedServiceConfig;
45
+ }
@@ -0,0 +1,210 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { hasDependency, installDependencies } from "@saws/core/utils/dependency-management";
4
+ import { fileExists } from "@saws/core/utils/file-exists";
5
+ import { DockerService, } from "@saws/docker-service";
6
+ import { createPowerSyncCommand, runPowerSyncCli } from "./powersync-command.js";
7
+ const POWERSYNC_CONFIG_PATH = "/config/service.yaml";
8
+ const POWERSYNC_SYNC_CONFIG_PATH = "/config/sync-config.yaml";
9
+ const POWERSYNC_DIRECTORY = "powersync";
10
+ export class PowerSyncService extends DockerService {
11
+ static getCommands(services = []) {
12
+ return [createPowerSyncCommand(services.filter(isPowerSyncService))];
13
+ }
14
+ applicationDatabase;
15
+ powersyncDatabase;
16
+ port;
17
+ maxOldSpaceSize;
18
+ serviceType = "powersync";
19
+ constructor(config) {
20
+ super({
21
+ ...config,
22
+ image: config.image ?? "journeyapps/powersync-service:latest",
23
+ command: ["start", "-r", "unified"],
24
+ dependencies: [
25
+ ...(config.dependencies ?? []),
26
+ config.applicationDatabase,
27
+ config.powersyncDatabase,
28
+ ],
29
+ healthCheck: config.healthCheck ?? {
30
+ command: "node -e \"fetch('http://localhost:${PS_PORT}/probes/liveness').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))\"",
31
+ interval: "5s",
32
+ timeout: "1s",
33
+ retries: 15,
34
+ },
35
+ });
36
+ this.applicationDatabase = config.applicationDatabase;
37
+ this.powersyncDatabase = config.powersyncDatabase;
38
+ this.port = config.port ?? Number(process.env["PS_PORT"] ?? 8080);
39
+ this.maxOldSpaceSize = config.maxOldSpaceSize ?? 1000;
40
+ }
41
+ async init() {
42
+ await super.init();
43
+ await mkdir(path.resolve(this.name), { recursive: true });
44
+ if (!(await hasDependency("powersync")) ||
45
+ !(await fileExists(path.resolve("node_modules", ".bin", "powersync")))) {
46
+ await installDependencies(["powersync"], { development: true });
47
+ }
48
+ const serviceConfigPath = this.getLocalPowerSyncFilePath("service.yaml");
49
+ if (!(await fileExists(serviceConfigPath))) {
50
+ await this.runPowerSyncCli(["init", "self-hosted"]);
51
+ }
52
+ await this.configureGeneratedServiceConfig(serviceConfigPath);
53
+ }
54
+ async deploy(stage) {
55
+ if (this.host != null) {
56
+ await this.writeRemoteRuntimeFile(stage, `${this.name}/${POWERSYNC_DIRECTORY}/service.yaml`, await readFile(this.getLocalPowerSyncFilePath("service.yaml"), "utf8"));
57
+ await this.writeRemoteRuntimeFile(stage, `${this.name}/${POWERSYNC_DIRECTORY}/sync-config.yaml`, await readFile(this.getLocalPowerSyncFilePath("sync-config.yaml"), "utf8"));
58
+ }
59
+ await super.deploy(stage);
60
+ }
61
+ async runPowerSyncCli(powersyncArgs) {
62
+ await runPowerSyncCli(path.resolve(this.name), powersyncArgs);
63
+ }
64
+ async getContainerEnvironment(stage) {
65
+ const applicationDatabase = await this.applicationDatabase.getConnectionInfo(stage, "container");
66
+ const powersyncDatabase = await this.powersyncDatabase.getConnectionInfo(stage, "container");
67
+ const port = String(this.port);
68
+ return {
69
+ ...(await super.getContainerEnvironment(stage)),
70
+ POWERSYNC_CONFIG_PATH,
71
+ NODE_OPTIONS: `--max-old-space-size=${this.maxOldSpaceSize}`,
72
+ PS_PORT: port,
73
+ PS_DATA_SOURCE_URI: applicationDatabase.url,
74
+ PS_DATABASE_PASSWORD: applicationDatabase.password,
75
+ PS_STORAGE_SOURCE_URI: powersyncDatabase.url,
76
+ PS_STORAGE_URI: powersyncDatabase.url,
77
+ PS_STORAGE_DATABASE_URL: powersyncDatabase.url,
78
+ PS_POWERSYNC_DATABASE_URI: powersyncDatabase.url,
79
+ PS_POWERSYNC_DATABASE_PASSWORD: powersyncDatabase.password,
80
+ };
81
+ }
82
+ async getDockerRunConfig(stage, deploy) {
83
+ const config = await super.getDockerRunConfig(stage, deploy);
84
+ return {
85
+ ...config,
86
+ volumes: [...this.getConfigVolumes(stage), ...(config.volumes ?? [])],
87
+ ports: [`${this.port}:${this.port}`],
88
+ };
89
+ }
90
+ getConfigVolumes(stage) {
91
+ if (stage === "local" || this.host == null) {
92
+ return [
93
+ `${this.getLocalPowerSyncFilePath("service.yaml")}:${POWERSYNC_CONFIG_PATH}:ro`,
94
+ `${this.getLocalPowerSyncFilePath("sync-config.yaml")}:${POWERSYNC_SYNC_CONFIG_PATH}:ro`,
95
+ ];
96
+ }
97
+ const serviceDirectory = path.posix.join(this.getAppDirectory(stage), this.name, POWERSYNC_DIRECTORY);
98
+ return [
99
+ `${path.posix.join(serviceDirectory, "service.yaml")}:${POWERSYNC_CONFIG_PATH}:ro`,
100
+ `${path.posix.join(serviceDirectory, "sync-config.yaml")}:${POWERSYNC_SYNC_CONFIG_PATH}:ro`,
101
+ ];
102
+ }
103
+ getLocalPowerSyncFilePath(fileName) {
104
+ return path.resolve(this.name, POWERSYNC_DIRECTORY, fileName);
105
+ }
106
+ async configureGeneratedServiceConfig(serviceConfigPath) {
107
+ const serviceConfig = await readFile(serviceConfigPath, "utf8");
108
+ const configured = configurePowerSyncServiceConfig(serviceConfig);
109
+ if (configured !== serviceConfig) {
110
+ await writeFile(serviceConfigPath, configured);
111
+ }
112
+ }
113
+ }
114
+ function isPowerSyncService(service) {
115
+ return service instanceof PowerSyncService;
116
+ }
117
+ function configurePowerSyncServiceConfig(contents) {
118
+ let configured = replaceTopLevelYamlEntry(contents, "port", ["port: !env PS_PORT"]);
119
+ configured = removeTopLevelYamlBlockEntry(configured, "api", "port");
120
+ configured = replaceTopLevelYamlBlock(configured, "storage", [
121
+ "storage:",
122
+ " sslmode: disable",
123
+ " type: postgresql",
124
+ " uri: !env PS_STORAGE_SOURCE_URI",
125
+ ]);
126
+ if (!hasActiveTopLevelYamlBlock(configured, "replication")) {
127
+ configured = appendTopLevelYamlBlock(configured, [
128
+ "replication:",
129
+ " connections:",
130
+ " - sslmode: disable",
131
+ " type: postgresql",
132
+ " uri: !env PS_DATA_SOURCE_URI",
133
+ ]);
134
+ }
135
+ return configured.endsWith("\n") ? configured : `${configured}\n`;
136
+ }
137
+ function hasActiveTopLevelYamlBlock(contents, key) {
138
+ const pattern = new RegExp(`^${escapeRegExp(key)}:\\s*(?:#.*)?$`, "m");
139
+ return pattern.test(contents);
140
+ }
141
+ function appendTopLevelYamlBlock(contents, block) {
142
+ return `${contents.replace(/\s*$/, "\n\n")}${block.join("\n")}\n`;
143
+ }
144
+ function replaceTopLevelYamlEntry(contents, key, replacement) {
145
+ const lines = contents.split(/\r?\n/);
146
+ const start = lines.findIndex((line) => new RegExp(`^${escapeRegExp(key)}:\\s*(?:.*)?$`).test(line));
147
+ if (start === -1) {
148
+ return [...lines, ...replacement].join("\n");
149
+ }
150
+ let end = start + 1;
151
+ while (end < lines.length) {
152
+ const line = lines[end];
153
+ if (/^[^\s#][^:]*:\s*(?:.*)?$/.test(line))
154
+ break;
155
+ end += 1;
156
+ }
157
+ return [...lines.slice(0, start), ...replacement, ...lines.slice(end)].join("\n");
158
+ }
159
+ function removeTopLevelYamlBlockEntry(contents, blockKey, entryKey) {
160
+ const lines = contents.split(/\r?\n/);
161
+ const blockStart = lines.findIndex((line) => new RegExp(`^${escapeRegExp(blockKey)}:\\s*(?:#.*)?$`).test(line));
162
+ if (blockStart === -1) {
163
+ return contents;
164
+ }
165
+ let blockEnd = blockStart + 1;
166
+ while (blockEnd < lines.length) {
167
+ const line = lines[blockEnd];
168
+ if (/^[^\s#][^:]*:\s*(?:#.*)?$/.test(line))
169
+ break;
170
+ blockEnd += 1;
171
+ }
172
+ const entryPattern = new RegExp(`^\\s+${escapeRegExp(entryKey)}:\\s*(?:.*)?$`);
173
+ const entryStart = lines.findIndex((line, index) => index > blockStart && index < blockEnd && entryPattern.test(line));
174
+ if (entryStart === -1) {
175
+ return contents;
176
+ }
177
+ let entryEnd = entryStart + 1;
178
+ while (entryEnd < blockEnd) {
179
+ const line = lines[entryEnd];
180
+ if (/^\s{2}\S[^:]*:\s*(?:.*)?$/.test(line))
181
+ break;
182
+ entryEnd += 1;
183
+ }
184
+ const updated = [...lines.slice(0, entryStart), ...lines.slice(entryEnd)];
185
+ const hasRemainingBlockEntries = updated
186
+ .slice(blockStart + 1, blockEnd - (entryEnd - entryStart))
187
+ .some((line) => line.trim() !== "" && !line.trimStart().startsWith("#"));
188
+ if (hasRemainingBlockEntries) {
189
+ return updated.join("\n");
190
+ }
191
+ return [...updated.slice(0, blockStart), ...updated.slice(blockStart + 1)].join("\n");
192
+ }
193
+ function replaceTopLevelYamlBlock(contents, key, replacement) {
194
+ const lines = contents.split(/\r?\n/);
195
+ const start = lines.findIndex((line) => new RegExp(`^${escapeRegExp(key)}:\\s*(?:#.*)?$`).test(line));
196
+ if (start === -1) {
197
+ return [...lines, ...replacement].join("\n");
198
+ }
199
+ let end = start + 1;
200
+ while (end < lines.length) {
201
+ const line = lines[end];
202
+ if (/^[^\s#][^:]*:\s*(?:#.*)?$/.test(line))
203
+ break;
204
+ end += 1;
205
+ }
206
+ return [...lines.slice(0, start), ...replacement, ...lines.slice(end)].join("\n");
207
+ }
208
+ function escapeRegExp(value) {
209
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
210
+ }
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "./PowerSyncService.js";
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { PowerSyncService } from "./PowerSyncService.js";
3
+ export declare const createPowerSyncCommand: (services: PowerSyncService[]) => Command;
4
+ export declare function runPowerSyncCli(cwd: string, powersyncArgs: string[]): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ import { Command } from "commander";
4
+ export const createPowerSyncCommand = (services) => new Command("powersync")
5
+ .description("run the PowerSync CLI from the PowerSync service directory")
6
+ .argument("[powersyncArgs...]", "arguments passed to powersync")
7
+ .allowUnknownOption()
8
+ .allowExcessArguments()
9
+ .helpOption(false)
10
+ .action((powersyncArgs) => powersyncCommand(services, powersyncArgs));
11
+ async function powersyncCommand(services, powersyncArgs) {
12
+ const service = resolveService(services);
13
+ await service.runPowerSyncCli(powersyncArgs);
14
+ }
15
+ function resolveService(services) {
16
+ if (services.length === 1)
17
+ return services[0];
18
+ if (services.length === 0) {
19
+ throw new Error("No PowerSync services are configured.");
20
+ }
21
+ throw new Error(`Multiple PowerSync services are configured. Use the PowerSync CLI directly from one of these directories: ${services
22
+ .map((service) => path.resolve(service.name))
23
+ .join(", ")}`);
24
+ }
25
+ export async function runPowerSyncCli(cwd, powersyncArgs) {
26
+ const powersyncBin = path.resolve("node_modules", ".bin", "powersync");
27
+ await new Promise((resolve, reject) => {
28
+ const child = spawn(powersyncBin, powersyncArgs, {
29
+ cwd,
30
+ env: process.env,
31
+ stdio: "inherit",
32
+ });
33
+ child.once("error", (error) => {
34
+ reject(new Error(`Unable to run powersync: ${error.message}`, { cause: error }));
35
+ });
36
+ child.once("close", (code, signal) => {
37
+ if (code === 0) {
38
+ resolve();
39
+ return;
40
+ }
41
+ const reason = signal == null ? `exit code ${code ?? "unknown"}` : `signal ${signal}`;
42
+ reject(new Error(`powersync failed with ${reason}`));
43
+ });
44
+ });
45
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saws/powersync-service",
3
- "version": "2.0.0-beta.3",
3
+ "version": "2.0.0-beta.4",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",
@@ -13,9 +13,12 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@saws/core": "2.0.0-beta.3",
17
- "@saws/docker-service": "2.0.0-beta.3",
18
- "@saws/postgres-service": "2.0.0-beta.3",
16
+ "@saws/core": "2.0.0-beta.4",
17
+ "@saws/docker-service": "2.0.0-beta.4",
18
+ "@saws/postgres-service": "2.0.0-beta.4",
19
19
  "commander": "^15.0.0"
20
- }
20
+ },
21
+ "files": [
22
+ "./dist"
23
+ ]
21
24
  }
@@ -1,296 +0,0 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { ServiceDefinition } from "@saws/core";
4
- import { hasDependency, installDependencies } from "@saws/core/utils/dependency-management";
5
- import { fileExists } from "@saws/core/utils/file-exists";
6
- import {
7
- DockerService,
8
- type DockerRunConfig,
9
- type DockerServiceConfig,
10
- } from "@saws/docker-service";
11
- import type { PostgresService } from "@saws/postgres-service";
12
- import { createPowerSyncCommand, runPowerSyncCli } from "./powersync-command.js";
13
-
14
- const POWERSYNC_CONFIG_PATH = "/config/service.yaml";
15
- const POWERSYNC_SYNC_CONFIG_PATH = "/config/sync-config.yaml";
16
- const POWERSYNC_DIRECTORY = "powersync";
17
-
18
- export interface PowerSyncServiceConfig extends Omit<
19
- DockerServiceConfig,
20
- "image" | "dockerfile" | "buildContext" | "volumes" | "ports" | "command"
21
- > {
22
- image?: string;
23
- /** Application database replicated by PowerSync. */
24
- applicationDatabase: PostgresService;
25
- /** PowerSync storage database. */
26
- powersyncDatabase: PostgresService;
27
- /** Host port to expose PowerSync on. Defaults to PS_PORT or 8080. */
28
- port?: number;
29
- /** Node heap size passed through NODE_OPTIONS. */
30
- maxOldSpaceSize?: number;
31
- }
32
-
33
- export class PowerSyncService extends DockerService {
34
- static getCommands(services: ServiceDefinition[] = []) {
35
- return [createPowerSyncCommand(services.filter(isPowerSyncService))];
36
- }
37
-
38
- readonly applicationDatabase: PostgresService;
39
- readonly powersyncDatabase: PostgresService;
40
- readonly port: number;
41
- readonly maxOldSpaceSize: number;
42
- protected override readonly serviceType = "powersync";
43
-
44
- constructor(config: PowerSyncServiceConfig) {
45
- super({
46
- ...config,
47
- image: config.image ?? "journeyapps/powersync-service:latest",
48
- command: ["start", "-r", "unified"],
49
- dependencies: [
50
- ...(config.dependencies ?? []),
51
- config.applicationDatabase,
52
- config.powersyncDatabase,
53
- ],
54
- healthCheck: config.healthCheck ?? {
55
- command:
56
- "node -e \"fetch('http://localhost:${PS_PORT}/probes/liveness').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))\"",
57
- interval: "5s",
58
- timeout: "1s",
59
- retries: 15,
60
- },
61
- });
62
-
63
- this.applicationDatabase = config.applicationDatabase;
64
- this.powersyncDatabase = config.powersyncDatabase;
65
- this.port = config.port ?? Number(process.env["PS_PORT"] ?? 8080);
66
- this.maxOldSpaceSize = config.maxOldSpaceSize ?? 1000;
67
- }
68
-
69
- override async init() {
70
- await super.init();
71
- await mkdir(path.resolve(this.name), { recursive: true });
72
-
73
- if (
74
- !(await hasDependency("powersync")) ||
75
- !(await fileExists(path.resolve("node_modules", ".bin", "powersync")))
76
- ) {
77
- await installDependencies(["powersync"], { development: true });
78
- }
79
-
80
- const serviceConfigPath = this.getLocalPowerSyncFilePath("service.yaml");
81
- if (!(await fileExists(serviceConfigPath))) {
82
- await this.runPowerSyncCli(["init", "self-hosted"]);
83
- }
84
- await this.configureGeneratedServiceConfig(serviceConfigPath);
85
- }
86
-
87
- override async deploy(stage: string) {
88
- if (this.host != null) {
89
- await this.writeRemoteRuntimeFile(
90
- stage,
91
- `${this.name}/${POWERSYNC_DIRECTORY}/service.yaml`,
92
- await readFile(this.getLocalPowerSyncFilePath("service.yaml"), "utf8"),
93
- );
94
- await this.writeRemoteRuntimeFile(
95
- stage,
96
- `${this.name}/${POWERSYNC_DIRECTORY}/sync-config.yaml`,
97
- await readFile(this.getLocalPowerSyncFilePath("sync-config.yaml"), "utf8"),
98
- );
99
- }
100
-
101
- await super.deploy(stage);
102
- }
103
-
104
- async runPowerSyncCli(powersyncArgs: string[]) {
105
- await runPowerSyncCli(path.resolve(this.name), powersyncArgs);
106
- }
107
-
108
- protected override async getContainerEnvironment(stage: string): Promise<Record<string, string>> {
109
- const applicationDatabase = await this.applicationDatabase.getConnectionInfo(
110
- stage,
111
- "container",
112
- );
113
- const powersyncDatabase = await this.powersyncDatabase.getConnectionInfo(stage, "container");
114
- const port = String(this.port);
115
-
116
- return {
117
- ...(await super.getContainerEnvironment(stage)),
118
- POWERSYNC_CONFIG_PATH,
119
- NODE_OPTIONS: `--max-old-space-size=${this.maxOldSpaceSize}`,
120
- PS_PORT: port,
121
- PS_DATA_SOURCE_URI: applicationDatabase.url,
122
- PS_DATABASE_PASSWORD: applicationDatabase.password,
123
- PS_STORAGE_SOURCE_URI: powersyncDatabase.url,
124
- PS_STORAGE_URI: powersyncDatabase.url,
125
- PS_STORAGE_DATABASE_URL: powersyncDatabase.url,
126
- PS_POWERSYNC_DATABASE_URI: powersyncDatabase.url,
127
- PS_POWERSYNC_DATABASE_PASSWORD: powersyncDatabase.password,
128
- };
129
- }
130
-
131
- protected override async getDockerRunConfig(stage: string, deploy: boolean) {
132
- const config = await super.getDockerRunConfig(stage, deploy);
133
-
134
- return {
135
- ...config,
136
- volumes: [...this.getConfigVolumes(stage), ...(config.volumes ?? [])],
137
- ports: [`${this.port}:${this.port}`],
138
- } satisfies DockerRunConfig;
139
- }
140
-
141
- private getConfigVolumes(stage: string) {
142
- if (stage === "local" || this.host == null) {
143
- return [
144
- `${this.getLocalPowerSyncFilePath("service.yaml")}:${POWERSYNC_CONFIG_PATH}:ro`,
145
- `${this.getLocalPowerSyncFilePath("sync-config.yaml")}:${POWERSYNC_SYNC_CONFIG_PATH}:ro`,
146
- ];
147
- }
148
-
149
- const serviceDirectory = path.posix.join(
150
- this.getAppDirectory(stage),
151
- this.name,
152
- POWERSYNC_DIRECTORY,
153
- );
154
- return [
155
- `${path.posix.join(serviceDirectory, "service.yaml")}:${POWERSYNC_CONFIG_PATH}:ro`,
156
- `${path.posix.join(serviceDirectory, "sync-config.yaml")}:${POWERSYNC_SYNC_CONFIG_PATH}:ro`,
157
- ];
158
- }
159
-
160
- private getLocalPowerSyncFilePath(fileName: string) {
161
- return path.resolve(this.name, POWERSYNC_DIRECTORY, fileName);
162
- }
163
-
164
- private async configureGeneratedServiceConfig(serviceConfigPath: string) {
165
- const serviceConfig = await readFile(serviceConfigPath, "utf8");
166
- const configured = configurePowerSyncServiceConfig(serviceConfig);
167
- if (configured !== serviceConfig) {
168
- await writeFile(serviceConfigPath, configured);
169
- }
170
- }
171
- }
172
-
173
- function isPowerSyncService(service: ServiceDefinition): service is PowerSyncService {
174
- return service instanceof PowerSyncService;
175
- }
176
-
177
- function configurePowerSyncServiceConfig(contents: string) {
178
- let configured = replaceTopLevelYamlEntry(contents, "port", ["port: !env PS_PORT"]);
179
- configured = removeTopLevelYamlBlockEntry(configured, "api", "port");
180
-
181
- configured = replaceTopLevelYamlBlock(configured, "storage", [
182
- "storage:",
183
- " sslmode: disable",
184
- " type: postgresql",
185
- " uri: !env PS_STORAGE_SOURCE_URI",
186
- ]);
187
-
188
- if (!hasActiveTopLevelYamlBlock(configured, "replication")) {
189
- configured = appendTopLevelYamlBlock(configured, [
190
- "replication:",
191
- " connections:",
192
- " - sslmode: disable",
193
- " type: postgresql",
194
- " uri: !env PS_DATA_SOURCE_URI",
195
- ]);
196
- }
197
-
198
- return configured.endsWith("\n") ? configured : `${configured}\n`;
199
- }
200
-
201
- function hasActiveTopLevelYamlBlock(contents: string, key: string) {
202
- const pattern = new RegExp(`^${escapeRegExp(key)}:\\s*(?:#.*)?$`, "m");
203
- return pattern.test(contents);
204
- }
205
-
206
- function appendTopLevelYamlBlock(contents: string, block: string[]) {
207
- return `${contents.replace(/\s*$/, "\n\n")}${block.join("\n")}\n`;
208
- }
209
-
210
- function replaceTopLevelYamlEntry(contents: string, key: string, replacement: string[]) {
211
- const lines = contents.split(/\r?\n/);
212
- const start = lines.findIndex((line) =>
213
- new RegExp(`^${escapeRegExp(key)}:\\s*(?:.*)?$`).test(line),
214
- );
215
- if (start === -1) {
216
- return [...lines, ...replacement].join("\n");
217
- }
218
-
219
- let end = start + 1;
220
- while (end < lines.length) {
221
- const line = lines[end]!;
222
- if (/^[^\s#][^:]*:\s*(?:.*)?$/.test(line)) break;
223
- end += 1;
224
- }
225
-
226
- return [...lines.slice(0, start), ...replacement, ...lines.slice(end)].join("\n");
227
- }
228
-
229
- function removeTopLevelYamlBlockEntry(
230
- contents: string,
231
- blockKey: string,
232
- entryKey: string,
233
- ) {
234
- const lines = contents.split(/\r?\n/);
235
- const blockStart = lines.findIndex((line) =>
236
- new RegExp(`^${escapeRegExp(blockKey)}:\\s*(?:#.*)?$`).test(line),
237
- );
238
- if (blockStart === -1) {
239
- return contents;
240
- }
241
-
242
- let blockEnd = blockStart + 1;
243
- while (blockEnd < lines.length) {
244
- const line = lines[blockEnd]!;
245
- if (/^[^\s#][^:]*:\s*(?:#.*)?$/.test(line)) break;
246
- blockEnd += 1;
247
- }
248
-
249
- const entryPattern = new RegExp(`^\\s+${escapeRegExp(entryKey)}:\\s*(?:.*)?$`);
250
- const entryStart = lines.findIndex(
251
- (line, index) => index > blockStart && index < blockEnd && entryPattern.test(line),
252
- );
253
- if (entryStart === -1) {
254
- return contents;
255
- }
256
-
257
- let entryEnd = entryStart + 1;
258
- while (entryEnd < blockEnd) {
259
- const line = lines[entryEnd]!;
260
- if (/^\s{2}\S[^:]*:\s*(?:.*)?$/.test(line)) break;
261
- entryEnd += 1;
262
- }
263
-
264
- const updated = [...lines.slice(0, entryStart), ...lines.slice(entryEnd)];
265
- const hasRemainingBlockEntries = updated
266
- .slice(blockStart + 1, blockEnd - (entryEnd - entryStart))
267
- .some((line) => line.trim() !== "" && !line.trimStart().startsWith("#"));
268
- if (hasRemainingBlockEntries) {
269
- return updated.join("\n");
270
- }
271
-
272
- return [...updated.slice(0, blockStart), ...updated.slice(blockStart + 1)].join("\n");
273
- }
274
-
275
- function replaceTopLevelYamlBlock(contents: string, key: string, replacement: string[]) {
276
- const lines = contents.split(/\r?\n/);
277
- const start = lines.findIndex((line) =>
278
- new RegExp(`^${escapeRegExp(key)}:\\s*(?:#.*)?$`).test(line),
279
- );
280
- if (start === -1) {
281
- return [...lines, ...replacement].join("\n");
282
- }
283
-
284
- let end = start + 1;
285
- while (end < lines.length) {
286
- const line = lines[end]!;
287
- if (/^[^\s#][^:]*:\s*(?:#.*)?$/.test(line)) break;
288
- end += 1;
289
- }
290
-
291
- return [...lines.slice(0, start), ...replacement, ...lines.slice(end)].join("\n");
292
- }
293
-
294
- function escapeRegExp(value: string) {
295
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
296
- }
@@ -1,57 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import path from "node:path";
3
- import { Command } from "commander";
4
- import type { PowerSyncService } from "./PowerSyncService.js";
5
-
6
- export const createPowerSyncCommand = (services: PowerSyncService[]) =>
7
- new Command("powersync")
8
- .description("run the PowerSync CLI from the PowerSync service directory")
9
- .argument("[powersyncArgs...]", "arguments passed to powersync")
10
- .allowUnknownOption()
11
- .allowExcessArguments()
12
- .helpOption(false)
13
- .action((powersyncArgs: string[]) => powersyncCommand(services, powersyncArgs));
14
-
15
- async function powersyncCommand(services: PowerSyncService[], powersyncArgs: string[]) {
16
- const service = resolveService(services);
17
- await service.runPowerSyncCli(powersyncArgs);
18
- }
19
-
20
- function resolveService(services: PowerSyncService[]) {
21
- if (services.length === 1) return services[0]!;
22
- if (services.length === 0) {
23
- throw new Error("No PowerSync services are configured.");
24
- }
25
-
26
- throw new Error(
27
- `Multiple PowerSync services are configured. Use the PowerSync CLI directly from one of these directories: ${services
28
- .map((service) => path.resolve(service.name))
29
- .join(", ")}`,
30
- );
31
- }
32
-
33
- export async function runPowerSyncCli(cwd: string, powersyncArgs: string[]) {
34
- const powersyncBin = path.resolve("node_modules", ".bin", "powersync");
35
-
36
- await new Promise<void>((resolve, reject) => {
37
- const child = spawn(powersyncBin, powersyncArgs, {
38
- cwd,
39
- env: process.env,
40
- stdio: "inherit",
41
- });
42
-
43
- child.once("error", (error) => {
44
- reject(new Error(`Unable to run powersync: ${error.message}`, { cause: error }));
45
- });
46
-
47
- child.once("close", (code, signal) => {
48
- if (code === 0) {
49
- resolve();
50
- return;
51
- }
52
-
53
- const reason = signal == null ? `exit code ${code ?? "unknown"}` : `signal ${signal}`;
54
- reject(new Error(`powersync failed with ${reason}`));
55
- });
56
- });
57
- }
package/tsconfig.json DELETED
@@ -1,13 +0,0 @@
1
- {
2
- "extends": "../../tsconfig-node.base.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "./src",
6
- "tsBuildInfoFile": "./dist/.tsbuildinfo"
7
- },
8
- "references": [
9
- { "path": "../core/tsconfig.json" },
10
- { "path": "../docker-service/tsconfig.json" },
11
- { "path": "../postgres-service/tsconfig.json" }
12
- ]
13
- }
File without changes