@ienlab/cloud-functions-library 0.9.6 → 1.0.0-dev.10
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/constant/firestore.d.ts +9 -0
- package/dist/constant/index.d.ts +1 -0
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/ssr-dynamic-og.d.ts +17 -0
- package/dist/index.d.ts +4 -17
- package/dist/index.js +1 -1
- package/dist/index.mjs +54 -4
- package/dist/types/firestore.d.ts +15 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/cors.d.ts +3 -0
- package/dist/utils/firestore.d.ts +2 -0
- package/dist/utils/index.d.ts +2 -0
- package/package.json +17 -18
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './firestore';
|
|
@@ -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
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { Timestamp } from 'firebase-admin/firestore';
|
|
6
|
-
|
|
7
|
-
export declare interface FirestoreItem {
|
|
8
|
-
id: string;
|
|
9
|
-
ref: DocumentReference | null;
|
|
10
|
-
createAt: Timestamp;
|
|
11
|
-
updateAt: Timestamp;
|
|
12
|
-
delete: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export declare function snapshotToData(snapshot: QueryDocumentSnapshot | DocumentSnapshot): DocumentData;
|
|
16
|
-
|
|
17
|
-
export { }
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './utils';
|
|
3
|
+
export * from './constant';
|
|
4
|
+
export * from './handlers';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`})
|
|
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,10 +1,60 @@
|
|
|
1
|
-
import "firebase-admin/firestore";
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { FieldValue as e } from "firebase-admin/firestore";
|
|
2
|
+
import { onRequest as t } from "firebase-functions/v2/https";
|
|
3
|
+
//#region src/utils/firestore.ts
|
|
4
|
+
function n(e) {
|
|
4
5
|
return {
|
|
5
6
|
...e.data(),
|
|
6
7
|
id: e.id
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
10
|
//#endregion
|
|
10
|
-
|
|
11
|
+
//#region src/utils/cors.ts
|
|
12
|
+
function r(e, t, n) {
|
|
13
|
+
let r = e.headers.origin;
|
|
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
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/constant/firestore.ts
|
|
18
|
+
var i = () => ({
|
|
19
|
+
updateAt: e.serverTimestamp(),
|
|
20
|
+
deletedAt: e.serverTimestamp()
|
|
21
|
+
}), a = () => ({
|
|
22
|
+
updateAt: e.serverTimestamp(),
|
|
23
|
+
deletedAt: null
|
|
24
|
+
});
|
|
25
|
+
//#endregion
|
|
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 };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DocumentReference, Timestamp } from 'firebase-admin/firestore';
|
|
2
|
+
export interface LegacyFirestoreItem {
|
|
3
|
+
id: string;
|
|
4
|
+
ref: DocumentReference | null;
|
|
5
|
+
createAt: Timestamp;
|
|
6
|
+
updateAt: Timestamp;
|
|
7
|
+
delete: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface FirestoreItem {
|
|
10
|
+
id: string;
|
|
11
|
+
ref: DocumentReference | null;
|
|
12
|
+
createAt: Timestamp;
|
|
13
|
+
updateAt: Timestamp;
|
|
14
|
+
deletedAt: Timestamp | null;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './firestore';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ienlab/cloud-functions-library",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-dev.10",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -15,24 +15,23 @@
|
|
|
15
15
|
"scripts": {
|
|
16
16
|
"build": "vite build"
|
|
17
17
|
},
|
|
18
|
-
"dependencies": {
|
|
19
|
-
|
|
20
|
-
"
|
|
18
|
+
"dependencies": {},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"express": ">=4.0.0",
|
|
21
|
+
"firebase-admin": ">=12.0.0",
|
|
22
|
+
"firebase-functions": ">=6.0.0"
|
|
21
23
|
},
|
|
22
24
|
"devDependencies": {
|
|
23
|
-
"firebase-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"@
|
|
27
|
-
"@types/
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"eslint
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"typescript-eslint": "^8.58.0",
|
|
35
|
-
"vite": "^8.0.4",
|
|
36
|
-
"vite-plugin-dts": "^4.5.4"
|
|
25
|
+
"firebase-admin": "^13.10.0",
|
|
26
|
+
"firebase-functions": "^7.2.5",
|
|
27
|
+
"firebase-functions-test": "^3.5.0",
|
|
28
|
+
"@eslint/js": "^10.0.1",
|
|
29
|
+
"@types/node": "^25.9.1",
|
|
30
|
+
"eslint": "^10.4.1",
|
|
31
|
+
"globals": "^17.6.0",
|
|
32
|
+
"typescript": "~6.0.3",
|
|
33
|
+
"typescript-eslint": "^8.60.1",
|
|
34
|
+
"vite": "^8.0.16",
|
|
35
|
+
"vite-plugin-dts": "^5.0.2"
|
|
37
36
|
}
|
|
38
37
|
}
|