@supacloud/lite 0.8.2 → 0.8.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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.8.3](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.8.2...supacloud-lite-v0.8.3) (2026-08-15)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **lite:** detect glibc in standalone runtime ([#925](https://github.com/zuohuadong/supacloud/issues/925)) ([c18f0f6](https://github.com/zuohuadong/supacloud/commit/c18f0f6ee86e488a7c603e13416e794060f2012d))
9
+
3
10
  ## [0.8.2](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.8.1...supacloud-lite-v0.8.2) (2026-08-15)
4
11
 
5
12
 
package/README.md CHANGED
@@ -250,7 +250,7 @@ S3 模式的快照只包含数据库中的 Storage 元数据和密钥,不复
250
250
  | `supabase.storage` | 已验证核心 | 覆盖上传下载、列表、删除、TUS/RLS、远端 S3 驱动,以及 Bun.Image 的 `contain`/`fill`、格式和质量变换子集;`cover` 明确不支持 |
251
251
  | `supabase.channel()` | 已验证核心 | 自动测试覆盖 `postgres_changes`、DELETE RLS 隔离和事件快照校验;Broadcast、Presence 属于实验性兼容 |
252
252
  | `supabase.functions.invoke()` | 已验证核心 | 自动测试覆盖 Bun.build、`Deno.serve()`、公开函数和同进程重启 |
253
- | Supabase Queues / PGMQ | 已验证核心 | 提供 `pgmq_public` 的 `send`、`send_batch`、`read`、`pop`、`archive`、`delete` RPC;队列数据持久化在同一 PGlite 项目中 |
253
+ | Supabase Queues / PGMQ | 已验证核心 | 提供 `pgmq_public` 的 `send`、`send_batch`、`read`、`pop`、`archive`、`delete` RPC;队列数据持久化在项目数据库(PGlite native PostgreSQL)中 |
254
254
  | Edge Functions `SupaCloud.pgredis` | 已验证核心 | 提供单项目持久 KV、TTL、原子 `getset`/`getdel`;绑定只在当前函数请求内可用 |
255
255
  | Supabase migrations | 支持 | 按文件名排序,记录到 `supabase_migrations` |
256
256
  | PostgreSQL RLS | 支持 | 使用 `anon`、`authenticated`、`service_role` 数据库角色执行 |
@@ -274,7 +274,7 @@ Lite 使用 Bun 原生 bcrypt,并兼容验证常见 GoTrue bcrypt 密码散列
274
274
 
275
275
  ### 队列与 Edge 缓存
276
276
 
277
- Lite 在同一个 PGlite 数据库中提供 Supabase Queues 的公开 RPC façade。应用可以直接使用官方客户端的
277
+ Lite 在项目数据库(PGlite native PostgreSQL)中提供 Supabase Queues 的公开 RPC façade。应用可以直接使用官方客户端的
278
278
  `supabase.schema('pgmq_public').rpc(...)`,无需额外的队列进程:
279
279
 
280
280
  ```sql
@@ -298,6 +298,7 @@ const { data: messages } = await queues.rpc('read', {
298
298
 
299
299
  Lite 的 `pgmq` 模拟层还提供 `set_vt`,支持直接 SQL 调整可见性超时。消息按 PGMQ 语义至少投递一次;`pop` 会立即删除消息,`archive` 是确认路径。队列创建、指标、purge、设置和管理 API 不属于 Lite 的公开 RPC façade,仍需由项目 SQL 或完整 SupaCloud 控制面处理。
300
300
  队列名遵循标准版的 1-128 位小写字母、数字、下划线和短横线规则,并且必须以字母或数字开头;Lite 会安全映射超出 PostgreSQL 63-byte 标识符上限的名称,避免截断后串队。默认 Data API 暴露 `public` 和 `pgmq_public`;如果显式设置 `dbSchemas`,Lite 会严格使用该列表,需要队列 RPC 时应把 `pgmq_public` 明确加入。
301
+ Durable workflow 的 run、step、event 和内部队列也保存在同一项目数据库中,可跨进程重启恢复;内部 workflow 队列不会通过 `pgmq_public` 暴露给 Data API 角色。
301
302
 
302
303
  Edge Function 内可使用 `globalThis.SupaCloud.pgredis`:
303
304
 
@@ -591,7 +592,7 @@ In-memory databases have no persistable data, so `snapshot` and `upgrade` reject
591
592
  | `supabase.storage` | Verified core | Covers upload/download, list, delete, TUS/RLS, remote S3 driver, and a subset of Bun.Image `contain`/`fill`, format, and quality transforms; `cover` is explicitly unsupported |
592
593
  | `supabase.channel()` | Verified core | Automated tests cover `postgres_changes`, DELETE RLS isolation, and event snapshot validation; Broadcast and Presence are experimentally compatible |
593
594
  | `supabase.functions.invoke()` | Verified core | Automated tests cover Bun.build, `Deno.serve()`, public functions, and in-process restart |
594
- | Supabase Queues / PGMQ | Verified core | Provides `send`, `send_batch`, `read`, `pop`, `archive`, and `delete` RPCs for `pgmq_public`; queue data is persisted in the same PGlite project |
595
+ | Supabase Queues / PGMQ | Verified core | Provides `send`, `send_batch`, `read`, `pop`, `archive`, and `delete` RPCs for `pgmq_public`; queue data is persisted in the project database (PGlite or native PostgreSQL) |
595
596
  | Edge Functions `SupaCloud.pgredis` | Verified core | Provides single-project persistent KV, TTL, and atomic `getset`/`getdel`; the binding is only available within the current function request |
596
597
  | Supabase migrations | Supported | Sorted by filename, recorded in `supabase_migrations` |
597
598
  | PostgreSQL RLS | Supported | Executed using the `anon`, `authenticated`, and `service_role` database roles |
@@ -615,7 +616,7 @@ Lite uses Bun's native bcrypt and is compatible with validating common GoTrue bc
615
616
 
616
617
  ### Queues and Edge Cache
617
618
 
618
- Lite provides a public RPC façade for Supabase Queues within the same PGlite database. Applications can directly use the official client's
619
+ 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
619
620
  `supabase.schema('pgmq_public').rpc(...)` without an additional queue process:
620
621
 
621
622
  ```sql
@@ -639,6 +640,7 @@ const { data: messages } = await queues.rpc('read', {
639
640
 
640
641
  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. 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.
641
642
  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.
643
+ 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`.
642
644
 
643
645
  Within an Edge Function, you can use `globalThis.SupaCloud.pgredis`:
644
646
 
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import { dirname as dirname7, join as join10, resolve as resolve4 } from "path";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@supacloud/lite",
11
- version: "0.8.2",
11
+ version: "0.8.3",
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",
@@ -45,7 +45,7 @@ var package_default = {
45
45
  dev: "bun run src/cli.ts start",
46
46
  start: "bun run src/cli.ts start",
47
47
  test: "bun test --timeout 20000",
48
- "test:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun test test/native-engine.test.ts --timeout 180000",
48
+ "test:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun test test/native-engine.test.ts test/qauth-workflow-matrix.test.ts --timeout 180000",
49
49
  parity: "bun run parity/harness.ts",
50
50
  "parity:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun run parity/harness.ts --engine native",
51
51
  "check:native": "bun run test:native && bun run parity:native",
@@ -10256,7 +10256,7 @@ import { tmpdir as tmpdir2 } from "os";
10256
10256
  import { dirname as dirname2, join as join2 } from "path";
10257
10257
 
10258
10258
  // src/runtime/node/native/engine.ts
10259
- import { execFileSync, spawn } from "child_process";
10259
+ import { execFileSync, spawn, spawnSync } from "child_process";
10260
10260
  import { createHash as createHash2, randomBytes as randomBytes2 } from "crypto";
10261
10261
  import { appendFileSync, chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync } from "fs";
10262
10262
  import { writeFile } from "fs/promises";
@@ -10798,16 +10798,45 @@ function toPgArrayLiteral(array) {
10798
10798
  var DEFAULT_PG_VERSION = "17.7.0";
10799
10799
  var POSTGRES_MIRROR_URL_ERROR = "SUPACLOUD_LITE_POSTGRES_MIRROR must be an absolute HTTPS URL or a loopback HTTP URL";
10800
10800
  var NATIVE_POSTGRES_MAJOR = DEFAULT_PG_VERSION.split(".")[0];
10801
+ var GLIBC_DYNAMIC_LOADERS = {
10802
+ x64: [
10803
+ "/lib64/ld-linux-x86-64.so.2",
10804
+ "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"
10805
+ ],
10806
+ arm64: [
10807
+ "/lib/ld-linux-aarch64.so.1",
10808
+ "/lib64/ld-linux-aarch64.so.1",
10809
+ "/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1"
10810
+ ]
10811
+ };
10801
10812
  function isNativeEngineSupported() {
10802
10813
  return (process.platform === "darwin" || process.platform === "linux") && (process.arch === "arm64" || process.arch === "x64") && (process.platform !== "linux" || isGlibcLinux());
10803
10814
  }
10804
10815
  function isGlibcLinux() {
10805
- try {
10806
- const version = execFileSync("ldd", ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
10807
- return /glibc|gnu libc/i.test(version);
10808
- } catch {
10809
- return false;
10810
- }
10816
+ const runtimeEvidence = {
10817
+ runtimeVersion: reportedGlibcVersion(),
10818
+ dynamicLoaderPresent: glibcDynamicLoaderPresent()
10819
+ };
10820
+ return isGlibcRuntime(runtimeEvidence) || isGlibcRuntime({ ...runtimeEvidence, lddVersion: lddVersion() });
10821
+ }
10822
+ function isGlibcRuntime(evidence) {
10823
+ return Boolean(evidence.runtimeVersion?.trim()) || evidence.dynamicLoaderPresent || /glibc|gnu libc/i.test(evidence.lddVersion ?? "");
10824
+ }
10825
+ function reportedGlibcVersion() {
10826
+ const report = process.report?.getReport();
10827
+ const runtimeVersion = report?.header?.glibcVersionRuntime;
10828
+ return typeof runtimeVersion === "string" ? runtimeVersion : undefined;
10829
+ }
10830
+ function glibcDynamicLoaderPresent() {
10831
+ const loaderPaths = process.arch === "x64" ? GLIBC_DYNAMIC_LOADERS.x64 : process.arch === "arm64" ? GLIBC_DYNAMIC_LOADERS.arm64 : [];
10832
+ return loaderPaths.some((loaderPath) => existsSync(loaderPath));
10833
+ }
10834
+ function lddVersion() {
10835
+ const command = spawnSync("ldd", ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
10836
+ if (command.error || command.status !== 0)
10837
+ return;
10838
+ return `${command.stdout}
10839
+ ${command.stderr}`.trim();
10811
10840
  }
10812
10841
  function target() {
10813
10842
  const arch = process.arch === "arm64" ? "aarch64" : process.arch === "x64" ? "x86_64" : null;
package/dist/index.js CHANGED
@@ -85,7 +85,7 @@ function randomToken(bytes = 32) {
85
85
  // package.json
86
86
  var package_default = {
87
87
  name: "@supacloud/lite",
88
- version: "0.8.2",
88
+ version: "0.8.3",
89
89
  description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
90
90
  type: "module",
91
91
  license: "Apache-2.0",
@@ -122,7 +122,7 @@ var package_default = {
122
122
  dev: "bun run src/cli.ts start",
123
123
  start: "bun run src/cli.ts start",
124
124
  test: "bun test --timeout 20000",
125
- "test:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun test test/native-engine.test.ts --timeout 180000",
125
+ "test:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun test test/native-engine.test.ts test/qauth-workflow-matrix.test.ts --timeout 180000",
126
126
  parity: "bun run parity/harness.ts",
127
127
  "parity:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun run parity/harness.ts --engine native",
128
128
  "check:native": "bun run test:native && bun run parity:native",
@@ -10269,7 +10269,7 @@ async function serveBun(backend, opts = {}) {
10269
10269
  };
10270
10270
  }
10271
10271
  // src/runtime/node/native/engine.ts
10272
- import { execFileSync, spawn } from "child_process";
10272
+ import { execFileSync, spawn, spawnSync } from "child_process";
10273
10273
  import { createHash as createHash2, randomBytes as randomBytes2 } from "crypto";
10274
10274
  import { appendFileSync, chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync } from "fs";
10275
10275
  import { writeFile as writeFile2 } from "fs/promises";
@@ -10811,16 +10811,45 @@ function toPgArrayLiteral(array) {
10811
10811
  var DEFAULT_PG_VERSION = "17.7.0";
10812
10812
  var POSTGRES_MIRROR_URL_ERROR = "SUPACLOUD_LITE_POSTGRES_MIRROR must be an absolute HTTPS URL or a loopback HTTP URL";
10813
10813
  var NATIVE_POSTGRES_MAJOR = DEFAULT_PG_VERSION.split(".")[0];
10814
+ var GLIBC_DYNAMIC_LOADERS = {
10815
+ x64: [
10816
+ "/lib64/ld-linux-x86-64.so.2",
10817
+ "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"
10818
+ ],
10819
+ arm64: [
10820
+ "/lib/ld-linux-aarch64.so.1",
10821
+ "/lib64/ld-linux-aarch64.so.1",
10822
+ "/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1"
10823
+ ]
10824
+ };
10814
10825
  function isNativeEngineSupported() {
10815
10826
  return (process.platform === "darwin" || process.platform === "linux") && (process.arch === "arm64" || process.arch === "x64") && (process.platform !== "linux" || isGlibcLinux());
10816
10827
  }
10817
10828
  function isGlibcLinux() {
10818
- try {
10819
- const version = execFileSync("ldd", ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
10820
- return /glibc|gnu libc/i.test(version);
10821
- } catch {
10822
- return false;
10823
- }
10829
+ const runtimeEvidence = {
10830
+ runtimeVersion: reportedGlibcVersion(),
10831
+ dynamicLoaderPresent: glibcDynamicLoaderPresent()
10832
+ };
10833
+ return isGlibcRuntime(runtimeEvidence) || isGlibcRuntime({ ...runtimeEvidence, lddVersion: lddVersion() });
10834
+ }
10835
+ function isGlibcRuntime(evidence) {
10836
+ return Boolean(evidence.runtimeVersion?.trim()) || evidence.dynamicLoaderPresent || /glibc|gnu libc/i.test(evidence.lddVersion ?? "");
10837
+ }
10838
+ function reportedGlibcVersion() {
10839
+ const report = process.report?.getReport();
10840
+ const runtimeVersion = report?.header?.glibcVersionRuntime;
10841
+ return typeof runtimeVersion === "string" ? runtimeVersion : undefined;
10842
+ }
10843
+ function glibcDynamicLoaderPresent() {
10844
+ const loaderPaths = process.arch === "x64" ? GLIBC_DYNAMIC_LOADERS.x64 : process.arch === "arm64" ? GLIBC_DYNAMIC_LOADERS.arm64 : [];
10845
+ return loaderPaths.some((loaderPath) => existsSync(loaderPath));
10846
+ }
10847
+ function lddVersion() {
10848
+ const command = spawnSync("ldd", ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
10849
+ if (command.error || command.status !== 0)
10850
+ return;
10851
+ return `${command.stdout}
10852
+ ${command.stderr}`.trim();
10824
10853
  }
10825
10854
  function target() {
10826
10855
  const arch = process.arch === "arm64" ? "aarch64" : process.arch === "x64" ? "x86_64" : null;
@@ -1,5 +1,10 @@
1
1
  import type { DbEngine } from '../../db/engine.js';
2
2
  export declare const NATIVE_POSTGRES_MAJOR: string;
3
+ export interface GlibcRuntimeEvidence {
4
+ runtimeVersion?: string;
5
+ dynamicLoaderPresent: boolean;
6
+ lddVersion?: string;
7
+ }
3
8
  /** Options for {@link createNativeEngine}. */
4
9
  export interface NativeEngineOptions {
5
10
  /** Postgres data directory (created + initdb'd if missing). */
@@ -14,6 +19,7 @@ export interface NativeEngineOptions {
14
19
  downloadMirror?: string;
15
20
  }
16
21
  export declare function isNativeEngineSupported(): boolean;
22
+ export declare function isGlibcRuntime(evidence: GlibcRuntimeEvidence): boolean;
17
23
  /** Download + unpack Postgres binaries if not already cached (concurrency-safe). Returns the install dir. */
18
24
  export declare function ensurePostgres(version?: string, cacheDir?: string, log?: (m: string) => void, downloadMirror?: string): Promise<string>;
19
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/runtime/node/native/engine.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAOlD,eAAO,MAAM,qBAAqB,QAAoC,CAAA;AAEtE,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAIjD;AA6DD,6GAA6G;AAC7G,wBAAsB,cAAc,CAClC,OAAO,SAAqB,EAC5B,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/F;AAkDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiFrF"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/runtime/node/native/engine.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAOlD,eAAO,MAAM,qBAAqB,QAAoC,CAAA;AActE,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAIjD;AAUD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAItE;AAuED,6GAA6G;AAC7G,wBAAsB,cAAc,CAClC,OAAO,SAAqB,EAC5B,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/F;AAkDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiFrF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supacloud/lite",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -37,7 +37,7 @@
37
37
  "dev": "bun run src/cli.ts start",
38
38
  "start": "bun run src/cli.ts start",
39
39
  "test": "bun test --timeout 20000",
40
- "test:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun test test/native-engine.test.ts --timeout 180000",
40
+ "test:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun test test/native-engine.test.ts test/qauth-workflow-matrix.test.ts --timeout 180000",
41
41
  "parity": "bun run parity/harness.ts",
42
42
  "parity:native": "SUPACLOUD_LITE_TEST_NATIVE=1 bun run parity/harness.ts --engine native",
43
43
  "check:native": "bun run test:native && bun run parity:native",