@ienlab/cloud-functions-library 1.0.0-dev.7 → 1.0.0-dev.9
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/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/ssr-dynamic-og.d.ts +17 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +43 -9
- package/dist/utils/firestore.d.ts +1 -3
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ssr-dynamic-og';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HttpsFunction } from 'firebase-functions/v2/https';
|
|
2
|
+
export interface OGData {
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
image: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SSRResolver {
|
|
8
|
+
pattern: RegExp;
|
|
9
|
+
resolve: (id: string) => Promise<OGData | null>;
|
|
10
|
+
}
|
|
11
|
+
export interface SSRDynamicOGConfig {
|
|
12
|
+
spaUrl: string;
|
|
13
|
+
defaultOG: OGData;
|
|
14
|
+
resolvers: SSRResolver[];
|
|
15
|
+
region?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function createSSRDynamicOG(config: SSRDynamicOGConfig): HttpsFunction;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("firebase-admin/firestore");function
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("firebase-admin/firestore"),t=require("firebase-functions/v2/https");function n(e){return{...e.data(),id:e.id}}function r(e,t,n){let r=e.headers.origin;return r&&n.includes(r)&&(t.set(`Access-Control-Allow-Origin`,r),t.set(`Vary`,`Origin`)),t.set(`Access-Control-Allow-Methods`,`POST, OPTIONS`),t.set(`Access-Control-Allow-Headers`,`Content-Type, Authorization`),e.method===`OPTIONS`?(t.status(204).send(),!1):e.method===`POST`?!0:(t.status(405).send({error:`Method Not Allowed`}),!1)}var i=()=>({updateAt:e.FieldValue.serverTimestamp(),deletedAt:e.FieldValue.serverTimestamp()}),a=()=>({updateAt:e.FieldValue.serverTimestamp(),deletedAt:null});function o(e){let{spaUrl:n,defaultOG:r,resolvers:i,region:a=`asia-northeast3`}=e,o=null;async function s(){if(o)return o;let e=await fetch(n);if(!e.ok)throw Error(`Failed to fetch template: ${e.status}`);return o=await e.text(),o}function c(e,t,n,r){return e.replace(/(<title>)[^<]*(<\/title>)/,`$1${t}$2`).replace(/(<meta\s+name="description"\s+content=")[^"]*(")/,`$1${n}$2`).replace(/(<meta\s+property="og:title"\s+content=")[^"]*(")/,`$1${t}$2`).replace(/(<meta\s+property="og:description"\s+content=")[^"]*(")/,`$1${n}$2`).replace(/(<meta\s+property="og:image"\s+content=")[^"]*(")/,`$1${r}$2`).replace(/(<meta\s+name="twitter:title"\s+content=")[^"]*(")/,`$1${t}$2`).replace(/(<meta\s+name="twitter:description"\s+content=")[^"]*(")/,`$1${n}$2`).replace(/(<meta\s+name="twitter:image"\s+content=")[^"]*(")/,`$1${r}$2`)}return(0,t.onRequest)({region:a},async(e,t)=>{let a=Date.now();try{let n=new URL(e.url,`https://${e.headers.host??`localhost`}`).pathname,o=r;for(let e of i){let t=n.match(e.pattern);if(t){let n=await e.resolve(t[1]);if(n){o=n;break}}}let l=c(await s(),o.title,o.description,o.image);console.log(`[SSRDynamicOG] ${n} → ${o.title} (${Date.now()-a}ms)`),t.setHeader(`Content-Type`,`text/html; charset=utf-8`),t.status(200).send(l)}catch(e){console.error(`[SSRDynamicOG] error:`,e),t.redirect(302,n)}})}exports.applyCors=r,exports.createSSRDynamicOG=o,exports.del=i,exports.snapshotToData=n,exports.undel=a;
|
package/dist/index.mjs
CHANGED
|
@@ -1,26 +1,60 @@
|
|
|
1
1
|
import { FieldValue as e } from "firebase-admin/firestore";
|
|
2
|
+
import { onRequest as t } from "firebase-functions/v2/https";
|
|
2
3
|
//#region src/utils/firestore.ts
|
|
3
|
-
function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
...t,
|
|
4
|
+
function n(e) {
|
|
5
|
+
return {
|
|
6
|
+
...e.data(),
|
|
7
7
|
id: e.id
|
|
8
|
-
}
|
|
8
|
+
};
|
|
9
9
|
}
|
|
10
10
|
//#endregion
|
|
11
11
|
//#region src/utils/cors.ts
|
|
12
|
-
function
|
|
12
|
+
function r(e, t, n) {
|
|
13
13
|
let r = e.headers.origin;
|
|
14
14
|
return r && n.includes(r) && (t.set("Access-Control-Allow-Origin", r), t.set("Vary", "Origin")), t.set("Access-Control-Allow-Methods", "POST, OPTIONS"), t.set("Access-Control-Allow-Headers", "Content-Type, Authorization"), e.method === "OPTIONS" ? (t.status(204).send(), !1) : e.method === "POST" ? !0 : (t.status(405).send({ error: "Method Not Allowed" }), !1);
|
|
15
15
|
}
|
|
16
16
|
//#endregion
|
|
17
17
|
//#region src/constant/firestore.ts
|
|
18
|
-
var
|
|
18
|
+
var i = () => ({
|
|
19
19
|
updateAt: e.serverTimestamp(),
|
|
20
20
|
deletedAt: e.serverTimestamp()
|
|
21
|
-
}),
|
|
21
|
+
}), a = () => ({
|
|
22
22
|
updateAt: e.serverTimestamp(),
|
|
23
23
|
deletedAt: null
|
|
24
24
|
});
|
|
25
25
|
//#endregion
|
|
26
|
-
|
|
26
|
+
//#region src/handlers/ssr-dynamic-og.ts
|
|
27
|
+
function o(e) {
|
|
28
|
+
let { spaUrl: n, defaultOG: r, resolvers: i, region: a = "asia-northeast3" } = e, o = null;
|
|
29
|
+
async function s() {
|
|
30
|
+
if (o) return o;
|
|
31
|
+
let e = await fetch(n);
|
|
32
|
+
if (!e.ok) throw Error(`Failed to fetch template: ${e.status}`);
|
|
33
|
+
return o = await e.text(), o;
|
|
34
|
+
}
|
|
35
|
+
function c(e, t, n, r) {
|
|
36
|
+
return e.replace(/(<title>)[^<]*(<\/title>)/, `$1${t}$2`).replace(/(<meta\s+name="description"\s+content=")[^"]*(")/, `$1${n}$2`).replace(/(<meta\s+property="og:title"\s+content=")[^"]*(")/, `$1${t}$2`).replace(/(<meta\s+property="og:description"\s+content=")[^"]*(")/, `$1${n}$2`).replace(/(<meta\s+property="og:image"\s+content=")[^"]*(")/, `$1${r}$2`).replace(/(<meta\s+name="twitter:title"\s+content=")[^"]*(")/, `$1${t}$2`).replace(/(<meta\s+name="twitter:description"\s+content=")[^"]*(")/, `$1${n}$2`).replace(/(<meta\s+name="twitter:image"\s+content=")[^"]*(")/, `$1${r}$2`);
|
|
37
|
+
}
|
|
38
|
+
return t({ region: a }, async (e, t) => {
|
|
39
|
+
let a = Date.now();
|
|
40
|
+
try {
|
|
41
|
+
let n = new URL(e.url, `https://${e.headers.host ?? "localhost"}`).pathname, o = r;
|
|
42
|
+
for (let e of i) {
|
|
43
|
+
let t = n.match(e.pattern);
|
|
44
|
+
if (t) {
|
|
45
|
+
let n = await e.resolve(t[1]);
|
|
46
|
+
if (n) {
|
|
47
|
+
o = n;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
let l = c(await s(), o.title, o.description, o.image);
|
|
53
|
+
console.log(`[SSRDynamicOG] ${n} → ${o.title} (${Date.now() - a}ms)`), t.setHeader("Content-Type", "text/html; charset=utf-8"), t.status(200).send(l);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
console.error("[SSRDynamicOG] error:", e), t.redirect(302, n);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { r as applyCors, o as createSSRDynamicOG, i as del, n as snapshotToData, a as undel };
|
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
import { DocumentData, QueryDocumentSnapshot, DocumentSnapshot } from 'firebase-admin/firestore';
|
|
2
|
-
export declare function snapshotToData
|
|
3
|
-
id: string;
|
|
4
|
-
}) | null;
|
|
2
|
+
export declare function snapshotToData(snapshot: QueryDocumentSnapshot | DocumentSnapshot): DocumentData;
|