@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.
@@ -0,0 +1,9 @@
1
+ import { FieldValue } from 'firebase-admin/firestore';
2
+ export declare const del: () => {
3
+ updateAt: FieldValue;
4
+ deletedAt: FieldValue;
5
+ };
6
+ export declare const undel: () => {
7
+ updateAt: FieldValue;
8
+ deletedAt: null;
9
+ };
@@ -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
- import { DocumentData } from 'firebase-admin/firestore';
2
- import { DocumentReference } from 'firebase-admin/firestore';
3
- import { DocumentSnapshot } from 'firebase-admin/firestore';
4
- import { QueryDocumentSnapshot } from 'firebase-admin/firestore';
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`}),require(`firebase-admin/firestore`);function e(e){return{...e.data(),id:e.id}}exports.snapshotToData=e;
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
- //#region src/index.ts
3
- function e(e) {
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
- export { e as snapshotToData };
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';
@@ -0,0 +1,3 @@
1
+ import { https } from 'firebase-functions';
2
+ import type * as express from "express";
3
+ export declare function applyCors(request: https.Request, response: express.Response, allowedOrigins: string[]): boolean;
@@ -0,0 +1,2 @@
1
+ import { DocumentData, QueryDocumentSnapshot, DocumentSnapshot } from 'firebase-admin/firestore';
2
+ export declare function snapshotToData(snapshot: QueryDocumentSnapshot | DocumentSnapshot): DocumentData;
@@ -0,0 +1,2 @@
1
+ export * from './firestore';
2
+ export * from './cors';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ienlab/cloud-functions-library",
3
- "version": "0.9.6",
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
- "firebase-admin": "^13.6.0",
20
- "firebase-functions": "^7.0.0"
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-functions-test": "^3.1.0",
24
- "@eslint/js": "^9.39.4",
25
- "@types/node": "^24.12.2",
26
- "@types/react": "^19.2.14",
27
- "@types/react-dom": "^19.2.3",
28
- "@vitejs/plugin-react": "^6.0.1",
29
- "eslint": "^9.39.4",
30
- "eslint-plugin-react-hooks": "^7.0.1",
31
- "eslint-plugin-react-refresh": "^0.5.2",
32
- "globals": "^17.4.0",
33
- "typescript": "~6.0.2",
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
  }