@autter/runtime-cli 1.0.0 → 1.2.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 CHANGED
@@ -5,24 +5,85 @@ content-addressed **debug id** and uploads its **source map** to the ingester,
5
5
  so minified browser frames resolve to your original source, even when the
6
6
  release your SDK reports doesn't match the upload.
7
7
 
8
+ - `autter-runtime sourcemaps setup` wires it into a project; `verify` checks a build
8
9
  - `autter-runtime sourcemaps inject <dir>` / `upload <dir>` CLI
9
10
  - Vite/Rollup plugin: `@autter/runtime-cli/vite`
10
11
  - webpack 5 plugin: `@autter/runtime-cli/webpack`
11
12
  - Next.js wrapper: `withAutterSourceMaps` from `@autter/runtime-cli/next`
12
13
 
13
- No runtime dependencies; bundlers are optional peer dependencies. Debug ids
14
- need ingester 1.6.0+ and `@autter/runtime-browser` 1.6.0+ (older ingesters
15
- still match `.js` maps by release + path). Full guide:
16
- [docs/SOURCE-MAPS.md](../../docs/SOURCE-MAPS.md).
14
+ Bundlers are optional peer dependencies. Debug ids need ingester 1.6.0+ and
15
+ `@autter/runtime-browser` 1.6.0+ (older ingesters still match `.js` maps by
16
+ release + path). Full guide: [docs/SOURCE-MAPS.md](../../docs/SOURCE-MAPS.md).
17
17
 
18
- ## Install
18
+ ## Quick start (people and coding agents)
19
19
 
20
20
  ```bash
21
- npm install -D @autter/runtime-cli
21
+ npx @autter/runtime-cli@latest sourcemaps setup # in the app's directory
22
+ npm run build # with AUTTER_RUNTIME_KEY set
23
+ npx autter-runtime sourcemaps verify dist # before deploying
22
24
  ```
23
25
 
24
- Set `AUTTER_RUNTIME_KEY` to a **server** ingest key (`autter_rt_…`) where your
25
- build runs. Without it, debug ids are injected and nothing is uploaded.
26
+ **`setup [dir]`** is non-interactive and safe to re-run. It detects the build
27
+ tool (Vite and the frameworks built on it: SvelteKit, Nuxt, Astro, Remix,
28
+ React Router, Solid, Qwik; Next.js; webpack and Vue CLI; Rollup; Create React
29
+ App; Angular CLI; Parcel; esbuild), the package manager, the CI (GitHub
30
+ Actions, Vercel, Netlify, Cloudflare Pages, GitLab CI), the output directory,
31
+ existing source map settings, the installed browser SDK, and whether
32
+ `initAutterBrowser` gets a `release`. Then it:
33
+
34
+ - adds `@autter/runtime-cli` to `devDependencies` and prints the install
35
+ command (`--install` runs it);
36
+ - adds the Vite/Rollup or webpack plugin, or wraps the Next.js config in
37
+ `withAutterSourceMaps` (outermost), when the config has a shape it can edit
38
+ safely: `export default defineConfig({...})`, `module.exports = {...}`, a
39
+ config variable, a function returning an object, `withX(nextConfig)`
40
+ wrappers. It parses the file (JavaScript or TypeScript) and changes only
41
+ what it adds; anything else becomes a `manual` action with the exact snippet;
42
+ - for builds without a plugin (CRA, Angular, Parcel, esbuild), adds a
43
+ `postbuild` step (appended to `build` for pnpm, Yarn 2+ and Bun, which skip
44
+ `postbuild`) that runs `inject`, then `upload --delete-after-upload
45
+ --best-effort`, and turns on hidden maps where the tool can
46
+ (`GENERATE_SOURCEMAP=true`, Angular `"sourceMap": { "scripts": true, "hidden": true }`);
47
+ - reports, never edits, app code: a missing `release` gets a `manual` action
48
+ showing how to pass the commit SHA through the tool's public env or define
49
+ mechanism;
50
+ - never writes a key. It says where to store `AUTTER_RUNTIME_KEY` for each CI
51
+ it found, with commands that read the value from a prompt or stdin, never
52
+ from argv: `gh secret set AUTTER_RUNTIME_KEY --repo <owner/repo>`,
53
+ `vercel env add AUTTER_RUNTIME_KEY production`, `netlify env:set …
54
+ "$(cat)"`, and dashboard notes for Cloudflare Pages and GitLab.
55
+
56
+ `--dry-run` writes nothing; `--json` prints `{ detected, actions: [{ type:
57
+ "edit"|"add-dependency"|"add-script"|"manual"|"set-secret", file?,
58
+ description, snippet?, command? }], secret: { name, key, where }, next }`.
59
+ Exit codes: `0` everything applied, `2` manual actions remain, `1` error.
60
+
61
+ **`verify <dir>`** checks a production build before deploy: every JS bundle
62
+ has a debug id (the comment and the registration snippet), no `.map` file is
63
+ left and no `sourceMappingURL` points at a missing map (both deploy risks),
64
+ and, when `AUTTER_RUNTIME_KEY` is set, every bundle's map is on the ingester
65
+ (`/v1/sourcemaps/check` by debug id, ingester 1.7.0+). Without a key the
66
+ local checks still run and the upload is reported as unverified. Files copied
67
+ unchanged from `public/`, Next.js build manifests and polyfills, and service workers are
68
+ skipped; `--ignore <glob>` skips more. `--allow-maps` reports leftover maps
69
+ without failing. `--json` for machines; exit `1` on any failure, with the
70
+ reason per file.
71
+
72
+ ## Keys
73
+
74
+ Set `AUTTER_RUNTIME_KEY` where your build runs. The recommended key for CI is
75
+ an **upload-only key** (`autter_rtu_…`): it can upload and check source maps
76
+ and nothing else, so a leaked CI secret can't send telemetry. The full server
77
+ key (`autter_rt_…`) also works. A publishable client key (`autter_rtc_…`) is
78
+ refused. Upload keys need ingester 1.7.0+. Without a key, the plugins turn no
79
+ source maps on and change nothing, and `upload --best-effort` uploads nothing
80
+ and exits 0.
81
+
82
+ ## By hand
83
+
84
+ ```bash
85
+ npm install -D @autter/runtime-cli
86
+ ```
26
87
 
