@supacloud/lite 0.11.0 → 0.12.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 +12 -0
- package/dist/cli.js +51 -3
- package/dist/index.js +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.12.0](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.11.0...supacloud-lite-v0.12.0) (2026-09-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **compiler,app:** add module tags and boundary governance with Nx workspace configuration ([#1110](https://github.com/vibeunion/supacloud/issues/1110)) ([dda9635](https://github.com/vibeunion/supacloud/commit/dda96355ba25a53f1b550e8e95011b1c806a2003))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Miscellaneous Chores
|
|
12
|
+
|
|
13
|
+
* clean up obsolete scripts, deprecated files and tech debt ([#1109](https://github.com/vibeunion/supacloud/issues/1109)) ([3df42f7](https://github.com/vibeunion/supacloud/commit/3df42f7a3ddfb57866427c648c08fbcac699b7dc))
|
|
14
|
+
|
|
3
15
|
## [0.11.0](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.10.0...supacloud-lite-v0.11.0) (2026-09-02)
|
|
4
16
|
|
|
5
17
|
|
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ import { dirname as dirname8, join as join10, resolve as resolve6 } from "path";
|
|
|
9
9
|
// package.json
|
|
10
10
|
var package_default = {
|
|
11
11
|
name: "@supacloud/lite",
|
|
12
|
-
version: "0.
|
|
12
|
+
version: "0.12.0",
|
|
13
13
|
description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
|
|
14
14
|
type: "module",
|
|
15
15
|
license: "Apache-2.0",
|
|
@@ -59,7 +59,7 @@ var package_default = {
|
|
|
59
59
|
},
|
|
60
60
|
dependencies: {
|
|
61
61
|
"@electric-sql/pglite": "0.5.8",
|
|
62
|
-
"@supacloud/db": "^0.
|
|
62
|
+
"@supacloud/db": "^0.2.0",
|
|
63
63
|
tar: "^7.5.22"
|
|
64
64
|
},
|
|
65
65
|
devDependencies: {
|
|
@@ -12204,6 +12204,18 @@ JOIN pg_language l ON l.oid = p.prolang
|
|
|
12204
12204
|
WHERE n.nspname = ANY($1)
|
|
12205
12205
|
ORDER BY n.nspname, p.proname
|
|
12206
12206
|
`;
|
|
12207
|
+
var TRIGGERS_SQL = `
|
|
12208
|
+
SELECT n.nspname AS schema,
|
|
12209
|
+
c.relname AS table,
|
|
12210
|
+
t.tgname AS name,
|
|
12211
|
+
t.tgenabled <> 'D' AS enabled
|
|
12212
|
+
FROM pg_trigger t
|
|
12213
|
+
JOIN pg_class c ON c.oid = t.tgrelid
|
|
12214
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
12215
|
+
WHERE NOT t.tgisinternal
|
|
12216
|
+
AND n.nspname = ANY($1)
|
|
12217
|
+
ORDER BY n.nspname, c.relname, t.tgname
|
|
12218
|
+
`;
|
|
12207
12219
|
var GRANTS_SQL = `
|
|
12208
12220
|
SELECT table_schema AS object_schema,
|
|
12209
12221
|
table_name AS object_name,
|
|
@@ -12236,10 +12248,11 @@ function extractSearchPath(config) {
|
|
|
12236
12248
|
}
|
|
12237
12249
|
async function readCatalog(executor, schemas = ["public"]) {
|
|
12238
12250
|
const params = [schemas];
|
|
12239
|
-
const [tableRows, policyRows, functionRows, grantRows] = await Promise.all([
|
|
12251
|
+
const [tableRows, policyRows, functionRows, triggerRows, grantRows] = await Promise.all([
|
|
12240
12252
|
executor.query(TABLES_SQL, params),
|
|
12241
12253
|
executor.query(POLICIES_SQL, params),
|
|
12242
12254
|
executor.query(FUNCTIONS_SQL, params),
|
|
12255
|
+
executor.query(TRIGGERS_SQL, params),
|
|
12243
12256
|
executor.query(GRANTS_SQL, params)
|
|
12244
12257
|
]);
|
|
12245
12258
|
return {
|
|
@@ -12265,6 +12278,12 @@ async function readCatalog(executor, schemas = ["public"]) {
|
|
|
12265
12278
|
searchPath: extractSearchPath(row.config),
|
|
12266
12279
|
language: row.language
|
|
12267
12280
|
})),
|
|
12281
|
+
triggers: triggerRows.map((row) => ({
|
|
12282
|
+
schema: row.schema,
|
|
12283
|
+
table: row.table,
|
|
12284
|
+
name: row.name,
|
|
12285
|
+
enabled: row.enabled
|
|
12286
|
+
})),
|
|
12268
12287
|
grants: grantRows.map((row) => ({
|
|
12269
12288
|
objectSchema: row.object_schema,
|
|
12270
12289
|
objectName: row.object_name,
|
|
@@ -12318,6 +12337,20 @@ function reconcileModule(module, catalog) {
|
|
|
12318
12337
|
push("error", "definer-without-search-path", fn.name, `security definer \u51FD\u6570 ${fn.name} \u672A\u8BBE\u7F6E\u56FA\u5B9A search_path\uFF08\u5F53\u524D: ${cf.searchPath ?? "\u672A\u8BBE\u7F6E"}\uFF09`);
|
|
12319
12338
|
}
|
|
12320
12339
|
}
|
|
12340
|
+
for (const trigger of module.triggers) {
|
|
12341
|
+
const [schema, table] = splitQualifiedName(trigger.table);
|
|
12342
|
+
const found = catalog.triggers.some((ct) => ct.schema === schema && ct.table === table && ct.name === trigger.name);
|
|
12343
|
+
if (!found) {
|
|
12344
|
+
push("error", "missing-trigger", `${trigger.table}.${trigger.name}`, `\u58F0\u660E\u7684\u89E6\u53D1\u5668 ${trigger.name} \u5728\u8868 ${trigger.table} \u7684 catalog \u4E2D\u4E0D\u5B58\u5728`);
|
|
12345
|
+
}
|
|
12346
|
+
}
|
|
12347
|
+
const declaredTriggerKeys = new Set(module.triggers.map((t) => `${t.table}::${t.name}`));
|
|
12348
|
+
for (const ct of catalog.triggers) {
|
|
12349
|
+
const qualified = `${ct.schema}.${ct.table}`;
|
|
12350
|
+
if (ownedTables.has(qualified) && !declaredTriggerKeys.has(`${qualified}::${ct.name}`)) {
|
|
12351
|
+
push("warn", "undeclared-trigger", `${qualified}.${ct.name}`, `\u5F52\u5C5E\u8868 ${qualified} \u4E0A\u5B58\u5728\u672A\u58F0\u660E\u7684\u89E6\u53D1\u5668 ${ct.name}${ct.enabled ? "" : "\uFF08\u5DF2\u7981\u7528\uFF09"}\uFF0C\u53EF\u80FD\u53D1\u751F\u6F02\u79FB`);
|
|
12352
|
+
}
|
|
12353
|
+
}
|
|
12321
12354
|
for (const table of module.tables) {
|
|
12322
12355
|
const [schema, name] = splitQualifiedName(table);
|
|
12323
12356
|
const ct = catalog.tables.find((t) => t.schema === schema && t.name === name);
|
|
@@ -12349,6 +12382,8 @@ var SET_SEARCH_PATH_RE = /\bset\s+search_path\b/i;
|
|
|
12349
12382
|
var GRANT_TO_PUBLIC_RE = /\bgrant\b[^;]*\bto\s+public\b/i;
|
|
12350
12383
|
var DROP_WITHOUT_IF_EXISTS_RE = /\bdrop\s+(?:table|column)\s+(?!if\s+exists\b)/i;
|
|
12351
12384
|
var ENABLE_RLS_RE = /\benable\s+row\s+level\s+security\b/i;
|
|
12385
|
+
var CREATE_POLICY_RE = /\bcreate\s+policy\b/i;
|
|
12386
|
+
var DROP_POLICY_IF_EXISTS_RE = /\bdrop\s+policy\s+if\s+exists\b/i;
|
|
12352
12387
|
function lineOf(sql, index) {
|
|
12353
12388
|
let line = 1;
|
|
12354
12389
|
for (let i = 0;i < index; i += 1) {
|
|
@@ -12389,6 +12424,19 @@ function lintSql(sql, file) {
|
|
|
12389
12424
|
line: lineOf(sql, drop.index)
|
|
12390
12425
|
});
|
|
12391
12426
|
}
|
|
12427
|
+
const createPolicy = CREATE_POLICY_RE.exec(sql);
|
|
12428
|
+
if (createPolicy) {
|
|
12429
|
+
const dropPolicy = DROP_POLICY_IF_EXISTS_RE.exec(sql);
|
|
12430
|
+
if (!dropPolicy || dropPolicy.index > createPolicy.index) {
|
|
12431
|
+
issues.push({
|
|
12432
|
+
severity: "warn",
|
|
12433
|
+
code: "non-idempotent-policy",
|
|
12434
|
+
message: "create policy \u524D\u7F3A\u5C11 drop policy if exists\uFF0C\u7B56\u7565\u4E0D\u53EF\u91CD\u590D\u6267\u884C",
|
|
12435
|
+
file,
|
|
12436
|
+
line: lineOf(sql, createPolicy.index)
|
|
12437
|
+
});
|
|
12438
|
+
}
|
|
12439
|
+
}
|
|
12392
12440
|
return issues;
|
|
12393
12441
|
}
|
|
12394
12442
|
async function lintModule(module, readFile2) {
|
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.
|
|
88
|
+
version: "0.12.0",
|
|
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",
|
|
@@ -135,7 +135,7 @@ var package_default = {
|
|
|
135
135
|
},
|
|
136
136
|
dependencies: {
|
|
137
137
|
"@electric-sql/pglite": "0.5.8",
|
|
138
|
-
"@supacloud/db": "^0.
|
|
138
|
+
"@supacloud/db": "^0.2.0",
|
|
139
139
|
tar: "^7.5.22"
|
|
140
140
|
},
|
|
141
141
|
devDependencies: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supacloud/lite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
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",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@electric-sql/pglite": "0.5.8",
|
|
53
|
-
"@supacloud/db": "^0.
|
|
53
|
+
"@supacloud/db": "^0.2.0",
|
|
54
54
|
"tar": "^7.5.22"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|