syncorejs 0.2.1 → 0.2.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/README.md +2 -1
- package/dist/_vendor/cli/app.d.mts.map +1 -1
- package/dist/_vendor/cli/app.mjs +330 -46
- package/dist/_vendor/cli/app.mjs.map +1 -1
- package/dist/_vendor/cli/context.mjs +27 -9
- package/dist/_vendor/cli/context.mjs.map +1 -1
- package/dist/_vendor/cli/dev-session.mjs.map +1 -1
- package/dist/_vendor/cli/doctor.mjs +513 -46
- package/dist/_vendor/cli/doctor.mjs.map +1 -1
- package/dist/_vendor/cli/errors.mjs.map +1 -1
- package/dist/_vendor/cli/help.mjs.map +1 -1
- package/dist/_vendor/cli/index.mjs +9 -2
- package/dist/_vendor/cli/index.mjs.map +1 -1
- package/dist/_vendor/cli/messages.mjs +5 -4
- package/dist/_vendor/cli/messages.mjs.map +1 -1
- package/dist/_vendor/cli/preflight.mjs.map +1 -1
- package/dist/_vendor/cli/project.mjs +125 -27
- package/dist/_vendor/cli/project.mjs.map +1 -1
- package/dist/_vendor/cli/render.mjs +57 -9
- package/dist/_vendor/cli/render.mjs.map +1 -1
- package/dist/_vendor/cli/targets.mjs +4 -3
- package/dist/_vendor/cli/targets.mjs.map +1 -1
- package/dist/_vendor/core/cli.d.mts +20 -4
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +458 -133
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/devtools-auth.mjs +60 -0
- package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
- package/dist/_vendor/core/index.d.mts +5 -3
- package/dist/_vendor/core/index.mjs +22 -2
- package/dist/_vendor/core/index.mjs.map +1 -1
- package/dist/_vendor/core/runtime/components.d.mts +111 -0
- package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
- package/dist/_vendor/core/runtime/components.mjs +186 -0
- package/dist/_vendor/core/runtime/components.mjs.map +1 -0
- package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +178 -60
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +398 -16
- package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs +74 -3
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/id.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +83 -0
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +720 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +234 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +255 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +200 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +252 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +145 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +221 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +41 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
- package/dist/_vendor/core/runtime/runtime.d.mts +1187 -202
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +73 -1365
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts +113 -0
- package/dist/_vendor/core/transport.d.mts.map +1 -0
- package/dist/_vendor/core/transport.mjs +428 -0
- package/dist/_vendor/core/transport.mjs.map +1 -0
- package/dist/_vendor/devtools-protocol/index.d.ts +187 -4
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js +25 -9
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/config.d.ts +3 -4
- package/dist/_vendor/next/config.d.ts.map +1 -1
- package/dist/_vendor/next/config.js +37 -19
- package/dist/_vendor/next/config.js.map +1 -1
- package/dist/_vendor/next/index.d.ts +109 -29
- package/dist/_vendor/next/index.d.ts.map +1 -1
- package/dist/_vendor/next/index.js +104 -26
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +156 -37
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +80 -12
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/react.js +11 -10
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
- package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
- package/dist/_vendor/platform-node/index.d.mts +192 -24
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +236 -97
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc.d.mts +11 -35
- package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc.mjs +3 -273
- package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +43 -1
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
- package/dist/_vendor/platform-web/external-change.js +32 -1
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +323 -51
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +233 -30
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
- package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.js +10 -0
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.d.ts +13 -0
- package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
- package/dist/_vendor/platform-web/opfs.js +12 -0
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.d.ts +54 -0
- package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
- package/dist/_vendor/platform-web/persistence.js +15 -0
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts +1 -2
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +27 -13
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/sqljs.js +10 -1
- package/dist/_vendor/platform-web/sqljs.js.map +1 -1
- package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
- package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
- package/dist/_vendor/platform-web/worker.d.ts +71 -44
- package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
- package/dist/_vendor/platform-web/worker.js +40 -271
- package/dist/_vendor/platform-web/worker.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +222 -23
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +476 -63
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/schema/definition.d.ts +151 -37
- package/dist/_vendor/schema/definition.d.ts.map +1 -1
- package/dist/_vendor/schema/definition.js +102 -20
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/index.d.ts +4 -4
- package/dist/_vendor/schema/index.js +2 -2
- package/dist/_vendor/schema/planner.d.ts +19 -2
- package/dist/_vendor/schema/planner.d.ts.map +1 -1
- package/dist/_vendor/schema/planner.js +79 -3
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.d.ts +279 -83
- package/dist/_vendor/schema/validators.d.ts.map +1 -1
- package/dist/_vendor/schema/validators.js +330 -38
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +245 -19
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +443 -20
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.js +2 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/package.json +29 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.tsx"],"mappings":";;;;;;AAgBA;UAAiB,uBAAA,SAAgC,oCAAA;;EAE/C,QAAA,EAAU,SAAA;EAGC;EAAX,QAAA,GAAW,SAAA;AAAA;;;;KAMD,2BAAA,GAA8B,uBAAuB;;;;iBAKjD,kBAAA,CAAA;EACd,QAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA;AAAA,GACC,uBAAA,GAA0B,SAAA;AAX7B;;;AAAA,iBA2DgB,sBAAA,CAAuB,KAAA,EAAO,2BAA2B,+BAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createSyncoreWebWorkerClient } from "./worker.js";
|
|
2
|
-
import {
|
|
2
|
+
import { createUnavailableSyncoreClient } from "../core/index.mjs";
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
4
|
import { SyncoreProvider } from "../react/index.js";
|
|
4
5
|
import { jsx } from "react/jsx-runtime";
|
|
5
6
|
//#region src/react.tsx
|
|
@@ -7,27 +8,40 @@ import { jsx } from "react/jsx-runtime";
|
|
|
7
8
|
* Start a worker-backed Syncore client and provide it to React descendants.
|
|
8
9
|
*/
|
|
9
10
|
function SyncoreWebProvider({ children, workerUrl, workerType, workerName, fallback = null }) {
|
|
10
|
-
const
|
|
11
|
+
const bootingClient = useMemo(() => createUnavailableSyncoreClient({
|
|
12
|
+
kind: "starting",
|
|
13
|
+
reason: "booting"
|
|
14
|
+
}), []);
|
|
15
|
+
const [client, setClient] = useState(bootingClient);
|
|
11
16
|
useEffect(() => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
let managedClient;
|
|
18
|
+
setClient(bootingClient);
|
|
19
|
+
try {
|
|
20
|
+
managedClient = createSyncoreWebWorkerClient({
|
|
21
|
+
workerUrl,
|
|
22
|
+
...workerType ? { workerType } : {},
|
|
23
|
+
...workerName ? { workerName } : {}
|
|
24
|
+
});
|
|
25
|
+
setClient(managedClient.client);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
setClient(createUnavailableSyncoreClient({
|
|
28
|
+
kind: "unavailable",
|
|
29
|
+
reason: "worker-unavailable",
|
|
30
|
+
...error instanceof Error ? { error } : {}
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
18
33
|
return () => {
|
|
19
|
-
|
|
20
|
-
setManagedClient(null);
|
|
34
|
+
managedClient?.dispose();
|
|
21
35
|
};
|
|
22
36
|
}, [
|
|
37
|
+
bootingClient,
|
|
23
38
|
workerName,
|
|
24
39
|
workerType,
|
|
25
40
|
workerUrl
|
|
26
41
|
]);
|
|
27
|
-
if (!managedClient) return fallback;
|
|
28
42
|
return /* @__PURE__ */ jsx(SyncoreProvider, {
|
|
29
|
-
client
|
|
30
|
-
children
|
|
43
|
+
client,
|
|
44
|
+
children: children ?? fallback
|
|
31
45
|
});
|
|
32
46
|
}
|
|
33
47
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","names":[],"sources":["../src/react.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { SyncoreProvider } from \"@syncore/react\";\nimport {\n createSyncoreWebWorkerClient,\n type CreateWebWorkerClientProviderOptions,\n type ManagedWebWorkerClient\n} from \"./worker.js\";\n\n/**\n * Props for {@link SyncoreWebProvider}.\n */\nexport interface SyncoreWebProviderProps extends CreateWebWorkerClientProviderOptions {\n /** The React subtree that should receive the Syncore client. */\n children: ReactNode;\n\n /** Optional fallback content rendered before the worker client is ready. */\n fallback?: ReactNode;\n}\n\n/**\n * Props for {@link SyncoreBrowserProvider}.\n */\nexport type SyncoreBrowserProviderProps = SyncoreWebProviderProps;\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreWebProvider({\n children,\n workerUrl,\n workerType,\n workerName,\n fallback = null\n}: SyncoreWebProviderProps): ReactNode {\n const [
|
|
1
|
+
{"version":3,"file":"react.js","names":[],"sources":["../src/react.tsx"],"sourcesContent":["import {\n createUnavailableSyncoreClient,\n type SyncoreClient\n} from \"@syncore/core\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { SyncoreProvider } from \"@syncore/react\";\nimport {\n createSyncoreWebWorkerClient,\n type CreateWebWorkerClientProviderOptions,\n type ManagedWebWorkerClient\n} from \"./worker.js\";\n\n/**\n * Props for {@link SyncoreWebProvider}.\n */\nexport interface SyncoreWebProviderProps extends CreateWebWorkerClientProviderOptions {\n /** The React subtree that should receive the Syncore client. */\n children: ReactNode;\n\n /** Optional fallback content rendered before the worker client is ready. */\n fallback?: ReactNode;\n}\n\n/**\n * Props for {@link SyncoreBrowserProvider}.\n */\nexport type SyncoreBrowserProviderProps = SyncoreWebProviderProps;\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreWebProvider({\n children,\n workerUrl,\n workerType,\n workerName,\n fallback = null\n}: SyncoreWebProviderProps): ReactNode {\n const bootingClient = useMemo(\n () =>\n createUnavailableSyncoreClient({\n kind: \"starting\",\n reason: \"booting\"\n }),\n []\n );\n const [client, setClient] = useState<SyncoreClient>(bootingClient);\n\n useEffect(() => {\n let managedClient: ManagedWebWorkerClient | undefined;\n\n setClient(bootingClient);\n\n try {\n managedClient = createSyncoreWebWorkerClient({\n workerUrl,\n ...(workerType ? { workerType } : {}),\n ...(workerName ? { workerName } : {})\n });\n setClient(managedClient.client);\n } catch (error) {\n setClient(\n createUnavailableSyncoreClient({\n kind: \"unavailable\",\n reason: \"worker-unavailable\",\n ...(error instanceof Error ? { error } : {})\n })\n );\n }\n\n return () => {\n managedClient?.dispose();\n };\n }, [bootingClient, workerName, workerType, workerUrl]);\n\n return (\n <SyncoreProvider client={client}>\n {children ?? fallback}\n </SyncoreProvider>\n );\n}\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreBrowserProvider(props: SyncoreBrowserProviderProps) {\n return <SyncoreWebProvider {...props} />;\n}\n"],"mappings":";;;;;;;;;AAgCA,SAAgB,mBAAmB,EACjC,UACA,WACA,YACA,YACA,WAAW,QAC0B;CACrC,MAAM,gBAAgB,cAElB,+BAA+B;EAC7B,MAAM;EACN,QAAQ;CACV,CAAC,GACH,CAAC,CACH;CACA,MAAM,CAAC,QAAQ,aAAa,SAAwB,aAAa;CAEjE,gBAAgB;EACd,IAAI;EAEJ,UAAU,aAAa;EAEvB,IAAI;GACF,gBAAgB,6BAA6B;IAC3C;IACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;IACnC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACrC,CAAC;GACD,UAAU,cAAc,MAAM;EAChC,SAAS,OAAO;GACd,UACE,+BAA+B;IAC7B,MAAM;IACN,QAAQ;IACR,GAAI,iBAAiB,QAAQ,EAAE,MAAM,IAAI,CAAC;GAC5C,CAAC,CACH;EACF;EAEA,aAAa;GACX,eAAe,QAAQ;EACzB;CACF,GAAG;EAAC;EAAe;EAAY;EAAY;CAAS,CAAC;CAErD,OACE,oBAAC,iBAAD;EAAyB;YACtB,YAAY;CACE,CAAA;AAErB;;;;AAKA,SAAgB,uBAAuB,OAAoC;CACzE,OAAO,oBAAC,oBAAD,EAAoB,GAAI,MAAQ,CAAA;AACzC"}
|
|
@@ -2,6 +2,10 @@ import { SyncoreIndexedDbPersistence } from "./indexeddb.js";
|
|
|
2
2
|
import initSqlJs from "sql.js";
|
|
3
3
|
//#region src/sqljs.ts
|
|
4
4
|
var SqlJsDriver = class SqlJsDriver {
|
|
5
|
+
database;
|
|
6
|
+
persistence;
|
|
7
|
+
databaseName;
|
|
8
|
+
createDatabase;
|
|
5
9
|
transactionDepth = 0;
|
|
6
10
|
closed = false;
|
|
7
11
|
constructor(database, persistence, databaseName, createDatabase) {
|
|
@@ -12,7 +16,9 @@ var SqlJsDriver = class SqlJsDriver {
|
|
|
12
16
|
}
|
|
13
17
|
static async create(options) {
|
|
14
18
|
const persistence = options.persistence ?? new SyncoreIndexedDbPersistence();
|
|
15
|
-
const
|
|
19
|
+
const hasExplicitWasmResolver = Boolean(options.locateFile ?? options.wasmUrl);
|
|
20
|
+
if (isBrowserLikeRuntime() && !hasExplicitWasmResolver) throw new Error("SqlJsDriver requires an explicit wasmUrl or locateFile in browser runtimes. Use createWebSyncoreRuntime/createBrowserWorkerRuntime for the default Syncore web resolver.");
|
|
21
|
+
const SQL = await initSqlJs(!hasExplicitWasmResolver ? void 0 : { locateFile: options.locateFile ?? (() => options.wasmUrl) });
|
|
16
22
|
const existingBytes = await persistence.loadDatabase(options.databaseName);
|
|
17
23
|
return new SqlJsDriver(existingBytes ? new SQL.Database(existingBytes) : new SQL.Database(), persistence, options.databaseName, (bytes) => bytes ? new SQL.Database(bytes) : new SQL.Database());
|
|
18
24
|
}
|
|
@@ -130,6 +136,9 @@ var SqlJsDriver = class SqlJsDriver {
|
|
|
130
136
|
previousDatabase.close();
|
|
131
137
|
}
|
|
132
138
|
};
|
|
139
|
+
function isBrowserLikeRuntime() {
|
|
140
|
+
return typeof window !== "undefined" || globalThis.WorkerGlobalScope !== void 0;
|
|
141
|
+
}
|
|
133
142
|
function normalizeParams(values) {
|
|
134
143
|
return values.map((value) => {
|
|
135
144
|
if (typeof value === "boolean") return value ? 1 : 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqljs.js","names":[],"sources":["../src/sqljs.ts"],"sourcesContent":["import initSqlJs from \"sql.js\";\nimport type { RunResult, SyncoreSqlDriver } from \"@syncore/core\";\nimport { SyncoreIndexedDbPersistence } from \"./indexeddb.js\";\nimport type { SyncoreWebPersistence } from \"./persistence.js\";\n\ntype SqlJsDatabase = initSqlJs.Database;\ntype SqlJsValue = initSqlJs.SqlValue;\n\nexport interface CreateSqlJsDriverOptions {\n databaseName: string;\n persistence?: SyncoreWebPersistence;\n wasmUrl?: string;\n locateFile?: (fileName: string) => string;\n}\n\nexport class SqlJsDriver implements SyncoreSqlDriver {\n private transactionDepth = 0;\n private closed = false;\n\n constructor(\n private database: SqlJsDatabase,\n private readonly persistence: SyncoreWebPersistence,\n private readonly databaseName: string,\n private readonly createDatabase: (bytes?: Uint8Array) => SqlJsDatabase\n ) {}\n\n static async create(options: CreateSqlJsDriverOptions): Promise<SqlJsDriver> {\n const persistence =\n options.persistence ?? new SyncoreIndexedDbPersistence();\n const SQL = await initSqlJs(\n typeof window === \"undefined\" && !options.locateFile && !options.wasmUrl\n ? undefined\n : {\n locateFile:\n options.locateFile ?? (() => options.wasmUrl ?? \"/sql-wasm.wasm\")\n }\n );\n const existingBytes = await persistence.loadDatabase(options.databaseName);\n const database = existingBytes\n ? new SQL.Database(existingBytes)\n : new SQL.Database();\n return new SqlJsDriver(\n database,\n persistence,\n options.databaseName,\n (bytes) => (bytes ? new SQL.Database(bytes) : new SQL.Database())\n );\n }\n\n async exec(sql: string): Promise<void> {\n this.ensureOpen();\n this.database.run(sql);\n await this.persistIfNeeded();\n }\n\n async run(sql: string, params: unknown[] = []): Promise<RunResult> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.run(normalizeParams(params));\n const lastInsertRowid = readScalarNumber(\n this.database,\n \"SELECT last_insert_rowid()\"\n );\n const result = {\n changes: this.database.getRowsModified(),\n ...(lastInsertRowid !== null ? { lastInsertRowid } : {})\n };\n await this.persistIfNeeded();\n return result;\n } finally {\n statement.free();\n }\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n if (!statement.step()) {\n return undefined;\n }\n return statement.getAsObject() as T;\n } finally {\n statement.free();\n }\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n const rows: T[] = [];\n while (statement.step()) {\n rows.push(statement.getAsObject() as T);\n }\n return rows;\n } finally {\n statement.free();\n }\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n\n this.transactionDepth += 1;\n this.database.run(\"BEGIN IMMEDIATE\");\n try {\n const result = await callback();\n this.database.run(\"COMMIT\");\n await this.persistNow();\n return result;\n } catch (error) {\n this.database.run(\"ROLLBACK\");\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.run(`SAVEPOINT ${safeName}`);\n this.transactionDepth += 1;\n try {\n const result = await callback();\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.run(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n await this.persistNow();\n this.database.close();\n this.closed = true;\n }\n\n async reloadFromPersistence(): Promise<boolean> {\n this.ensureOpen();\n const bytes = await this.persistence.loadDatabase(this.databaseName);\n if (!bytes) {\n return false;\n }\n const nextDatabase = this.createDatabase(bytes);\n const previousDatabase = this.database;\n this.database = nextDatabase;\n previousDatabase.close();\n return true;\n }\n\n createDatabaseFromBytes(bytes?: Uint8Array): SqlJsDatabase {\n return this.createDatabase(bytes);\n }\n\n private async persistIfNeeded(): Promise<void> {\n if (this.transactionDepth === 0) {\n await this.persistNow();\n }\n }\n\n private async persistNow(): Promise<void> {\n this.ensureOpen();\n await this.persistence.saveDatabase(\n this.databaseName,\n this.database.export()\n );\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"The sql.js driver is already closed.\");\n }\n }\n\n replaceDatabase(database: SqlJsDatabase): void {\n this.ensureOpen();\n const previousDatabase = this.database;\n this.database = database;\n previousDatabase.close();\n }\n}\n\nfunction normalizeParams(values: unknown[]): SqlJsValue[] {\n return values.map((value) => {\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n value instanceof Uint8Array\n ) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n return JSON.stringify(value);\n });\n}\n\nfunction readScalarNumber(database: SqlJsDatabase, sql: string): number | null {\n const rows = database.exec(sql);\n const firstSet = rows[0];\n const firstRow = firstSet?.values[0];\n const firstValue = firstRow?.[0];\n if (typeof firstValue === \"number\") {\n return firstValue;\n }\n if (typeof firstValue === \"string\") {\n const parsed = Number(firstValue);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqljs.js","names":["scope"],"sources":["../src/sqljs.ts"],"sourcesContent":["import initSqlJs from \"sql.js\";\nimport type { RunResult, SyncoreSqlDriver } from \"@syncore/core\";\nimport { SyncoreIndexedDbPersistence } from \"./indexeddb.js\";\nimport type { SyncoreWebPersistence } from \"./persistence.js\";\n\ntype SqlJsDatabase = initSqlJs.Database;\ntype SqlJsValue = initSqlJs.SqlValue;\n\nexport interface CreateSqlJsDriverOptions {\n databaseName: string;\n persistence?: SyncoreWebPersistence;\n wasmUrl?: string;\n locateFile?: (fileName: string) => string;\n}\n\nexport class SqlJsDriver implements SyncoreSqlDriver {\n private transactionDepth = 0;\n private closed = false;\n\n constructor(\n private database: SqlJsDatabase,\n private readonly persistence: SyncoreWebPersistence,\n private readonly databaseName: string,\n private readonly createDatabase: (bytes?: Uint8Array) => SqlJsDatabase\n ) {}\n\n static async create(options: CreateSqlJsDriverOptions): Promise<SqlJsDriver> {\n const persistence =\n options.persistence ?? new SyncoreIndexedDbPersistence();\n const hasExplicitWasmResolver = Boolean(options.locateFile ?? options.wasmUrl);\n if (isBrowserLikeRuntime() && !hasExplicitWasmResolver) {\n throw new Error(\n \"SqlJsDriver requires an explicit wasmUrl or locateFile in browser runtimes. \" +\n \"Use createWebSyncoreRuntime/createBrowserWorkerRuntime for the default Syncore web resolver.\"\n );\n }\n const SQL = await initSqlJs(\n !hasExplicitWasmResolver\n ? undefined\n : {\n locateFile:\n options.locateFile ?? (() => options.wasmUrl as string)\n }\n );\n const existingBytes = await persistence.loadDatabase(options.databaseName);\n const database = existingBytes\n ? new SQL.Database(existingBytes)\n : new SQL.Database();\n return new SqlJsDriver(\n database,\n persistence,\n options.databaseName,\n (bytes) => (bytes ? new SQL.Database(bytes) : new SQL.Database())\n );\n }\n\n async exec(sql: string): Promise<void> {\n this.ensureOpen();\n this.database.run(sql);\n await this.persistIfNeeded();\n }\n\n async run(sql: string, params: unknown[] = []): Promise<RunResult> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.run(normalizeParams(params));\n const lastInsertRowid = readScalarNumber(\n this.database,\n \"SELECT last_insert_rowid()\"\n );\n const result = {\n changes: this.database.getRowsModified(),\n ...(lastInsertRowid !== null ? { lastInsertRowid } : {})\n };\n await this.persistIfNeeded();\n return result;\n } finally {\n statement.free();\n }\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n if (!statement.step()) {\n return undefined;\n }\n return statement.getAsObject() as T;\n } finally {\n statement.free();\n }\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n const rows: T[] = [];\n while (statement.step()) {\n rows.push(statement.getAsObject() as T);\n }\n return rows;\n } finally {\n statement.free();\n }\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n\n this.transactionDepth += 1;\n this.database.run(\"BEGIN IMMEDIATE\");\n try {\n const result = await callback();\n this.database.run(\"COMMIT\");\n await this.persistNow();\n return result;\n } catch (error) {\n this.database.run(\"ROLLBACK\");\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.run(`SAVEPOINT ${safeName}`);\n this.transactionDepth += 1;\n try {\n const result = await callback();\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.run(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n await this.persistNow();\n this.database.close();\n this.closed = true;\n }\n\n async reloadFromPersistence(): Promise<boolean> {\n this.ensureOpen();\n const bytes = await this.persistence.loadDatabase(this.databaseName);\n if (!bytes) {\n return false;\n }\n const nextDatabase = this.createDatabase(bytes);\n const previousDatabase = this.database;\n this.database = nextDatabase;\n previousDatabase.close();\n return true;\n }\n\n createDatabaseFromBytes(bytes?: Uint8Array): SqlJsDatabase {\n return this.createDatabase(bytes);\n }\n\n private async persistIfNeeded(): Promise<void> {\n if (this.transactionDepth === 0) {\n await this.persistNow();\n }\n }\n\n private async persistNow(): Promise<void> {\n this.ensureOpen();\n await this.persistence.saveDatabase(\n this.databaseName,\n this.database.export()\n );\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"The sql.js driver is already closed.\");\n }\n }\n\n replaceDatabase(database: SqlJsDatabase): void {\n this.ensureOpen();\n const previousDatabase = this.database;\n this.database = database;\n previousDatabase.close();\n }\n}\n\nfunction isBrowserLikeRuntime(): boolean {\n const scope = globalThis as typeof globalThis & {\n WorkerGlobalScope?: unknown;\n };\n return typeof window !== \"undefined\" || scope.WorkerGlobalScope !== undefined;\n}\n\nfunction normalizeParams(values: unknown[]): SqlJsValue[] {\n return values.map((value) => {\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n value instanceof Uint8Array\n ) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n return JSON.stringify(value);\n });\n}\n\nfunction readScalarNumber(database: SqlJsDatabase, sql: string): number | null {\n const rows = database.exec(sql);\n const firstSet = rows[0];\n const firstRow = firstSet?.values[0];\n const firstValue = firstRow?.[0];\n if (typeof firstValue === \"number\") {\n return firstValue;\n }\n if (typeof firstValue === \"string\") {\n const parsed = Number(firstValue);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-sqljs-wasm.js","names":[],"sources":["../src/web-sqljs-wasm.ts"],"sourcesContent":["export function resolveDefaultWebSqlJsWasmUrl(): string {\n return new URL(\"sql.js/dist/sql-wasm.wasm\", import.meta.url).toString();\n}\n"],"mappings":";AAAA,SAAgB,gCAAwC;CACtD,OAAO,IAAI,IAAI,6BAA6B,OAAO,KAAK,GAAG,EAAE,SAAS;AACxE"}
|
|
@@ -1,76 +1,103 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreDataModel } from "../core/index.d.mts";
|
|
2
2
|
|
|
3
3
|
//#region src/worker.d.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
private rejectAllPending;
|
|
29
|
-
private ensureNotDisposed;
|
|
30
|
-
}
|
|
31
|
-
interface AttachWebWorkerRuntimeOptions {
|
|
32
|
-
endpoint: SyncoreWorkerMessageEndpoint;
|
|
33
|
-
createRuntime: (() => Promise<SyncoreRuntime<WebWorkerSyncoreSchema>>) | (() => SyncoreRuntime<WebWorkerSyncoreSchema>);
|
|
34
|
-
}
|
|
35
|
-
interface AttachedWebWorkerRuntime {
|
|
36
|
-
ready: Promise<void>;
|
|
37
|
-
dispose(): Promise<void>;
|
|
4
|
+
/**
|
|
5
|
+
* Schema type constraint for worker-side Syncore runtimes.
|
|
6
|
+
*
|
|
7
|
+
* Pass any schema produced by `defineSchema()` where this type is expected.
|
|
8
|
+
* Defaults to the unconstrained `SyncoreDataModel` when omitted.
|
|
9
|
+
*/
|
|
10
|
+
type WebWorkerSyncoreSchema<TSchema extends SyncoreDataModel = SyncoreDataModel> = TSchema;
|
|
11
|
+
/** Message endpoint shape required by the browser worker bridge (alias of `SyncoreBridgeMessageEndpoint`). */
|
|
12
|
+
type SyncoreWorkerMessageEndpoint = SyncoreBridgeMessageEndpoint;
|
|
13
|
+
/** Live-query subscription handle returned by `SyncoreWebWorkerClient.watchQuery`. */
|
|
14
|
+
type WorkerQueryWatch<TValue> = BridgeQueryWatch<TValue>;
|
|
15
|
+
/**
|
|
16
|
+
* Syncore client that communicates with a runtime running in a browser Worker
|
|
17
|
+
* over the `postMessage` bridge.
|
|
18
|
+
*
|
|
19
|
+
* Use `createSyncoreWebWorkerClient()` or `createManagedWebWorkerClient()` to
|
|
20
|
+
* create instances. Prefer the React hooks (`useQuery`, `useMutation`, etc.)
|
|
21
|
+
* over calling this directly in React apps.
|
|
22
|
+
*/
|
|
23
|
+
declare class SyncoreWebWorkerClient extends SyncoreBridgeClient {
|
|
24
|
+
query: SyncoreBridgeClient["query"];
|
|
25
|
+
mutation: SyncoreBridgeClient["mutation"];
|
|
26
|
+
action: SyncoreBridgeClient["action"];
|
|
27
|
+
watchQuery: SyncoreBridgeClient["watchQuery"];
|
|
38
28
|
}
|
|
29
|
+
/** Options for attaching a runtime to a worker bridge endpoint. Alias of `AttachRuntimeBridgeOptions`. */
|
|
30
|
+
type AttachWebWorkerRuntimeOptions<TSchema extends WebWorkerSyncoreSchema = WebWorkerSyncoreSchema> = AttachRuntimeBridgeOptions<TSchema>;
|
|
31
|
+
/** Handle returned by `attachWebWorkerRuntime` for controlling the attached bridge. */
|
|
32
|
+
type AttachedWebWorkerRuntime = AttachedRuntimeBridge;
|
|
39
33
|
/**
|
|
40
|
-
* A
|
|
34
|
+
* A browser Worker and its associated Syncore client, bundled for easy
|
|
35
|
+
* lifecycle management.
|
|
36
|
+
*
|
|
37
|
+
* Returned by `createSyncoreWebWorkerClient` and `createManagedWebWorkerClient`.
|
|
38
|
+
* Call `dispose()` to terminate the worker and release its resources.
|
|
41
39
|
*/
|
|
42
40
|
interface ManagedWebWorkerClient {
|
|
41
|
+
/** The Syncore client connected to the worker. */
|
|
43
42
|
client: SyncoreWebWorkerClient;
|
|
43
|
+
/** The underlying `Worker` instance. Useful for low-level control. */
|
|
44
44
|
worker: Worker;
|
|
45
|
+
/** Terminate the worker and dispose the client. Call on app unmount or navigation. */
|
|
45
46
|
dispose(): void;
|
|
46
47
|
}
|
|
47
48
|
/**
|
|
48
|
-
* Options for creating a worker
|
|
49
|
+
* Options for creating a managed worker Syncore client via
|
|
50
|
+
* `createSyncoreWebWorkerClient`.
|
|
49
51
|
*/
|
|
50
52
|
interface CreateWebWorkerClientProviderOptions {
|
|
51
|
-
/** The worker module URL passed to `new Worker(...)`. */
|
|
53
|
+
/** The worker module URL passed to `new Worker(...)`. Typically an `import.meta.url`-relative `URL`. */
|
|
52
54
|
workerUrl: URL | string;
|
|
53
|
-
/**
|
|
55
|
+
/** Worker module type. Defaults to `"module"` (ESM worker). */
|
|
54
56
|
workerType?: WorkerOptions["type"];
|
|
55
|
-
/** Optional
|
|
57
|
+
/** Optional label shown in browser devtools’ Sources panel. */
|
|
56
58
|
workerName?: string;
|
|
57
59
|
}
|
|
58
60
|
/**
|
|
59
|
-
* Create a
|
|
61
|
+
* Create a {@link SyncoreWebWorkerClient} from a low-level message endpoint.
|
|
62
|
+
*
|
|
63
|
+
* Use this when you already have a `Worker` or `MessagePort` reference and
|
|
64
|
+
* want to wrap it manually. For the common case of spawning a new Worker from
|
|
65
|
+
* a URL, use `createSyncoreWebWorkerClient` instead.
|
|
60
66
|
*/
|
|
61
67
|
declare function createWebWorkerClient(endpoint: SyncoreWorkerMessageEndpoint): SyncoreWebWorkerClient;
|
|
62
68
|
/**
|
|
63
|
-
* Create
|
|
69
|
+
* Create a {@link ManagedWebWorkerClient} using a provided Worker factory.
|
|
70
|
+
*
|
|
71
|
+
* Useful when you need control over how the Worker is constructed (e.g. to
|
|
72
|
+
* pass constructor options not exposed by `CreateWebWorkerClientProviderOptions`).
|
|
73
|
+
* For the common URL-based case, use `createSyncoreWebWorkerClient`.
|
|
64
74
|
*/
|
|
65
75
|
declare function createManagedWebWorkerClient(options: {
|
|
66
76
|
createWorker: () => Worker;
|
|
67
77
|
}): ManagedWebWorkerClient;
|
|
68
78
|
/**
|
|
69
|
-
* Create a
|
|
79
|
+
* Create a {@link ManagedWebWorkerClient} by spawning a new Worker from a URL.
|
|
80
|
+
*
|
|
81
|
+
* This is the standard way to create a main-thread client in a browser app.
|
|
82
|
+
* Pass the URL of your `syncore.worker.ts` file (which calls
|
|
83
|
+
* `createWebWorkerRuntime`) and connect the returned `client` to your React
|
|
84
|
+
* `SyncoreProvider` or Svelte context.
|
|
85
|
+
*
|
|
86
|
+
* ```ts
|
|
87
|
+
* // main.ts (or React root)
|
|
88
|
+
* import { createSyncoreWebWorkerClient } from "syncorejs/browser";
|
|
89
|
+
*
|
|
90
|
+
* const { client, dispose } = createSyncoreWebWorkerClient({
|
|
91
|
+
* workerUrl: new URL("./syncore.worker.ts", import.meta.url),
|
|
92
|
+
* });
|
|
93
|
+
* ```
|
|
70
94
|
*/
|
|
71
95
|
declare function createSyncoreWebWorkerClient(options: CreateWebWorkerClientProviderOptions): ManagedWebWorkerClient;
|
|
72
96
|
/**
|
|
73
|
-
*
|
|
97
|
+
* Wire a Syncore runtime factory to a worker message endpoint.
|
|
98
|
+
*
|
|
99
|
+
* Called internally by `createWebWorkerRuntime`. Exposed for cases where you
|
|
100
|
+
* need to attach a runtime to a custom bridge endpoint (e.g. a `MessagePort`).
|
|
74
101
|
*/
|
|
75
102
|
declare function attachWebWorkerRuntime(options: AttachWebWorkerRuntimeOptions): AttachedWebWorkerRuntime;
|
|
76
103
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker.ts"],"mappings":";;;;;AAgBA;;;;KAAY,sBAAA,iBACM,gBAAA,GAAmB,gBAAA,IACjC,OAAA;;KAEQ,4BAAA,GAA+B,4BAA4B;;KAE3D,gBAAA,WAA2B,gBAAgB,CAAC,MAAA;;;;;AAJ7C;AAEX;;;cAYa,sBAAA,SAA+B,mBAAA;EAClC,KAAA,EAAO,mBAAA;EACP,QAAA,EAAU,mBAAA;EACV,MAAA,EAAQ,mBAAA;EACR,UAAA,EAAY,mBAAA;AAAA;;KAIV,6BAAA,iBACM,sBAAA,GAAyB,sBAAA,IACvC,0BAAA,CAA2B,OAAA;;KAEnB,wBAAA,GAA2B,qBAAqB;AAtBE;AAU9D;;;;;;AAV8D,UA+B7C,sBAAA;EArB2B;EAuB1C,MAAA,EAAQ,sBAAA;EAvBqD;EAyB7D,MAAA,EAAQ,MAAM;EAxBN;EA0BR,OAAA;AAAA;;;;;UAOe,oCAAA;EA9BwB;EAgCvC,SAAA,EAAW,GAAA;EA5BD;EA8BV,UAAA,GAAa,aAAa;EA9Ba;EAgCvC,UAAA;AAAA;;;;;;;;iBAUc,qBAAA,CACd,QAAA,EAAU,4BAAA,GACT,sBAAsB;;;AA1Ca;AAEtC;;;;iBAmDgB,4BAAA,CAA6B,OAAA;EAC3C,YAAA,QAAoB,MAAA;AAAA,IAClB,sBAAsB;;;;;;;;;AAtCjB;AAOT;;;;;;;;iBA6DgB,4BAAA,CACd,OAAA,EAAS,oCAAA,GACR,sBAAsB;;AAzDb;AAUZ;;;;iBA+DgB,sBAAA,CACd,OAAA,EAAS,6BAAA,GACR,wBAAwB"}
|