@dasasian/firebase-structured-logger 0.8.0 → 1.0.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.
Files changed (51) hide show
  1. package/README.md +234 -35
  2. package/dist/client/index.d.ts +1 -1
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +2 -1
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/client/logger.d.ts +22 -2
  7. package/dist/client/logger.d.ts.map +1 -1
  8. package/dist/client/logger.js +135 -21
  9. package/dist/client/logger.js.map +1 -1
  10. package/dist/client/rateLimiter.d.ts +106 -11
  11. package/dist/client/rateLimiter.d.ts.map +1 -1
  12. package/dist/client/rateLimiter.js +334 -21
  13. package/dist/client/rateLimiter.js.map +1 -1
  14. package/dist/functions/httpHandler.d.ts +1 -1
  15. package/dist/functions/httpHandler.js +1 -1
  16. package/dist/functions/index.d.ts +1 -1
  17. package/dist/functions/index.d.ts.map +1 -1
  18. package/dist/functions/logHandler.d.ts +10 -5
  19. package/dist/functions/logHandler.d.ts.map +1 -1
  20. package/dist/functions/logHandler.js +17 -5
  21. package/dist/functions/logHandler.js.map +1 -1
  22. package/dist/functions/logger.d.ts.map +1 -1
  23. package/dist/functions/logger.js +232 -10
  24. package/dist/functions/logger.js.map +1 -1
  25. package/dist/functions/sourceMapCache.js +1 -1
  26. package/dist/functions/sourceMapCache.js.map +1 -1
  27. package/dist/shared/deprecate.d.ts +4 -0
  28. package/dist/shared/deprecate.d.ts.map +1 -0
  29. package/dist/shared/deprecate.js +30 -0
  30. package/dist/shared/deprecate.js.map +1 -0
  31. package/dist/shared/nodeModules.d.ts +39 -0
  32. package/dist/shared/nodeModules.d.ts.map +1 -0
  33. package/dist/shared/nodeModules.js +120 -0
  34. package/dist/shared/nodeModules.js.map +1 -0
  35. package/dist/shared/types.d.ts +7 -0
  36. package/dist/shared/types.d.ts.map +1 -1
  37. package/dist/shared/versionRange.d.ts +17 -0
  38. package/dist/shared/versionRange.d.ts.map +1 -0
  39. package/dist/shared/versionRange.js +48 -0
  40. package/dist/shared/versionRange.js.map +1 -0
  41. package/dist/tools/doctor.d.ts +54 -0
  42. package/dist/tools/doctor.d.ts.map +1 -0
  43. package/dist/tools/doctor.js +381 -0
  44. package/dist/tools/doctor.js.map +1 -0
  45. package/dist/tools/index.js +34 -5
  46. package/dist/tools/index.js.map +1 -1
  47. package/dist/tools/uploadSourceMaps.d.ts +7 -0
  48. package/dist/tools/uploadSourceMaps.d.ts.map +1 -1
  49. package/dist/tools/uploadSourceMaps.js.map +1 -1
  50. package/package.json +11 -11
  51. package/skills/query-logs/SKILL.md +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionRange.d.ts","sourceRoot":"","sources":["../../src/shared/versionRange.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAOhF;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGpE"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * The one range shape this package's own `peerDependencies` use: `>=X.Y.Z`.
