@guard-rail/core 0.9.1 → 0.11.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/README.md +253 -36
- package/dist/adapters/supabase/auth.js +1 -2
- package/dist/adapters/supabase/auth.js.map +1 -1
- package/dist/adapters/supabase/client.js +6 -1
- package/dist/adapters/supabase/client.js.map +1 -1
- package/dist/adapters/supabase/confirm.d.ts +11 -11
- package/dist/adapters/supabase/confirm.js +14 -18
- package/dist/adapters/supabase/confirm.js.map +1 -1
- package/dist/adapters/supabase/index.d.ts +3 -1
- package/dist/adapters/supabase/index.js +5 -0
- package/dist/adapters/supabase/index.js.map +1 -1
- package/dist/adapters/supabase/rateLimit.d.ts +24 -0
- package/dist/adapters/supabase/rateLimit.js +37 -0
- package/dist/adapters/supabase/rateLimit.js.map +1 -0
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.js +1046 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init-db.js +23 -5
- package/dist/cli/init-db.js.map +1 -1
- package/dist/core/adapter-types.d.ts +71 -1
- package/dist/core/config.d.ts +12 -1
- package/dist/core/config.js +29 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/csp.d.ts +32 -0
- package/dist/core/csp.js +26 -0
- package/dist/core/csp.js.map +1 -0
- package/dist/core/validate.d.ts +47 -0
- package/dist/core/validate.js +118 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.client.d.ts +2 -1
- package/dist/index.client.js +3 -0
- package/dist/index.client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/react/Admin.d.ts +5 -3
- package/dist/react/Admin.js +29 -41
- package/dist/react/Admin.js.map +1 -1
- package/dist/react/AuthDrawer.js +22 -34
- package/dist/react/AuthDrawer.js.map +1 -1
- package/dist/react/AuthRedirectSync.js +28 -22
- package/dist/react/AuthRedirectSync.js.map +1 -1
- package/dist/react/GRail/client.js +27 -47
- package/dist/react/GRail/client.js.map +1 -1
- package/dist/react/GRail/render.js +3 -2
- package/dist/react/GRail/render.js.map +1 -1
- package/dist/react/MediaPicker.js +12 -16
- package/dist/react/MediaPicker.js.map +1 -1
- package/dist/react/Repeater/client.js +12 -13
- package/dist/react/Repeater/client.js.map +1 -1
- package/dist/react/Team.d.ts +1 -7
- package/dist/react/Team.js +21 -46
- package/dist/react/Team.js.map +1 -1
- package/dist/react/guardrail.css +563 -0
- package/dist/server/actions.js +52 -31
- package/dist/server/actions.js.map +1 -1
- package/dist/server/loader.js +4 -4
- package/dist/server/loader.js.map +1 -1
- package/dist/server/rateLimit.d.ts +21 -0
- package/dist/server/rateLimit.js +94 -0
- package/dist/server/rateLimit.js.map +1 -0
- package/dist/server/repeaterActions.js +9 -1
- package/dist/server/repeaterActions.js.map +1 -1
- package/dist/server/wrapper.js +18 -1
- package/dist/server/wrapper.js.map +1 -1
- package/package.json +11 -9
- package/supabase/admin/check-grants.sql +41 -0
- package/supabase/migrations/20261028000000_require_confirmed_email.sql +53 -0
- package/supabase/migrations/20261028010000_rate_limits.sql +67 -0
- package/supabase/migrations/20261028020000_member_and_bucket_guards.sql +96 -0
- package/dist/react/styles.d.ts +0 -504
- package/dist/react/styles.js +0 -500
- package/dist/react/styles.js.map +0 -1
- package/scripts/postinstall.mjs +0 -48
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { adminClient, assertCredentials } from "./client";
|
|
2
|
+
import { GR_SCHEMA } from "../../core/defs";
|
|
3
|
+
import { memoryLimiter } from "../../server/rateLimit";
|
|
4
|
+
function supabaseRateLimit(creds) {
|
|
5
|
+
assertCredentials(creds);
|
|
6
|
+
if (!creds.serviceRoleKey) return void 0;
|
|
7
|
+
let warned = false;
|
|
8
|
+
return async ({ name, key, limit, windowSeconds }) => {
|
|
9
|
+
const { data, error } = await adminClient(creds).schema(GR_SCHEMA).rpc("gr_rate_hit", {
|
|
10
|
+
p_name: name,
|
|
11
|
+
p_key: key,
|
|
12
|
+
p_limit: limit,
|
|
13
|
+
p_window_seconds: windowSeconds
|
|
14
|
+
});
|
|
15
|
+
if (error) {
|
|
16
|
+
if (error.code === "42883" || error.code === "PGRST202") {
|
|
17
|
+
if (!warned) {
|
|
18
|
+
warned = true;
|
|
19
|
+
console.warn(
|
|
20
|
+
"Guardrail (Supabase): the rate-limit function isn't installed, so limits are counted in memory. Run `pnpm exec guardrail-init-db --push` to add it."
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
return memoryLimiter({ name, key, limit, windowSeconds });
|
|
24
|
+
}
|
|
25
|
+
throw new Error(error.message);
|
|
26
|
+
}
|
|
27
|
+
const row = Array.isArray(data) ? data[0] : data;
|
|
28
|
+
return {
|
|
29
|
+
allowed: Boolean(row?.allowed),
|
|
30
|
+
retryAfterSeconds: Number(row?.retry_after_seconds) || void 0
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
supabaseRateLimit
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/supabase/rateLimit.ts"],"sourcesContent":["import { adminClient, assertCredentials, type SupabaseCredentials } from \"./client\";\nimport { GR_SCHEMA } from \"../../core/defs\";\nimport { memoryLimiter } from \"../../server/rateLimit\";\nimport type { GRRateLimiter } from \"../../core/adapter-types\";\n\n/**\n * Rate-limit counters in the project's own `guardrail` schema (see the\n * rate_limits migration), so a site gets limits that hold across serverless\n * instances with nothing extra to run. One database round trip per counted\n * attempt — slower than Redis, and fine at the rate people sign in.\n *\n * Needs the service-role key, because sign-in and \"Forgot password?\" have no\n * session to carry the call. Used automatically by supabaseAdapters() when\n * that key is present.\n *\n * Failure handling: if the migration hasn't been applied yet (the function\n * doesn't exist), this warns once and counts in memory instead — an upgrade\n * that forgot the migration shouldn't lock everyone out of signing in. Any\n * other database error throws, which blocks the request (fail closed).\n */\nexport function supabaseRateLimit(creds: SupabaseCredentials): GRRateLimiter | undefined {\n assertCredentials(creds);\n if (!creds.serviceRoleKey) return undefined;\n\n let warned = false;\n return async ({ name, key, limit, windowSeconds }) => {\n const { data, error } = await adminClient(creds)\n .schema(GR_SCHEMA)\n .rpc(\"gr_rate_hit\", {\n p_name: name,\n p_key: key,\n p_limit: limit,\n p_window_seconds: windowSeconds,\n });\n\n if (error) {\n // 42883 = function doesn't exist; PGRST202 = PostgREST can't find it.\n if (error.code === \"42883\" || error.code === \"PGRST202\") {\n if (!warned) {\n warned = true;\n console.warn(\n \"Guardrail (Supabase): the rate-limit function isn't installed, so limits are counted in memory. Run `pnpm exec guardrail-init-db --push` to add it.\",\n );\n }\n return memoryLimiter({ name, key, limit, windowSeconds });\n }\n throw new Error(error.message);\n }\n\n const row = Array.isArray(data) ? data[0] : data;\n return {\n allowed: Boolean(row?.allowed),\n retryAfterSeconds: Number(row?.retry_after_seconds) || undefined,\n };\n };\n}\n"],"mappings":"AAAA,SAAS,aAAa,yBAAmD;AACzE,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAkBvB,SAAS,kBAAkB,OAAuD;AACvF,oBAAkB,KAAK;AACvB,MAAI,CAAC,MAAM,eAAgB,QAAO;AAElC,MAAI,SAAS;AACb,SAAO,OAAO,EAAE,MAAM,KAAK,OAAO,cAAc,MAAM;AACpD,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,YAAY,KAAK,EAC5C,OAAO,SAAS,EAChB,IAAI,eAAe;AAAA,MAClB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB,CAAC;AAEH,QAAI,OAAO;AAET,UAAI,MAAM,SAAS,WAAW,MAAM,SAAS,YAAY;AACvD,YAAI,CAAC,QAAQ;AACX,mBAAS;AACT,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,eAAO,cAAc,EAAE,MAAM,KAAK,OAAO,cAAc,CAAC;AAAA,MAC1D;AACA,YAAM,IAAI,MAAM,MAAM,OAAO;AAAA,IAC/B;AAEA,UAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,KAAK,CAAC,IAAI;AAC5C,WAAO;AAAA,MACL,SAAS,QAAQ,KAAK,OAAO;AAAA,MAC7B,mBAAmB,OAAO,KAAK,mBAAmB,KAAK;AAAA,IACzD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|