@dasasian/firebase-structured-logger 0.4.0-beta.0 → 0.4.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/README.md +2 -1
- package/dist/tools/index.js +0 -22
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/uploadSourceMaps.d.ts +21 -0
- package/dist/tools/uploadSourceMaps.d.ts.map +1 -1
- package/dist/tools/uploadSourceMaps.js +46 -4
- package/dist/tools/uploadSourceMaps.js.map +1 -1
- package/package.json +3 -3
- package/dist/tools/packDeploy.d.ts +0 -15
- package/dist/tools/packDeploy.d.ts.map +0 -1
- package/dist/tools/packDeploy.js +0 -148
- package/dist/tools/packDeploy.js.map +0 -1
package/README.md
CHANGED
|
@@ -185,7 +185,8 @@ npx fsl upload-sourcemaps [--bucket=<name>] [--functions=<path>] [--embed-source
|
|
|
185
185
|
npx fsl install-skills
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
-
>
|
|
188
|
+
> To try an unreleased change in a real deployment, publish a prerelease and install it:
|
|
189
|
+
> `npm publish --tag beta`, then `npm i @dasasian/firebase-structured-logger@beta`. For local work against a checkout, `npm link` avoids publishing entirely.
|
|
189
190
|
|
|
190
191
|
## Skills
|
|
191
192
|
|
package/dist/tools/index.js
CHANGED
|
@@ -38,7 +38,6 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const uploadSourceMaps_1 = require("./uploadSourceMaps");
|
|
40
40
|
const installSkills_1 = require("./installSkills");
|
|
41
|
-
const packDeploy_1 = require("./packDeploy");
|
|
42
41
|
const [, , command, ...rawArgs] = process.argv;
|
|
43
42
|
function parseArgs(args) {
|
|
44
43
|
const result = {};
|
|
@@ -98,22 +97,6 @@ async function main() {
|
|
|
98
97
|
await (0, installSkills_1.installSkills)({ global: args.global === 'true', force: args.force === 'true' });
|
|
99
98
|
break;
|
|
100
99
|
}
|
|
101
|
-
case 'pack': {
|
|
102
|
-
if (!args.functions) {
|
|
103
|
-
console.error('Usage: fsl pack --functions=<path>');
|
|
104
|
-
process.exit(1);
|
|
105
|
-
}
|
|
106
|
-
await (0, packDeploy_1.pack)({ functionsDir: args.functions });
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
case 'pack-restore': {
|
|
110
|
-
if (!args.functions) {
|
|
111
|
-
console.error('Usage: fsl pack-restore --functions=<path>');
|
|
112
|
-
process.exit(1);
|
|
113
|
-
}
|
|
114
|
-
await (0, packDeploy_1.packRestore)({ functionsDir: args.functions });
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
100
|
default: {
|
|
118
101
|
console.log(`
|
|
119
102
|
firebase-structured-logger (fsl)
|
|
@@ -131,12 +114,7 @@ Commands:
|
|
|
131
114
|
Copy skills/ to .claude/skills/ (project) or ~/.claude/skills/ (--global).
|
|
132
115
|
Prompts before overwriting existing skills. Use --force to skip prompts.
|
|
133
116
|
|
|
134
|
-
fsl pack --functions=<path>
|
|
135
|
-
Build + pack firebase-structured-logger, copy tgz to functions/vendor/,
|
|
136
|
-
and patch functions/package.json. Run before firebase deploy.
|
|
137
117
|
|
|
138
|
-
fsl pack-restore --functions=<path>
|
|
139
|
-
Restore functions/package.json to its file: reference after deploy.
|
|
140
118
|
`);
|
|
141
119
|
if (command) {
|
|
142
120
|
console.error(`Unknown command: ${command}`);
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAwB;AACxB,2CAA4B;AAC5B,yDAAqD;AACrD,mDAA+C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,26 @@ export interface UploadOptions {
|
|
|
5
5
|
functionsDir?: string;
|
|
6
6
|
embedSourcemaps?: boolean;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Drop `sourcesContent` from a source map, returning the JSON to store.
|
|
10
|
+
*
|
|
11
|
+
* `sourcesContent` inlines the ENTIRE original source of every file the bundle
|
|
12
|
+
* covers. Symbolication never reads it — `originalPositionFor` needs only
|
|
13
|
+
* `sources`, `names` and `mappings` — so uploading it costs storage, download
|
|
14
|
+
* time on the per-error path, and Cloud Function memory, for nothing.
|
|
15
|
+
*
|
|
16
|
+
* It is also your source code. Uploading maps verbatim means a logging tool
|
|
17
|
+
* quietly ships your source into a Storage bucket, where a misconfiguration
|
|
18
|
+
* turns a logging concern into a source-code leak.
|
|
19
|
+
*
|
|
20
|
+
* Measured on a real Vite bundle: 2.23 MB -> 580 KB, a 74.6% reduction.
|
|
21
|
+
*
|
|
22
|
+
* Returns the original text unchanged if it is not parseable JSON, so an odd
|
|
23
|
+
* map is uploaded as-is rather than lost.
|
|
24
|
+
*/
|
|
25
|
+
export declare function stripSourcesContent(raw: string): {
|
|
26
|
+
json: string;
|
|
27
|
+
stripped: boolean;
|
|
28
|
+
};
|
|
8
29
|
export declare function uploadSourceMaps(options: UploadOptions): Promise<void>;
|
|
9
30
|
//# sourceMappingURL=uploadSourceMaps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadSourceMaps.d.ts","sourceRoot":"","sources":["../../src/tools/uploadSourceMaps.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;
|
|
1
|
+
{"version":3,"file":"uploadSourceMaps.d.ts","sourceRoot":"","sources":["../../src/tools/uploadSourceMaps.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CASpF;AA8BD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE5E"}
|
|
@@ -33,10 +33,46 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.stripSourcesContent = stripSourcesContent;
|
|
36
37
|
exports.uploadSourceMaps = uploadSourceMaps;
|
|
37
38
|
const fs = __importStar(require("fs"));
|
|
38
39
|
const path = __importStar(require("path"));
|
|
39
40
|
const storage_1 = require("@google-cloud/storage");
|
|
41
|
+
/**
|
|
42
|
+
* Drop `sourcesContent` from a source map, returning the JSON to store.
|
|
43
|
+
*
|
|
44
|
+
* `sourcesContent` inlines the ENTIRE original source of every file the bundle
|
|
45
|
+
* covers. Symbolication never reads it — `originalPositionFor` needs only
|
|
46
|
+
* `sources`, `names` and `mappings` — so uploading it costs storage, download
|
|
47
|
+
* time on the per-error path, and Cloud Function memory, for nothing.
|
|
48
|
+
*
|
|
49
|
+
* It is also your source code. Uploading maps verbatim means a logging tool
|
|
50
|
+
* quietly ships your source into a Storage bucket, where a misconfiguration
|
|
51
|
+
* turns a logging concern into a source-code leak.
|
|
52
|
+
*
|
|
53
|
+
* Measured on a real Vite bundle: 2.23 MB -> 580 KB, a 74.6% reduction.
|
|
54
|
+
*
|
|
55
|
+
* Returns the original text unchanged if it is not parseable JSON, so an odd
|
|
56
|
+
* map is uploaded as-is rather than lost.
|
|
57
|
+
*/
|
|
58
|
+
function stripSourcesContent(raw) {
|
|
59
|
+
try {
|
|
60
|
+
const map = JSON.parse(raw);
|
|
61
|
+
if (!('sourcesContent' in map))
|
|
62
|
+
return { json: raw, stripped: false };
|
|
63
|
+
delete map.sourcesContent;
|
|
64
|
+
return { json: JSON.stringify(map), stripped: true };
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { json: raw, stripped: false };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function readStrippedMap(localPath) {
|
|
71
|
+
const raw = fs.readFileSync(localPath, 'utf-8');
|
|
72
|
+
const { json } = stripSourcesContent(raw);
|
|
73
|
+
return { json, before: Buffer.byteLength(raw), after: Buffer.byteLength(json) };
|
|
74
|
+
}
|
|
75
|
+
const kb = (bytes) => `${Math.round(bytes / 1024)}KB`;
|
|
40
76
|
function findMapFiles(dir) {
|
|
41
77
|
const results = [];
|
|
42
78
|
if (!fs.existsSync(dir))
|
|
@@ -77,8 +113,12 @@ async function uploadSourceMaps(options) {
|
|
|
77
113
|
}
|
|
78
114
|
for (const localPath of mapFiles) {
|
|
79
115
|
const dest = path.join(embedDir, path.basename(localPath));
|
|
80
|
-
|
|
81
|
-
|
|
116
|
+
// Stripped here too: these ship inside the deployed function, so the
|
|
117
|
+
// content would inflate the deploy and sit in memory for the instance's life.
|
|
118
|
+
const { json, before, after } = readStrippedMap(localPath);
|
|
119
|
+
fs.writeFileSync(dest, json);
|
|
120
|
+
const saved = before > after ? ` (${kb(before)} → ${kb(after)})` : '';
|
|
121
|
+
console.log(` ✓ embedded ${path.basename(localPath)} → ${options.functionsDir}/sourcemaps/current/${saved}`);
|
|
82
122
|
}
|
|
83
123
|
}
|
|
84
124
|
// Authenticate via service account key if available, otherwise fall back to ADC
|
|
@@ -92,8 +132,10 @@ async function uploadSourceMaps(options) {
|
|
|
92
132
|
for (const localPath of mapFiles) {
|
|
93
133
|
const fileName = path.basename(localPath);
|
|
94
134
|
const destination = `sourcemaps/${releaseId}/${fileName}`;
|
|
95
|
-
|
|
96
|
-
|
|
135
|
+
const { json, before, after } = readStrippedMap(localPath);
|
|
136
|
+
await bucket.file(destination).save(json, { contentType: 'application/json' });
|
|
137
|
+
const saved = before > after ? ` (${kb(before)} → ${kb(after)}, -${Math.round(100 - (after / before) * 100)}%)` : '';
|
|
138
|
+
console.log(` ✓ ${fileName} → gs://${options.bucket}/${destination}${saved}`);
|
|
97
139
|
// Delete local .map file after upload
|
|
98
140
|
fs.unlinkSync(localPath);
|
|
99
141
|
console.log(` ✗ deleted ${path.relative(process.cwd(), localPath)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadSourceMaps.js","sourceRoot":"","sources":["../../src/tools/uploadSourceMaps.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"uploadSourceMaps.js","sourceRoot":"","sources":["../../src/tools/uploadSourceMaps.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dasasian/firebase-structured-logger",
|
|
3
|
-
"version": "0.4.0
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Structured logging for Firebase apps \u2014 client, functions, and tools",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Dasasian",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"build:watch": "tsc --watch",
|
|
66
66
|
"clean": "rm -rf dist",
|
|
67
67
|
"typecheck": "tsc --noEmit",
|
|
68
|
-
"test": "tsx tests/logger.ts && tsx tests/breadcrumbs.ts && tsx tests/rateLimiter.ts && tsx tests/errorHandler.ts && tsx tests/attachments.ts && FUNCTIONS_EMULATOR=true tsx tests/errorPayload.ts && FUNCTIONS_EMULATOR=true tsx tests/requestLogger.ts && FUNCTIONS_EMULATOR=true tsx tests/handler.ts && FUNCTIONS_EMULATOR=true tsx tests/symbolication.ts && FUNCTIONS_EMULATOR=true tsx tests/publicApi.ts && FUNCTIONS_EMULATOR=true tsx tests/configureTwice.ts && tsx tests/productionOutput.ts && tsx tests/handlerSymbolication.ts",
|
|
69
|
-
"prepublishOnly": "npm run build",
|
|
68
|
+
"test": "tsx tests/logger.ts && tsx tests/breadcrumbs.ts && tsx tests/rateLimiter.ts && tsx tests/errorHandler.ts && tsx tests/attachments.ts && tsx tests/sourceMapStripping.ts && FUNCTIONS_EMULATOR=true tsx tests/errorPayload.ts && FUNCTIONS_EMULATOR=true tsx tests/requestLogger.ts && FUNCTIONS_EMULATOR=true tsx tests/handler.ts && FUNCTIONS_EMULATOR=true tsx tests/symbolication.ts && FUNCTIONS_EMULATOR=true tsx tests/publicApi.ts && FUNCTIONS_EMULATOR=true tsx tests/configureTwice.ts && tsx tests/productionOutput.ts && tsx tests/handlerSymbolication.ts",
|
|
69
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
70
70
|
"smoke:deploy": "cd smoke/functions && npm install && npm run build && cd .. && firebase deploy --only functions --project $(grep '^FSL_SMOKE_PROJECT=' .env.local | cut -d= -f2)",
|
|
71
71
|
"smoke": "tsx smoke/run.ts"
|
|
72
72
|
},
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
interface PackOptions {
|
|
2
|
-
functionsDir: string;
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* Build + pack firebase-structured-logger, copy tgz to functions/vendor/,
|
|
6
|
-
* and patch functions/package.json to reference it. Call before firebase deploy.
|
|
7
|
-
*/
|
|
8
|
-
export declare function pack(options: PackOptions): Promise<void>;
|
|
9
|
-
/**
|
|
10
|
-
* Restore functions/package.json to its original file: reference.
|
|
11
|
-
* Call after firebase deploy (e.g. in postdeploy script).
|
|
12
|
-
*/
|
|
13
|
-
export declare function packRestore(options: PackOptions): Promise<void>;
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=packDeploy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"packDeploy.d.ts","sourceRoot":"","sources":["../../src/tools/packDeploy.ts"],"names":[],"mappings":"AASA,UAAU,WAAW;IACnB,YAAY,EAAE,MAAM,CAAA;CACrB;AAyBD;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD9D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCrE"}
|
package/dist/tools/packDeploy.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.pack = pack;
|
|
37
|
-
exports.packRestore = packRestore;
|
|
38
|
-
const crypto_1 = require("crypto");
|
|
39
|
-
const child_process_1 = require("child_process");
|
|
40
|
-
const fs = __importStar(require("fs"));
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
// __dirname resolves symlinks, so when consumed via file: reference this points
|
|
43
|
-
// to the real firebase-structured-logger directory, not node_modules.
|
|
44
|
-
const packageRoot = path.join(__dirname, '..', '..');
|
|
45
|
-
function readPackageJson(dir) {
|
|
46
|
-
return JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
|
|
47
|
-
}
|
|
48
|
-
function writePackageJson(dir, pkg) {
|
|
49
|
-
fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify(pkg, null, 2) + '\n');
|
|
50
|
-
}
|
|
51
|
-
function findFslDep(pkg) {
|
|
52
|
-
for (const field of ['dependencies', 'devDependencies']) {
|
|
53
|
-
const deps = pkg[field];
|
|
54
|
-
if (deps?.['firebase-structured-logger']) {
|
|
55
|
-
return { field, ref: deps['firebase-structured-logger'] };
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Build + pack firebase-structured-logger, copy tgz to functions/vendor/,
|
|
62
|
-
* and patch functions/package.json to reference it. Call before firebase deploy.
|
|
63
|
-
*/
|
|
64
|
-
async function pack(options) {
|
|
65
|
-
const functionsDir = path.resolve(process.cwd(), options.functionsDir);
|
|
66
|
-
const vendorDir = path.join(functionsDir, 'vendor');
|
|
67
|
-
const manifestPath = path.join(vendorDir, '.fsl-restore.json');
|
|
68
|
-
// 1. Build
|
|
69
|
-
console.log('[fsl] Building firebase-structured-logger...');
|
|
70
|
-
(0, child_process_1.execSync)('npm run build', { cwd: packageRoot, stdio: 'inherit' });
|
|
71
|
-
// 2. Pack — use --json for reliable filename parsing
|
|
72
|
-
console.log('[fsl] Packing...');
|
|
73
|
-
const packOutput = (0, child_process_1.execSync)('npm pack --json', { cwd: packageRoot, encoding: 'utf-8' });
|
|
74
|
-
const [{ filename: baseTgzFileName }] = JSON.parse(packOutput);
|
|
75
|
-
const tgzSource = path.join(packageRoot, baseTgzFileName);
|
|
76
|
-
// Use a content hash so the filename is stable for identical builds and
|
|
77
|
-
// changes only when FSL itself changes — no calling-project release ID needed.
|
|
78
|
-
const contentHash = (0, crypto_1.createHash)('sha256').update(fs.readFileSync(tgzSource)).digest('hex').slice(0, 8);
|
|
79
|
-
const tgzFileName = baseTgzFileName.replace(/\.tgz$/, `-${contentHash}.tgz`);
|
|
80
|
-
// 3. Copy to functions/vendor/ (remove any previous fsl tarballs first)
|
|
81
|
-
fs.mkdirSync(vendorDir, { recursive: true });
|
|
82
|
-
for (const f of fs.readdirSync(vendorDir)) {
|
|
83
|
-
if (f.startsWith('firebase-structured-logger-') && f.endsWith('.tgz')) {
|
|
84
|
-
fs.unlinkSync(path.join(vendorDir, f));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const tgzDest = path.join(vendorDir, tgzFileName);
|
|
88
|
-
fs.copyFileSync(tgzSource, tgzDest);
|
|
89
|
-
fs.unlinkSync(tgzSource);
|
|
90
|
-
console.log(`[fsl] Copied ${tgzFileName} → functions/vendor/`);
|
|
91
|
-
// 4. Patch functions/package.json
|
|
92
|
-
const pkg = readPackageJson(functionsDir);
|
|
93
|
-
const existing = findFslDep(pkg);
|
|
94
|
-
if (!existing) {
|
|
95
|
-
console.error('[fsl] firebase-structured-logger not found in functions/package.json');
|
|
96
|
-
process.exit(1);
|
|
97
|
-
}
|
|
98
|
-
const manifest = { originalRef: existing.ref, tgzFileName };
|
|
99
|
-
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
|
|
100
|
-
pkg[existing.field]['firebase-structured-logger'] =
|
|
101
|
-
`file:./vendor/${tgzFileName}`;
|
|
102
|
-
writePackageJson(functionsDir, pkg);
|
|
103
|
-
// 5. npm install to lock in the tgz
|
|
104
|
-
console.log('[fsl] Installing...');
|
|
105
|
-
(0, child_process_1.execSync)('npm install', { cwd: functionsDir, stdio: 'inherit' });
|
|
106
|
-
console.log('[fsl] Pack complete — ready to deploy.');
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Restore functions/package.json to its original file: reference.
|
|
110
|
-
* Call after firebase deploy (e.g. in postdeploy script).
|
|
111
|
-
*/
|
|
112
|
-
async function packRestore(options) {
|
|
113
|
-
const functionsDir = path.resolve(process.cwd(), options.functionsDir);
|
|
114
|
-
const vendorDir = path.join(functionsDir, 'vendor');
|
|
115
|
-
const manifestPath = path.join(vendorDir, '.fsl-restore.json');
|
|
116
|
-
if (!fs.existsSync(manifestPath)) {
|
|
117
|
-
console.log('[fsl] No restore manifest found — nothing to restore.');
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const { originalRef, tgzFileName } = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
121
|
-
// 1. Restore package.json — skip if originalRef is a file: path that no longer exists
|
|
122
|
-
// (e.g. a previous vendor tarball that was cleaned up during pack).
|
|
123
|
-
const pkg = readPackageJson(functionsDir);
|
|
124
|
-
const existing = findFslDep(pkg);
|
|
125
|
-
const refMatch = originalRef.match(/^file:(.+)$/);
|
|
126
|
-
const refFilePath = refMatch ? path.resolve(functionsDir, refMatch[1]) : null;
|
|
127
|
-
const refFileExists = refFilePath ? fs.existsSync(refFilePath) : true;
|
|
128
|
-
if (existing) {
|
|
129
|
-
if (refFileExists) {
|
|
130
|
-
;
|
|
131
|
-
pkg[existing.field]['firebase-structured-logger'] = originalRef;
|
|
132
|
-
writePackageJson(functionsDir, pkg);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
console.log(`[fsl] Original ref (${originalRef}) no longer exists — keeping vendor tgz reference.`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// 2. Remove tgz + manifest — only remove tgz if we restored to a different ref
|
|
139
|
-
const tgzPath = path.join(vendorDir, tgzFileName);
|
|
140
|
-
if (refFileExists && fs.existsSync(tgzPath))
|
|
141
|
-
fs.unlinkSync(tgzPath);
|
|
142
|
-
fs.unlinkSync(manifestPath);
|
|
143
|
-
// 3. npm install to restore
|
|
144
|
-
console.log('[fsl] Restoring...');
|
|
145
|
-
(0, child_process_1.execSync)('npm install', { cwd: functionsDir, stdio: 'inherit' });
|
|
146
|
-
console.log('[fsl] Restore complete.');
|
|
147
|
-
}
|
|
148
|
-
//# sourceMappingURL=packDeploy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"packDeploy.js","sourceRoot":"","sources":["../../src/tools/packDeploy.ts"],"names":[],"mappings":"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"}
|