27
88
  ## Vite / Rollup
28
89
 
@@ -50,8 +111,10 @@ export default withAutterSourceMaps({ reactStrictMode: true });
50
111
  ```
51
112
 
52
113
  All three turn on hidden source maps when you haven't configured maps, inject
53
- debug ids after the build, upload when a key is present, and delete the maps
54
- they created once uploaded. Options (all optional): `release`, `urlPrefix`,
114
+ debug ids after the build, upload when a key is present, and then delete the
115
+ maps they created whether or not the upload succeeded (a rejected upload, an
116
+ unreachable ingester, a dry run), printing one line that says why; without a
117
+ key they turn none on. Maps you configured yourself are left alone. Options (all optional): `release`, `urlPrefix`,
55
118
  `endpoint`, `key`, `upload: false`, `deleteAfterUpload`, `dryRun`,
56
119
  `concurrency`, `failOnError` (default `false`: a failed upload is logged and
57
120
  never fails the build), `silent`.
@@ -65,28 +128,43 @@ npx autter-runtime sourcemaps upload dist --dry-run
65
128
  ```
66
129
 
67
130
  ```
68
- autter-runtime sourcemaps inject <dir> [--dry-run]
131
+ autter-runtime sourcemaps setup [dir] [--dry-run] [--install] [--json]
132
+ autter-runtime sourcemaps verify <dir> [--endpoint <url>] [--url-prefix <prefix>]
133
+ [--ignore <glob>]... [--allow-maps] [--json]
134
+ autter-runtime sourcemaps inject <dir> [--dry-run] [--json]
69
135
  autter-runtime sourcemaps upload <dir> [--release <r>] [--url-prefix <prefix>]
70
- [--endpoint <url>] [--concurrency <n>] [--delete-after-upload] [--dry-run] [--json]
136
+ [--endpoint <url>] [--concurrency <n>] [--delete-after-upload]
137
+ [--best-effort] [--dry-run] [--json]
71
138
  ```
72
139
 
73
140
  - **inject** writes `//# debugId=<id>`, a one-line snippet that registers
74
141
  `globalThis._autterDebugIds[new Error().stack] = "<id>"`, and `"debugId"` in
75
142
  the `.map`, for each `.js`/`.mjs`/`.cjs` with a map. The id is derived from
