@typicalday/firegraph 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-6OQW5OKO.js +110 -0
- package/dist/chunk-6OQW5OKO.js.map +1 -0
- package/dist/chunk-WOAJRVHD.js +699 -0
- package/dist/chunk-WOAJRVHD.js.map +1 -0
- package/dist/chunk-YUXOALMR.js +1653 -0
- package/dist/chunk-YUXOALMR.js.map +1 -0
- package/dist/codegen/index.d.cts +25 -1
- package/dist/codegen/index.d.ts +25 -1
- package/dist/d1.cjs +2416 -0
- package/dist/d1.cjs.map +1 -0
- package/dist/d1.d.cts +54 -0
- package/dist/d1.d.ts +54 -0
- package/dist/d1.js +75 -0
- package/dist/d1.js.map +1 -0
- package/dist/do-sqlite.cjs +2419 -0
- package/dist/do-sqlite.cjs.map +1 -0
- package/dist/do-sqlite.d.cts +41 -0
- package/dist/do-sqlite.d.ts +41 -0
- package/dist/do-sqlite.js +78 -0
- package/dist/do-sqlite.js.map +1 -0
- package/dist/editor/server/index.mjs +2054 -1984
- package/dist/index.cjs +2845 -2744
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +345 -233
- package/dist/index.d.ts +345 -233
- package/dist/index.js +710 -2295
- package/dist/index.js.map +1 -1
- package/dist/serialization-C6JNNOCS.js +13 -0
- package/dist/serialization-C6JNNOCS.js.map +1 -0
- package/dist/{index-B9aodfYD.d.cts → types-BVtx9zLv.d.cts} +26 -25
- package/dist/{index-B9aodfYD.d.ts → types-BVtx9zLv.d.ts} +26 -25
- package/package.json +24 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// src/serialization.ts
|
|
2
|
+
import { Timestamp, GeoPoint, FieldValue } from "@google-cloud/firestore";
|
|
3
|
+
var SERIALIZATION_TAG = "__firegraph_ser__";
|
|
4
|
+
var KNOWN_TYPES = /* @__PURE__ */ new Set(["Timestamp", "GeoPoint", "VectorValue", "DocumentReference"]);
|
|
5
|
+
var _docRefWarned = false;
|
|
6
|
+
function isTaggedValue(value) {
|
|
7
|
+
if (value === null || typeof value !== "object") return false;
|
|
8
|
+
const tag = value[SERIALIZATION_TAG];
|
|
9
|
+
return typeof tag === "string" && KNOWN_TYPES.has(tag);
|
|
10
|
+
}
|
|
11
|
+
function isTimestamp(value) {
|
|
12
|
+
return value instanceof Timestamp;
|
|
13
|
+
}
|
|
14
|
+
function isGeoPoint(value) {
|
|
15
|
+
return value instanceof GeoPoint;
|
|
16
|
+
}
|
|
17
|
+
function isDocumentReference(value) {
|
|
18
|
+
if (value === null || typeof value !== "object") return false;
|
|
19
|
+
const v = value;
|
|
20
|
+
return typeof v.path === "string" && v.firestore !== void 0 && typeof v.id === "string" && v.constructor?.name === "DocumentReference";
|
|
21
|
+
}
|
|
22
|
+
function isVectorValue(value) {
|
|
23
|
+
if (value === null || typeof value !== "object") return false;
|
|
24
|
+
const v = value;
|
|
25
|
+
return v.constructor?.name === "VectorValue" && Array.isArray(v._values);
|
|
26
|
+
}
|
|
27
|
+
function serializeFirestoreTypes(data) {
|
|
28
|
+
return serializeValue(data);
|
|
29
|
+
}
|
|
30
|
+
function serializeValue(value) {
|
|
31
|
+
if (value === null || value === void 0) return value;
|
|
32
|
+
if (typeof value !== "object") return value;
|
|
33
|
+
if (isTimestamp(value)) {
|
|
34
|
+
return { [SERIALIZATION_TAG]: "Timestamp", seconds: value.seconds, nanoseconds: value.nanoseconds };
|
|
35
|
+
}
|
|
36
|
+
if (isGeoPoint(value)) {
|
|
37
|
+
return { [SERIALIZATION_TAG]: "GeoPoint", latitude: value.latitude, longitude: value.longitude };
|
|
38
|
+
}
|
|
39
|
+
if (isDocumentReference(value)) {
|
|
40
|
+
return { [SERIALIZATION_TAG]: "DocumentReference", path: value.path };
|
|
41
|
+
}
|
|
42
|
+
if (isVectorValue(value)) {
|
|
43
|
+
const v = value;
|
|
44
|
+
const values = typeof v.toArray === "function" ? v.toArray() : v._values;
|
|
45
|
+
return { [SERIALIZATION_TAG]: "VectorValue", values: [...values] };
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
return value.map(serializeValue);
|
|
49
|
+
}
|
|
50
|
+
const result = {};
|
|
51
|
+
for (const key of Object.keys(value)) {
|
|
52
|
+
result[key] = serializeValue(value[key]);
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
function deserializeFirestoreTypes(data, db) {
|
|
57
|
+
return deserializeValue(data, db);
|
|
58
|
+
}
|
|
59
|
+
function deserializeValue(value, db) {
|
|
60
|
+
if (value === null || value === void 0) return value;
|
|
61
|
+
if (typeof value !== "object") return value;
|
|
62
|
+
if (isTimestamp(value) || isGeoPoint(value) || isDocumentReference(value) || isVectorValue(value)) {
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return value.map((v) => deserializeValue(v, db));
|
|
67
|
+
}
|
|
68
|
+
const obj = value;
|
|
69
|
+
if (isTaggedValue(obj)) {
|
|
70
|
+
const tag = obj[SERIALIZATION_TAG];
|
|
71
|
+
switch (tag) {
|
|
72
|
+
case "Timestamp":
|
|
73
|
+
if (typeof obj.seconds !== "number" || typeof obj.nanoseconds !== "number") return obj;
|
|
74
|
+
return new Timestamp(obj.seconds, obj.nanoseconds);
|
|
75
|
+
case "GeoPoint":
|
|
76
|
+
if (typeof obj.latitude !== "number" || typeof obj.longitude !== "number") return obj;
|
|
77
|
+
return new GeoPoint(obj.latitude, obj.longitude);
|
|
78
|
+
case "VectorValue":
|
|
79
|
+
if (!Array.isArray(obj.values)) return obj;
|
|
80
|
+
return FieldValue.vector(obj.values);
|
|
81
|
+
case "DocumentReference":
|
|
82
|
+
if (typeof obj.path !== "string") return obj;
|
|
83
|
+
if (db) {
|
|
84
|
+
return db.doc(obj.path);
|
|
85
|
+
}
|
|
86
|
+
if (!_docRefWarned) {
|
|
87
|
+
_docRefWarned = true;
|
|
88
|
+
console.warn(
|
|
89
|
+
"[firegraph] DocumentReference encountered during migration deserialization but no Firestore instance available. The reference will remain as a tagged object with its path. Enable write-back for full reconstruction."
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
return obj;
|
|
93
|
+
default:
|
|
94
|
+
return obj;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const result = {};
|
|
98
|
+
for (const key of Object.keys(obj)) {
|
|
99
|
+
result[key] = deserializeValue(obj[key], db);
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export {
|
|
105
|
+
SERIALIZATION_TAG,
|
|
106
|
+
isTaggedValue,
|
|
107
|
+
serializeFirestoreTypes,
|
|
108
|
+
deserializeFirestoreTypes
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=chunk-6OQW5OKO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/serialization.ts"],"sourcesContent":["/**\n * Firestore-aware serialization for the sandbox migration pipeline.\n *\n * Firestore documents can contain special types (Timestamp, GeoPoint,\n * VectorValue, DocumentReference) that don't survive plain JSON\n * round-tripping. This module provides tagged serialization: Firestore\n * types are wrapped in tagged plain objects before JSON marshaling and\n * reconstructed after.\n *\n * Only used by the `defaultExecutor` sandbox path. Static migrations\n * (in-memory functions) receive raw Firestore objects directly.\n */\n\nimport { Timestamp, GeoPoint, FieldValue } from '@google-cloud/firestore';\nimport type { Firestore, DocumentReference } from '@google-cloud/firestore';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Sentinel key used to tag serialized Firestore types. */\nexport const SERIALIZATION_TAG = '__firegraph_ser__' as const;\n\n/** Known discriminator values for tagged types. */\nconst KNOWN_TYPES = new Set(['Timestamp', 'GeoPoint', 'VectorValue', 'DocumentReference']);\n\n// One-time warning for DocumentReference deserialization without db\nlet _docRefWarned = false;\n\n// ---------------------------------------------------------------------------\n// Type guard\n// ---------------------------------------------------------------------------\n\n/** Check if a value is a tagged serialized Firestore type. */\nexport function isTaggedValue(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const tag = (value as Record<string, unknown>)[SERIALIZATION_TAG];\n return typeof tag === 'string' && KNOWN_TYPES.has(tag);\n}\n\n// ---------------------------------------------------------------------------\n// Detection helpers\n// ---------------------------------------------------------------------------\n\nfunction isTimestamp(value: unknown): value is Timestamp {\n return value instanceof Timestamp;\n}\n\nfunction isGeoPoint(value: unknown): value is GeoPoint {\n return value instanceof GeoPoint;\n}\n\nfunction isDocumentReference(value: unknown): value is DocumentReference {\n // Duck-type check: DocumentReference has path (string) and firestore properties\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.path === 'string' &&\n v.firestore !== undefined &&\n typeof v.id === 'string' &&\n v.constructor?.name === 'DocumentReference'\n );\n}\n\nfunction isVectorValue(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return (\n v.constructor?.name === 'VectorValue' &&\n Array.isArray((v as Record<string, unknown>)._values)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Serialize\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively walk a data object and replace Firestore types with tagged\n * plain objects suitable for JSON serialization.\n *\n * Returns a new object tree — the input is never mutated.\n */\nexport function serializeFirestoreTypes(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n return serializeValue(data) as Record<string, unknown>;\n}\n\nfunction serializeValue(value: unknown): unknown {\n // Primitives\n if (value === null || value === undefined) return value;\n if (typeof value !== 'object') return value;\n\n // Firestore types (check before generic object/array)\n if (isTimestamp(value)) {\n return { [SERIALIZATION_TAG]: 'Timestamp', seconds: value.seconds, nanoseconds: value.nanoseconds };\n }\n if (isGeoPoint(value)) {\n return { [SERIALIZATION_TAG]: 'GeoPoint', latitude: value.latitude, longitude: value.longitude };\n }\n if (isDocumentReference(value)) {\n return { [SERIALIZATION_TAG]: 'DocumentReference', path: (value as DocumentReference).path };\n }\n if (isVectorValue(value)) {\n // Prefer toArray() (public API) over _values (private internal property)\n const v = value as Record<string, unknown>;\n const values = typeof v.toArray === 'function'\n ? (v.toArray as () => number[])()\n : (v._values as number[]);\n return { [SERIALIZATION_TAG]: 'VectorValue', values: [...values] };\n }\n\n // Arrays\n if (Array.isArray(value)) {\n return value.map(serializeValue);\n }\n\n // Plain objects — recurse\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = serializeValue((value as Record<string, unknown>)[key]);\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Deserialize\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively walk a data object and reconstruct Firestore types from\n * tagged plain objects.\n *\n * @param data - The data to deserialize (typically from JSON.parse)\n * @param db - Optional Firestore instance for DocumentReference reconstruction.\n * If not provided, tagged DocumentReferences are left as-is with a one-time warning.\n *\n * Returns a new object tree — the input is never mutated.\n */\nexport function deserializeFirestoreTypes(\n data: Record<string, unknown>,\n db?: Firestore,\n): Record<string, unknown> {\n return deserializeValue(data, db) as Record<string, unknown>;\n}\n\nfunction deserializeValue(value: unknown, db?: Firestore): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value !== 'object') return value;\n\n // Short-circuit for values that are already real Firestore types.\n // This makes deserializeFirestoreTypes idempotent — safe to call on data\n // that has already been deserialized (e.g., write-back after defaultExecutor\n // already reconstructed types, or static migrations that return raw types).\n if (isTimestamp(value) || isGeoPoint(value) || isDocumentReference(value) || isVectorValue(value)) {\n return value;\n }\n\n // Arrays\n if (Array.isArray(value)) {\n return value.map((v) => deserializeValue(v, db));\n }\n\n const obj = value as Record<string, unknown>;\n\n // Check for tagged Firestore type\n if (isTaggedValue(obj)) {\n const tag = obj[SERIALIZATION_TAG] as string;\n\n switch (tag) {\n case 'Timestamp':\n // Validate expected fields before reconstruction\n if (typeof obj.seconds !== 'number' || typeof obj.nanoseconds !== 'number') return obj;\n return new Timestamp(obj.seconds, obj.nanoseconds);\n\n case 'GeoPoint':\n if (typeof obj.latitude !== 'number' || typeof obj.longitude !== 'number') return obj;\n return new GeoPoint(obj.latitude, obj.longitude);\n\n case 'VectorValue':\n if (!Array.isArray(obj.values)) return obj;\n return FieldValue.vector(obj.values as number[]);\n\n case 'DocumentReference':\n if (typeof obj.path !== 'string') return obj;\n if (db) {\n return db.doc(obj.path);\n }\n // No db available — leave as tagged object with one-time warning\n if (!_docRefWarned) {\n _docRefWarned = true;\n console.warn(\n '[firegraph] DocumentReference encountered during migration deserialization ' +\n 'but no Firestore instance available. The reference will remain as a tagged ' +\n 'object with its path. Enable write-back for full reconstruction.',\n );\n }\n return obj;\n\n default:\n // Unknown tag — leave as-is (forward compatibility)\n return obj;\n }\n }\n\n // Plain object — recurse\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = deserializeValue(obj[key], db);\n }\n return result;\n}\n"],"mappings":"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","names":[]}
|