4
+ *
5
+ * Not a general semver comparator — `unsupported-peer` reads ranges from this
6
+ * package's own `package.json` at runtime rather than copying them into doctor
7
+ * (so the two cannot drift), and every peer range there is a plain minimum today.
8
+ * If a future range needs `^` or `||`, this returns `undefined` rather than a
9
+ * wrong answer, and the caller skips the check instead of guessing.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.meetsMinimum = meetsMinimum;
13
+ exports.leadingMajorVersion = leadingMajorVersion;
14
+ const VERSION = /^(\d+)\.(\d+)\.(\d+)/;
15
+ const MINIMUM_RANGE = /^>=\s*(\d+)\.(\d+)\.(\d+)/;
16
+ function parseVersion(version) {
17
+ const match = VERSION.exec(version);
18
+ if (!match)
19
+ return undefined;
20
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
21
+ }
22
+ function compare(a, b) {
23
+ for (let i = 0; i < 3; i++) {
24
+ if (a[i] !== b[i])
25
+ return a[i] - b[i];
26
+ }
27
+ return 0;
28
+ }
29
+ /**
30
+ * Whether `version` meets `range`, or `undefined` when `range` is not a plain
31
+ * `>=X.Y.Z` minimum — the caller's signal to skip rather than misreport.
32
+ */
33
+ function meetsMinimum(version, range) {
34
+ const rangeMatch = MINIMUM_RANGE.exec(range.trim());
35
+ if (!rangeMatch)
36
+ return undefined;
37
+ const minimum = [Number(rangeMatch[1]), Number(rangeMatch[2]), Number(rangeMatch[3])];
38
+ const parsed = parseVersion(version);
39
+ if (!parsed)
40
+ return undefined;
41
+ return compare(parsed, minimum) >= 0;
42
+ }
43
+ /** The leading major version number in a string like `22.11.0`, `^22`, or `nodejs20`. */
44
+ function leadingMajorVersion(text) {
45
+ const match = /(\d+)/.exec(text);
46
+ return match ? Number(match[1]) : undefined;
47
+ }
48
+ //# sourceMappingURL=versionRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionRange.js","sourceRoot":"","sources":["../../src/shared/versionRange.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAsBH,oCAOC;AAGD,kDAGC;AAjCD,MAAM,OAAO,GAAG,sBAAsB,CAAA;AACtC,MAAM,aAAa,GAAG,2BAA2B,CAAA;AAEjD,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,OAAO,CAAC,CAA2B,EAAE,CAA2B;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,KAAa;IACzD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACnD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,MAAM,OAAO,GAA6B,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/G,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC;AAED,yFAAyF;AACzF,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `fsl doctor` — checks a project's setup from disk and reports how it will behave.
3
+ *
4
+ * Every fact comes from a file with a fixed format: `firebase.json`, `package.json`,
5
+ * each installed package's own `package.json`, `dist/`, and the embedded `.release`
6
+ * marker. Nothing
7
+ * here parses source code or guesses at behavior — a check that cannot read what it
8
+ * needs reports `could-not-check`, never a pass (see CLAUDE.md, "fsl doctor — facts,
9
+ * not guesses"). The finding ids, levels, and the `--json` shape are the README's
10
+ * "Check your setup" section, verbatim; this file exists to make that section true.
11
+ */
12
+ export type SetupKind = 'firebase' | 'node' | 'browser-only' | 'backend-only';
13
+ export type LoggingPath = 'firebase-functions' | 'stdout' | 'none';
14
+ export type TraceSource = 'trigger' | 'header' | 'none';
15
+ export type StoragePath = 'firebase-admin' | 'google-cloud-storage' | 'none';
16
+ export type FindingLevel = 'error' | 'warning';
17
+ export type FindingId = 'maps-published' | 'node-version' | 'callable-without-firebase-functions' | 'could-not-check' | 'duplicate-storage' | 'unsupported-peer' | 'embedded-maps-without-release';
18
+ export interface DoctorSetup {
19
+ kind: SetupKind;
20
+ backend: string | null;
21
+ dist: string | null;
22
+ logging: LoggingPath;
23
+ trace: TraceSource;
24
+ storage: StoragePath;
25
+ callable: boolean;
26
+ }
27
+ export interface DoctorFinding {
28
+ id: FindingId;
29
+ level: FindingLevel;
30
+ message: string;
31
+ fix: string;
32
+ }
33
+ export interface DoctorReport {
34
+ setup: DoctorSetup;
35
+ findings: DoctorFinding[];
36
+ exitCode: number;
37
+ }
38
+ export interface DoctorOptions {
39
+ projectRoot: string;
40
+ backend?: string;
41
+ dist?: string;
42
+ }
43
+ /**
44
+ * A peer whose supported range cannot be evaluated is `could-not-check`, never a pass:
45
+ * the ranges are read from this package's own `peerDependencies`, and a range shape
46
+ * `meetsMinimum` does not understand must surface rather than skip the check.
47
+ */
48
+ export declare function checkUnsupportedPeers(searchDirs: string[], ownPeerDependencies: Record<string, string>, findings: DoctorFinding[]): void;
49
+ export declare function runDoctor(options: DoctorOptions): DoctorReport;
50
+ /** `report.exitCode` ignores `--strict`; the CLI applies it here. */
51
+ export declare function exitCodeFor(report: DoctorReport, strict: boolean): number;
52
+ /** Renders the human-readable report `fsl doctor` prints without `--json`. */
53
+ export declare function formatDoctorReport(report: DoctorReport): string;
54
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,cAAc,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,oBAAoB,GAAG,QAAQ,GAAG,MAAM,CAAA;AAClE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAA;AACvD,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,MAAM,CAAA;AAC5E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAA;AAE9C,MAAM,MAAM,SAAS,GACjB,gBAAgB,GAChB,cAAc,GACd,qCAAqC,GACrC,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,+BAA+B,CAAA;AAEnC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,SAAS,CAAA;IACb,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAkMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAAE,EACpB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,QAAQ,EAAE,aAAa,EAAE,GACxB,IAAI,CAuBN;AA8BD,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAoC9D;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAIzE;AA2BD,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA+B/D"}
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ /**
3
+ * `fsl doctor` — checks a project's setup from disk and reports how it will behave.
4
+ *
5
+ * Every fact comes from a file with a fixed format: `firebase.json`, `package.json`,
6
+ * each installed package's own `package.json`, `dist/`, and the embedded `.release`
7
+ * marker. Nothing
8
+ * here parses source code or guesses at behavior — a check that cannot read what it
9
+ * needs reports `could-not-check`, never a pass (see CLAUDE.md, "fsl doctor — facts,
10
+ * not guesses"). The finding ids, levels, and the `--json` shape are the README's
11
+ * "Check your setup" section, verbatim; this file exists to make that section true.
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.checkUnsupportedPeers = checkUnsupportedPeers;
48
+ exports.runDoctor = runDoctor;
49
+ exports.exitCodeFor = exitCodeFor;
50
+ exports.formatDoctorReport = formatDoctorReport;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const paths_js_1 = require("../shared/paths.js");
54
+ const nodeModules_js_1 = require("../shared/nodeModules.js");
55
+ const versionRange_js_1 = require("../shared/versionRange.js");
56
+ const PEER_PACKAGES = ['firebase', 'firebase-admin', 'firebase-functions'];
57
+ function readFirebaseJson(projectRoot) {
58
+ const file = path.join(projectRoot, 'firebase.json');
59
+ if (!fs.existsSync(file))
60
+ return { ok: 'absent' };
61
+ try {
62
+ return { ok: true, config: JSON.parse(fs.readFileSync(file, 'utf-8')) };
63
+ }
64
+ catch {
65
+ return {
66
+ ok: false,
67
+ finding: couldNotCheck('firebase.json could not be parsed as JSON.', 'Fix the syntax error in firebase.json.'),
68
+ };
69
+ }
70
+ }
71
+ function couldNotCheck(message, fix) {
72
+ return { id: 'could-not-check', level: 'error', message, fix };
73
+ }
74
+ function firstOf(value) {
75
+ return Array.isArray(value) ? value[0] : value;
76
+ }
77
+ function hostingPublicDirs(hosting) {
78
+ const configs = Array.isArray(hosting) ? hosting : hosting ? [hosting] : [];
79
+ return configs.map((c) => c.public).filter((p) => typeof p === 'string');
80
+ }
81
+ /**
82
+ * Determine the setup this project has, from `firebase.json` when present, or from
83
+ * `--backend`/`--dist` otherwise. `dist` here is "the folder hosting serves" — under
84
+ * Firebase that is `hosting.public`; outside Firebase it is whatever `--dist` names.
85
+ */
86
+ function detectSetup(options, findings) {
87
+ const firebaseJson = readFirebaseJson(options.projectRoot);
88
+ if (firebaseJson.ok === false) {
89
+ findings.push(firebaseJson.finding);
90
+ return { kind: 'firebase', backendDir: null, distDirs: [] };
91
+ }
92
+ if (firebaseJson.ok === true) {
93
+ const functionsConfig = firstOf(firebaseJson.config.functions);
94
+ const backend = functionsConfig?.source ?? 'functions';
95
+ const distDirs = hostingPublicDirs(firebaseJson.config.hosting);
96
+ return {
97
+ kind: 'firebase',
98
+ backendDir: path.resolve(options.projectRoot, backend),
99
+ distDirs: distDirs.map((d) => path.resolve(options.projectRoot, d)),
100
+ };
101
+ }
102
+ const backendDir = options.backend ? path.resolve(options.projectRoot, options.backend) : null;
103
+ const distDirs = options.dist ? [path.resolve(options.projectRoot, options.dist)] : [];
104
+ const kind = backendDir && distDirs.length ? 'node' : backendDir ? 'backend-only' : distDirs.length ? 'browser-only' : 'backend-only';
105
+ return { kind, backendDir, distDirs };
106
+ }
107
+ function findMapFiles(dir) {
108
+ const results = [];
109
+ if (!fs.existsSync(dir))
110
+ return results;
111
+ const walk = (current) => {
112
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
113
+ const full = path.join(current, entry.name);
114
+ if (entry.isDirectory())
115
+ walk(full);
116
+ else if (entry.isFile() && entry.name.endsWith('.map'))
117
+ results.push(full);
118
+ }
119
+ };
120
+ walk(dir);
121
+ return results;
122
+ }
123
+ function checkMapsPublished(distDirs, findings) {
124
+ for (const dist of distDirs) {
125
+ const maps = findMapFiles(dist);
126
+ if (maps.length === 0)
127
+ continue;
128
+ findings.push({
129
+ id: 'maps-published',
130
+ level: 'error',
131
+ message: `${maps.length} .map file(s) found under ${dist}, which hosting serves — your source code is public.`,
132
+ fix: `Run fsl upload-sourcemaps before deploying, so maps leave ${dist} instead of being published.`,
133
+ });
134
+ return;
135
+ }
136
+ }
137
+ function checkNodeVersion(backendDir, firebaseRuntime, findings) {
138
+ if (!backendDir)
139
+ return;
140
+ if (firebaseRuntime) {
141
+ const major = (0, versionRange_js_1.leadingMajorVersion)(firebaseRuntime);
142
+ if (major !== undefined && major < 22) {
143
+ findings.push({
144
+ id: 'node-version',
145
+ level: 'error',
146
+ message: `firebase.json sets the functions runtime to ${firebaseRuntime}, below the supported floor of Node 22.`,
147
+ fix: 'Set functions.runtime to "nodejs22" (or later) in firebase.json.',
148
+ });
149
+ return;
150
+ }
151
+ if (major !== undefined)
152
+ return;
153
+ }
154
+ const read = (0, nodeModules_js_1.readPackageJson)(backendDir);
155
+ if (!read.ok) {
156
+ if (read.reason === 'missing') {
157
+ findings.push(couldNotCheck(`No package.json in ${backendDir}. Run npm install first.`, 'Run npm install in the backend directory.'));
158
+ }
159
+ else {
160
+ findings.push(couldNotCheck(`${path.join(backendDir, 'package.json')} could not be parsed as JSON.`, 'Fix the syntax error in the backend package.json.'));
161
+ }
162
+ return;
163
+ }
164
+ const engines = read.pkg.engines;
165
+ const engineNode = engines?.node;
166
+ if (!engineNode)
167
+ return;
168
+ const major = (0, versionRange_js_1.leadingMajorVersion)(engineNode);
169
+ if (major !== undefined && major < 22) {
170
+ findings.push({
171
+ id: 'node-version',
172
+ level: 'error',
173
+ message: `${path.join(backendDir, 'package.json')} sets engines.node to "${engineNode}", below the supported floor of Node 22.`,
174
+ fix: 'Set engines.node to ">=22" in the backend package.json.',
175
+ });
176
+ }
177
+ }
178
+ function checkCallable(kind, backendDir, findings) {
179
+ if (kind !== 'firebase' || !backendDir)
180
+ return false;
181
+ const version = (0, nodeModules_js_1.findTopLevelVersion)([backendDir], 'firebase-functions');
182
+ if (version)
183
+ return true;
184
+ findings.push({
185
+ id: 'callable-without-firebase-functions',
186
+ level: 'error',
187
+ message: `firebase.json configures functions in ${backendDir}, but firebase-functions is not installed there.`,
188
+ fix: `Run npm install firebase-functions in ${backendDir}.`,
189
+ });
190
+ return false;
191
+ }
192
+ function checkDuplicateStorage(backendDir, findings) {
193
+ if (!backendDir || !fs.existsSync(path.join(backendDir, 'node_modules')))
194
+ return;
195
+ const copies = (0, nodeModules_js_1.findPackageCopies)(backendDir, '@google-cloud/storage');
196
+ const versions = [...new Set(copies.map((c) => c.version))];
197
+ if (versions.length <= 1)
198
+ return;
199
+ const placed = copies.map((c) => `${c.version} ${describeOwner(ownerOf(c.dir))}`);
200
+ findings.push({
201
+ id: 'duplicate-storage',
202
+ level: 'warning',
203
+ message: `${copies.length} copies of @google-cloud/storage (${placed.join(', ')})`,
204
+ fix: 'npm dedupe',
205
+ });
206
+ }
207
+ function displayPath(projectRoot, dir) {
208
+ const relative = path.relative(projectRoot, dir);
209
+ if (relative === '')
210
+ return '.';
211
+ return relative.startsWith('..') || path.isAbsolute(relative) ? relative : `./${relative}`;
212
+ }
213
+ function ownerOf(packageDir) {
214
+ const parts = packageDir.split(path.sep);
215
+ const nodeModules = parts.lastIndexOf('node_modules');
216
+ const previous = parts.lastIndexOf('node_modules', nodeModules - 1);
217
+ if (previous === -1)
218
+ return null;
219
+ const owner = parts.slice(previous + 1, nodeModules);
220
+ return owner.join('/');
221
+ }
222
+ function describeOwner(owner) {
223
+ return owner === null ? 'at the top level' : `inside ${owner}`;
224
+ }
225
+ /**
226
+ * A peer whose supported range cannot be evaluated is `could-not-check`, never a pass:
227
+ * the ranges are read from this package's own `peerDependencies`, and a range shape
228
+ * `meetsMinimum` does not understand must surface rather than skip the check.
229
+ */
230
+ function checkUnsupportedPeers(searchDirs, ownPeerDependencies, findings) {
231
+ for (const peer of PEER_PACKAGES) {
232
+ const range = ownPeerDependencies[peer];
233
+ if (!range)
234
+ continue;
235
+ const installed = (0, nodeModules_js_1.findTopLevelVersion)(searchDirs, peer);
236
+ if (!installed)
237
+ continue;
238
+ const meets = (0, versionRange_js_1.meetsMinimum)(installed, range);
239
+ if (meets === undefined) {
240
+ findings.push({
241
+ id: 'could-not-check',
242
+ level: 'error',
243
+ message: `Could not compare ${peer} ${installed} with the supported range ${range}.`,
244
+ fix: 'Report this at https://github.com/dasasian/firebase-structured-logger/issues — doctor needs to learn this range shape.',
245
+ });
246
+ }
247
+ else if (meets === false) {
248
+ findings.push({
249
+ id: 'unsupported-peer',
250
+ level: 'warning',
251
+ message: `${peer} ${installed} is installed, outside this package's supported range (${range}).`,
252
+ fix: `Upgrade ${peer} to satisfy ${range}.`,
253
+ });
254
+ }
255
+ }
256
+ }
257
+ function checkEmbeddedMapsWithoutRelease(backendDir, findings) {
258
+ if (!backendDir)
259
+ return;
260
+ const dir = (0, paths_js_1.embeddedDir)(backendDir);
261
+ if (!fs.existsSync(dir))
262
+ return;
263
+ const hasMaps = fs.readdirSync(dir).some((f) => f.endsWith('.map'));
264
+ if (!hasMaps)
265
+ return;
266
+ if (fs.existsSync((0, paths_js_1.embeddedMarkerPath)(backendDir)))
267
+ return;
268
+ findings.push({
269
+ id: 'embedded-maps-without-release',
270
+ level: 'warning',
271
+ message: `${dir} has embedded maps but no ${paths_js_1.RELEASE_MARKER} marker — an older release's stack can resolve against the wrong map.`,
272
+ fix: 'Re-run fsl upload-sourcemaps --embed-sourcemaps, which writes the marker.',
273
+ });
274
+ }
275
+ /** This package's own `package.json`, read at runtime — never copied into doctor. */
276
+ function readOwnPackageJson() {
277
+ const read = (0, nodeModules_js_1.readPackageJson)(path.join(__dirname, '..', '..'));
278
+ if (!read.ok)
279
+ throw new Error('fsl doctor could not read its own package.json');
280
+ return read.pkg;
281
+ }
282
+ function resolveStorage(searchDirs) {
283
+ if ((0, nodeModules_js_1.findTopLevelVersion)(searchDirs, 'firebase-admin'))
284
+ return 'firebase-admin';
285
+ if ((0, nodeModules_js_1.findTopLevelVersion)(searchDirs, '@google-cloud/storage'))
286
+ return 'google-cloud-storage';
287
+ return 'none';
288
+ }
289
+ function runDoctor(options) {
290
+ const findings = [];
291
+ const { kind, backendDir, distDirs } = detectSetup(options, findings);
292
+ const firebaseJson = readFirebaseJson(options.projectRoot);
293
+ const firebaseRuntime = firebaseJson.ok === true ? firstOf(firebaseJson.config.functions)?.runtime : undefined;
294
+ checkMapsPublished(distDirs, findings);
295
+ checkNodeVersion(backendDir, firebaseRuntime, findings);
296
+ const callable = checkCallable(kind, backendDir, findings);
297
+ checkDuplicateStorage(backendDir, findings);
298
+ const searchDirs = [backendDir, options.projectRoot].filter((d) => d !== null);
299
+ const ownPkg = readOwnPackageJson();
300
+ checkUnsupportedPeers(searchDirs, ownPkg.peerDependencies ?? {}, findings);
301
+ checkEmbeddedMapsWithoutRelease(backendDir, findings);
302
+ const hasFirebaseFunctions = backendDir !== null && (0, nodeModules_js_1.findTopLevelVersion)([backendDir], 'firebase-functions') !== undefined;
303
+ const logging = kind === 'firebase' && hasFirebaseFunctions ? 'firebase-functions' : backendDir ? 'stdout' : 'none';
304
+ const trace = kind === 'firebase' && hasFirebaseFunctions ? 'trigger' : backendDir ? 'header' : 'none';
305
+ const storage = resolveStorage(searchDirs);
306
+ const setup = {
307
+ kind,
308
+ backend: backendDir ? displayPath(options.projectRoot, backendDir) : null,
309
+ dist: distDirs[0] ? displayPath(options.projectRoot, distDirs[0]) : null,
310
+ logging,
311
+ trace,
312
+ storage,
313
+ callable,
314
+ };
315
+ const hasError = findings.some((f) => f.level === 'error');
316
+ const exitCode = hasError ? 1 : 0;
317
+ return { setup, findings, exitCode };
318
+ }
319
+ /** `report.exitCode` ignores `--strict`; the CLI applies it here. */
320
+ function exitCodeFor(report, strict) {
321
+ if (report.findings.some((f) => f.level === 'error'))
322
+ return 1;
323
+ if (strict && report.findings.some((f) => f.level === 'warning'))
324
+ return 1;
325
+ return 0;
326
+ }
327
+ const SETUP_LABEL = {
328
+ firebase: 'Firebase',
329
+ node: 'Node',
330
+ 'browser-only': 'browser only',
331
+ 'backend-only': 'backend only',
332
+ };
333
+ const LOGGING_LABEL = {
334
+ 'firebase-functions': 'firebase-functions write()',
335
+ stdout: 'stdout JSON (createHttpLogHandler)',
336
+ none: 'not applicable — no backend given',
337
+ };
338
+ const TRACE_LABEL = {
339
+ trigger: 'from each Cloud Functions trigger',
340
+ header: 'from the x-cloud-trace-context header',
341
+ none: 'not applicable — no backend given',
342
+ };
343
+ const STORAGE_LABEL = {
344
+ 'firebase-admin': 'firebase-admin, default bucket',
345
+ 'google-cloud-storage': '@google-cloud/storage — needs a bucket named in code (not checked)',
346
+ none: 'not configured',
347
+ };
348
+ /** Renders the human-readable report `fsl doctor` prints without `--json`. */
349
+ function formatDoctorReport(report) {
350
+ const { setup, findings } = report;
351
+ const backendNoun = setup.kind === 'firebase' ? 'functions' : 'backend';
352
+ const location = setup.backend && setup.dist
353
+ ? `${backendNoun} in ${setup.backend}, web build in ${setup.dist}`
354
+ : setup.backend
355
+ ? `backend in ${setup.backend}`
356
+ : setup.dist
357
+ ? `web build in ${setup.dist}`
358
+ : 'nothing to check — pass --backend and/or --dist';
359
+ const lines = [
360
+ `Setup: ${SETUP_LABEL[setup.kind]} — ${location}`,
361
+ '',
362
+ pad('Logging', LOGGING_LABEL[setup.logging]),
363
+ pad('Trace ids', TRACE_LABEL[setup.trace]),
364
+ pad('Storage', STORAGE_LABEL[setup.storage]),
365
+ pad('Callable', setup.callable ? 'createClientLogFunction available' : 'not available'),
366
+ ];
367
+ if (findings.length > 0) {
368
+ lines.push('');
369
+ for (const finding of findings) {
370
+ const icon = finding.level === 'error' ? '✗' : '⚠';
371
+ const indent = ' '.repeat(4);
372
+ lines.push(` ${icon} ${finding.id.padEnd(20)} ${finding.message}`);
373
+ lines.push(`${indent}${' '.repeat(20)}Fix: ${finding.fix}`);
374
+ }
375
+ }
376
+ return lines.join('\n');
377
+ }
378
+ function pad(label, value) {
379
+ return ` ${label.padEnd(15)}${value}`;
380
+ }
381
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,8 @@ 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 doctor_1 = require("./doctor");
42
+ const deprecate_1 = require("../shared/deprecate");
41
43
  const [, , command, ...rawArgs] = process.argv;