76
143
  sha256 of the bundle bytes; running it again changes nothing.
77
- - **upload** posts each map (without `sourcesContent`) to
78
- `<endpoint>/v1/sourcemaps`, in parallel, skipping maps the ingester already
79
- has. Release: `--release`, else `GITHUB_SHA`, `VERCEL_GIT_COMMIT_SHA`,
80
- `CF_PAGES_COMMIT_SHA`, `GIT_SHA`, then `git rev-parse HEAD`.
144
+ - **upload** posts each map (without `sourcesContent`, gzipped, up to 32 MB)
145
+ to `<endpoint>/v1/sourcemaps`, in parallel, skipping maps the ingester
146
+ already has. Each map carries the bundle's function scopes (`x_autter_scopes`),
147
+ parsed from the file as served, so frames are named after the function they
148
+ are in rather than their call site; a bundle that does not parse is uploaded
149
+ without them, with a warning. Release: `--release`, else `GITHUB_SHA`,
150
+ `VERCEL_GIT_COMMIT_SHA`, `CF_PAGES_COMMIT_SHA`, `GIT_SHA`, then
151
+ `git rev-parse HEAD`.
152
+ - **upload --best-effort** is for build scripts that also run locally and in
153
+ fork PRs: without a key, or when the upload fails, it says so and exits 0;
154
+ with `--delete-after-upload`, every `.map` under `<dir>` is then deleted
155
+ anyway, so the output is the same with or without a key and never ships
156
+ maps.
81
157
 
82
158
  Exit codes: `0` ok, `1` some maps failed, `2` no key / no release / key
83
- rejected, `64` usage error.
159
+ rejected, `64` usage error (`--best-effort`: always `0`). `setup` and `verify`
160
+ have their own, above.
84
161
 
85
162
  ## Programmatic API
86
163
 
87
164
  ```ts
88
- import { injectDir, uploadDir } from "@autter/runtime-cli";
165
+ import { injectDir, uploadDir, verifyDir } from "@autter/runtime-cli";
89
166
 
90
167
  await injectDir("dist");
91
- const summary = await uploadDir("dist", { urlPrefix: "/", release: process.env.GIT_SHA });
168
+ const summary = await uploadDir("dist", { urlPrefix: "/", release: process.env.GIT_SHA, deleteAfterUpload: true });
169
+ const check = await verifyDir("dist"); // check.ok, check.failures, check.upload.status
92
170
  ```
@@ -69,8 +69,17 @@ declare function injectBundle(bundle: BundleWithMap, options?: InjectOptions): P
69
69
  declare function injectDir(dir: string, options?: InjectOptions): Promise<InjectResult[]>;
70
70
 
71
71
  declare const DEFAULT_ENDPOINT = "https://otlp.autter.dev";
72
- /** The ingester's `/v1/sourcemaps` body limit. */
72
+ /** Largest map the ingester stores: characters of JSON without
73
+ * `sourcesContent` (otlp-ingester's SOURCE_MAP_MAX_CHARS). */
74
+ declare const MAX_MAP_CHARS: number;
75
+ /** The ingester's `/v1/sourcemaps` body limit, counted after the gzip body
76
+ * is inflated: the map plus room for the rest of the request. */
73
77
  declare const MAX_UPLOAD_BYTES: number;
