fest-gateway 0.6.0 → 0.7.1
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 +25 -2
- package/dist/cli/tags.js +185 -46
- package/dist/cli/tags.js.map +1 -1
- package/dist/server/api/auth.js +6 -5
- package/dist/server/api/auth.js.map +1 -1
- package/dist/server/bin/fest.js +144 -28
- package/dist/server/bin/fest.js.map +1 -1
- package/dist/server/cluster/messages.js +35 -0
- package/dist/server/cluster/messages.js.map +1 -0
- package/dist/server/cluster/primary.js +178 -0
- package/dist/server/cluster/primary.js.map +1 -0
- package/dist/server/cluster/worker.js +82 -0
- package/dist/server/cluster/worker.js.map +1 -0
- package/dist/server/config.js +15 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/http/server.js +4 -1
- package/dist/server/http/server.js.map +1 -1
- package/dist/server/ingest/sink.js +9 -7
- package/dist/server/ingest/sink.js.map +1 -1
- package/dist/server/log.js +4 -1
- package/dist/server/log.js.map +1 -1
- package/dist/server/store/db.js +42 -4
- package/dist/server/store/db.js.map +1 -1
- package/dist/server/store/write.js +1 -1
- package/dist/server/usage/prices/refresh.js +9 -3
- package/dist/server/usage/prices/refresh.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -53,7 +53,7 @@ fest logout # forget the local token (does not revoke it server-side)
|
|
|
53
53
|
fest claude gw # force org credentials + the gateway's extra models
|
|
54
54
|
fest codex # OpenAI Codex CLI, on its own ChatGPT login or API key
|
|
55
55
|
fest copilot # GitHub Copilot CLI, on its own Copilot login
|
|
56
|
-
fest tags set team=platform # label usage
|
|
56
|
+
fest tags set team=platform # label usage; saved in the repo (package.json or .fest.json), -g: everywhere
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
Codex and Copilot CLI are metered into the same dashboard, labelled by client.
|
|
@@ -132,6 +132,7 @@ docker compose run --rm fest token list | token revoke <id>
|
|
|
132
132
|
| `FEST_SECURE_COOKIES` | set behind HTTPS. |
|
|
133
133
|
| `FEST_ROUTES` | routing table path. Absent means everything passes through. See [docs/ROUTING.md](docs/ROUTING.md). |
|
|
134
134
|
| `FEST_UPSTREAM_BASE_URL`, `FEST_LOG_LEVEL` | |
|
|
135
|
+
| `FEST_WORKERS` | HTTP worker processes: a number, or `auto` for one per CPU the process may use (a container's CPU limit counts). Default `1`; the Docker image sets `auto`. See [More than one core](#more-than-one-core). |
|
|
135
136
|
| `FEST_BEDROCK_BASE_URL` | opens the `/bedrock` mount, relaying Claude-in-Bedrock traffic on the *caller's* AWS credential. Must include Bedrock's `/anthropic` segment. Unset means the mount refuses. |
|
|
136
137
|
| `FEST_OPENAI_BASE_URL`, `FEST_CHATGPT_BASE_URL` | where the `/openai` (Codex on an API key) and `/chatgpt` (Codex on a ChatGPT login) mounts relay. Default `https://api.openai.com` and `https://chatgpt.com`; `off` refuses. See [docs/CODEX.md](docs/CODEX.md). |
|
|
137
138
|
| `FEST_COPILOT_BASE_URL`, `FEST_COPILOT_MCP_BASE_URL` | where the `/copilot/<plan>` mount (Copilot CLI on its own login) and the root `/mcp` relay (its built-in GitHub MCP server) go. Default `https://api.{plan}.githubcopilot.com` and `https://api.githubcopilot.com`; `off` refuses. See [docs/COPILOT.md](docs/COPILOT.md). |
|
|
@@ -146,6 +147,28 @@ docker compose run --rm fest token list | token revoke <id>
|
|
|
146
147
|
|
|
147
148
|
For the full OAuth setup, see [docs/CLI-AUTH.md](docs/CLI-AUTH.md).
|
|
148
149
|
|
|
150
|
+
### More than one core
|
|
151
|
+
|
|
152
|
+
One process relays a lot of streams, because relaying is mostly waiting on the
|
|
153
|
+
network. When it isn't enough, set `FEST_WORKERS` (or `auto`). `fest serve`
|
|
154
|
+
then becomes a small primary that forks that many HTTP workers onto the same
|
|
155
|
+
port with `node:cluster`.
|
|
156
|
+
|
|
157
|
+
- **One writer.** SQLite takes one writer at a time, and a process waiting for
|
|
158
|
+
the lock stalls every stream it relays. So workers send their usage to the
|
|
159
|
+
primary, which serves no HTTP and is the only process that writes metering.
|
|
160
|
+
It also runs migrations, retention and the price refresh, exactly once.
|
|
161
|
+
- **One host, one local disk.** Every process opens the same database file in
|
|
162
|
+
WAL mode, which needs shared memory. Don't put `/data` on NFS, EFS or any
|
|
163
|
+
other network filesystem. Spreading across machines needs a different
|
|
164
|
+
database, which Fest doesn't support yet.
|
|
165
|
+
- **A crash costs one worker's streams.** The primary respawns it, backing off
|
|
166
|
+
if it keeps crashing. Stopping the container drains every worker the same
|
|
167
|
+
way a single process drains.
|
|
168
|
+
- **Per worker, not shared:** the login throttle counts attempts per worker,
|
|
169
|
+
so the effective limit is that many times higher. `/healthz` reports the
|
|
170
|
+
worker that answered. Log lines from a worker carry its `worker` id.
|
|
171
|
+
|
|
149
172
|
### Behind a reverse proxy, on a path
|
|
150
173
|
|
|
151
174
|
Fest can be mounted under a path rather than on its own hostname. Set
|
|
@@ -348,7 +371,7 @@ per-developer detail.
|
|
|
348
371
|
|
|
349
372
|
## Develop it
|
|
350
373
|
|
|
351
|
-
Node >=
|
|
374
|
+
Node >= 26. There is **no build step for the server** — Node runs the
|
|
352
375
|
TypeScript directly via native type stripping. Only the dashboard is built, and
|
|
353
376
|
only the published npm package is compiled (Node refuses to strip types under
|
|
354
377
|
`node_modules`).
|
package/dist/cli/tags.js
CHANGED
|
@@ -7,15 +7,19 @@
|
|
|
7
7
|
*
|
|
8
8
|
* 1. `project=<git repo name>`, when inside a repo
|
|
9
9
|
* 2. global saved tags (`fest tags set -g team=platform`)
|
|
10
|
-
* 3.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* 3. directory layers containing the cwd, outermost first, so the narrowest
|
|
11
|
+
* wins: the repo's own file (below) and any directory saved in
|
|
12
|
+
* `~/.fest/tags.json` (`fest tags set team=data` in `~/work`, outside a
|
|
13
|
+
* repo, applies to every repo under it). The repo file wins a tie.
|
|
13
14
|
* 4. `FEST_TAGS="team=platform,project=fest"`
|
|
14
15
|
* 5. `--tag key=value` on the command line
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* Inside a git repo, `fest tags set` writes to the repo itself — the `fest`
|
|
18
|
+
* key of a root `package.json`, else `.fest.json` at the root — so the tags are
|
|
19
|
+
* committed with the code and every clone picks them up with no setup. Tags
|
|
20
|
+
* describe the WORK, and the repo is the work. Outside a repo it saves for the
|
|
21
|
+
* directory in `~/.fest/tags.json`; `-g` is for the few that follow the
|
|
22
|
+
* developer everywhere.
|
|
19
23
|
*
|
|
20
24
|
* The result rides in the `~…` path segment of the base URL each command
|
|
21
25
|
* already builds (see `shared/tags.ts`), so one mechanism serves all three
|
|
@@ -27,7 +31,7 @@
|
|
|
27
31
|
*/
|
|
28
32
|
import { execFileSync } from "node:child_process";
|
|
29
33
|
import { realpathSync } from "node:fs";
|
|
30
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
34
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
31
35
|
import { homedir } from "node:os";
|
|
32
36
|
import { basename, join, sep } from "node:path";
|
|
33
37
|
import { CONFIG_DIR } from "./config.js";
|
|
@@ -72,20 +76,25 @@ export function repoTagValue(name) {
|
|
|
72
76
|
.slice(0, MAX_TAG_VALUE_LENGTH);
|
|
73
77
|
return cleaned === "" ? null : cleaned;
|
|
74
78
|
}
|
|
75
|
-
/** The current git repo's
|
|
76
|
-
export function
|
|
79
|
+
/** The current git repo's root, symlink-resolved, or null outside a repo / without git. */
|
|
80
|
+
export function gitRoot(cwd = process.cwd()) {
|
|
77
81
|
try {
|
|
78
82
|
const top = execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
79
83
|
cwd,
|
|
80
84
|
encoding: "utf8",
|
|
81
85
|
stdio: ["ignore", "pipe", "ignore"],
|
|
82
86
|
}).trim();
|
|
83
|
-
return top === "" ? null :
|
|
87
|
+
return top === "" ? null : canonicalDir(top);
|
|
84
88
|
}
|
|
85
89
|
catch {
|
|
86
90
|
return null;
|
|
87
91
|
}
|
|
88
92
|
}
|
|
93
|
+
/** The current git repo's directory name, or null outside a repo / without git. */
|
|
94
|
+
export function gitRepoName(cwd = process.cwd()) {
|
|
95
|
+
const root = gitRoot(cwd);
|
|
96
|
+
return root === null ? null : repoTagValue(basename(root));
|
|
97
|
+
}
|
|
89
98
|
const EMPTY_SAVED = { global: {}, paths: {} };
|
|
90
99
|
/** Pure: the precedence chain above, given each layer's raw input. */
|
|
91
100
|
export function resolveTags(layers) {
|
|
@@ -93,7 +102,7 @@ export function resolveTags(layers) {
|
|
|
93
102
|
if (layers.repo !== null)
|
|
94
103
|
pairs.push({ key: "project", value: layers.repo });
|
|
95
104
|
pairs.push(...toPairs(layers.saved.global));
|
|
96
|
-
for (const
|
|
105
|
+
for (const { layer } of dirLayers(layers.saved, layers.repoFile ?? null, layers.cwd))
|
|
97
106
|
pairs.push(...toPairs(layer));
|
|
98
107
|
if (layers.env !== undefined)
|
|
99
108
|
pairs.push(...parseTagPairs(layers.env));
|
|
@@ -112,6 +121,20 @@ export function pathLayers(saved, cwd) {
|
|
|
112
121
|
.filter(([dir]) => cwd === dir || cwd.startsWith(dir.endsWith(sep) ? dir : dir + sep))
|
|
113
122
|
.sort((a, b) => a[0].length - b[0].length);
|
|
114
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Every directory layer that applies at `cwd`, outermost first: the saved
|
|
126
|
+
* directories containing it plus the repo's own file. Sorted by depth, so the
|
|
127
|
+
* narrowest wins; the repo file sorts after a saved entry for the same
|
|
128
|
+
* directory, because a committed file is the more deliberate statement.
|
|
129
|
+
*/
|
|
130
|
+
export function dirLayers(saved, repoFile, cwd) {
|
|
131
|
+
const out = pathLayers(saved, cwd).map(([dir, layer]) => ({ dir, files: null, layer }));
|
|
132
|
+
if (repoFile !== null && Object.keys(repoFile.tags).length > 0) {
|
|
133
|
+
out.push({ dir: repoFile.dir, files: repoFile.files, layer: repoFile.tags });
|
|
134
|
+
}
|
|
135
|
+
// Stable, so a tie keeps the repo file (pushed last) on top.
|
|
136
|
+
return out.sort((a, b) => a.dir.length - b.dir.length);
|
|
137
|
+
}
|
|
115
138
|
/** Symlink-resolved, so `/tmp/x` and `/private/tmp/x` are one directory. */
|
|
116
139
|
export function canonicalDir(dir) {
|
|
117
140
|
try {
|
|
@@ -165,11 +188,111 @@ async function writeSavedTags(saved) {
|
|
|
165
188
|
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
166
189
|
await writeFile(TAGS_FILE, JSON.stringify(saved, null, 2) + "\n", { mode: 0o600 });
|
|
167
190
|
}
|
|
191
|
+
export const PACKAGE_JSON = "package.json";
|
|
192
|
+
export const FEST_JSON = ".fest.json";
|
|
193
|
+
/** A JSON object from `path`, null when the file is absent. */
|
|
194
|
+
async function readJsonObject(path) {
|
|
195
|
+
let raw;
|
|
196
|
+
try {
|
|
197
|
+
raw = await readFile(path, "utf8");
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err.code === "ENOENT")
|
|
201
|
+
return null;
|
|
202
|
+
throw err;
|
|
203
|
+
}
|
|
204
|
+
const parsed = JSON.parse(raw);
|
|
205
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
206
|
+
throw new Error(`${path}: expected a JSON object`);
|
|
207
|
+
}
|
|
208
|
+
return parsed;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The tags committed at a repo root: `package.json`'s `fest` key, then
|
|
212
|
+
* `.fest.json` over it. Both are read, so a `.fest.json` keeps working after
|
|
213
|
+
* the repo later gains a `package.json`.
|
|
214
|
+
*
|
|
215
|
+
* Never throws: a broken `package.json` is the repo's problem, and must not
|
|
216
|
+
* stop `fest claude` from starting. It just contributes no tags.
|
|
217
|
+
*/
|
|
218
|
+
export async function readRepoTags(root) {
|
|
219
|
+
const files = [];
|
|
220
|
+
const tags = {};
|
|
221
|
+
for (const [file, pick] of [
|
|
222
|
+
[PACKAGE_JSON, (o) => o["fest"]],
|
|
223
|
+
[FEST_JSON, (o) => o],
|
|
224
|
+
]) {
|
|
225
|
+
let obj;
|
|
226
|
+
try {
|
|
227
|
+
obj = await readJsonObject(join(root, file));
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (obj === null)
|
|
233
|
+
continue;
|
|
234
|
+
const layer = readLayer(pick(obj));
|
|
235
|
+
if (Object.keys(layer).length === 0)
|
|
236
|
+
continue;
|
|
237
|
+
files.push(file);
|
|
238
|
+
Object.assign(tags, layer);
|
|
239
|
+
}
|
|
240
|
+
return { dir: root, files, tags };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Write a repo's committed tags where {@link readRepoTags} finds them: an
|
|
244
|
+
* existing `.fest.json` if there is one (somebody chose it), else the `fest`
|
|
245
|
+
* key of a root `package.json`, else a new `.fest.json`. The rest of
|
|
246
|
+
* `package.json` is left as it was, down to its indentation, and an emptied
|
|
247
|
+
* layer removes the key or the file rather than leaving `{}` behind.
|
|
248
|
+
*
|
|
249
|
+
* `update` gets that file's own layer and returns the new one. Returns the
|
|
250
|
+
* file written and what went in it. Unlike reading, a file that does not parse
|
|
251
|
+
* is an error here — rewriting it would destroy it.
|
|
252
|
+
*/
|
|
253
|
+
export async function writeRepoTags(root, update) {
|
|
254
|
+
const festPath = join(root, FEST_JSON);
|
|
255
|
+
const pkgPath = join(root, PACKAGE_JSON);
|
|
256
|
+
const fest = await readJsonObject(festPath);
|
|
257
|
+
if (fest === null) {
|
|
258
|
+
let pkgRaw = null;
|
|
259
|
+
try {
|
|
260
|
+
pkgRaw = await readFile(pkgPath, "utf8");
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
if (err.code !== "ENOENT")
|
|
264
|
+
throw err;
|
|
265
|
+
}
|
|
266
|
+
if (pkgRaw !== null) {
|
|
267
|
+
const pkg = (await readJsonObject(pkgPath));
|
|
268
|
+
const layer = update(readLayer(pkg["fest"]));
|
|
269
|
+
if (Object.keys(layer).length === 0)
|
|
270
|
+
delete pkg["fest"];
|
|
271
|
+
else
|
|
272
|
+
pkg["fest"] = layer;
|
|
273
|
+
const indent = /^([ \t]+)\S/m.exec(pkgRaw)?.[1] ?? 2;
|
|
274
|
+
const eol = pkgRaw.endsWith("\n") ? "\n" : "";
|
|
275
|
+
await writeFile(pkgPath, JSON.stringify(pkg, null, indent) + eol);
|
|
276
|
+
return { file: PACKAGE_JSON, layer };
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const layer = update(readLayer(fest));
|
|
280
|
+
await writeLayerFile(festPath, layer);
|
|
281
|
+
return { file: FEST_JSON, layer };
|
|
282
|
+
}
|
|
283
|
+
async function writeLayerFile(path, layer) {
|
|
284
|
+
if (Object.keys(layer).length === 0)
|
|
285
|
+
await rm(path, { force: true });
|
|
286
|
+
else
|
|
287
|
+
await writeFile(path, JSON.stringify(layer, null, 2) + "\n");
|
|
288
|
+
}
|
|
168
289
|
/** Everything a client command needs: the tags, already resolved. */
|
|
169
290
|
export async function sessionTags(flags, cwd = process.cwd()) {
|
|
291
|
+
const root = gitRoot(cwd);
|
|
170
292
|
return resolveTags({
|
|
171
|
-
repo:
|
|
293
|
+
repo: root === null ? null : repoTagValue(basename(root)),
|
|
172
294
|
saved: await readSavedTags(),
|
|
295
|
+
repoFile: root === null ? null : await readRepoTags(root),
|
|
173
296
|
cwd: canonicalDir(cwd),
|
|
174
297
|
env: process.env.FEST_TAGS,
|
|
175
298
|
flags,
|
|
@@ -196,9 +319,9 @@ function showDir(dir) {
|
|
|
196
319
|
return dir === home ? "~" : dir.startsWith(home + sep) ? `~${dir.slice(home.length)}` : dir;
|
|
197
320
|
}
|
|
198
321
|
/**
|
|
199
|
-
* `fest tags`
|
|
200
|
-
* `fest tags set [-g] k=v [k=v …]` save
|
|
201
|
-
* `fest tags unset [-g] k [k …]` remove from
|
|
322
|
+
* `fest tags` the layers that apply here, and the result
|
|
323
|
+
* `fest tags set [-g] k=v [k=v …]` save in this repo (or directory, or globally)
|
|
324
|
+
* `fest tags unset [-g] k [k …]` remove from the same place
|
|
202
325
|
*/
|
|
203
326
|
export async function runTags(argv, opts = {}) {
|
|
204
327
|
const out = opts.out ?? ((s) => void process.stdout.write(`${s}\n`));
|
|
@@ -206,52 +329,68 @@ export async function runTags(argv, opts = {}) {
|
|
|
206
329
|
const global = argv.includes("-g") || argv.includes("--global");
|
|
207
330
|
const [sub, ...rest] = argv.filter((a) => a !== "-g" && a !== "--global");
|
|
208
331
|
const saved = await readSavedTags();
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
const store = async (layer) => {
|
|
212
|
-
const paths = { ...saved.paths };
|
|
213
|
-
if (!global) {
|
|
214
|
-
if (Object.keys(layer).length === 0)
|
|
215
|
-
delete paths[cwd];
|
|
216
|
-
else
|
|
217
|
-
paths[cwd] = layer;
|
|
218
|
-
}
|
|
219
|
-
await writeSavedTags({ global: global ? layer : saved.global, paths });
|
|
220
|
-
out(`saved ${where}: ${showLayer(layer)}`);
|
|
221
|
-
};
|
|
332
|
+
const root = gitRoot(cwd);
|
|
333
|
+
let edit = null;
|
|
222
334
|
if (sub === "set") {
|
|
223
335
|
if (rest.length === 0)
|
|
224
336
|
throw new Error("usage: fest tags set [-g] key=value [key=value …]");
|
|
225
|
-
const
|
|
226
|
-
for (const arg of rest) {
|
|
337
|
+
const pairs = rest.flatMap((arg) => {
|
|
227
338
|
const parsed = parseTagPairs(arg);
|
|
228
339
|
if (parsed.length === 0)
|
|
229
340
|
throw new Error(`${arg}: expected key=value`);
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
}
|
|
234
|
-
await store(next);
|
|
235
|
-
return;
|
|
341
|
+
return parsed;
|
|
342
|
+
});
|
|
343
|
+
// An empty value is kept: here it means "not in this repo / directory".
|
|
344
|
+
edit = (current) => Object.assign({ ...current }, ...pairs.map((p) => ({ [p.key]: p.value })));
|
|
236
345
|
}
|
|
237
|
-
if (sub === "unset") {
|
|
346
|
+
else if (sub === "unset") {
|
|
238
347
|
if (rest.length === 0)
|
|
239
348
|
throw new Error("usage: fest tags unset [-g] key [key …]");
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
349
|
+
edit = (current) => {
|
|
350
|
+
const next = { ...current };
|
|
351
|
+
for (const key of rest)
|
|
352
|
+
delete next[key.toLowerCase()];
|
|
353
|
+
return next;
|
|
354
|
+
};
|
|
245
355
|
}
|
|
246
|
-
if (sub !== undefined)
|
|
356
|
+
else if (sub !== undefined) {
|
|
247
357
|
throw new Error(`unknown \`fest tags ${sub}\`. Try \`fest tags set key=value\`.`);
|
|
358
|
+
}
|
|
359
|
+
if (edit !== null) {
|
|
360
|
+
if (global) {
|
|
361
|
+
const layer = edit({ ...saved.global });
|
|
362
|
+
await writeSavedTags({ global: layer, paths: saved.paths });
|
|
363
|
+
out(`saved globally: ${showLayer(layer)}`);
|
|
364
|
+
}
|
|
365
|
+
else if (root !== null) {
|
|
366
|
+
// In a repo the tags go IN the repo, so every clone gets them.
|
|
367
|
+
const { file, layer } = await writeRepoTags(root, edit);
|
|
368
|
+
out(`saved in ${join(showDir(root), file)}: ${showLayer(layer)}`);
|
|
369
|
+
out(`commit ${file} so everyone working in this repo gets the same tags.`);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
const layer = edit({ ...(saved.paths[cwd] ?? {}) });
|
|
373
|
+
const paths = { ...saved.paths };
|
|
374
|
+
if (Object.keys(layer).length === 0)
|
|
375
|
+
delete paths[cwd];
|
|
376
|
+
else
|
|
377
|
+
paths[cwd] = layer;
|
|
378
|
+
await writeSavedTags({ global: saved.global, paths });
|
|
379
|
+
out(`saved for ${showDir(cwd)}: ${showLayer(layer)}`);
|
|
380
|
+
}
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
const repoFile = root === null ? null : await readRepoTags(root);
|
|
248
384
|
out(`global: ${showLayer(saved.global)}`);
|
|
249
|
-
for (const
|
|
250
|
-
|
|
385
|
+
for (const { dir, files, layer } of dirLayers(saved, repoFile, cwd)) {
|
|
386
|
+
const label = files === null ? showDir(dir) : files.map((f) => join(showDir(dir), f)).join(" + ");
|
|
387
|
+
out(`${label}: ${showLayer(layer)}`);
|
|
388
|
+
}
|
|
251
389
|
const effective = await sessionTags([], cwd);
|
|
252
390
|
out(`effective: ${decodeURIComponent(formatTags(effective)) || "(none)"}`);
|
|
253
391
|
out("");
|
|
254
|
-
out("`fest tags set` saves
|
|
392
|
+
out("`fest tags set` saves in this repo (package.json's \"fest\" key, else .fest.json) or,");
|
|
393
|
+
out("outside a repo, for this directory and below; -g saves globally. The narrowest wins.");
|
|
255
394
|
out("Effective also adds project=<git repo name> and FEST_TAGS. Override per session with");
|
|
256
395
|
out("--tag key=value; an empty value (project=) removes a key.");
|
|
257
396
|
}
|
package/dist/cli/tags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../cli/tags.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../cli/tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,cAAc,EACd,aAAa,GAGd,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACzF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACtC,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC;SACnC,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAClC,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAChE,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC;AAYD,MAAM,WAAW,GAAc,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAWzD,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,MAO3B;IACC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACpH,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,sBAAsB,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,KAAuC,EAAa,EAAE,CACrE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAEhE,iEAAiE;AACjE,MAAM,UAAU,UAAU,CACxB,KAAgB,EAChB,GAAW;IAEX,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;SACrF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,KAAgB,EAChB,QAAyB,EACzB,GAAW;IAEX,MAAM,GAAG,GACP,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,6DAA6D;IAC7D,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACvE,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QACtC,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC7G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,WAAW,CAAC;QACzE,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAC;IAC/F,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,mEAAmE;IACnE,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC1F,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC,EAAE,CAAC;YACnF,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,KAAgB;IAC5C,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAEtC,+DAA+D;AAC/D,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAiC,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI;QACzB,CAAC,YAAY,EAAE,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,SAAS,EAAE,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC;KACtC,EAAE,CAAC;QACX,IAAI,GAAmC,CAAC;QACxC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,MAAmE;IAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;QAClE,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;;gBACnD,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;YACzB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;YAClE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAuC;IACjF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;;QAChE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAwB,EACxB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzD,KAAK,EAAE,MAAM,aAAa,EAAE;QAC5B,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC;QACzD,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;QAC1B,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,IAAU;IACrC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,8EAA8E;AAC9E,SAAS,SAAS,CAAC,KAAuC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvH,CAAC;AAED,4DAA4D;AAC5D,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAuB,EACvB,OAAuD,EAAE;IAEzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,UAAU,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,IAAI,GAAyE,IAAI,CAAC;IACtF,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,sBAAsB,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,wEAAwE;QACxE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAClF,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE;YACjB,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;SAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,sCAAsC,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5D,GAAG,CAAC,mBAAmB,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,+DAA+D;YAC/D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxD,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClE,GAAG,CAAC,UAAU,IAAI,uDAAuD,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;;gBAClD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACxB,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,GAAG,CAAC,aAAa,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACjE,GAAG,CAAC,cAAc,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClG,GAAG,CAAC,GAAG,KAAK,MAAM,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7C,GAAG,CAAC,cAAc,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC3E,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,uFAAuF,CAAC,CAAC;IAC7F,GAAG,CAAC,sFAAsF,CAAC,CAAC;IAC5F,GAAG,CAAC,sFAAsF,CAAC,CAAC;IAC5F,GAAG,CAAC,2DAA2D,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/server/api/auth.js
CHANGED
|
@@ -21,11 +21,12 @@ function json(res, status, body, extra = {}) {
|
|
|
21
21
|
/**
|
|
22
22
|
* Login throttle, in memory and per (email, ip).
|
|
23
23
|
*
|
|
24
|
-
* In memory because
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
24
|
+
* In memory, because putting this in SQLite would let an unauthenticated
|
|
25
|
+
* caller drive writes into the same single-writer database the metering flush
|
|
26
|
+
* needs. The trades are that a restart clears the counters, and that with
|
|
27
|
+
* `FEST_WORKERS` > 1 each worker counts separately, so the effective limit is
|
|
28
|
+
* that many times MAX_ATTEMPTS — both acceptable against online guessing,
|
|
29
|
+
* which is what this defends; offline guessing is scrypt's job.
|
|
29
30
|
*/
|
|
30
31
|
const ATTEMPT_WINDOW_MS = 15 * 60_000;
|
|
31
32
|
const MAX_ATTEMPTS = 10;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../server/api/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGhC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC;AAShC,SAAS,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa,EAAE,QAAgC,EAAE;IAClG,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACrG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../server/api/auth.ts"],"names":[],"mappings":"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"}
|