@nextblock-cms/db 0.20.3 → 0.21.1

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 ADDED
@@ -0,0 +1,47 @@
1
+ # @nextblock-cms/db
2
+
3
+ The database layer of [NextBlock](https://github.com/nextblock-cms/nextblock), the open-core CMS
4
+ for Next.js and Supabase: Supabase clients for each trust level, the generated `Database` types,
5
+ secret encryption, and the premium-package license check. It also ships the NextBlock database
6
+ migrations.
7
+
8
+ Projects created with `npm create nextblock@latest` already depend on it. It is built for
9
+ NextBlock projects (Next.js 16, React 19, `@supabase/ssr`) rather than as a general-purpose
10
+ library.
11
+
12
+ ```bash
13
+ npm install @nextblock-cms/db
14
+ ```
15
+
16
+ ## Entry points
17
+
18
+ | Import | Use it from | What it holds |
19
+ | :-- | :-- | :-- |
20
+ | `@nextblock-cms/db` | client | The browser Supabase client (`createClient`), the `Database` types, and client-side profile and language lookups |
21
+ | `@nextblock-cms/db/server` | server only | `createClient()` scoped to the request cookies, `getSsgSupabaseClient()` for public reads, `getServiceRoleSupabaseClient()` for admin work only (it bypasses Row Level Security), `verifyPackageOnline()`, secret encryption and config resolution |
22
+ | `@nextblock-cms/db/secrets` | server only | Secret encryption (`encryptSecret`, `decryptSecret`) and config resolution, without the Supabase clients |
23
+ | `@nextblock-cms/db/types` | types only | The generated `Database` types |
24
+
25
+ Pick the server client by trust level. Use the service-role client only in code that has
26
+ already checked the caller's role.
27
+
28
+ ## Environment
29
+
30
+ The clients read `NEXT_PUBLIC_SUPABASE_URL` or `SUPABASE_URL`, the publishable (anon) key under
31
+ either its `NEXT_PUBLIC_` or its plain name, and, for the service-role client,
32
+ `SUPABASE_SERVICE_ROLE_KEY` or `SUPABASE_SECRET_KEY`. The alternative names are the ones the
33
+ Vercel Supabase integration injects.
34
+
35
+ ## Migrations
36
+
37
+ The package includes `supabase/` with the NextBlock migrations. `npm run update` in a NextBlock
38
+ project copies them into the project's `supabase/migrations` and applies the pending ones.
39
+
40
+ ## Documentation
41
+
42
+ - [Database and auth](https://github.com/nextblock-cms/nextblock/blob/master/docs/04-DATABASE-AND-AUTH.md)
43
+ - [Staying up to date](https://github.com/nextblock-cms/nextblock/blob/master/docs/13-STAYING-UP-TO-DATE.md)
44
+
45
+ ## License
46
+
47
+ AGPL-3.0-or-later.
package/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./lib/supabase/client.cjs.js"),t=require("./lib/supabase/types.cjs.js"),i=require("./lib/media-actions.cjs.js");exports.createClient=e.createClient;exports.getActiveLanguagesClientSide=e.getActiveLanguagesClientSide;exports.getProfileWithRoleClientSide=e.getProfileWithRoleClientSide;exports.Constants=t.Constants;exports.recordMediaUpload=i.recordMediaUpload;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./lib/supabase/client.cjs.js"),t=require("./lib/supabase/types.cjs.js"),n=require("./lib/media-actions.cjs.js");exports.Constants=t.Constants,exports.createClient=e.createClient,exports.getActiveLanguagesClientSide=e.getActiveLanguagesClientSide,exports.getProfileWithRoleClientSide=e.getProfileWithRoleClientSide,exports.recordMediaUpload=n.recordMediaUpload;
package/index.es.js CHANGED
@@ -1,10 +1,4 @@
1
- import { createClient as o, getActiveLanguagesClientSide as r, getProfileWithRoleClientSide as i } from "./lib/supabase/client.es.js";
2
- import { Constants as l } from "./lib/supabase/types.es.js";
3
- import { recordMediaUpload as d } from "./lib/media-actions.es.js";
4
- export {
5
- l as Constants,
6
- o as createClient,
7
- r as getActiveLanguagesClientSide,
8
- i as getProfileWithRoleClientSide,
9
- d as recordMediaUpload
10
- };
1
+ import { createClient as e, getActiveLanguagesClientSide as t, getProfileWithRoleClientSide as n } from "./lib/supabase/client.es.js";
2
+ import { Constants as r } from "./lib/supabase/types.es.js";
3
+ import { recordMediaUpload as i } from "./lib/media-actions.es.js";
4
+ export { r as Constants, e as createClient, t as getActiveLanguagesClientSide, n as getProfileWithRoleClientSide, i as recordMediaUpload };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=new Set;function a(e,n,s){const t=typeof e=="string"?e.trim():"";if(t)return t;const o=process.env[n],r=typeof o=="string"?o.trim():"";return r?(s?.warnOnEnvFallback!==!1&&!i.has(n)&&(i.add(n),console.warn(`[nextblock-config] "${n}" is still resolved from an environment variable. Configure it in the CMS to move it into the database.`)),r):null}function l(){return process.env.NEXT_PUBLIC_IS_SANDBOX==="true"}exports.isSandboxEnvironment=l;exports.resolveConfigValue=a;
1
+ var e=new Set;function t(t,n,r){let i=typeof t==`string`?t.trim():``;if(i)return i;let a=process.env[n],o=typeof a==`string`?a.trim():``;return o?(r?.warnOnEnvFallback!==!1&&!e.has(n)&&(e.add(n),console.warn(`[nextblock-config] "${n}" is still resolved from an environment variable. Configure it in the CMS to move it into the database.`)),o):null}function n(){return process.env.NEXT_PUBLIC_IS_SANDBOX===`true`}exports.isSandboxEnvironment=n,exports.resolveConfigValue=t;
@@ -1,17 +1,13 @@
1
- const i = /* @__PURE__ */ new Set();
2
- function f(t, n, s) {
3
- const r = typeof t == "string" ? t.trim() : "";
4
- if (r)
5
- return r;
6
- const o = process.env[n], e = typeof o == "string" ? o.trim() : "";
7
- return e ? (s?.warnOnEnvFallback !== !1 && !i.has(n) && (i.add(n), console.warn(
8
- `[nextblock-config] "${n}" is still resolved from an environment variable. Configure it in the CMS to move it into the database.`
9
- )), e) : null;
1
+ //#region src/lib/config-resolve.ts
2
+ var e = /* @__PURE__ */ new Set();
3
+ function t(t, n, r) {
4
+ let i = typeof t == "string" ? t.trim() : "";
5
+ if (i) return i;
6
+ let a = process.env[n], o = typeof a == "string" ? a.trim() : "";
7
+ return o ? (r?.warnOnEnvFallback !== !1 && !e.has(n) && (e.add(n), console.warn(`[nextblock-config] "${n}" is still resolved from an environment variable. Configure it in the CMS to move it into the database.`)), o) : null;
10
8
  }
11
- function a() {
12
- return process.env.NEXT_PUBLIC_IS_SANDBOX === "true";
9
+ function n() {
10
+ return process.env.NEXT_PUBLIC_IS_SANDBOX === "true";
13
11
  }
14
- export {
15
- a as isSandboxEnvironment,
16
- f as resolveConfigValue
17
- };
12
+ //#endregion
13
+ export { n as isSandboxEnvironment, t as resolveConfigValue };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("./supabase/server.cjs.js"),_=require("next/cache"),o=require("@nextblock-cms/utils/server");async function j(e,a){const n=e.actorUserId,d=n?g.getServiceRoleSupabaseClient():g.createClient();let s;if(n)s=n;else{const{data:{user:r},error:t}=await d.auth.getUser();if(t||!r)return a?{error:"User not authenticated for media record."}:o.encodedRedirect("error","/cms/media","User not authenticated for media record.");s=r.id}const{data:l}=await d.from("profiles").select("role").eq("id",s).single();if(!l||!["ADMIN","WRITER"].includes(l.role))return a?{error:"Forbidden: Insufficient permissions to record media."}:o.encodedRedirect("error","/cms/media","Forbidden: Insufficient permissions to record media.");let i=e.r2Variants.find(r=>r.variantLabel==="original_avif")||e.r2Variants.find(r=>r.variantLabel==="xlarge_avif")||e.r2Variants[0]||e.originalImageDetails;i||(i=e.originalImageDetails||{objectKey:e.r2OriginalKey,url:"",width:0,height:0,fileType:"application/octet-stream",sizeBytes:0,variantLabel:"fallback_original"});const b=[...e.originalImageDetails&&e.originalImageDetails.objectKey!==i.objectKey?[e.originalImageDetails]:[],...e.r2Variants].filter((r,t,m)=>t===m.findIndex(f=>f.objectKey===r.objectKey)),h=r=>{const t=r.lastIndexOf(".");return(t>0?r.substring(0,t):r).replace(/[-+_\\]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w+/g,u=>u.charAt(0).toUpperCase()+u.slice(1))},p=e.description??(i.fileType?.startsWith("image/")||e.originalImageDetails?.fileType?.startsWith("image/")?h(e.fileName):null),I={uploader_id:s,file_name:e.fileName,object_key:i.objectKey,file_path:i.objectKey,folder:(()=>{const r=i.objectKey.match(/^(.*\/)?.*$/);return r&&r[1]?r[1]:null})(),file_type:i.fileType,size_bytes:i.sizeBytes,description:p,width:i.width,height:i.height,variants:b,blur_data_url:e.blurDataUrl||null},{data:v,error:c}=await d.from("media").insert(I).select().single();if(c)return console.error("Error recording media upload:",c),a?{error:`Failed to record media: ${c.message}`}:o.encodedRedirect("error","/cms/media",`Failed to record media: ${c.message}`);if(_.revalidatePath("/cms/media"),a)return{success:!0,data:v};o.encodedRedirect("success","/cms/media","Media recorded successfully.")}exports.recordMediaUpload=j;
1
+ "use server";const e=require("./supabase/server.cjs.js");let t=require("next/cache"),n=require("@nextblock-cms/utils/server");async function r(r,i){let a=r.actorUserId,o=a?e.getServiceRoleSupabaseClient():e.createClient(),s;if(a)s=a;else{let{data:{user:e},error:t}=await o.auth.getUser();if(t||!e)return i?{error:`User not authenticated for media record.`}:(0,n.encodedRedirect)(`error`,`/cms/media`,`User not authenticated for media record.`);s=e.id}let{data:c}=await o.from(`profiles`).select(`role`).eq(`id`,s).single();if(!c||![`ADMIN`,`WRITER`].includes(c.role))return i?{error:`Forbidden: Insufficient permissions to record media.`}:(0,n.encodedRedirect)(`error`,`/cms/media`,`Forbidden: Insufficient permissions to record media.`);let l=r.r2Variants.find(e=>e.variantLabel===`original_avif`)||r.r2Variants.find(e=>e.variantLabel===`xlarge_avif`)||r.r2Variants[0]||r.originalImageDetails;l||=r.originalImageDetails||{objectKey:r.r2OriginalKey,url:``,width:0,height:0,fileType:`application/octet-stream`,sizeBytes:0,variantLabel:`fallback_original`};let u=[...r.originalImageDetails&&r.originalImageDetails.objectKey!==l.objectKey?[r.originalImageDetails]:[],...r.r2Variants].filter((e,t,n)=>t===n.findIndex(t=>t.objectKey===e.objectKey)),d=r.description??(l.fileType?.startsWith(`image/`)||r.originalImageDetails?.fileType?.startsWith(`image/`)?(e=>{let t=e.lastIndexOf(`.`);return(t>0?e.substring(0,t):e).replace(/[-+_\\]+/g,` `).replace(/\s+/g,` `).trim().replace(/\b\w+/g,e=>e.charAt(0).toUpperCase()+e.slice(1))})(r.fileName):null),f={uploader_id:s,file_name:r.fileName,object_key:l.objectKey,file_path:l.objectKey,folder:(()=>{let e=l.objectKey.match(/^(.*\/)?.*$/);return e&&e[1]?e[1]:null})(),file_type:l.fileType,size_bytes:l.sizeBytes,description:d,width:l.width,height:l.height,variants:u,blur_data_url:r.blurDataUrl||null},{data:p,error:m}=await o.from(`media`).insert(f).select().single();if(m)return console.error(`Error recording media upload:`,m),i?{error:`Failed to record media: ${m.message}`}:(0,n.encodedRedirect)(`error`,`/cms/media`,`Failed to record media: ${m.message}`);if((0,t.revalidatePath)(`/cms/media`),i)return{success:!0,data:p};(0,n.encodedRedirect)(`success`,`/cms/media`,`Media recorded successfully.`)}exports.recordMediaUpload=r;
@@ -1,61 +1,54 @@
1
- import { getServiceRoleSupabaseClient as _, createClient as j } from "./supabase/server.es.js";
2
- import { revalidatePath as v } from "next/cache";
3
- import { encodedRedirect as n } from "@nextblock-cms/utils/server";
4
- async function w(e, a) {
5
- const c = e.actorUserId, l = c ? _() : j();
6
- let s;
7
- if (c)
8
- s = c;
9
- else {
10
- const { data: { user: r }, error: t } = await l.auth.getUser();
11
- if (t || !r)
12
- return a ? { error: "User not authenticated for media record." } : n("error", "/cms/media", "User not authenticated for media record.");
13
- s = r.id;
14
- }
15
- const { data: d } = await l.from("profiles").select("role").eq("id", s).single();
16
- if (!d || !["ADMIN", "WRITER"].includes(d.role))
17
- return a ? { error: "Forbidden: Insufficient permissions to record media." } : n("error", "/cms/media", "Forbidden: Insufficient permissions to record media.");
18
- let i = e.r2Variants.find((r) => r.variantLabel === "original_avif") || e.r2Variants.find((r) => r.variantLabel === "xlarge_avif") || e.r2Variants[0] || e.originalImageDetails;
19
- i || (i = e.originalImageDetails || {
20
- objectKey: e.r2OriginalKey,
21
- url: "",
22
- width: 0,
23
- height: 0,
24
- fileType: "application/octet-stream",
25
- sizeBytes: 0,
26
- variantLabel: "fallback_original"
27
- });
28
- const u = [
29
- ...e.originalImageDetails && e.originalImageDetails.objectKey !== i.objectKey ? [e.originalImageDetails] : [],
30
- ...e.r2Variants
31
- ].filter(
32
- (r, t, m) => t === m.findIndex((f) => f.objectKey === r.objectKey)
33
- ), b = (r) => {
34
- const t = r.lastIndexOf(".");
35
- return (t > 0 ? r.substring(0, t) : r).replace(/[-+_\\]+/g, " ").replace(/\s+/g, " ").trim().replace(/\b\w+/g, (g) => g.charAt(0).toUpperCase() + g.slice(1));
36
- }, h = e.description ?? (i.fileType?.startsWith("image/") || e.originalImageDetails?.fileType?.startsWith("image/") ? b(e.fileName) : null), p = {
37
- uploader_id: s,
38
- file_name: e.fileName,
39
- object_key: i.objectKey,
40
- file_path: i.objectKey,
41
- folder: (() => {
42
- const r = i.objectKey.match(/^(.*\/)?.*$/);
43
- return r && r[1] ? r[1] : null;
44
- })(),
45
- file_type: i.fileType,
46
- size_bytes: i.sizeBytes,
47
- description: h,
48
- width: i.width,
49
- height: i.height,
50
- variants: u,
51
- blur_data_url: e.blurDataUrl || null
52
- }, { data: I, error: o } = await l.from("media").insert(p).select().single();
53
- if (o)
54
- return console.error("Error recording media upload:", o), a ? { error: `Failed to record media: ${o.message}` } : n("error", "/cms/media", `Failed to record media: ${o.message}`);
55
- if (v("/cms/media"), a)
56
- return { success: !0, data: I };
57
- n("success", "/cms/media", "Media recorded successfully.");
1
+ "use server";
2
+ import { createClient as e, getServiceRoleSupabaseClient as t } from "./supabase/server.es.js";
3
+ import { revalidatePath as n } from "next/cache";
4
+ import { encodedRedirect as r } from "@nextblock-cms/utils/server";
5
+ //#region src/lib/media-actions.ts
6
+ async function i(i, a) {
7
+ let o = i.actorUserId, s = o ? t() : e(), c;
8
+ if (o) c = o;
9
+ else {
10
+ let { data: { user: e }, error: t } = await s.auth.getUser();
11
+ if (t || !e) return a ? { error: "User not authenticated for media record." } : r("error", "/cms/media", "User not authenticated for media record.");
12
+ c = e.id;
13
+ }
14
+ let { data: l } = await s.from("profiles").select("role").eq("id", c).single();
15
+ if (!l || !["ADMIN", "WRITER"].includes(l.role)) return a ? { error: "Forbidden: Insufficient permissions to record media." } : r("error", "/cms/media", "Forbidden: Insufficient permissions to record media.");
16
+ let u = i.r2Variants.find((e) => e.variantLabel === "original_avif") || i.r2Variants.find((e) => e.variantLabel === "xlarge_avif") || i.r2Variants[0] || i.originalImageDetails;
17
+ u ||= i.originalImageDetails || {
18
+ objectKey: i.r2OriginalKey,
19
+ url: "",
20
+ width: 0,
21
+ height: 0,
22
+ fileType: "application/octet-stream",
23
+ sizeBytes: 0,
24
+ variantLabel: "fallback_original"
25
+ };
26
+ let d = [...i.originalImageDetails && i.originalImageDetails.objectKey !== u.objectKey ? [i.originalImageDetails] : [], ...i.r2Variants].filter((e, t, n) => t === n.findIndex((t) => t.objectKey === e.objectKey)), f = i.description ?? (u.fileType?.startsWith("image/") || i.originalImageDetails?.fileType?.startsWith("image/") ? ((e) => {
27
+ let t = e.lastIndexOf(".");
28
+ return (t > 0 ? e.substring(0, t) : e).replace(/[-+_\\]+/g, " ").replace(/\s+/g, " ").trim().replace(/\b\w+/g, (e) => e.charAt(0).toUpperCase() + e.slice(1));
29
+ })(i.fileName) : null), p = {
30
+ uploader_id: c,
31
+ file_name: i.fileName,
32
+ object_key: u.objectKey,
33
+ file_path: u.objectKey,
34
+ folder: (() => {
35
+ let e = u.objectKey.match(/^(.*\/)?.*$/);
36
+ return e && e[1] ? e[1] : null;
37
+ })(),
38
+ file_type: u.fileType,
39
+ size_bytes: u.sizeBytes,
40
+ description: f,
41
+ width: u.width,
42
+ height: u.height,
43
+ variants: d,
44
+ blur_data_url: i.blurDataUrl || null
45
+ }, { data: m, error: h } = await s.from("media").insert(p).select().single();
46
+ if (h) return console.error("Error recording media upload:", h), a ? { error: `Failed to record media: ${h.message}` } : r("error", "/cms/media", `Failed to record media: ${h.message}`);
47
+ if (n("/cms/media"), a) return {
48
+ success: !0,
49
+ data: m
50
+ };
51
+ r("success", "/cms/media", "Media recorded successfully.");
58
52
  }
59
- export {
60
- w as recordMediaUpload
61
- };
53
+ //#endregion
54
+ export { i as recordMediaUpload };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("server-only");const A=require("./supabase/server.cjs.js"),E=require("next/cache"),_=require("@supabase/supabase-js"),c="package-activation";function l(e){if(typeof e!="string"||!e.trim())return null;const r=e.trim(),t=/(?:z|[+-]\d{2}:?\d{2})$/i.test(r),n=Date.parse(t?r:`${r.replace(" ","T")}Z`);return Number.isFinite(n)?n:null}function i(e){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e,t=r.nextblock&&typeof r.nextblock=="object"&&!Array.isArray(r.nextblock)?r.nextblock:null,n=[t?.expiration,t?.trial_ends_at,r.expiration].map(l).filter(s=>s!==null);return n.length>0?Math.min(...n):null}function o(e,r=Date.now()){if(e.status!=="active")return!1;const t=i(e.meta);return t===null||t>r}async function a(e,r){try{const{data:t,error:n}=await r.from("package_activations").select("status, meta").eq("package_id",e).eq("status","active").limit(5);return n||!Array.isArray(t)?!1:t.some(s=>o(s))}catch(t){return console.error(`Error verifying package ${e}:`,t),!1}}const S=E.unstable_cache(async e=>{const r=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,t=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY||process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY;if(!r||!t)return!1;const n=_.createClient(r,t,{auth:{persistSession:!1,autoRefreshToken:!1,detectSessionInUrl:!1}});return a(e,n)},["package-activation"],{revalidate:60,tags:[c]});async function u(e,r){if(r)return a(e,r);const t=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,n=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY||process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY;if(t&&n)return S(e);const s=await A.createClient();return a(e,s)}exports.PACKAGE_ACTIVATION_CACHE_TAG=c;exports.isPackageActivationRowValid=o;exports.resolvePackageActivationExpiry=i;exports.verifyPackageOnline=u;
1
+ const e=require("./supabase/server.cjs.js");let t=require("@supabase/supabase-js"),n=require("next/cache");require("server-only");var r=`package-activation`;function i(e){if(typeof e!=`string`||!e.trim())return null;let t=e.trim(),n=/(?:z|[+-]\d{2}:?\d{2})$/i.test(t),r=Date.parse(n?t:`${t.replace(` `,`T`)}Z`);return Number.isFinite(r)?r:null}function a(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=t.nextblock&&typeof t.nextblock==`object`&&!Array.isArray(t.nextblock)?t.nextblock:null,r=[n?.expiration,n?.trial_ends_at,t.expiration].map(i).filter(e=>e!==null);return r.length>0?Math.min(...r):null}function o(e,t=Date.now()){if(e.status!==`active`)return!1;let n=a(e.meta);return n===null||n>t}async function s(e,t){try{let{data:n,error:r}=await t.from(`package_activations`).select(`status, meta`).eq(`package_id`,e).eq(`status`,`active`).limit(5);return r||!Array.isArray(n)?!1:n.some(e=>o(e))}catch(t){return console.error(`Error verifying package ${e}:`,t),!1}}var c=(0,n.unstable_cache)(async e=>{let n=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,r=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY||process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY;return!n||!r?!1:s(e,(0,t.createClient)(n,r,{auth:{persistSession:!1,autoRefreshToken:!1,detectSessionInUrl:!1}}))},[`package-activation`],{revalidate:60,tags:[r]});async function l(t,n){if(n)return s(t,n);let r=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,i=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY||process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY;return r&&i?c(t):s(t,await e.createClient())}exports.PACKAGE_ACTIVATION_CACHE_TAG=r,exports.isPackageActivationRowValid=o,exports.resolvePackageActivationExpiry=a,exports.verifyPackageOnline=l;
@@ -1,63 +1,51 @@
1
+ import { createClient as e } from "./supabase/server.es.js";
2
+ import { createClient as t } from "@supabase/supabase-js";
3
+ import { unstable_cache as n } from "next/cache";
1
4
  import "server-only";
2
- import { createClient as c } from "./supabase/server.es.js";
3
- import { unstable_cache as o } from "next/cache";
4
- import { createClient as i } from "@supabase/supabase-js";
5
- const A = "package-activation";
6
- function E(e) {
7
- if (typeof e != "string" || !e.trim())
8
- return null;
9
- const r = e.trim(), t = /(?:z|[+-]\d{2}:?\d{2})$/i.test(r), n = Date.parse(t ? r : `${r.replace(" ", "T")}Z`);
10
- return Number.isFinite(n) ? n : null;
5
+ //#region src/lib/package-validation.ts
6
+ var r = "package-activation";
7
+ function i(e) {
8
+ if (typeof e != "string" || !e.trim()) return null;
9
+ let t = e.trim(), n = /(?:z|[+-]\d{2}:?\d{2})$/i.test(t), r = Date.parse(n ? t : `${t.replace(" ", "T")}Z`);
10
+ return Number.isFinite(r) ? r : null;
11
11
  }
12
- function _(e) {
13
- if (!e || typeof e != "object" || Array.isArray(e))
14
- return null;
15
- const r = e, t = r.nextblock && typeof r.nextblock == "object" && !Array.isArray(r.nextblock) ? r.nextblock : null, n = [t?.expiration, t?.trial_ends_at, r.expiration].map(E).filter((s) => s !== null);
16
- return n.length > 0 ? Math.min(...n) : null;
12
+ function a(e) {
13
+ if (!e || typeof e != "object" || Array.isArray(e)) return null;
14
+ let t = e, n = t.nextblock && typeof t.nextblock == "object" && !Array.isArray(t.nextblock) ? t.nextblock : null, r = [
15
+ n?.expiration,
16
+ n?.trial_ends_at,
17
+ t.expiration
18
+ ].map(i).filter((e) => e !== null);
19
+ return r.length > 0 ? Math.min(...r) : null;
17
20
  }
18
- function l(e, r = Date.now()) {
19
- if (e.status !== "active")
20
- return !1;
21
- const t = _(e.meta);
22
- return t === null || t > r;
21
+ function o(e, t = Date.now()) {
22
+ if (e.status !== "active") return !1;
23
+ let n = a(e.meta);
24
+ return n === null || n > t;
23
25
  }
24
- async function a(e, r) {
25
- try {
26
- const { data: t, error: n } = await r.from("package_activations").select("status, meta").eq("package_id", e).eq("status", "active").limit(5);
27
- return n || !Array.isArray(t) ? !1 : t.some((s) => l(s));
28
- } catch (t) {
29
- return console.error(`Error verifying package ${e}:`, t), !1;
30
- }
26
+ async function s(e, t) {
27
+ try {
28
+ let { data: n, error: r } = await t.from("package_activations").select("status, meta").eq("package_id", e).eq("status", "active").limit(5);
29
+ return r || !Array.isArray(n) ? !1 : n.some((e) => o(e));
30
+ } catch (t) {
31
+ return console.error(`Error verifying package ${e}:`, t), !1;
32
+ }
31
33
  }
32
- const S = o(
33
- async (e) => {
34
- const r = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, t = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SECRET_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY;
35
- if (!r || !t)
36
- return !1;
37
- const n = i(r, t, {
38
- auth: {
39
- persistSession: !1,
40
- autoRefreshToken: !1,
41
- detectSessionInUrl: !1
42
- }
43
- });
44
- return a(e, n);
45
- },
46
- ["package-activation"],
47
- { revalidate: 60, tags: [A] }
48
- );
49
- async function U(e, r) {
50
- if (r)
51
- return a(e, r);
52
- const t = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, n = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SECRET_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY;
53
- if (t && n)
54
- return S(e);
55
- const s = await c();
56
- return a(e, s);
34
+ var c = n(async (e) => {
35
+ let n = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, r = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SECRET_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY;
36
+ return !n || !r ? !1 : s(e, t(n, r, { auth: {
37
+ persistSession: !1,
38
+ autoRefreshToken: !1,
39
+ detectSessionInUrl: !1
40
+ } }));
41
+ }, ["package-activation"], {
42
+ revalidate: 60,
43
+ tags: [r]
44
+ });
45
+ async function l(t, n) {
46
+ if (n) return s(t, n);
47
+ let r = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, i = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SECRET_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY;
48
+ return r && i ? c(t) : s(t, await e());
57
49
  }
58
- export {
59
- A as PACKAGE_ACTIVATION_CACHE_TAG,
60
- l as isPackageActivationRowValid,
61
- _ as resolvePackageActivationExpiry,
62
- U as verifyPackageOnline
63
- };
50
+ //#endregion
51
+ export { r as PACKAGE_ACTIVATION_CACHE_TAG, o as isPackageActivationRowValid, a as resolvePackageActivationExpiry, l as verifyPackageOnline };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("node:crypto"),c="aes-256-gcm",a=1;function E(t){const e=t.trim();if(!e)throw new Error("A non-empty encryption secret is required to manage stored secrets.");return o.createHash("sha256").update(e).digest()}function i(t){if(!t||typeof t!="object")return!1;const e=t;return e.algorithm===c&&e.version===a&&typeof e.authTag=="string"&&typeof e.ciphertext=="string"&&typeof e.iv=="string"}function g(t){if(!i(t))throw new Error("Invalid encrypted secret payload.");const e=t;return{algorithm:e.algorithm,authTag:e.authTag,ciphertext:e.ciphertext,iv:e.iv,last4:typeof e.last4=="string"?e.last4:"",updatedAt:typeof e.updatedAt=="string"?e.updatedAt:"",version:e.version}}function d(t){const e=t.value.trim();if(!e)throw new Error("A non-empty value is required to encrypt a secret.");const n=E(t.encryptionSecret),r=o.randomBytes(12),s=o.createCipheriv(c,n,r),S=Buffer.concat([s.update(e,"utf8"),s.final()]),h=s.getAuthTag();return{algorithm:c,authTag:h.toString("base64"),ciphertext:S.toString("base64"),iv:r.toString("base64"),last4:e.slice(-4),updatedAt:(t.now??new Date).toISOString(),version:a}}function u(t){const e=g(t.envelope),n=E(t.encryptionSecret);try{const r=o.createDecipheriv(c,n,Buffer.from(e.iv,"base64"));return r.setAuthTag(Buffer.from(e.authTag,"base64")),Buffer.concat([r.update(Buffer.from(e.ciphertext,"base64")),r.final()]).toString("utf8")}catch{throw new Error("Failed to decrypt stored secret.")}}function l(t){const e=(t??"").trim();return e?`•••• ${e}`:"Stored secret"}function v(t){if(!i(t))return{hasStoredValue:!1,last4:null,maskedValue:null,updatedAt:null};const e=t,n=typeof e.last4=="string"&&e.last4?e.last4:null;return{hasStoredValue:!0,last4:n,maskedValue:l(n),updatedAt:typeof e.updatedAt=="string"&&e.updatedAt?e.updatedAt:null}}const _="nextblock-secret-encryption-key-v1";function m(){const t=process.env.SUPABASE_SERVICE_ROLE_KEY??process.env.SUPABASE_SECRET_KEY;return typeof t!="string"||!t.trim()?null:o.createHmac("sha256",t.trim()).update(_).digest("hex")}function f(){const t=[],e=n=>{const r=typeof n=="string"?n.trim():"";r&&!t.includes(r)&&t.push(r)};return e(process.env.NEXTBLOCK_ENCRYPTION_KEY),e(process.env.CORTEX_AI_ENCRYPTION_KEY),e(m()),t}function p(){return f()[0]??null}function K(){return p()!==null}function y(){const t=p();if(!t)throw new Error("An encryption key (NEXTBLOCK_ENCRYPTION_KEY or CORTEX_AI_ENCRYPTION_KEY) is required to manage stored secrets.");return t}function T(t,e){return d({value:t,encryptionSecret:y(),now:e})}function A(t){return u({envelope:t,encryptionSecret:y()})}function O(t){if(!i(t))return null;for(const e of f())try{return u({envelope:t,encryptionSecret:e})}catch{}return null}exports.SECRET_ENVELOPE_ALGORITHM=c;exports.SECRET_ENVELOPE_VERSION=a;exports.decryptSecret=u;exports.decryptWithEnvKey=A;exports.encryptSecret=d;exports.encryptWithEnvKey=T;exports.getMaskedSecret=l;exports.getSecretEnvelopeStatus=v;exports.hasSecretEncryptionKey=K;exports.isEncryptedSecretEnvelope=i;exports.requireSecretEncryptionKey=y;exports.resolveSecretEncryptionKey=p;exports.tryDecryptWithEnvKey=O;
1
+ let e=require("node:crypto");var t=`aes-256-gcm`,n=1;function r(t){let n=t.trim();if(!n)throw Error(`A non-empty encryption secret is required to manage stored secrets.`);return(0,e.createHash)(`sha256`).update(n).digest()}function i(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.algorithm===`aes-256-gcm`&&t.version===1&&typeof t.authTag==`string`&&typeof t.ciphertext==`string`&&typeof t.iv==`string`}function a(e){if(!i(e))throw Error(`Invalid encrypted secret payload.`);let t=e;return{algorithm:t.algorithm,authTag:t.authTag,ciphertext:t.ciphertext,iv:t.iv,last4:typeof t.last4==`string`?t.last4:``,updatedAt:typeof t.updatedAt==`string`?t.updatedAt:``,version:t.version}}function o(n){let i=n.value.trim();if(!i)throw Error(`A non-empty value is required to encrypt a secret.`);let a=r(n.encryptionSecret),o=(0,e.randomBytes)(12),s=(0,e.createCipheriv)(t,a,o),c=Buffer.concat([s.update(i,`utf8`),s.final()]);return{algorithm:t,authTag:s.getAuthTag().toString(`base64`),ciphertext:c.toString(`base64`),iv:o.toString(`base64`),last4:i.slice(-4),updatedAt:(n.now??new Date).toISOString(),version:1}}function s(n){let i=a(n.envelope),o=r(n.encryptionSecret);try{let n=(0,e.createDecipheriv)(t,o,Buffer.from(i.iv,`base64`));return n.setAuthTag(Buffer.from(i.authTag,`base64`)),Buffer.concat([n.update(Buffer.from(i.ciphertext,`base64`)),n.final()]).toString(`utf8`)}catch{throw Error(`Failed to decrypt stored secret.`)}}function c(e){let t=(e??``).trim();return t?`•••• ${t}`:`Stored secret`}function l(e){if(!i(e))return{hasStoredValue:!1,last4:null,maskedValue:null,updatedAt:null};let t=e,n=typeof t.last4==`string`&&t.last4?t.last4:null;return{hasStoredValue:!0,last4:n,maskedValue:c(n),updatedAt:typeof t.updatedAt==`string`&&t.updatedAt?t.updatedAt:null}}var u=`nextblock-secret-encryption-key-v1`;function d(){let t=process.env.SUPABASE_SERVICE_ROLE_KEY??process.env.SUPABASE_SECRET_KEY;return typeof t!=`string`||!t.trim()?null:(0,e.createHmac)(`sha256`,t.trim()).update(u).digest(`hex`)}function f(){let e=[],t=t=>{let n=typeof t==`string`?t.trim():``;n&&!e.includes(n)&&e.push(n)};return t(process.env.NEXTBLOCK_ENCRYPTION_KEY),t(process.env.CORTEX_AI_ENCRYPTION_KEY),t(d()),e}function p(){return f()[0]??null}function m(){return p()!==null}function h(){let e=p();if(!e)throw Error(`An encryption key (NEXTBLOCK_ENCRYPTION_KEY or CORTEX_AI_ENCRYPTION_KEY) is required to manage stored secrets.`);return e}function g(e,t){return o({value:e,encryptionSecret:h(),now:t})}function _(e){return s({envelope:e,encryptionSecret:h()})}function v(e){if(!i(e))return null;for(let t of f())try{return s({envelope:e,encryptionSecret:t})}catch{}return null}exports.SECRET_ENVELOPE_ALGORITHM=t,exports.SECRET_ENVELOPE_VERSION=n,exports.decryptSecret=s,exports.decryptWithEnvKey=_,exports.encryptSecret=o,exports.encryptWithEnvKey=g,exports.getMaskedSecret=c,exports.getSecretEnvelopeStatus=l,exports.hasSecretEncryptionKey=m,exports.isEncryptedSecretEnvelope=i,exports.requireSecretEncryptionKey=h,exports.resolveSecretEncryptionKey=p,exports.tryDecryptWithEnvKey=v;
@@ -1,131 +1,116 @@
1
- import { createDecipheriv as E, randomBytes as h, createCipheriv as g, createHash as S, createHmac as v } from "node:crypto";
2
- const o = "aes-256-gcm", s = 1;
3
- function a(t) {
4
- const e = t.trim();
5
- if (!e)
6
- throw new Error("A non-empty encryption secret is required to manage stored secrets.");
7
- return S("sha256").update(e).digest();
1
+ import { createCipheriv as e, createDecipheriv as t, createHash as n, createHmac as r, randomBytes as i } from "node:crypto";
2
+ //#region src/lib/secret-crypto.ts
3
+ var a = "aes-256-gcm", o = 1;
4
+ function s(e) {
5
+ let t = e.trim();
6
+ if (!t) throw Error("A non-empty encryption secret is required to manage stored secrets.");
7
+ return n("sha256").update(t).digest();
8
8
  }
9
- function i(t) {
10
- if (!t || typeof t != "object")
11
- return !1;
12
- const e = t;
13
- return e.algorithm === o && e.version === s && typeof e.authTag == "string" && typeof e.ciphertext == "string" && typeof e.iv == "string";
9
+ function c(e) {
10
+ if (!e || typeof e != "object") return !1;
11
+ let t = e;
12
+ return t.algorithm === "aes-256-gcm" && t.version === 1 && typeof t.authTag == "string" && typeof t.ciphertext == "string" && typeof t.iv == "string";
14
13
  }
15
- function m(t) {
16
- if (!i(t))
17
- throw new Error("Invalid encrypted secret payload.");
18
- const e = t;
19
- return {
20
- algorithm: e.algorithm,
21
- authTag: e.authTag,
22
- ciphertext: e.ciphertext,
23
- iv: e.iv,
24
- last4: typeof e.last4 == "string" ? e.last4 : "",
25
- updatedAt: typeof e.updatedAt == "string" ? e.updatedAt : "",
26
- version: e.version
27
- };
28
- }
29
- function A(t) {
30
- const e = t.value.trim();
31
- if (!e)
32
- throw new Error("A non-empty value is required to encrypt a secret.");
33
- const n = a(t.encryptionSecret), r = h(12), c = g(o, n, r), l = Buffer.concat([c.update(e, "utf8"), c.final()]), y = c.getAuthTag();
34
- return {
35
- algorithm: o,
36
- authTag: y.toString("base64"),
37
- ciphertext: l.toString("base64"),
38
- iv: r.toString("base64"),
39
- last4: e.slice(-4),
40
- updatedAt: (t.now ?? /* @__PURE__ */ new Date()).toISOString(),
41
- version: s
42
- };
14
+ function l(e) {
15
+ if (!c(e)) throw Error("Invalid encrypted secret payload.");
16
+ let t = e;
17
+ return {
18
+ algorithm: t.algorithm,
19
+ authTag: t.authTag,
20
+ ciphertext: t.ciphertext,
21
+ iv: t.iv,
22
+ last4: typeof t.last4 == "string" ? t.last4 : "",
23
+ updatedAt: typeof t.updatedAt == "string" ? t.updatedAt : "",
24
+ version: t.version
25
+ };
43
26
  }
44
27
  function u(t) {
45
- const e = m(t.envelope), n = a(t.encryptionSecret);
46
- try {
47
- const r = E(
48
- o,
49
- n,
50
- Buffer.from(e.iv, "base64")
51
- );
52
- return r.setAuthTag(Buffer.from(e.authTag, "base64")), Buffer.concat([
53
- r.update(Buffer.from(e.ciphertext, "base64")),
54
- r.final()
55
- ]).toString("utf8");
56
- } catch {
57
- throw new Error("Failed to decrypt stored secret.");
58
- }
28
+ let n = t.value.trim();
29
+ if (!n) throw Error("A non-empty value is required to encrypt a secret.");
30
+ let r = s(t.encryptionSecret), o = i(12), c = e(a, r, o), l = Buffer.concat([c.update(n, "utf8"), c.final()]);
31
+ return {
32
+ algorithm: a,
33
+ authTag: c.getAuthTag().toString("base64"),
34
+ ciphertext: l.toString("base64"),
35
+ iv: o.toString("base64"),
36
+ last4: n.slice(-4),
37
+ updatedAt: (t.now ?? /* @__PURE__ */ new Date()).toISOString(),
38
+ version: 1
39
+ };
40
+ }
41
+ function d(e) {
42
+ let n = l(e.envelope), r = s(e.encryptionSecret);
43
+ try {
44
+ let e = t(a, r, Buffer.from(n.iv, "base64"));
45
+ return e.setAuthTag(Buffer.from(n.authTag, "base64")), Buffer.concat([e.update(Buffer.from(n.ciphertext, "base64")), e.final()]).toString("utf8");
46
+ } catch {
47
+ throw Error("Failed to decrypt stored secret.");
48
+ }
59
49
  }
60
- function _(t) {
61
- const e = (t ?? "").trim();
62
- return e ? `•••• ${e}` : "Stored secret";
50
+ function f(e) {
51
+ let t = (e ?? "").trim();
52
+ return t ? `•••• ${t}` : "Stored secret";
63
53
  }
64
- function R(t) {
65
- if (!i(t))
66
- return { hasStoredValue: !1, last4: null, maskedValue: null, updatedAt: null };
67
- const e = t, n = typeof e.last4 == "string" && e.last4 ? e.last4 : null;
68
- return {
69
- hasStoredValue: !0,
70
- last4: n,
71
- maskedValue: _(n),
72
- updatedAt: typeof e.updatedAt == "string" && e.updatedAt ? e.updatedAt : null
73
- };
54
+ function p(e) {
55
+ if (!c(e)) return {
56
+ hasStoredValue: !1,
57
+ last4: null,
58
+ maskedValue: null,
59
+ updatedAt: null
60
+ };
61
+ let t = e, n = typeof t.last4 == "string" && t.last4 ? t.last4 : null;
62
+ return {
63
+ hasStoredValue: !0,
64
+ last4: n,
65
+ maskedValue: f(n),
66
+ updatedAt: typeof t.updatedAt == "string" && t.updatedAt ? t.updatedAt : null
67
+ };
74
68
  }
75
- const T = "nextblock-secret-encryption-key-v1";
76
- function K() {
77
- const t = process.env.SUPABASE_SERVICE_ROLE_KEY ?? process.env.SUPABASE_SECRET_KEY;
78
- return typeof t != "string" || !t.trim() ? null : v("sha256", t.trim()).update(T).digest("hex");
69
+ var m = "nextblock-secret-encryption-key-v1";
70
+ function h() {
71
+ let e = process.env.SUPABASE_SERVICE_ROLE_KEY ?? process.env.SUPABASE_SECRET_KEY;
72
+ return typeof e != "string" || !e.trim() ? null : r("sha256", e.trim()).update(m).digest("hex");
79
73
  }
80
- function p() {
81
- const t = [], e = (n) => {
82
- const r = typeof n == "string" ? n.trim() : "";
83
- r && !t.includes(r) && t.push(r);
84
- };
85
- return e(process.env.NEXTBLOCK_ENCRYPTION_KEY), e(process.env.CORTEX_AI_ENCRYPTION_KEY), e(K()), t;
74
+ function g() {
75
+ let e = [], t = (t) => {
76
+ let n = typeof t == "string" ? t.trim() : "";
77
+ n && !e.includes(n) && e.push(n);
78
+ };
79
+ return t(process.env.NEXTBLOCK_ENCRYPTION_KEY), t(process.env.CORTEX_AI_ENCRYPTION_KEY), t(h()), e;
86
80
  }
87
- function d() {
88
- return p()[0] ?? null;
81
+ function _() {
82
+ return g()[0] ?? null;
89
83
  }
90
- function N() {
91
- return d() !== null;
84
+ function v() {
85
+ return _() !== null;
92
86
  }
93
- function f() {
94
- const t = d();
95
- if (!t)
96
- throw new Error(
97
- "An encryption key (NEXTBLOCK_ENCRYPTION_KEY or CORTEX_AI_ENCRYPTION_KEY) is required to manage stored secrets."
98
- );
99
- return t;
87
+ function y() {
88
+ let e = _();
89
+ if (!e) throw Error("An encryption key (NEXTBLOCK_ENCRYPTION_KEY or CORTEX_AI_ENCRYPTION_KEY) is required to manage stored secrets.");
90
+ return e;
100
91
  }
101
- function C(t, e) {
102
- return A({ value: t, encryptionSecret: f(), now: e });
92
+ function b(e, t) {
93
+ return u({
94
+ value: e,
95
+ encryptionSecret: y(),
96
+ now: t
97
+ });
103
98
  }
104
- function I(t) {
105
- return u({ envelope: t, encryptionSecret: f() });
99
+ function x(e) {
100
+ return d({
101
+ envelope: e,
102
+ encryptionSecret: y()
103
+ });
106
104
  }
107
- function w(t) {
108
- if (!i(t))
109
- return null;
110
- for (const e of p())
111
- try {
112
- return u({ envelope: t, encryptionSecret: e });
113
- } catch {
114
- }
115
- return null;
105
+ function S(e) {
106
+ if (!c(e)) return null;
107
+ for (let t of g()) try {
108
+ return d({
109
+ envelope: e,
110
+ encryptionSecret: t
111
+ });
112
+ } catch {}
113
+ return null;
116
114
  }
117
- export {
118
- o as SECRET_ENVELOPE_ALGORITHM,
119
- s as SECRET_ENVELOPE_VERSION,
120
- u as decryptSecret,
121
- I as decryptWithEnvKey,
122
- A as encryptSecret,
123
- C as encryptWithEnvKey,
124
- _ as getMaskedSecret,
125
- R as getSecretEnvelopeStatus,
126
- N as hasSecretEncryptionKey,
127
- i as isEncryptedSecretEnvelope,
128
- f as requireSecretEncryptionKey,
129
- d as resolveSecretEncryptionKey,
130
- w as tryDecryptWithEnvKey
131
- };
115
+ //#endregion
116
+ export { a as SECRET_ENVELOPE_ALGORITHM, o as SECRET_ENVELOPE_VERSION, d as decryptSecret, x as decryptWithEnvKey, u as encryptSecret, b as encryptWithEnvKey, f as getMaskedSecret, p as getSecretEnvelopeStatus, v as hasSecretEncryptionKey, c as isEncryptedSecretEnvelope, y as requireSecretEncryptionKey, _ as resolveSecretEncryptionKey, S as tryDecryptWithEnvKey };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("@supabase/ssr"),t=()=>{const r=typeof window<"u"?window.__NEXTBLOCK_PUBLIC_ENV__:void 0,n=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL||r?.url,e=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY||r?.anonKey;if(!n||!e)throw new Error(`CRITICAL: Supabase URL or Anon Key is missing. Please ensure NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are set in your production environment. URL_IS_SET: ${!!n}, ANON_KEY_IS_SET: ${!!e}`);return s.createBrowserClient(n,e)};async function a(r,n){const{data:e,error:i}=await r.from("profiles").select("id, full_name, avatar_url, role, updated_at, website").eq("id",n).single();return i||!e?null:e}async function o(){const r=t(),{data:n,error:e}=await r.from("languages").select("id, code, name, is_default, is_active, created_at, updated_at").order("name",{ascending:!0});return e?[]:n||[]}exports.createClient=t;exports.getActiveLanguagesClientSide=o;exports.getProfileWithRoleClientSide=a;
1
+ let e=require("@supabase/ssr");var t=()=>{let t=typeof window<`u`?window.__NEXTBLOCK_PUBLIC_ENV__:void 0,n=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL||t?.url,r=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY||t?.anonKey;if(!n||!r)throw Error(`CRITICAL: Supabase URL or Anon Key is missing. Please ensure NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are set in your production environment. URL_IS_SET: ${!!n}, ANON_KEY_IS_SET: ${!!r}`);return(0,e.createBrowserClient)(n,r)};async function n(e,t){let{data:n,error:r}=await e.from(`profiles`).select(`id, full_name, avatar_url, role, updated_at, website`).eq(`id`,t).single();return r||!n?null:n}async function r(){let{data:e,error:n}=await t().from(`languages`).select(`id, code, name, is_default, is_active, created_at, updated_at`).order(`name`,{ascending:!0});return n?[]:e||[]}exports.createClient=t,exports.getActiveLanguagesClientSide=r,exports.getProfileWithRoleClientSide=n;
@@ -1,22 +1,17 @@
1
- import { createBrowserClient as o } from "@supabase/ssr";
2
- const a = () => {
3
- const n = typeof window < "u" ? window.__NEXTBLOCK_PUBLIC_ENV__ : void 0, r = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || n?.url, e = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY || n?.anonKey;
4
- if (!r || !e)
5
- throw new Error(
6
- `CRITICAL: Supabase URL or Anon Key is missing. Please ensure NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are set in your production environment. URL_IS_SET: ${!!r}, ANON_KEY_IS_SET: ${!!e}`
7
- );
8
- return o(r, e);
1
+ import { createBrowserClient as e } from "@supabase/ssr";
2
+ //#region src/lib/supabase/client.ts
3
+ var t = () => {
4
+ let t = typeof window < "u" ? window.__NEXTBLOCK_PUBLIC_ENV__ : void 0, n = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || t?.url, r = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY || t?.anonKey;
5
+ if (!n || !r) throw Error(`CRITICAL: Supabase URL or Anon Key is missing. Please ensure NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are set in your production environment. URL_IS_SET: ${!!n}, ANON_KEY_IS_SET: ${!!r}`);
6
+ return e(n, r);
9
7
  };
10
- async function _(n, r) {
11
- const { data: e, error: t } = await n.from("profiles").select("id, full_name, avatar_url, role, updated_at, website").eq("id", r).single();
12
- return t || !e ? null : e;
8
+ async function n(e, t) {
9
+ let { data: n, error: r } = await e.from("profiles").select("id, full_name, avatar_url, role, updated_at, website").eq("id", t).single();
10
+ return r || !n ? null : n;
13
11
  }
14
- async function i() {
15
- const n = a(), { data: r, error: e } = await n.from("languages").select("id, code, name, is_default, is_active, created_at, updated_at").order("name", { ascending: !0 });
16
- return e ? [] : r || [];
12
+ async function r() {
13
+ let { data: e, error: n } = await t().from("languages").select("id, code, name, is_default, is_active, created_at, updated_at").order("name", { ascending: !0 });
14
+ return n ? [] : e || [];
17
15
  }
18
- export {
19
- a as createClient,
20
- i as getActiveLanguagesClientSide,
21
- _ as getProfileWithRoleClientSide
22
- };
16
+ //#endregion
17
+ export { t as createClient, r as getActiveLanguagesClientSide, n as getProfileWithRoleClientSide };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("@supabase/ssr"),S=require("@supabase/supabase-js"),c=require("next/headers"),u="This module cannot be imported from a Client Component module. It should only be used from a Server Component.";if(typeof window<"u")throw new Error(u);const i=()=>{const e=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL||"https://dummy.supabase.co",r=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY||"dummy-anon-key";return l.createServerClient(e,r,{cookies:{getAll:async()=>{try{return(await c.cookies()).getAll()}catch{return[]}},setAll:async s=>{try{const t=await c.cookies();for(const{name:n,value:a,options:o}of s)a&&a.length>0?t.set({name:n,value:a,...o}):o&&Object.keys(o).length>0?t.delete({name:n,...o}):t.delete(n)}catch{}}}})};async function E(e){const r=i(),{data:s,error:t}=await r.from("profiles").select("id, full_name, avatar_url, role, updated_at, website").eq("id",e).single();return t||!s?(console.error("Error fetching profile (server-side):",t?.message),null):s}async function d(){const e=i(),{data:r,error:s}=await e.from("languages").select("id, code, name, is_default, is_active, created_at, updated_at").order("name",{ascending:!0});return s?(console.error("Error fetching languages (server-side):",s.message),[]):r||[]}const p=()=>{const e=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,r=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY;if(!e||!r)throw new Error("Missing Supabase Service Role environment variables");return S.createClient(e,r,{auth:{autoRefreshToken:!1,persistSession:!1}})};exports.createClient=i;exports.getActiveLanguagesServerSide=d;exports.getProfileWithRoleServerSide=E;exports.getServiceRoleSupabaseClient=p;
1
+ let e=require("@supabase/ssr"),t=require("@supabase/supabase-js"),n=require("next/headers");var r=`This module cannot be imported from a Client Component module. It should only be used from a Server Component.`;if(typeof window<`u`)throw Error(r);var i=()=>{let t=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL||`https://dummy.supabase.co`,r=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY||`dummy-anon-key`;return(0,e.createServerClient)(t,r,{cookies:{getAll:async()=>{try{return(await(0,n.cookies)()).getAll()}catch{return[]}},setAll:async e=>{try{let t=await(0,n.cookies)();for(let{name:n,value:r,options:i}of e)r&&r.length>0?t.set({name:n,value:r,...i}):i&&Object.keys(i).length>0?t.delete({name:n,...i}):t.delete(n)}catch{}}}})};async function a(e){let{data:t,error:n}=await i().from(`profiles`).select(`id, full_name, avatar_url, role, updated_at, website`).eq(`id`,e).single();return n||!t?(console.error(`Error fetching profile (server-side):`,n?.message),null):t}async function o(){let{data:e,error:t}=await i().from(`languages`).select(`id, code, name, is_default, is_active, created_at, updated_at`).order(`name`,{ascending:!0});return t?(console.error(`Error fetching languages (server-side):`,t.message),[]):e||[]}var s=()=>{let e=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,n=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY;if(!e||!n)throw Error(`Missing Supabase Service Role environment variables`);return(0,t.createClient)(e,n,{auth:{autoRefreshToken:!1,persistSession:!1}})};exports.createClient=i,exports.getActiveLanguagesServerSide=o,exports.getProfileWithRoleServerSide=a,exports.getServiceRoleSupabaseClient=s;
@@ -1,57 +1,49 @@
1
- import { createServerClient as l } from "@supabase/ssr";
2
- import { createClient as S } from "@supabase/supabase-js";
3
- import { cookies as i } from "next/headers";
4
- const u = "This module cannot be imported from a Client Component module. It should only be used from a Server Component.";
5
- if (typeof window < "u")
6
- throw new Error(u);
7
- const c = () => {
8
- const e = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || "https://dummy.supabase.co", r = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY || "dummy-anon-key";
9
- return l(
10
- e,
11
- r,
12
- {
13
- cookies: {
14
- getAll: async () => {
15
- try {
16
- return (await i()).getAll();
17
- } catch {
18
- return [];
19
- }
20
- },
21
- setAll: async (o) => {
22
- try {
23
- const s = await i();
24
- for (const { name: n, value: a, options: t } of o)
25
- a && a.length > 0 ? s.set({ name: n, value: a, ...t }) : t && Object.keys(t).length > 0 ? s.delete({ name: n, ...t }) : s.delete(n);
26
- } catch {
27
- }
28
- }
29
- }
30
- }
31
- );
1
+ import { createServerClient as e } from "@supabase/ssr";
2
+ import { createClient as t } from "@supabase/supabase-js";
3
+ import { cookies as n } from "next/headers";
4
+ //#region src/lib/supabase/server.ts
5
+ var r = "This module cannot be imported from a Client Component module. It should only be used from a Server Component.";
6
+ if (typeof window < "u") throw Error(r);
7
+ var i = () => {
8
+ let t = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || "https://dummy.supabase.co", r = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY || "dummy-anon-key";
9
+ return e(t, r, { cookies: {
10
+ getAll: async () => {
11
+ try {
12
+ return (await n()).getAll();
13
+ } catch {
14
+ return [];
15
+ }
16
+ },
17
+ setAll: async (e) => {
18
+ try {
19
+ let t = await n();
20
+ for (let { name: n, value: r, options: i } of e) r && r.length > 0 ? t.set({
21
+ name: n,
22
+ value: r,
23
+ ...i
24
+ }) : i && Object.keys(i).length > 0 ? t.delete({
25
+ name: n,
26
+ ...i
27
+ }) : t.delete(n);
28
+ } catch {}
29
+ }
30
+ } });
32
31
  };
33
- async function f(e) {
34
- const r = c(), { data: o, error: s } = await r.from("profiles").select("id, full_name, avatar_url, role, updated_at, website").eq("id", e).single();
35
- return s || !o ? (console.error("Error fetching profile (server-side):", s?.message), null) : o;
32
+ async function a(e) {
33
+ let { data: t, error: n } = await i().from("profiles").select("id, full_name, avatar_url, role, updated_at, website").eq("id", e).single();
34
+ return n || !t ? (console.error("Error fetching profile (server-side):", n?.message), null) : t;
36
35
  }
37
- async function d() {
38
- const e = c(), { data: r, error: o } = await e.from("languages").select("id, code, name, is_default, is_active, created_at, updated_at").order("name", { ascending: !0 });
39
- return o ? (console.error("Error fetching languages (server-side):", o.message), []) : r || [];
36
+ async function o() {
37
+ let { data: e, error: t } = await i().from("languages").select("id, code, name, is_default, is_active, created_at, updated_at").order("name", { ascending: !0 });
38
+ return t ? (console.error("Error fetching languages (server-side):", t.message), []) : e || [];
40
39
  }
41
- const A = () => {
42
- const e = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, r = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SECRET_KEY;
43
- if (!e || !r)
44
- throw new Error("Missing Supabase Service Role environment variables");
45
- return S(e, r, {
46
- auth: {
47
- autoRefreshToken: !1,
48
- persistSession: !1
49
- }
50
- });
51
- };
52
- export {
53
- c as createClient,
54
- d as getActiveLanguagesServerSide,
55
- f as getProfileWithRoleServerSide,
56
- A as getServiceRoleSupabaseClient
40
+ var s = () => {
41
+ let e = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, n = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SECRET_KEY;
42
+ if (!e || !n) throw Error("Missing Supabase Service Role environment variables");
43
+ return t(e, n, { auth: {
44
+ autoRefreshToken: !1,
45
+ persistSession: !1
46
+ } });
57
47
  };
48
+ //#endregion
49
+ export { i as createClient, o as getActiveLanguagesServerSide, a as getProfileWithRoleServerSide, s as getServiceRoleSupabaseClient };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@supabase/supabase-js"),r=()=>{const e=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,s=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY,n=e||"https://dummy.supabase.co",t=s||"dummy-key";return(!e||!s)&&console.warn("Supabase URL or Anon Key is missing for SSG client. Returning dummy client to prevent build crash."),o.createClient(n,t)};exports.getSsgSupabaseClient=r;
1
+ let e=require("@supabase/supabase-js");var t=()=>{let t=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,n=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.SUPABASE_ANON_KEY||process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||process.env.SUPABASE_PUBLISHABLE_KEY,r=t||`https://dummy.supabase.co`,i=n||`dummy-key`;return(!t||!n)&&console.warn(`Supabase URL or Anon Key is missing for SSG client. Returning dummy client to prevent build crash.`),(0,e.createClient)(r,i)};exports.getSsgSupabaseClient=t;
@@ -1,8 +1,8 @@
1
- import { createClient as r } from "@supabase/supabase-js";
2
- const S = () => {
3
- const e = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, s = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY, n = e || "https://dummy.supabase.co", o = s || "dummy-key";
4
- return (!e || !s) && console.warn("Supabase URL or Anon Key is missing for SSG client. Returning dummy client to prevent build crash."), r(n, o);
5
- };
6
- export {
7
- S as getSsgSupabaseClient
1
+ import { createClient as e } from "@supabase/supabase-js";
2
+ //#region src/lib/supabase/ssg-client.ts
3
+ var t = () => {
4
+ let t = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, n = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY, r = t || "https://dummy.supabase.co", i = n || "dummy-key";
5
+ return (!t || !n) && console.warn("Supabase URL or Anon Key is missing for SSG client. Returning dummy client to prevent build crash."), e(r, i);
8
6
  };
7
+ //#endregion
8
+ export { t as getSsgSupabaseClient };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={public:{Enums:{approval_status:["pending","approved","denied"],interaction_type:["review","comment"],menu_location:["HEADER","FOOTER","SIDEBAR"],page_status:["draft","published","archived"],revision_type:["snapshot","diff"],user_role:["ADMIN","WRITER","USER"]}}};exports.Constants=e;
1
+ var e={public:{Enums:{approval_status:[`pending`,`approved`,`denied`],interaction_type:[`review`,`comment`],menu_location:[`HEADER`,`FOOTER`,`SIDEBAR`],page_status:[`draft`,`published`,`archived`],revision_type:[`snapshot`,`diff`],user_role:[`ADMIN`,`WRITER`,`USER`]}}};exports.Constants=e;
@@ -1,15 +1,27 @@
1
- const e = {
2
- public: {
3
- Enums: {
4
- approval_status: ["pending", "approved", "denied"],
5
- interaction_type: ["review", "comment"],
6
- menu_location: ["HEADER", "FOOTER", "SIDEBAR"],
7
- page_status: ["draft", "published", "archived"],
8
- revision_type: ["snapshot", "diff"],
9
- user_role: ["ADMIN", "WRITER", "USER"]
10
- }
11
- }
12
- };
13
- export {
14
- e as Constants
15
- };
1
+ //#region src/lib/supabase/types.ts
2
+ var e = { public: { Enums: {
3
+ approval_status: [
4
+ "pending",
5
+ "approved",
6
+ "denied"
7
+ ],
8
+ interaction_type: ["review", "comment"],
9
+ menu_location: [
10
+ "HEADER",
11
+ "FOOTER",
12
+ "SIDEBAR"
13
+ ],
14
+ page_status: [
15
+ "draft",
16
+ "published",
17
+ "archived"
18
+ ],
19
+ revision_type: ["snapshot", "diff"],
20
+ user_role: [
21
+ "ADMIN",
22
+ "WRITER",
23
+ "USER"
24
+ ]
25
+ } } };
26
+ //#endregion
27
+ export { e as Constants };
package/package.json CHANGED
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "name": "@nextblock-cms/db",
3
- "version": "0.20.3",
3
+ "version": "0.21.1",
4
+ "license": "AGPL-3.0-or-later",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/nextblock-cms/nextblock.git",
8
+ "directory": "libs/db"
9
+ },
4
10
  "main": "index.cjs.js",
5
11
  "module": "index.es.js",
6
12
  "types": "index.d.ts",
package/secrets.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./lib/config-resolve.cjs.js"),e=require("./lib/secret-crypto.cjs.js");exports.isSandboxEnvironment=t.isSandboxEnvironment;exports.resolveConfigValue=t.resolveConfigValue;exports.SECRET_ENVELOPE_ALGORITHM=e.SECRET_ENVELOPE_ALGORITHM;exports.SECRET_ENVELOPE_VERSION=e.SECRET_ENVELOPE_VERSION;exports.decryptSecret=e.decryptSecret;exports.decryptWithEnvKey=e.decryptWithEnvKey;exports.encryptSecret=e.encryptSecret;exports.encryptWithEnvKey=e.encryptWithEnvKey;exports.getMaskedSecret=e.getMaskedSecret;exports.getSecretEnvelopeStatus=e.getSecretEnvelopeStatus;exports.hasSecretEncryptionKey=e.hasSecretEncryptionKey;exports.isEncryptedSecretEnvelope=e.isEncryptedSecretEnvelope;exports.requireSecretEncryptionKey=e.requireSecretEncryptionKey;exports.resolveSecretEncryptionKey=e.resolveSecretEncryptionKey;exports.tryDecryptWithEnvKey=e.tryDecryptWithEnvKey;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./lib/secret-crypto.cjs.js"),t=require("./lib/config-resolve.cjs.js");exports.SECRET_ENVELOPE_ALGORITHM=e.SECRET_ENVELOPE_ALGORITHM,exports.SECRET_ENVELOPE_VERSION=e.SECRET_ENVELOPE_VERSION,exports.decryptSecret=e.decryptSecret,exports.decryptWithEnvKey=e.decryptWithEnvKey,exports.encryptSecret=e.encryptSecret,exports.encryptWithEnvKey=e.encryptWithEnvKey,exports.getMaskedSecret=e.getMaskedSecret,exports.getSecretEnvelopeStatus=e.getSecretEnvelopeStatus,exports.hasSecretEncryptionKey=e.hasSecretEncryptionKey,exports.isEncryptedSecretEnvelope=e.isEncryptedSecretEnvelope,exports.isSandboxEnvironment=t.isSandboxEnvironment,exports.requireSecretEncryptionKey=e.requireSecretEncryptionKey,exports.resolveConfigValue=t.resolveConfigValue,exports.resolveSecretEncryptionKey=e.resolveSecretEncryptionKey,exports.tryDecryptWithEnvKey=e.tryDecryptWithEnvKey;
package/secrets.es.js CHANGED
@@ -1,19 +1,3 @@
1
- import { isSandboxEnvironment as r, resolveConfigValue as E } from "./lib/config-resolve.es.js";
2
- import { SECRET_ENVELOPE_ALGORITHM as c, SECRET_ENVELOPE_VERSION as y, decryptSecret as o, decryptWithEnvKey as p, encryptSecret as S, encryptWithEnvKey as i, getMaskedSecret as v, getSecretEnvelopeStatus as s, hasSecretEncryptionKey as K, isEncryptedSecretEnvelope as a, requireSecretEncryptionKey as d, resolveSecretEncryptionKey as l, tryDecryptWithEnvKey as h } from "./lib/secret-crypto.es.js";
3
- export {
4
- c as SECRET_ENVELOPE_ALGORITHM,
5
- y as SECRET_ENVELOPE_VERSION,
6
- o as decryptSecret,
7
- p as decryptWithEnvKey,
8
- S as encryptSecret,
9
- i as encryptWithEnvKey,
10
- v as getMaskedSecret,
11
- s as getSecretEnvelopeStatus,
12
- K as hasSecretEncryptionKey,
13
- a as isEncryptedSecretEnvelope,
14
- r as isSandboxEnvironment,
15
- d as requireSecretEncryptionKey,
16
- E as resolveConfigValue,
17
- l as resolveSecretEncryptionKey,
18
- h as tryDecryptWithEnvKey
19
- };
1
+ import { SECRET_ENVELOPE_ALGORITHM as e, SECRET_ENVELOPE_VERSION as t, decryptSecret as n, decryptWithEnvKey as r, encryptSecret as i, encryptWithEnvKey as a, getMaskedSecret as o, getSecretEnvelopeStatus as s, hasSecretEncryptionKey as c, isEncryptedSecretEnvelope as l, requireSecretEncryptionKey as u, resolveSecretEncryptionKey as d, tryDecryptWithEnvKey as f } from "./lib/secret-crypto.es.js";
2
+ import { isSandboxEnvironment as p, resolveConfigValue as m } from "./lib/config-resolve.es.js";
3
+ export { e as SECRET_ENVELOPE_ALGORITHM, t as SECRET_ENVELOPE_VERSION, n as decryptSecret, r as decryptWithEnvKey, i as encryptSecret, a as encryptWithEnvKey, o as getMaskedSecret, s as getSecretEnvelopeStatus, c as hasSecretEncryptionKey, l as isEncryptedSecretEnvelope, p as isSandboxEnvironment, u as requireSecretEncryptionKey, m as resolveConfigValue, d as resolveSecretEncryptionKey, f as tryDecryptWithEnvKey };
package/server.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./lib/supabase/server.cjs.js"),n=require("./lib/supabase/ssg-client.cjs.js"),r=require("./lib/package-validation.cjs.js"),e=require("./lib/secret-crypto.cjs.js"),i=require("./lib/config-resolve.cjs.js");exports.createClient=t.createClient;exports.getActiveLanguagesServerSide=t.getActiveLanguagesServerSide;exports.getProfileWithRoleServerSide=t.getProfileWithRoleServerSide;exports.getServiceRoleSupabaseClient=t.getServiceRoleSupabaseClient;exports.getSsgSupabaseClient=n.getSsgSupabaseClient;exports.PACKAGE_ACTIVATION_CACHE_TAG=r.PACKAGE_ACTIVATION_CACHE_TAG;exports.isPackageActivationRowValid=r.isPackageActivationRowValid;exports.resolvePackageActivationExpiry=r.resolvePackageActivationExpiry;exports.verifyPackageOnline=r.verifyPackageOnline;exports.SECRET_ENVELOPE_ALGORITHM=e.SECRET_ENVELOPE_ALGORITHM;exports.SECRET_ENVELOPE_VERSION=e.SECRET_ENVELOPE_VERSION;exports.decryptSecret=e.decryptSecret;exports.decryptWithEnvKey=e.decryptWithEnvKey;exports.encryptSecret=e.encryptSecret;exports.encryptWithEnvKey=e.encryptWithEnvKey;exports.getMaskedSecret=e.getMaskedSecret;exports.getSecretEnvelopeStatus=e.getSecretEnvelopeStatus;exports.hasSecretEncryptionKey=e.hasSecretEncryptionKey;exports.isEncryptedSecretEnvelope=e.isEncryptedSecretEnvelope;exports.requireSecretEncryptionKey=e.requireSecretEncryptionKey;exports.resolveSecretEncryptionKey=e.resolveSecretEncryptionKey;exports.tryDecryptWithEnvKey=e.tryDecryptWithEnvKey;exports.isSandboxEnvironment=i.isSandboxEnvironment;exports.resolveConfigValue=i.resolveConfigValue;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./lib/supabase/server.cjs.js"),t=require("./lib/supabase/ssg-client.cjs.js"),n=require("./lib/package-validation.cjs.js"),r=require("./lib/secret-crypto.cjs.js"),i=require("./lib/config-resolve.cjs.js");exports.PACKAGE_ACTIVATION_CACHE_TAG=n.PACKAGE_ACTIVATION_CACHE_TAG,exports.SECRET_ENVELOPE_ALGORITHM=r.SECRET_ENVELOPE_ALGORITHM,exports.SECRET_ENVELOPE_VERSION=r.SECRET_ENVELOPE_VERSION,exports.createClient=e.createClient,exports.decryptSecret=r.decryptSecret,exports.decryptWithEnvKey=r.decryptWithEnvKey,exports.encryptSecret=r.encryptSecret,exports.encryptWithEnvKey=r.encryptWithEnvKey,exports.getActiveLanguagesServerSide=e.getActiveLanguagesServerSide,exports.getMaskedSecret=r.getMaskedSecret,exports.getProfileWithRoleServerSide=e.getProfileWithRoleServerSide,exports.getSecretEnvelopeStatus=r.getSecretEnvelopeStatus,exports.getServiceRoleSupabaseClient=e.getServiceRoleSupabaseClient,exports.getSsgSupabaseClient=t.getSsgSupabaseClient,exports.hasSecretEncryptionKey=r.hasSecretEncryptionKey,exports.isEncryptedSecretEnvelope=r.isEncryptedSecretEnvelope,exports.isPackageActivationRowValid=n.isPackageActivationRowValid,exports.isSandboxEnvironment=i.isSandboxEnvironment,exports.requireSecretEncryptionKey=r.requireSecretEncryptionKey,exports.resolveConfigValue=i.resolveConfigValue,exports.resolvePackageActivationExpiry=n.resolvePackageActivationExpiry,exports.resolveSecretEncryptionKey=r.resolveSecretEncryptionKey,exports.tryDecryptWithEnvKey=r.tryDecryptWithEnvKey,exports.verifyPackageOnline=n.verifyPackageOnline;
package/server.es.js CHANGED
@@ -1,31 +1,6 @@
1
- import { createClient as r, getActiveLanguagesServerSide as i, getProfileWithRoleServerSide as n, getServiceRoleSupabaseClient as o } from "./lib/supabase/server.es.js";
2
- import { getSsgSupabaseClient as E } from "./lib/supabase/ssg-client.es.js";
3
- import { PACKAGE_ACTIVATION_CACHE_TAG as S, isPackageActivationRowValid as p, resolvePackageActivationExpiry as y, verifyPackageOnline as v } from "./lib/package-validation.es.js";
4
- import { SECRET_ENVELOPE_ALGORITHM as g, SECRET_ENVELOPE_VERSION as s, decryptSecret as A, decryptWithEnvKey as C, encryptSecret as d, encryptWithEnvKey as f, getMaskedSecret as x, getSecretEnvelopeStatus as K, hasSecretEncryptionKey as P, isEncryptedSecretEnvelope as R, requireSecretEncryptionKey as _, resolveSecretEncryptionKey as m, tryDecryptWithEnvKey as u } from "./lib/secret-crypto.es.js";
5
- import { isSandboxEnvironment as T, resolveConfigValue as V } from "./lib/config-resolve.es.js";
6
- export {
7
- S as PACKAGE_ACTIVATION_CACHE_TAG,
8
- g as SECRET_ENVELOPE_ALGORITHM,
9
- s as SECRET_ENVELOPE_VERSION,
10
- r as createClient,
11
- A as decryptSecret,
12
- C as decryptWithEnvKey,
13
- d as encryptSecret,
14
- f as encryptWithEnvKey,
15
- i as getActiveLanguagesServerSide,
16
- x as getMaskedSecret,
17
- n as getProfileWithRoleServerSide,
18
- K as getSecretEnvelopeStatus,
19
- o as getServiceRoleSupabaseClient,
20
- E as getSsgSupabaseClient,
21
- P as hasSecretEncryptionKey,
22
- R as isEncryptedSecretEnvelope,
23
- p as isPackageActivationRowValid,
24
- T as isSandboxEnvironment,
25
- _ as requireSecretEncryptionKey,
26
- V as resolveConfigValue,
27
- y as resolvePackageActivationExpiry,
28
- m as resolveSecretEncryptionKey,
29
- u as tryDecryptWithEnvKey,
30
- v as verifyPackageOnline
31
- };
1
+ import { createClient as e, getActiveLanguagesServerSide as t, getProfileWithRoleServerSide as n, getServiceRoleSupabaseClient as r } from "./lib/supabase/server.es.js";
2
+ import { getSsgSupabaseClient as i } from "./lib/supabase/ssg-client.es.js";
3
+ import { PACKAGE_ACTIVATION_CACHE_TAG as a, isPackageActivationRowValid as o, resolvePackageActivationExpiry as s, verifyPackageOnline as c } from "./lib/package-validation.es.js";
4
+ import { SECRET_ENVELOPE_ALGORITHM as l, SECRET_ENVELOPE_VERSION as u, decryptSecret as d, decryptWithEnvKey as f, encryptSecret as p, encryptWithEnvKey as m, getMaskedSecret as h, getSecretEnvelopeStatus as g, hasSecretEncryptionKey as _, isEncryptedSecretEnvelope as v, requireSecretEncryptionKey as y, resolveSecretEncryptionKey as b, tryDecryptWithEnvKey as x } from "./lib/secret-crypto.es.js";
5
+ import { isSandboxEnvironment as S, resolveConfigValue as C } from "./lib/config-resolve.es.js";
6
+ export { a as PACKAGE_ACTIVATION_CACHE_TAG, l as SECRET_ENVELOPE_ALGORITHM, u as SECRET_ENVELOPE_VERSION, e as createClient, d as decryptSecret, f as decryptWithEnvKey, p as encryptSecret, m as encryptWithEnvKey, t as getActiveLanguagesServerSide, h as getMaskedSecret, n as getProfileWithRoleServerSide, g as getSecretEnvelopeStatus, r as getServiceRoleSupabaseClient, i as getSsgSupabaseClient, _ as hasSecretEncryptionKey, v as isEncryptedSecretEnvelope, o as isPackageActivationRowValid, S as isSandboxEnvironment, y as requireSecretEncryptionKey, C as resolveConfigValue, s as resolvePackageActivationExpiry, b as resolveSecretEncryptionKey, x as tryDecryptWithEnvKey, c as verifyPackageOnline };
@@ -0,0 +1,70 @@
1
+ -- 02017: install guide (EN + FR) -- Node.js floor 20 -> 22.12.
2
+ --
3
+ -- The "How to Install NextBlock" post ('how-to-setup-nextblock', EN) and its French twin
4
+ -- ('comment-configurer-nextblock', FR) still tell readers to install Node.js 20. The
5
+ -- upgraded dependencies no longer run there: supabase-js >= 2.110 and AI SDK 7 declare
6
+ -- node >= 22, and both paths the guide describes need 22.12 -- the create-nextblock CLI
7
+ -- (engines >= 22.12.0) and the cloned repository's Vitest 5 / Vite 8 toolchain. Node 20
8
+ -- has been end-of-life since 2026-04-30. The copy shipped through 02000 (catch-up) / 02004
9
+ -- (baseline) and lives on real installs, so per the append-only rule this is a
10
+ -- forward-only data fix instead of an edit to those files.
11
+ --
12
+ -- Targets the text block of each guide post by parent (post resolved by slug + language
13
+ -- code; never blocks.id: ids drift on every install) plus the 'Node.js 20' signature, and
14
+ -- rewrites only the eight seeded phrases (four EN, four FR; "or newer" / "ou plus récent"
15
+ -- appears twice per language) with replace(), leaving the rest of the block and any
16
+ -- operator-edited wording untouched. post_revisions rows of the same posts get the same
17
+ -- rewrite so restoring a seeded revision cannot bring the Node.js 20 copy back.
18
+ -- Idempotent: a second run matches zero rows (the rewritten text no longer contains
19
+ -- 'Node.js 20').
20
+ --
21
+ -- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts
22
+ -- excludes any migration whose filename contains "sandbox" from the reset bundle.
23
+
24
+ CREATE OR REPLACE FUNCTION pg_temp.nb_install_guide_node22(src text)
25
+ RETURNS text
26
+ LANGUAGE sql
27
+ IMMUTABLE
28
+ AS $fn$
29
+ SELECT replace(replace(replace(replace(replace(replace(replace(replace(src,
30
+ '>Node.js 20 or newer</a>',
31
+ '>Node.js 22.12 or newer</a>'),
32
+ '>Node.js 20+</a> and Docker Desktop',
33
+ '>Node.js 22.12+</a> and Docker Desktop'),
34
+ 'managed-cloud path: Node.js 20+ plus',
35
+ 'managed-cloud path: Node.js 22.12+ plus'),
36
+ 'cloned repository: Node.js 20+ and git',
37
+ 'cloned repository: Node.js 22.12+ and git'),
38
+ '>Node.js 20 ou plus récent</a>',
39
+ '>Node.js 22.12 ou plus récent</a>'),
40
+ '>Node.js 20+</a> et Docker Desktop',
41
+ '>Node.js 22.12+</a> et Docker Desktop'),
42
+ 'Node.js 20+ ainsi qu',
43
+ 'Node.js 22.12+ ainsi qu'),
44
+ 'Node.js 20+ et git',
45
+ 'Node.js 22.12+ et git')
46
+ $fn$;
47
+
48
+ UPDATE public.blocks AS b
49
+ SET content = pg_temp.nb_install_guide_node22(b.content::text)::jsonb,
50
+ updated_at = now()
51
+ FROM public.posts AS p
52
+ JOIN public.languages AS l ON l.id = p.language_id
53
+ WHERE b.post_id = p.id
54
+ AND b.block_type = 'text'
55
+ AND ((p.slug = 'how-to-setup-nextblock' AND l.code = 'en')
56
+ OR (p.slug = 'comment-configurer-nextblock' AND l.code = 'fr'))
57
+ AND b.content::text LIKE '%Node.js 20%'
58
+ AND b.content::text <> pg_temp.nb_install_guide_node22(b.content::text);
59
+
60
+ UPDATE public.post_revisions AS r
61
+ SET content = pg_temp.nb_install_guide_node22(r.content::text)::jsonb
62
+ FROM public.posts AS p
63
+ JOIN public.languages AS l ON l.id = p.language_id
64
+ WHERE r.post_id = p.id
65
+ AND ((p.slug = 'how-to-setup-nextblock' AND l.code = 'en')
66
+ OR (p.slug = 'comment-configurer-nextblock' AND l.code = 'fr'))
67
+ AND r.content::text LIKE '%Node.js 20%'
68
+ AND r.content::text <> pg_temp.nb_install_guide_node22(r.content::text);
69
+
70
+ DROP FUNCTION IF EXISTS pg_temp.nb_install_guide_node22(text);