@supacloud/lite 0.25.1 → 0.27.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.27.0](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.26.0...supacloud-lite-v0.27.0) (2026-10-14)
4
+
5
+
6
+ ### Features
7
+
8
+ * **compiler:** enforce vibecoding defaults ([886c82f](https://github.com/vibeunion/supacloud/commit/886c82f1462261e10c490586cc9446cb447a21ae))
9
+
10
+ ## [0.26.0](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.25.1...supacloud-lite-v0.26.0) (2026-10-12)
11
+
12
+
13
+ ### Features
14
+
15
+ * **lite:** bundle PostgreSQL extension parity set ([#1849](https://github.com/vibeunion/supacloud/issues/1849)) ([233fb1b](https://github.com/vibeunion/supacloud/commit/233fb1bb9d52673a7f38d77d47e8c1e6c0b7c5e4))
16
+
3
17
  ## [0.25.1](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.25.0...supacloud-lite-v0.25.1) (2026-10-11)
4
18
 
5
19
 
@@ -0,0 +1,90 @@
1
+ ---
2
+ title: License
3
+ description: License for Bun
4
+ ---
5
+
6
+ Bun itself is MIT-licensed.
7
+
8
+ ## JavaScriptCore
9
+
10
+ Bun statically links JavaScriptCore (and WebKit), which is LGPL-2 licensed. WebCore files from WebKit are also licensed under LGPL-2. Per LGPL-2:
11
+
12
+ > (1) If you statically link against an LGPL'd library, you must also provide your application in an object (not necessarily source) format, so that a user has the opportunity to modify the library and relink the application.
13
+
14
+ Bun's patched version of WebKit lives at https://github.com/oven-sh/webkit. To relink Bun with changes:
15
+
16
+ - `git clone https://github.com/oven-sh/WebKit vendor/WebKit`
17
+ - `bun sync-webkit-source` (checks out the version pinned in `WEBKIT_VERSION` in `scripts/build/deps/webkit.ts`)
18
+ - `bun run build:local`
19
+
20
+ `bun run build:local` compiles JavaScriptCore, compiles Bun's `.cpp` bindings for JavaScriptCore (the object files that use JavaScriptCore), and outputs a new `bun` binary with your changes.
21
+
22
+ ## Linked libraries
23
+
24
+ Bun statically links these libraries:
25
+
26
+ | Library | License |
27
+ | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
28
+ | [`boringssl`](https://boringssl.googlesource.com/boringssl/) | [several licenses](https://boringssl.googlesource.com/boringssl/+/refs/heads/master/LICENSE) |
29
+ | [`brotli`](https://github.com/google/brotli) | MIT |
30
+ | [`libarchive`](https://github.com/libarchive/libarchive) | [several licenses](https://github.com/libarchive/libarchive/blob/master/COPYING) |
31
+ | [`lol-html`](https://github.com/cloudflare/lol-html/tree/master/c-api) | BSD 3-Clause |
32
+ | [`ls-hpack`](https://github.com/litespeedtech/ls-hpack) | MIT (bundled xxhash is BSD 2-Clause) |
33
+ | [`ls-qpack`](https://github.com/litespeedtech/ls-qpack) | MIT |
34
+ | [`lsquic`](https://github.com/litespeedtech/lsquic) | MIT (portions derived from Chromium proto-quic, BSD 3-Clause) |
35
+ | [`mimalloc`](https://github.com/microsoft/mimalloc) | MIT |
36
+ | [`picohttp`](https://github.com/h2o/picohttpparser) | dual-licensed under the Perl License or the MIT License |
37
+ | [`zstd`](https://github.com/facebook/zstd) | dual-licensed under the BSD License or GPLv2 license |
38
+ | [`simdutf`](https://github.com/simdutf/simdutf) | Apache 2.0 |
39
+ | [`tinycc`](https://github.com/tinycc/tinycc) | LGPL v2.1 |
40
+ | [`uSockets`](https://github.com/uNetworking/uSockets) | Apache 2.0 |
41
+ | [`zlib-ng`](https://github.com/zlib-ng/zlib-ng) | zlib |
42
+ | [`c-ares`](https://github.com/c-ares/c-ares) | MIT licensed |
43
+ | [`libicu`](https://github.com/unicode-org/icu) 78 | [ICU license](https://github.com/unicode-org/icu/blob/main/icu4c/LICENSE) |
44
+ | [`libbase64`](https://github.com/aklomp/base64/blob/master/LICENSE) | BSD 2-Clause |
45
+ | [`libuv`](https://github.com/libuv/libuv) (on Windows) | MIT |
46
+ | [`libdeflate`](https://github.com/ebiggers/libdeflate) | MIT |
47
+ | [`libjpeg-turbo`](https://github.com/libjpeg-turbo/libjpeg-turbo) | BSD 3-Clause / IJG / zlib |
48
+ | [`libspng`](https://github.com/randy408/libspng) | BSD 2-Clause (portions derived from libpng, PNG Reference Library License v2) |
49
+ | [`libwebp`](https://github.com/webmproject/libwebp) | BSD 3-Clause |
50
+ | [`highway`](https://github.com/google/highway) | Apache 2.0 |
51
+ | [`HdrHistogram_c`](https://github.com/HdrHistogram/HdrHistogram_c) | dual-licensed under CC0 1.0 or the BSD 2-Clause License |
52
+ | [`sqlite`](https://sqlite.org) (on Linux and Windows) | [public domain](https://sqlite.org/copyright.html) |
53
+ | A fork of [`uWebsockets`](https://github.com/jarred-sumner/uwebsockets) | Apache 2.0 licensed |
54
+ | Parts of [Tigerbeetle's IO code](https://github.com/tigerbeetle/tigerbeetle/blob/532c8b70b9142c17e07737ab6d3da68d7500cbca/src/io/windows.zig#L1) | Apache 2.0 licensed |
55
+
56
+ ## Polyfills
57
+
58
+ For compatibility, Bun embeds the following packages into its binary and injects them if imported.
59
+
60
+ | Package | License |
61
+ | ------------------------------------------------------------------------ | ------- |
62
+ | [`acorn`](https://github.com/acornjs/acorn) | MIT |
63
+ | [`acorn-walk`](https://github.com/acornjs/acorn) | MIT |
64
+ | [`assert`](https://npmjs.com/package/assert) | MIT |
65
+ | [`browserify-zlib`](https://npmjs.com/package/browserify-zlib) | MIT |
66
+ | [`buffer`](https://npmjs.com/package/buffer) | MIT |
67
+ | [`constants-browserify`](https://npmjs.com/package/constants-browserify) | MIT |
68
+ | [`crypto-browserify`](https://npmjs.com/package/crypto-browserify) | MIT |
69
+ | [`domain-browser`](https://npmjs.com/package/domain-browser) | MIT |
70
+ | [`events`](https://npmjs.com/package/events) | MIT |
71
+ | [`https-browserify`](https://npmjs.com/package/https-browserify) | MIT |
72
+ | [`os-browserify`](https://npmjs.com/package/os-browserify) | MIT |
73
+ | [`path-browserify`](https://npmjs.com/package/path-browserify) | MIT |
74
+ | [`process`](https://npmjs.com/package/process) | MIT |
75
+ | [`punycode`](https://npmjs.com/package/punycode) | MIT |
76
+ | [`querystring-es3`](https://npmjs.com/package/querystring-es3) | MIT |
77
+ | [`stream-browserify`](https://npmjs.com/package/stream-browserify) | MIT |
78
+ | [`stream-http`](https://npmjs.com/package/stream-http) | MIT |
79
+ | [`string_decoder`](https://npmjs.com/package/string_decoder) | MIT |
80
+ | [`timers-browserify`](https://npmjs.com/package/timers-browserify) | MIT |
81
+ | [`tty-browserify`](https://npmjs.com/package/tty-browserify) | MIT |
82
+ | [`url`](https://npmjs.com/package/url) | MIT |
83
+ | [`util`](https://npmjs.com/package/util) | MIT |
84
+ | [`vm-browserify`](https://npmjs.com/package/vm-browserify) | MIT |
85
+
86
+ ## Additional credits
87
+
88
+ - Bun's JS transpiler and Node.js module resolver source code is a port of [@evanw](https://github.com/evanw)’s [esbuild](https://github.com/evanw/esbuild) project.
89
+ - Bun's CSS parser source code is derived from the [Lightning CSS](https://github.com/parcel-bundler/lightningcss) and [Servo](https://github.com/servo/servo) projects.
90
+ - Credit to [@kipply](https://github.com/kipply) for the name "Bun".
package/README.md CHANGED
@@ -12,7 +12,7 @@ V1 的目标不是复刻完整 Supabase 平台控制面,而是让现有应用
12
12
 
13
13
  ### 状态
14
14
 
15
- - 运行时:npm 包需要 Bun 1.4.2+;单二进制发行版已内嵌 Bun 和 PGlite 资源
15
+ - 运行时:npm 包需要 Bun 1.4.3+;单二进制发行版已内嵌 Bun 和 PGlite 资源
16
16
  - 数据库:PGlite 0.5.8,或 native PostgreSQL
17
17
  - 项目模型:单进程、单项目,内部 project ref 固定为 `local`
18
18
  - 客户端:直接使用官方 `@supabase/supabase-js`
@@ -334,7 +334,7 @@ S3 模式的快照只包含数据库中的 Storage 元数据和密钥,不复
334
334
  | Commands / Artifacts | 支持 | 与完整 SupaCloud 使用相同 SQL contract;PGlite/native 均通过 `@supacloud/js` 端到端测试 |
335
335
  | Logical Replication / PowerSync source | 有条件支持 | PGlite 不支持;native 仅在显式 `powersync` profile 下支持,默认关闭 |
336
336
  | PostgREST 完整线协议 | 部分支持 | 目标是常用 `supabase-js` 行为,不承诺所有 PostgREST 边角行为 |
337
- | PostgreSQL 扩展 | 部分支持 | 仅支持 PGlite 内置或 Lite 模拟的扩展能力 |
337
+ | PostgreSQL 扩展 | 默认扩展集 + Native 可扩展 | PGlite 默认包含 `pgvector`、实验性 PostGIS、`pg_textsearch`、官方 `pgmq` 及 Lite 原有扩展;Native 模式支持挂载与 PostgreSQL 主版本、操作系统和 ABI 匹配的 operator-managed 扩展安装 |
338
338
  | Supabase Studio | 不支持 | V1 不提供管理 UI |
339
339
  | 多项目控制面 | 不支持 | V1 每个进程只运行一个项目,可通过多个进程部署多个项目 |
340
340
 
@@ -348,6 +348,37 @@ RLS 表的 Realtime DELETE 无法在行删除后安全重放 SELECT policy,因
348
348
  supacloud-lite doctor --json
349
349
  ```
350
350
 
351
+ ### PostgreSQL 扩展生态
352
+
353
+ Lite 默认把一组常用扩展打进 PGlite:`uuid-ossp`、`pgcrypto`、`citext`、
354
+ `pg_trgm`、`ltree`、`hstore`、`fuzzystrmatch`、`pgvector`、
355
+ `pg_textsearch`、PostGIS 和官方 `pgmq`。其中 PostGIS 是上游实验性包,
356
+ 应按实际空间数据 workload 验证。需要 `pg_graphql`、`pg_cron` 或其他未
357
+ 打包的 native 扩展时,应使用 `--engine native`,并提供一套与 Lite 使用的
358
+ PostgreSQL 主版本、操作系统、CPU 架构和 ABI 匹配的 PostgreSQL 安装:
359
+
360
+ ```bash
361
+ supacloud-lite migrate \
362
+ --engine native \
363
+ --postgres-dir /opt/postgresql/17
364
+
365
+ supacloud-lite doctor \
366
+ --engine native \
367
+ --postgres-dir /opt/postgresql/17 \
368
+ --json
369
+ ```
370
+
371
+ `doctor --json` 的 `postgres_extensions.available` 来自 PostgreSQL 的
372
+ `pg_available_extensions`,`installed` 来自当前数据库的 `pg_extension`;
373
+ 它只报告数据库实际可见的扩展,不会把“存在 control 文件”误报成已经可用。
374
+ 扩展迁移仍由项目自己的 `CREATE EXTENSION` migration 管理。
375
+
376
+ “完整 PostgreSQL 扩展生态”因此表示:Lite 不再人为限制 native 扩展,
377
+ 而是使用 operator-managed PostgreSQL 的真实扩展目录;它不表示每个平台、
378
+ 每个 PostgreSQL 主版本和每个扩展都能被同一个 Release 二进制打包。需要
379
+ 扩展的动态库、control/SQL 文件和系统依赖由 PostgreSQL 安装提供,并且
380
+ 升级 PostgreSQL 主版本时必须重新验证扩展 ABI 和数据目录兼容性。
381
+
351
382
  默认 PGlite 输出会明确包含:
352
383
 
353
384
  ```json
@@ -419,8 +450,13 @@ const { data: messages } = await queues.rpc('read', {
419
450
  })
420
451
  ```
421
452
 
422
- Lite 的 `pgmq` 模拟层还提供 `set_vt`,支持直接 SQL 调整可见性超时。消息按 PGMQ 语义至少投递一次;`pop` 会立即删除消息,`archive` 是确认路径。`sleep_seconds` 和 visibility timeout 只控制消息何时可再次领取,不是消息 TTL;Lite/PGMQ 不提供逐消息到期删除语义。队列创建、指标、purge、设置和管理 API 不属于 Lite 的公开 RPC façade,仍需由项目 SQL 或完整 SupaCloud 控制面处理。
423
- 队列名遵循标准版的 1-128 位小写字母、数字、下划线和短横线规则,并且必须以字母或数字开头;Lite 会安全映射超出 PostgreSQL 63-byte 标识符上限的名称,避免截断后串队。默认 Data API 暴露 `public` 和 `pgmq_public`;如果显式设置 `dbSchemas`,Lite 会严格使用该列表,需要队列 RPC 时应把 `pgmq_public` 明确加入。
453
+ Lite 的 PGMQ 层还提供 `set_vt`,支持直接 SQL 调整可见性超时。消息按
454
+ PGMQ 语义至少投递一次;`pop` 会立即删除消息,`archive` 是确认路径。
455
+ `sleep_seconds` 和 visibility timeout 只控制消息何时可再次领取,不是消息 TTL。
456
+ 队列名遵循官方 PGMQ 的 1-47 位小写字母、数字、下划线和短横线规则,并且
457
+ 必须以字母或数字开头。默认 Data API 暴露 `public` 和 `pgmq_public`;如果
458
+ 显式设置 `dbSchemas`,Lite 会严格使用该列表,需要队列 RPC 时应把
459
+ `pgmq_public` 明确加入。
424
460
  Durable workflow 的 run、step、event 和内部队列也保存在同一项目数据库中,可跨进程重启恢复;内部 workflow 队列不会通过 `pgmq_public` 暴露给 Data API 角色。Workflow 提供重试、取消和 dead-letter 失败原语,但不会自动执行 Saga 补偿;补偿步骤及其幂等性仍由应用工作流显式定义。
425
461
 
426
462
  Edge Function 内可使用 `globalThis.SupaCloud.pgredis`:
@@ -477,7 +513,7 @@ The goal of V1 is not to replicate the full Supabase platform control plane, but
477
513
 
478
514
  ### Status
479
515
 
480
- - Runtime: the npm package requires Bun 1.4.2+; the single-binary release embeds Bun and PGlite assets
516
+ - Runtime: the npm package requires Bun 1.4.3+; the single-binary release embeds Bun and PGlite assets
481
517
  - Database: PGlite 0.5.8, or native PostgreSQL
482
518
  - Project model: single process, single project, with an internal project ref fixed as `local`
483
519
  - Client: uses the official `@supabase/supabase-js` directly
@@ -769,7 +805,7 @@ source package for a synthetic baseline, not a production performance claim.
769
805
  | Commands / Artifacts | Supported | Uses the same SQL contract as full SupaCloud; PGlite/native are both exercised end-to-end through `@supacloud/js` |
770
806
  | Logical Replication / PowerSync source | Conditional | PGlite is unsupported; native requires the explicit `powersync` profile and remains disabled by default |
771
807
  | Full PostgREST wire protocol | Partial | Targets common `supabase-js` behavior; does not promise all PostgREST edge-case behavior |
772
- | PostgreSQL extensions | Partial | Only supports extensions built into PGlite or emulated by Lite |
808
+ | PostgreSQL extensions | Bundled parity set plus native-extensible | PGlite bundles the default Lite extension set, including `pgvector`, experimental PostGIS, `pg_textsearch`, and `pgmq`; native mode can use an operator-managed PostgreSQL installation whose extensions match the PostgreSQL major version, OS, CPU architecture, and ABI |
773
809
  | Supabase Studio | Not supported | V1 does not provide an admin UI |
774
810
  | Multi-project control plane | Not supported | V1 runs only one project per process; multiple projects can be deployed via multiple processes |
775
811
 
@@ -779,6 +815,44 @@ Realtime DELETE on RLS tables cannot safely replay SELECT policies after a row i
779
815
 
780
816
  `supacloud-lite doctor --json` reports a stable Lite capability contract without copying the full Management API. PGlite explicitly reports Logical Replication and PowerSync source support as `unsupported`; it never emulates WAL, publications, or slots. Multi-device offline deployments should use central SupaCloud + PowerSync, while a single field workstation can use Lite as a local project server or upload through an application-owned outbox.
781
817
 
818
+ ### PostgreSQL extension ecosystem
819
+
820
+ Lite ships a PostgreSQL-shaped default extension set in PGlite. New databases
821
+ install `uuid-ossp`, `pgcrypto`, `citext`, `pg_trgm`, `ltree`, `hstore`,
822
+ `fuzzystrmatch`, `pgvector`, `pg_textsearch`, PostGIS, and the official PGMQ
823
+ extension automatically when the corresponding bundled WASM package is
824
+ available. PostGIS is experimental upstream and should be validated against
825
+ the application's geometry workload.
826
+
827
+ PGlite can load only WASM/bundled extensions. For `pg_graphql`, `pg_cron`, or
828
+ other extensions that are not in this bundled set, use `--engine native` with
829
+ a PostgreSQL installation whose major version, OS, CPU architecture, and ABI
830
+ match the Lite process:
831
+
832
+ ```bash
833
+ supacloud-lite migrate \
834
+ --engine native \
835
+ --postgres-dir /opt/postgresql/17
836
+
837
+ supacloud-lite doctor \
838
+ --engine native \
839
+ --postgres-dir /opt/postgresql/17 \
840
+ --json
841
+ ```
842
+
843
+ In `doctor --json`, `postgres_extensions.available` comes from
844
+ `pg_available_extensions` and `installed` comes from `pg_extension`. The report
845
+ describes what the live database can see; it does not mistake a control file
846
+ for an extension that has been successfully loaded. Extension migrations remain
847
+ application-owned `CREATE EXTENSION` migrations.
848
+
849
+ “Full PostgreSQL extension ecosystem” therefore means that native Lite does not
850
+ artificially restrict the extensions supplied by the operator-managed
851
+ PostgreSQL installation. It does not mean that every platform, PostgreSQL major
852
+ version, extension shared library, control/SQL file, and system dependency can
853
+ be shipped inside the same Release binary. PostgreSQL major upgrades require
854
+ separate extension ABI and data-directory validation.
855
+
782
856
  Native Lite keeps `wal_level=minimal`, WAL senders, and database TCP disabled by default. The explicit profile enables bounded Logical Replication:
783
857
 
784
858
  ```bash
@@ -804,7 +878,10 @@ Lite uses Bun's native bcrypt and is compatible with validating common GoTrue bc
804
878
 
805
879
  ### Queues and Edge Cache
806
880
 
807
- Lite provides a public RPC façade for Supabase Queues in the project database (PGlite or native PostgreSQL). Applications can directly use the official client's
881
+ Lite uses the official `pgmq` extension on PGlite by default and retains a
882
+ SQL fallback for native PostgreSQL installations where `pgmq` is unavailable.
883
+ The Lite-owned `pgmq_public` façade adds the Supabase-compatible RPC surface
884
+ and idempotent send support. Applications can directly use the official client's
808
885
  `supabase.schema('pgmq_public').rpc(...)` without an additional queue process:
809
886
 
810
887
  ```sql
@@ -826,8 +903,15 @@ const { data: messages } = await queues.rpc('read', {
826
903
  })
827
904
  ```
828
905
 
829
- Lite's `pgmq` emulation layer also provides `set_vt`, allowing direct SQL adjustment of visibility timeouts. Messages are delivered at least once according to PGMQ semantics; `pop` deletes the message immediately, and `archive` is the acknowledgment path. `sleep_seconds` and visibility timeouts only control when a message can be claimed again; they are not message TTLs, and Lite/PGMQ does not provide per-message expiry deletion semantics. Queue creation, metrics, purge, settings, and management APIs are not part of Lite's public RPC façade and must still be handled by project SQL or the full SupaCloud control plane.
830
- Queue names follow the standard 1-128 character lowercase letter, digit, underscore, and hyphen rule, and must start with a letter or digit; Lite safely maps names that exceed PostgreSQL's 63-byte identifier limit to avoid cross-queue collisions after truncation. The default Data API exposes `public` and `pgmq_public`; if `dbSchemas` is set explicitly, Lite uses that list strictly, and `pgmq_public` should be explicitly included when queue RPCs are needed.
906
+ Lite's `pgmq` layer also provides `set_vt`, allowing direct SQL adjustment of
907
+ visibility timeouts. Messages are delivered at least once according to PGMQ
908
+ semantics; `pop` deletes the message immediately, and `archive` is the
909
+ acknowledgment path. `sleep_seconds` and visibility timeouts only control when
910
+ a message can be claimed again; they are not message TTLs. Queue names follow
911
+ the official PGMQ 1-47 character lowercase letter, digit, underscore, and
912
+ hyphen rule, and must start with a letter or digit. Queue creation, metrics,
913
+ purge, settings, and management APIs remain available through direct SQL but
914
+ are not part of Lite's public RPC façade.
831
915
  Durable workflow runs, steps, events, and the internal queue are stored in the same project database and survive process restarts. Data API roles cannot access the internal workflow queue through `pgmq_public`. Workflow retry, cancellation, and dead-letter operations are failure primitives, not automatic Saga compensation; applications must define compensation steps and their idempotency explicitly.
832
916
 
833
917
  Within an Edge Function, you can use `globalThis.SupaCloud.pgredis`:
@@ -18,6 +18,16 @@ SupaCloud Lite 使用 ElectricSQL PGlite 作为嵌入式 PostgreSQL 引擎。
18
18
  - Upstream: `https://github.com/electric-sql/pglite`
19
19
  - Local license copy: `LICENSES/PGLITE-APACHE-2.0.txt`
20
20
 
21
+ Lite also bundles the official PGlite extension packages:
22
+
23
+ - `@electric-sql/pglite-pgvector` 0.0.9
24
+ - `@electric-sql/pglite-postgis` 0.2.8
25
+ - `@electric-sql/pglite-pg_textsearch` 0.0.10
26
+ - `@electric-sql/pglite-pgmq` 0.0.6
27
+
28
+ These packages are published by ElectricSQL under Apache-2.0 and their
29
+ extension archives are embedded in the standalone binary.
30
+
21
31
  ## Native PostgreSQL binaries
22
32
 
23
33
  Linux/macOS 上的可选 native 引擎会按需下载 Theseus 发布的 PostgreSQL 17.7.0 预编译包;该二进制不会内嵌到 npm 包或 Lite 单文件发布物中。
@@ -56,13 +66,13 @@ SupaCloud Lite 使用 `tar` 作为跨平台流式快照归档依赖,避免把
56
66
 
57
67
  ## Bun runtime
58
68
 
59
- SupaCloud Lite 单二进制由 Bun 1.4.2 编译并内嵌 Bun runtime,最终用户无需另外安装 Bun、Node.js 或 npm。
69
+ SupaCloud Lite 单二进制由 Bun 1.4.3 编译并内嵌 Bun runtime,最终用户无需另外安装 Bun、Node.js 或 npm。
60
70
 
61
- - Version: 1.4.2
71
+ - Version: 1.4.3
62
72
  - Bun license: MIT
63
73
  - Upstream: `https://github.com/oven-sh/bun`
64
- - Local runtime notice: `LICENSES/BUN-1.4.2-RUNTIME-NOTICES.txt`
65
- - Notice source: Bun 1.4.2 `docs/project/license.mdx` 的逐字副本
74
+ - Local runtime notice: `LICENSES/BUN-1.4.3-RUNTIME-NOTICES.txt`
75
+ - Notice source: Bun 1.4.3 `docs/project/license.mdx` 的逐字副本
66
76
  - Linked-library coverage: JavaScriptCore/WebKit、`boringssl`、`brotli`、`libarchive`、`lol-html`、`ls-hpack`、`ls-qpack`、`lsquic`、`mimalloc`、`picohttp`、`zstd`、`simdutf`、`tinycc`、`uSockets`、`zlib-ng`、`c-ares`、`libicu` 78、`libbase64`、Windows 上的 `libuv`、`libdeflate`、`libjpeg-turbo`、`libspng`、`libwebp`、`highway`、`HdrHistogram_c`、Linux/Windows 上的 `sqlite`、uWebSockets fork 和 Tigerbeetle IO 代码
67
77
  - Polyfill coverage: `acorn`、`acorn-walk`、`assert`、`browserify-zlib`、`buffer`、`constants-browserify`、`crypto-browserify`、`domain-browser`、`events`、`https-browserify`、`os-browserify`、`path-browserify`、`process`、`punycode`、`querystring-es3`、`stream-browserify`、`stream-http`、`string_decoder`、`timers-browserify`、`tty-browserify`、`url`、`util`、`vm-browserify`
68
78
 
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import { dirname as dirname8, join as join10, resolve as resolve6 } from "path";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@supacloud/lite",
11
- version: "0.25.1",
11
+ version: "0.27.0",
12
12
  description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
13
13
  type: "module",
14
14
  license: "Apache-2.0",
@@ -35,7 +35,7 @@ var package_default = {
35
35
  ],
36
36
  scripts: {
37
37
  build: "bun run build:js && bun run build:types",
38
- "build:js": "bun run clean && bun build src/index.ts --target=bun --format=esm --outdir=dist --external @electric-sql/pglite --external tar && bun build src/cli.ts --target=bun --format=esm --outdir=dist --external @electric-sql/pglite --external tar && bun run scripts/build-launcher.ts",
38
+ "build:js": "bun run clean && bun build src/index.ts --target=bun --format=esm --outdir=dist --external @electric-sql/pglite --external @electric-sql/pglite-pgvector --external @electric-sql/pglite-postgis --external @electric-sql/pglite-pg_textsearch --external @electric-sql/pglite-pgmq --external tar && bun build src/cli.ts --target=bun --format=esm --outdir=dist --external @electric-sql/pglite --external @electric-sql/pglite-pgvector --external @electric-sql/pglite-postgis --external @electric-sql/pglite-pg_textsearch --external @electric-sql/pglite-pgmq --external tar && bun run scripts/build-launcher.ts",
39
39
  "build:standalone:host": "bun run scripts/build-standalone.ts host",
40
40
  "build:standalone:linux-x64": "bun run scripts/build-standalone.ts linux-x64",
41
41
  "build:standalone:linux": "bun run scripts/build-standalone.ts linux-x64 linux-arm64",
@@ -63,6 +63,10 @@ var package_default = {
63
63
  },
64
64
  dependencies: {
65
65
  "@electric-sql/pglite": "0.5.8",
66
+ "@electric-sql/pglite-pg_textsearch": "0.0.10",
67
+ "@electric-sql/pglite-pgmq": "0.0.6",
68
+ "@electric-sql/pglite-pgvector": "0.0.9",
69
+ "@electric-sql/pglite-postgis": "0.2.8",
66
70
  "@supacloud/db": "^0.6.0",
67
71
  "exact-mirror": "1.2.6",
68
72
  tar: "^7.5.22",
@@ -73,7 +77,7 @@ var package_default = {
73
77
  "@supacloud/compiler": "file:../compiler",
74
78
  "@supacloud/elysia": "file:../elysia",
75
79
  "@supabase/supabase-js": "^2.117.3",
76
- "@types/bun": "^1.4.2",
80
+ "@types/bun": "^1.4.3",
77
81
  effect: "4.0.2",
78
82
  elysia: "2.0.0-beta.21",
79
83
  jose: "^6.2.12",
@@ -90,7 +94,7 @@ var package_default = {
90
94
  "@graphql-tools/utils": "^12.0.3"
91
95
  },
92
96
  engines: {
93
- bun: ">=1.4.2"
97
+ bun: ">=1.4.3"
94
98
  },
95
99
  publishConfig: {
96
100
  access: "public",
@@ -3252,7 +3256,10 @@ create schema if not exists extensions;
3252
3256
  do $$
3253
3257
  declare ext text;
3254
3258
  begin
3255
- foreach ext in array array['uuid-ossp','pgcrypto','citext','pg_trgm','ltree','hstore','fuzzystrmatch'] loop
3259
+ foreach ext in array array[
3260
+ 'uuid-ossp','pgcrypto','citext','pg_trgm','ltree','hstore','fuzzystrmatch',
3261
+ 'vector','postgis','pg_textsearch'
3262
+ ] loop
3256
3263
  begin
3257
3264
  execute format('create extension if not exists %I with schema extensions', ext);
3258
3265
  exception when others then
@@ -3261,6 +3268,19 @@ begin
3261
3268
  end loop;
3262
3269
  end $$;
3263
3270
 
3271
+ -- The official pgmq extension owns its required pgmq schema. PGlite and
3272
+ -- native PostgreSQL builds that do not provide it simply continue to Lite's
3273
+ -- SQL fallback during database initialization.
3274
+ create schema if not exists pgmq;
3275
+ do $$
3276
+ begin
3277
+ begin
3278
+ create extension if not exists pgmq with schema pgmq;
3279
+ exception when others then
3280
+ null;
3281
+ end;
3282
+ end $$;
3283
+
3264
3284
  -- uuid-ossp isn't in every Postgres build (it needs an external UUID lib at
3265
3285
  -- build time - e.g. the theseus Linux binaries omit it). uuid_generate_v4() is
3266
3286
  -- the single most-used function from it, so shim it onto core gen_random_uuid()
@@ -3763,7 +3783,7 @@ grant execute on function realtime.send(jsonb, text, text, boolean) to anon, aut
3763
3783
  `;
3764
3784
 
3765
3785
  // src/runtime/db/emulated.ts
3766
- var PGMQ_SQL = `
3786
+ var PGMQ_CORE_SQL = `
3767
3787
  create schema if not exists pgmq;
3768
3788
  revoke all on schema pgmq from public, anon, authenticated;
3769
3789
  grant usage on schema pgmq to service_role;
@@ -3948,6 +3968,8 @@ $pgmq$;
3948
3968
  revoke all on all functions in schema pgmq from public, anon, authenticated;
3949
3969
  grant execute on all functions in schema pgmq to service_role;
3950
3970
 
3971
+ `;
3972
+ var PGMQ_PUBLIC_SQL = `
3951
3973
  -- supacloud:sql-module:pgmq-public:start
3952
3974
  DO $pgmq_extension$
3953
3975
  BEGIN
@@ -4254,6 +4276,8 @@ GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA pgmq_public TO anon, authenticated, ser
4254
4276
  NOTIFY pgrst, 'reload schema';
4255
4277
  -- supacloud:sql-module:pgmq-public:end
4256
4278
  `;
4279
+ var PGMQ_SQL = `${PGMQ_CORE_SQL}
4280
+ ${PGMQ_PUBLIC_SQL}`;
4257
4281
  var WORKFLOWS_SQL = `
4258
4282
  -- supacloud:sql-module:workflows-public:start
4259
4283
  DO $pgmq_extension$
@@ -6342,16 +6366,44 @@ async function createPgliteEngine(dataDir, options = {}) {
6342
6366
  let cleanupStandaloneBundles = async () => {};
6343
6367
  try {
6344
6368
  ({ PGlite } = await import("@electric-sql/pglite"));
6345
- const [uuid_ossp, pgcrypto, citext, pg_trgm, ltree, hstore, fuzzystrmatch] = await Promise.all([
6369
+ const [
6370
+ uuid_ossp,
6371
+ pgcrypto,
6372
+ citext,
6373
+ pg_trgm,
6374
+ ltree,
6375
+ hstore,
6376
+ fuzzystrmatch,
6377
+ vector,
6378
+ postgis,
6379
+ pg_textsearch,
6380
+ pgmq
6381
+ ] = await Promise.all([
6346
6382
  import("@electric-sql/pglite/contrib/uuid_ossp").then((m) => m.uuid_ossp),
6347
6383
  import("@electric-sql/pglite/contrib/pgcrypto").then((m) => m.pgcrypto),
6348
6384
  import("@electric-sql/pglite/contrib/citext").then((m) => m.citext),
6349
6385
  import("@electric-sql/pglite/contrib/pg_trgm").then((m) => m.pg_trgm),
6350
6386
  import("@electric-sql/pglite/contrib/ltree").then((m) => m.ltree),
6351
6387
  import("@electric-sql/pglite/contrib/hstore").then((m) => m.hstore),
6352
- import("@electric-sql/pglite/contrib/fuzzystrmatch").then((m) => m.fuzzystrmatch)
6388
+ import("@electric-sql/pglite/contrib/fuzzystrmatch").then((m) => m.fuzzystrmatch),
6389
+ import("@electric-sql/pglite-pgvector").then((m) => m.vector),
6390
+ import("@electric-sql/pglite-postgis").then((m) => m.postgis),
6391
+ import("@electric-sql/pglite-pg_textsearch").then((m) => m.pg_textsearch),
6392
+ import("@electric-sql/pglite-pgmq").then((m) => m.pgmq)
6353
6393
  ]);
6354
- extensions = { uuid_ossp, pgcrypto, citext, pg_trgm, ltree, hstore, fuzzystrmatch };
6394
+ extensions = {
6395
+ uuid_ossp,
6396
+ pgcrypto,
6397
+ citext,
6398
+ pg_trgm,
6399
+ ltree,
6400
+ hstore,
6401
+ fuzzystrmatch,
6402
+ vector,
6403
+ postgis,
6404
+ pg_textsearch,
6405
+ pgmq
6406
+ };
6355
6407
  } catch (error) {
6356
6408
  await releaseLock();
6357
6409
  if (error instanceof Error && /wasm/.test(error.message))
@@ -6369,7 +6421,11 @@ async function createPgliteEngine(dataDir, options = {}) {
6369
6421
  pg_trgm: withEmbeddedBundle(extensions.pg_trgm, standaloneBundles.bundles.pg_trgm),
6370
6422
  ltree: withEmbeddedBundle(extensions.ltree, standaloneBundles.bundles.ltree),
6371
6423
  hstore: withEmbeddedBundle(extensions.hstore, standaloneBundles.bundles.hstore),
6372
- fuzzystrmatch: withEmbeddedBundle(extensions.fuzzystrmatch, standaloneBundles.bundles.fuzzystrmatch)
6424
+ fuzzystrmatch: withEmbeddedBundle(extensions.fuzzystrmatch, standaloneBundles.bundles.fuzzystrmatch),
6425
+ vector: withEmbeddedBundle(extensions.vector, standaloneBundles.bundles.vector),
6426
+ postgis: withEmbeddedBundle(extensions.postgis, standaloneBundles.bundles.postgis),
6427
+ pg_textsearch: withEmbeddedBundle(extensions.pg_textsearch, standaloneBundles.bundles.pg_textsearch),
6428
+ pgmq: withEmbeddedBundle(extensions.pgmq, standaloneBundles.bundles.pgmq)
6373
6429
  };
6374
6430
  } catch (error) {
6375
6431
  await removePreparedBundles(cleanupStandaloneBundles);
@@ -6515,7 +6571,8 @@ class Database {
6515
6571
  await engine.exec(MINIMAL_BOOTSTRAP_SQL);
6516
6572
  } else {
6517
6573
  await engine.exec(BOOTSTRAP_SQL);
6518
- await engine.exec(PGMQ_SQL);
6574
+ const pgmqExtension = await engine.query(`select extname from pg_extension where extname = 'pgmq' limit 1`);
6575
+ await engine.exec(pgmqExtension.rows.length > 0 ? PGMQ_PUBLIC_SQL : PGMQ_SQL);
6519
6576
  await engine.exec(WORKFLOWS_SQL);
6520
6577
  await engine.exec(CRON_SQL);
6521
6578
  await engine.exec(NET_SQL);
@@ -13633,14 +13690,55 @@ function formatDatabaseModuleCheck(result) {
13633
13690
  `;
13634
13691
  }
13635
13692
 
13693
+ // src/runtime/node/native/extensions.ts
13694
+ async function inspectPostgresExtensions(engine, source) {
13695
+ try {
13696
+ const [available, installed] = await Promise.all([
13697
+ engine.query(`
13698
+ SELECT name, default_version, installed_version, comment
13699
+ FROM pg_available_extensions
13700
+ ORDER BY name
13701
+ `),
13702
+ engine.query(`
13703
+ SELECT extname AS name, extversion AS version
13704
+ FROM pg_extension
13705
+ ORDER BY extname
13706
+ `)
13707
+ ]);
13708
+ return {
13709
+ source,
13710
+ status: "inspected",
13711
+ available: available.rows,
13712
+ installed: installed.rows
13713
+ };
13714
+ } catch (error) {
13715
+ return {
13716
+ source,
13717
+ status: "unavailable",
13718
+ available: [],
13719
+ installed: [],
13720
+ reason: error instanceof Error ? error.message : String(error)
13721
+ };
13722
+ }
13723
+ }
13724
+
13636
13725
  // src/runtime/node/native/readiness.ts
13637
13726
  function liteCapabilities(engine, replicationProfile) {
13727
+ const extensionSource = engine === "native" ? "native-postgresql" : "pglite-bundled";
13638
13728
  const common = {
13639
13729
  graphql: { status: "unverified", extension: "pg_graphql", reason: "DATABASE_NOT_INSPECTED" },
13640
13730
  runtime_mode: "development",
13641
13731
  identity: { mode: "local", verification: "built-in" },
13642
13732
  migrations: { formats: ["flat-sql", "timestamp-folder"], content_check: "supported", target_bindings: "supported" },
13643
- project_release_manifests: "unsupported"
13733
+ project_release_manifests: "unsupported",
13734
+ postgres_extensions: {
13735
+ engine,
13736
+ source: extensionSource,
13737
+ status: "unavailable",
13738
+ available: [],
13739
+ installed: [],
13740
+ reason: "DATABASE_NOT_INSPECTED"
13741
+ }
13644
13742
  };
13645
13743
  if (engine === "pglite") {
13646
13744
  return {
@@ -15897,6 +15995,10 @@ ${privilegedKey}
15897
15995
  const engine = paths.databaseEngine === "native" ? await createNativeEngine({ dataDir: paths.dataDir, installDir: options.postgresDir, log: quietLog, replication }) : await createPgliteEngine(paths.dataDir);
15898
15996
  try {
15899
15997
  report.graphql = await inspectGraphql(engine);
15998
+ report.postgres_extensions = {
15999
+ engine: paths.databaseEngine,
16000
+ ...await inspectPostgresExtensions(engine, paths.databaseEngine === "native" ? "native-postgresql" : "pglite-bundled")
16001
+ };
15900
16002
  if (replication)
15901
16003
  report.powersync_readiness = await inspectPowerSyncReadiness(engine, replication);
15902
16004
  } finally {
@@ -16185,6 +16287,7 @@ async function printInspection(rows) {
16185
16287
  async function printDoctor(report) {
16186
16288
  const output = Object.entries(report).filter(([, value]) => typeof value !== "object").map(([name, value]) => `${name}: ${value}`);
16187
16289
  output.push(`graphql: ${report.graphql.status} (${report.graphql.version ?? report.graphql.reason ?? "pg_graphql"})`);
16290
+ output.push(`postgres_extensions: ${report.postgres_extensions.status} ` + `(${report.postgres_extensions.source}, ${report.postgres_extensions.available.length} available, ` + `${report.postgres_extensions.installed.length} installed)`);
16188
16291
  output.push(`identity: ${report.identity.mode} (${report.identity.verification})`);
16189
16292
  output.push(`migration_formats: ${report.migrations.formats.join(", ")}`);
16190
16293
  if (report.powersync_readiness) {
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export type { RunningServer, ServerHandle, ServeOptions } from './runtime/node/b
15
15
  export { createNativeEngine, ensurePostgres, isNativeEngineSupported, type NativeEngineOptions, } from './runtime/node/native/engine.js';
16
16
  export { POWERSYNC_PUBLICATION, POWERSYNC_REPLICATION_ROLE, buildPowerSyncPostgresArgs, ensurePowerSyncReplicationCatalog, validatePowerSyncReplicationOptions, writePowerSyncHba, type NativeReplicationOptions, type NativeReplicationTlsOptions, type PowerSyncReplicationOptions, } from './runtime/node/native/replication.js';
17
17
  export { inspectPowerSyncReadiness, liteCapabilities, type LiteCapabilityStatus, type LiteDoctorReport, type PowerSyncReadiness, } from './runtime/node/native/readiness.js';
18
+ export { inspectPostgresExtensions, type ExtensionInventorySource, type ExtensionInventoryStatus, type PostgresExtension, type PostgresExtensionInventory, } from './runtime/node/native/extensions.js';
18
19
  export { createProjectBackend, ensureProjectSecrets, mintProjectKeys, resolveDatabaseEngine, resolveNativeReplicationOptions, resolveStorageBackend, resolveProjectPaths, startProjectServer, } from './project-runtime.js';
19
20
  export { createSnapshot, restoreSnapshot, type CreateSnapshotOptions, type RestoreSnapshotOptions, type RestoreSnapshotResult, type SnapshotManifest, } from './snapshot.js';
20
21
  export type { ConfiguredStorageBackend, DatabaseEngine, ProjectBackend, ProjectPaths, ProjectRuntimeOptions, ProjectSecrets, ReplicationProfile, RunningProjectServer, StorageBackend, } from './project-runtime.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,iBAAiB,EAClC,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,SAAS,EACT,OAAO,EACP,SAAS,GACV,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,aAAa,IAAI,mBAAmB,EACpC,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,UAAU,EACV,MAAM,EACN,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EACL,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,gCAAgC,CAAA;AACvC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AACnF,YAAY,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,yBAAyB,EAAE,KAAK,wBAAwB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC7H,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAClG,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC7F,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,iCAAiC,EACjC,mCAAmC,EACnC,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,GACjC,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,+BAA+B,EAC/B,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,iBAAiB,EAClC,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,SAAS,EACT,OAAO,EACP,SAAS,GACV,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,aAAa,IAAI,mBAAmB,EACpC,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,UAAU,EACV,MAAM,EACN,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EACL,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,gCAAgC,CAAA;AACvC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AACnF,YAAY,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,yBAAyB,EAAE,KAAK,wBAAwB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC7H,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAClG,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC7F,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,iCAAiC,EACjC,mCAAmC,EACnC,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,GACjC,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,GAChC,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,+BAA+B,EAC/B,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,sBAAsB,CAAA"}