78
+ /** Keys `upload` accepts, and the one it refuses before sending anything. */
79
+ declare const UPLOAD_KEY_PREFIX = "autter_rtu_";
80
+ declare const SERVER_KEY_PREFIX = "autter_rt_";
81
+ declare const CLIENT_KEY_PREFIX = "autter_rtc_";
82
+ declare const KEY_ADVICE: string;
74
83
  interface UploadOptions {
75
84
  /** Only these bundles (absolute, or relative to the directory). */
76
85
  files?: string[];
@@ -82,7 +91,8 @@ interface UploadOptions {
82
91
  /** Ingester base URL. Default: $AUTTER_ENDPOINT, $AUTTER_RUNTIME_ENDPOINT,
83
92
  * $OTEL_EXPORTER_OTLP_ENDPOINT, else https://otlp.autter.dev. */
84
93
  endpoint?: string;
85
- /** Server ingest key. Default: $AUTTER_RUNTIME_KEY. */
94
+ /** Upload key (`autter_rtu_…`, recommended for CI) or server key
95
+ * (`autter_rt_…`). Default: $AUTTER_RUNTIME_KEY. */
86
96
  key?: string;
87
97
  /** List what would be uploaded; no network, no key needed. */
88
98
  dryRun?: boolean;
@@ -145,13 +155,18 @@ interface AutterSourceMapsOptions {
145
155
  /** Ingester base URL. Default: $AUTTER_ENDPOINT, $AUTTER_RUNTIME_ENDPOINT,
146
156
  * $OTEL_EXPORTER_OTLP_ENDPOINT, else https://otlp.autter.dev. */
147
157
  endpoint?: string;
148
- /** Server ingest key. Default: $AUTTER_RUNTIME_KEY. Without one, debug ids
149
- * are still injected but nothing is uploaded. */
158
+ /** Upload-only key (`autter_rtu_…`, recommended for CI) or server key
159
+ * (`autter_rt_…`). Default: $AUTTER_RUNTIME_KEY. Without one (and
160
+ * without `upload: false` or `dryRun`), the plugin generates no source
161
+ * maps it would have to delete again: the build is left as it was. */
150
162
  key?: string;
151
- /** Set false to inject debug ids only (upload later with the CLI). */
163
+ /** Set false to inject debug ids only (upload later with the CLI). Maps
164
+ * the plugin generated are then kept for that upload: don't deploy them. */
152
165
  upload?: boolean;
153
- /** Delete `.map` files once uploaded so they are never deployed. Default:
154
- * true when the plugin turned source maps on itself, false when you had. */
166
+ /** Maps the plugin generated itself are always deleted after the upload
167
+ * step, uploaded or not, so they are never deployed; set false to keep
168
+ * them (you must then keep them out of the deploy). Maps you configured
169
+ * yourself are deleted only when this is true, and only once uploaded. */
155
170
  deleteAfterUpload?: boolean;
156
171
  /** Log what would be uploaded without sending anything. */
157
172
  dryRun?: boolean;
@@ -166,13 +181,19 @@ interface AutterSourceMapsOptions {
166
181
  interface BuildOutputResult {
167
182
  injected: InjectResult[];
168
183
  upload: UploadSummary | null;
184
+ /** Maps the plugin generated and deleted (paths relative to the directory). */
185
+ removedMaps: string[];
169
186
  }
170
187
  /** Human-readable lines for an upload summary (CLI and plugins). */
171
188
  declare function formatUploadSummary(summary: UploadSummary): string[];
172
189
  /**
173
190
  * What every bundler integration does after a build: inject debug ids into
174
191
  * the emitted bundles, then upload their maps when a key is present.
175
- * Failures are logged, and thrown only with `failOnError`.
192
+ * Failures are logged, and thrown only with `failOnError`. When the
193
+ * integration turned source maps on itself (`ownMaps`), every map it made
194
+ * is deleted afterwards whatever happened to the upload (no key, a failed
195
+ * or partial upload, an unreachable ingester, a dry run), with the
196
+ * sourceMappingURL comments that name them, so none is deployed.
176
197
  */
177
198
  declare function processBuildOutput(input: {
178
199
  dir: string;
@@ -182,6 +203,11 @@ declare function processBuildOutput(input: {
182
203
  /** Default for `deleteAfterUpload` (true when the plugin enabled maps). */
183
204
  deleteAfterUpload: boolean;
184
205
  stripSourceMappingUrl?: boolean;
206
+ /** The integration turned source maps on itself: none may be deployed. */
207
+ ownMaps?: boolean;
208
+ /** Map files the build emitted (absolute), when the bundler lists them;
209
+ * the maps of `files` (or of every bundle under `dir`) are added. */
210
+ maps?: string[];
185
211
  }): Promise<BuildOutputResult>;
186
212
 
187
- export { type AutterSourceMapsOptions as A, BUNDLE_RE as B, DEFAULT_ENDPOINT as D, FatalUploadError as F, type InjectOptions as I, MAX_UPLOAD_BYTES as M, SNIPPET_LINE_KEY as S, type UploadItem as U, type BuildOutputResult as a, type BundleWithMap as b, type InjectResult as c, type UploadOptions as d, type UploadSummary as e, findBundles as f, formatUploadSummary as g, injectDir as h, injectBundle as i, resolveEndpoint as j, shiftMappings as k, snippetLine as l, mapPathFor as m, storedMapJson as n, stripSourceMappingUrl as o, processBuildOutput as p, readSourceMappingUrl as r, servedFilename as s, uploadDir as u };
213
+ export { type AutterSourceMapsOptions as A, BUNDLE_RE as B, CLIENT_KEY_PREFIX as C, DEFAULT_ENDPOINT as D, FatalUploadError as F, type InjectOptions as I, KEY_ADVICE as K, MAX_MAP_CHARS as M, SERVER_KEY_PREFIX as S, UPLOAD_KEY_PREFIX as U, type BuildOutputResult as a, type BundleWithMap as b, type InjectResult as c, MAX_UPLOAD_BYTES as d, SNIPPET_LINE_KEY as e, type UploadItem as f, type UploadOptions as g, type UploadSummary as h, findBundles as i, formatUploadSummary as j, injectBundle as k, injectDir as l, mapPathFor as m, resolveEndpoint as n, shiftMappings as o, processBuildOutput as p, snippetLine as q, readSourceMappingUrl as r, servedFilename as s, storedMapJson as t, stripSourceMappingUrl as u, uploadDir as v };
@@ -69,8 +69,17 @@ declare function injectBundle(bundle: BundleWithMap, options?: InjectOptions): P
69
69
  declare function injectDir(dir: string, options?: InjectOptions): Promise<InjectResult[]>;
70
70
 
71
71
  declare const DEFAULT_ENDPOINT = "https://otlp.autter.dev";
72
- /** The ingester's `/v1/sourcemaps` body limit. */
72
+ /** Largest map the ingester stores: characters of JSON without
73
+ * `sourcesContent` (otlp-ingester's SOURCE_MAP_MAX_CHARS). */
74
+ declare const MAX_MAP_CHARS: number;
75
+ /** The ingester's `/v1/sourcemaps` body limit, counted after the gzip body
76
+ * is inflated: the map plus room for the rest of the request. */
73
77
  declare const MAX_UPLOAD_BYTES: number;
78
+ /** Keys `upload` accepts, and the one it refuses before sending anything. */
79
+ declare const UPLOAD_KEY_PREFIX = "autter_rtu_";
80
+ declare const SERVER_KEY_PREFIX = "autter_rt_";
81
+ declare const CLIENT_KEY_PREFIX = "autter_rtc_";
82
+ declare const KEY_ADVICE: string;
74
83
  interface UploadOptions {
75
84
  /** Only these bundles (absolute, or relative to the directory). */
76
85
  files?: string[];
@@ -82,7 +91,8 @@ interface UploadOptions {
82
91
  /** Ingester base URL. Default: $AUTTER_ENDPOINT, $AUTTER_RUNTIME_ENDPOINT,
83
92
  * $OTEL_EXPORTER_OTLP_ENDPOINT, else https://otlp.autter.dev. */
84
93
  endpoint?: string;
85
- /** Server ingest key. Default: $AUTTER_RUNTIME_KEY. */
94
+ /** Upload key (`autter_rtu_…`, recommended for CI) or server key
95
+ * (`autter_rt_…`). Default: $AUTTER_RUNTIME_KEY. */
86
96
  key?: string;
87
97
  /** List what would be uploaded; no network, no key needed. */
88
98
  dryRun?: boolean;
@@ -145,13 +155,18 @@ interface AutterSourceMapsOptions {
145
155
  /** Ingester base URL. Default: $AUTTER_ENDPOINT, $AUTTER_RUNTIME_ENDPOINT,
146
156
  * $OTEL_EXPORTER_OTLP_ENDPOINT, else https://otlp.autter.dev. */
147
157
  endpoint?: string;
148
- /** Server ingest key. Default: $AUTTER_RUNTIME_KEY. Without one, debug ids
149
- * are still injected but nothing is uploaded. */
158
+ /** Upload-only key (`autter_rtu_…`, recommended for CI) or server key
159
+ * (`autter_rt_…`). Default: $AUTTER_RUNTIME_KEY. Without one (and
160
+ * without `upload: false` or `dryRun`), the plugin generates no source
161
+ * maps it would have to delete again: the build is left as it was. */
150
162
  key?: string;
151
- /** Set false to inject debug ids only (upload later with the CLI). */
163
+ /** Set false to inject debug ids only (upload later with the CLI). Maps
164
+ * the plugin generated are then kept for that upload: don't deploy them. */
152
165
  upload?: boolean;
153
- /** Delete `.map` files once uploaded so they are never deployed. Default:
154
- * true when the plugin turned source maps on itself, false when you had. */
166
+ /** Maps the plugin generated itself are always deleted after the upload
167
+ * step, uploaded or not, so they are never deployed; set false to keep
168
+ * them (you must then keep them out of the deploy). Maps you configured
169
+ * yourself are deleted only when this is true, and only once uploaded. */
155
170
  deleteAfterUpload?: boolean;
156
171
  /** Log what would be uploaded without sending anything. */
157
172
  dryRun?: boolean;
@@ -166,13 +181,19 @@ interface AutterSourceMapsOptions {
166
181
  interface BuildOutputResult {
167
182
  injected: InjectResult[];
168
183
  upload: UploadSummary | null;
184
+ /** Maps the plugin generated and deleted (paths relative to the directory). */
185
+ removedMaps: string[];
169
186
  }
170
187
  /** Human-readable lines for an upload summary (CLI and plugins). */
171
188
  declare function formatUploadSummary(summary: UploadSummary): string[];
172
189
  /**
173
190
  * What every bundler integration does after a build: inject debug ids into
174
191
  * the emitted bundles, then upload their maps when a key is present.
175
- * Failures are logged, and thrown only with `failOnError`.
192
+ * Failures are logged, and thrown only with `failOnError`. When the
193
+ * integration turned source maps on itself (`ownMaps`), every map it made
194
+ * is deleted afterwards whatever happened to the upload (no key, a failed
195
+ * or partial upload, an unreachable ingester, a dry run), with the
196
+ * sourceMappingURL comments that name them, so none is deployed.
176
197
  */
177
198
  declare function processBuildOutput(input: {
178
199
  dir: string;
@@ -182,6 +203,11 @@ declare function processBuildOutput(input: {
182
203
  /** Default for `deleteAfterUpload` (true when the plugin enabled maps). */
183
204
  deleteAfterUpload: boolean;
184
205
  stripSourceMappingUrl?: boolean;
206
+ /** The integration turned source maps on itself: none may be deployed. */
207
+ ownMaps?: boolean;
208
+ /** Map files the build emitted (absolute), when the bundler lists them;
209
+ * the maps of `files` (or of every bundle under `dir`) are added. */
210
+ maps?: string[];
185
211
  }): Promise<BuildOutputResult>;
186
212
 
187
- export { type AutterSourceMapsOptions as A, BUNDLE_RE as B, DEFAULT_ENDPOINT as D, FatalUploadError as F, type InjectOptions as I, MAX_UPLOAD_BYTES as M, SNIPPET_LINE_KEY as S, type UploadItem as U, type BuildOutputResult as a, type BundleWithMap as b, type InjectResult as c, type UploadOptions as d, type UploadSummary as e, findBundles as f, formatUploadSummary as g, injectDir as h, injectBundle as i, resolveEndpoint as j, shiftMappings as k, snippetLine as l, mapPathFor as m, storedMapJson as n, stripSourceMappingUrl as o, processBuildOutput as p, readSourceMappingUrl as r, servedFilename as s, uploadDir as u };
213
+ export { type AutterSourceMapsOptions as A, BUNDLE_RE as B, CLIENT_KEY_PREFIX as C, DEFAULT_ENDPOINT as D, FatalUploadError as F, type InjectOptions as I, KEY_ADVICE as K, MAX_MAP_CHARS as M, SERVER_KEY_PREFIX as S, UPLOAD_KEY_PREFIX as U, type BuildOutputResult as a, type BundleWithMap as b, type InjectResult as c, MAX_UPLOAD_BYTES as d, SNIPPET_LINE_KEY as e, type UploadItem as f, type UploadOptions as g, type UploadSummary as h, findBundles as i, formatUploadSummary as j, injectBundle as k, injectDir as l, mapPathFor as m, resolveEndpoint as n, shiftMappings as o, processBuildOutput as p, snippetLine as q, readSourceMappingUrl as r, servedFilename as s, storedMapJson as t, stripSourceMappingUrl as u, uploadDir as v };