42
44
  function parseArgs(args) {
43
45
  const result = {};
@@ -80,10 +82,14 @@ async function main() {
80
82
  case 'upload-sourcemaps': {
81
83
  const bucket = args.bucket ?? process.env.VITE_FIREBASE_STORAGE_BUCKET ?? process.env.FIREBASE_STORAGE_BUCKET;
82
84
  const embed = args['embed-sourcemaps'] === 'true';
85
+ if (args.functions !== undefined) {
86
+ (0, deprecate_1.warnDeprecated)('--functions', '--backend');
87
+ }
88
+ const backend = args.backend ?? args.functions;
83
89
  // A bucket is only required when something is going to be uploaded.
84
90
  // Embed-only is the whole flow for a backend that has no bucket — see #34.
85
91
  if (!bucket && !embed) {
86
- console.error('Usage: fsl upload-sourcemaps [--bucket=<name>] [--functions=<path>] [--embed-sourcemaps] [--release=<id>] [--dist=<path>] [--prefix=<path>]');
92
+ console.error('Usage: fsl upload-sourcemaps [--bucket=<name>] [--backend=<path>] [--embed-sourcemaps] [--release=<id>] [--dist=<path>] [--prefix=<path>]');
87
93
  console.error('Bucket can also be set via VITE_FIREBASE_STORAGE_BUCKET or FIREBASE_STORAGE_BUCKET env var (loaded from .env.local automatically).');
88
94
  console.error('Omit the bucket only with --embed-sourcemaps, to embed the current release without uploading.');
89
95
  process.exit(1);
@@ -92,7 +98,7 @@ async function main() {
92
98
  bucket,
93
99
  release: args.release,
94
100
  distDir: args.dist,
95
- functionsDir: args.functions,
101
+ functionsDir: backend,
96
102
  embedSourcemaps: embed,
97
103
  prefix: args.prefix,
98
104
  });
@@ -106,16 +112,31 @@ async function main() {
106
112
  await (0, installSkills_1.installSkills)({ global: args.global === 'true', force: args.force === 'true' });
107
113
  break;
108
114
  }
115
+ case 'doctor': {
116
+ const report = (0, doctor_1.runDoctor)({
117
+ projectRoot: process.cwd(),
118
+ backend: args.backend,
119
+ dist: args.dist,
120
+ });
121
+ if (args.json === 'true') {
122
+ console.log(JSON.stringify({ ...report, exitCode: (0, doctor_1.exitCodeFor)(report, args.strict === 'true') }));
123
+ }
124
+ else {
125
+ console.log((0, doctor_1.formatDoctorReport)(report));
126
+ }
127
+ process.exit((0, doctor_1.exitCodeFor)(report, args.strict === 'true'));
128
+ }
109
129
  default: {
110
130
  console.log(`
111
131
  firebase-structured-logger (fsl)
112
132
 
113
133
  Commands:
114
- fsl upload-sourcemaps [--bucket=<name>] [--functions=<path>] [--embed-sourcemaps] [--release=<id>] [--dist=<path>] [--prefix=<path>]
134
+ fsl upload-sourcemaps [--bucket=<name>] [--backend=<path>] [--embed-sourcemaps] [--release=<id>] [--dist=<path>] [--prefix=<path>]
115
135
  Upload .map files from dist/ to Cloud Storage and delete them locally.
116
136
  --bucket defaults to VITE_FIREBASE_STORAGE_BUCKET or FIREBASE_STORAGE_BUCKET (loaded from .env.local automatically).
117
- --functions path to Cloud Functions directory (e.g. ./functions or ./backend).
118
- --embed-sourcemaps copies maps to {functions}/sourcemaps/current/ for fast lookup of current release.
137
+ --backend path to the backend directory (e.g. ./functions or ./backend). --functions is
138
+ a deprecated alias, kept for existing scripts.
139
+ --embed-sourcemaps copies maps to {backend}/sourcemaps/current/ for fast lookup of current release.
119
140
  Given without --bucket, embeds only and uploads nothing — for a backend with no
120
141
  bucket. Only the deployed release can then be symbolicated.
121
142
  --prefix Cloud Storage prefix to upload under (default sourcemaps/). Must match
@@ -123,6 +144,14 @@ Commands:
123
144
  Authenticates via FIREBASE_SERVICE_ACCOUNT_PATH if set, otherwise uses ADC.
124
145
  Release ID defaults to git rev-parse --short HEAD.
125
146
 
147
+ fsl doctor [--backend=<path>] [--dist=<path>] [--strict] [--json]
148
+ Check the project's setup from disk: how logging, trace ids, Storage and the
149
+ callable will behave, and any findings. Reads firebase.json when present;
150
+ otherwise --backend and --dist say where things are.
151
+ --strict also fail (exit 1) on warnings, not just errors.
152
+ --json print the same result as JSON instead of the human-readable report.
153
+ Exit code: 0 with no errors, 1 with an error (or a warning under --strict).
154
+
126
155
  fsl install-skills [--global] [--force]
127
156
  Copy skills/ to .claude/skills/ (project) or ~/.claude/skills/ (--global).
128
157
  Prompts before overwriting existing skills. Use --force to skip prompts.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAwB;AACxB,2CAA4B;AAC5B,yDAAsF;AACtF,mDAA+C;AAE/C,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAA;AAE9C,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAC7B,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAM;IACpC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAQ;QACvB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACvC,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAE/B,2CAA2C;IAC3C,WAAW,CAAC,YAAY,CAAC,CAAA;IAEzB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAA;YAC7G,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,MAAM,CAAA;YACjD,oEAAoE;YACpE,2EAA2E;YAC3E,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,6IAA6I,CAAC,CAAA;gBAC5J,OAAO,CAAC,KAAK,CAAC,oIAAoI,CAAC,CAAA;gBACnJ,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAA;gBAC9G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAgB,EAAC;gBACpC,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,YAAY,EAAE,IAAI,CAAC,SAAS;gBAC5B,eAAe,EAAE,KAAK;gBACtB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAA;YACF,0DAA0D;YAC1D,gDAAgD;YAChD,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,kDAA+B,CAAC,CAAA;YACnE,MAAK;QACP,CAAC;QAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,IAAA,6BAAa,EAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,CAAA;YACrF,MAAK;QACP,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBjB,CAAC,CAAA;YACI,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;gBAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,13 @@ export interface UploadOptions {
30
30
  bucket?: string;
31
31
  release?: string;
32
32
  distDir?: string;
33
+ /**
34
+ * Path to the backend directory (e.g. './functions' or './backend').
35
+ *
36
+ * Named `functionsDir` internally; the CLI flag is `--backend` (`--functions` is
37
+ * kept as a deprecated alias) — this option also serves a Cloud Run backend that
38
+ * is not a Cloud Functions directory at all.
39
+ */
33
40
  functionsDir?: string;
34
41
  embedSourcemaps?: boolean;
35
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"uploadSourceMaps.d.ts","sourceRoot":"","sources":["../../src/tools/uploadSourceMaps.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,aAAiB,CAAA;AAErD,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;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;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAkH7F"}
1
+ {"version":3,"file":"uploadSourceMaps.d.ts","sourceRoot":"","sources":["../../src/tools/uploadSourceMaps.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,aAAiB,CAAA;AAErD,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;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;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAkH7F"}