overleaf-codex 0.1.0-rc.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.
Potentially problematic release.
This version of overleaf-codex might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/NOTICE.md +25 -0
- package/README.md +217 -0
- package/assets/olcx-mark.svg +22 -0
- package/dist/auth/projectAuth.d.ts +19 -0
- package/dist/auth/projectAuth.js +163 -0
- package/dist/auth/projectAuth.js.map +1 -0
- package/dist/auth/redact.d.ts +3 -0
- package/dist/auth/redact.js +7 -0
- package/dist/auth/redact.js.map +1 -0
- package/dist/auth/types.d.ts +10 -0
- package/dist/auth/types.js +4 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/backend/index.d.ts +6 -0
- package/dist/backend/index.js +2 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/olcli/client.d.ts +329 -0
- package/dist/backend/olcli/client.js +1757 -0
- package/dist/backend/olcli/client.js.map +1 -0
- package/dist/backend/olcli/index.d.ts +2 -0
- package/dist/backend/olcli/index.js +2 -0
- package/dist/backend/olcli/index.js.map +1 -0
- package/dist/backend/overleafBackend.d.ts +41 -0
- package/dist/backend/overleafBackend.js +200 -0
- package/dist/backend/overleafBackend.js.map +1 -0
- package/dist/backend/types.d.ts +73 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/cli-behavior.d.ts +14 -0
- package/dist/cli-behavior.js +59 -0
- package/dist/cli-behavior.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.js +441 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +21 -0
- package/dist/commands/auth.js +104 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/compile.d.ts +7 -0
- package/dist/commands/compile.js +73 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.js +9 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/endpoint.d.ts +23 -0
- package/dist/commands/endpoint.js +69 -0
- package/dist/commands/endpoint.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.js +48 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.js +5 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +26 -0
- package/dist/commands/sync.js +139 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/watch.d.ts +28 -0
- package/dist/commands/watch.js +124 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/compile/compileFlow.d.ts +32 -0
- package/dist/compile/compileFlow.js +290 -0
- package/dist/compile/compileFlow.js.map +1 -0
- package/dist/compile/pdfOutput.d.ts +12 -0
- package/dist/compile/pdfOutput.js +64 -0
- package/dist/compile/pdfOutput.js.map +1 -0
- package/dist/config/ignoreRules.d.ts +5 -0
- package/dist/config/ignoreRules.js +53 -0
- package/dist/config/ignoreRules.js.map +1 -0
- package/dist/config/overleafProject.d.ts +9 -0
- package/dist/config/overleafProject.js +61 -0
- package/dist/config/overleafProject.js.map +1 -0
- package/dist/config/projectConfig.d.ts +6 -0
- package/dist/config/projectConfig.js +180 -0
- package/dist/config/projectConfig.js.map +1 -0
- package/dist/config/projectRoot.d.ts +1 -0
- package/dist/config/projectRoot.js +36 -0
- package/dist/config/projectRoot.js.map +1 -0
- package/dist/config/types.d.ts +50 -0
- package/dist/config/types.js +34 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/vscode.d.ts +10 -0
- package/dist/config/vscode.js +134 -0
- package/dist/config/vscode.js.map +1 -0
- package/dist/diagnostics/doctor.d.ts +8 -0
- package/dist/diagnostics/doctor.js +209 -0
- package/dist/diagnostics/doctor.js.map +1 -0
- package/dist/diagnostics/status.d.ts +6 -0
- package/dist/diagnostics/status.js +110 -0
- package/dist/diagnostics/status.js.map +1 -0
- package/dist/diagnostics/types.d.ts +33 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/endpoint/overleafEndpoint.d.ts +36 -0
- package/dist/endpoint/overleafEndpoint.js +105 -0
- package/dist/endpoint/overleafEndpoint.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/sync/apply.d.ts +14 -0
- package/dist/sync/apply.js +92 -0
- package/dist/sync/apply.js.map +1 -0
- package/dist/sync/conflicts.d.ts +7 -0
- package/dist/sync/conflicts.js +59 -0
- package/dist/sync/conflicts.js.map +1 -0
- package/dist/sync/ignore.d.ts +5 -0
- package/dist/sync/ignore.js +74 -0
- package/dist/sync/ignore.js.map +1 -0
- package/dist/sync/plan.d.ts +3 -0
- package/dist/sync/plan.js +197 -0
- package/dist/sync/plan.js.map +1 -0
- package/dist/sync/snapshot.d.ts +13 -0
- package/dist/sync/snapshot.js +82 -0
- package/dist/sync/snapshot.js.map +1 -0
- package/dist/sync/state.d.ts +16 -0
- package/dist/sync/state.js +214 -0
- package/dist/sync/state.js.map +1 -0
- package/dist/sync/types.d.ts +113 -0
- package/dist/sync/types.js +4 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/testing/fakeBackend.d.ts +27 -0
- package/dist/testing/fakeBackend.js +213 -0
- package/dist/testing/fakeBackend.js.map +1 -0
- package/dist/watch/queue.d.ts +2 -0
- package/dist/watch/queue.js +91 -0
- package/dist/watch/queue.js.map +1 -0
- package/dist/watch/types.d.ts +52 -0
- package/dist/watch/types.js +2 -0
- package/dist/watch/types.js.map +1 -0
- package/dist/watch/watcher.d.ts +6 -0
- package/dist/watch/watcher.js +58 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/watch/workflow.d.ts +30 -0
- package/dist/watch/workflow.js +62 -0
- package/dist/watch/workflow.js.map +1 -0
- package/docs/architecture.md +603 -0
- package/docs/auth.md +65 -0
- package/docs/cli-behavior.md +95 -0
- package/docs/compile.md +51 -0
- package/docs/design.md +82 -0
- package/docs/endpoint.md +84 -0
- package/docs/npm-packaging.md +148 -0
- package/docs/quickdev-queue-audit.md +193 -0
- package/docs/release-gates.md +119 -0
- package/docs/release-notes-v1.md +97 -0
- package/docs/security.md +61 -0
- package/docs/sync-state.md +305 -0
- package/docs/sync.md +50 -0
- package/docs/troubleshooting.md +124 -0
- package/docs/usage.md +184 -0
- package/examples/minimal-paper/.olcx/auth.local.example.json +7 -0
- package/examples/minimal-paper/.olcx/config.json +23 -0
- package/examples/minimal-paper/README.md +88 -0
- package/examples/minimal-paper/main.tex +23 -0
- package/package.json +66 -0
- package/src/backend/olcli/LICENSE +21 -0
- package/src/backend/olcli/README.md +26 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { redactSensitive } from "../cli-behavior.js";
|
|
2
|
+
import { compileProject, } from "../compile/compileFlow.js";
|
|
3
|
+
export async function runCompileCommand(input) {
|
|
4
|
+
return compileProject(input);
|
|
5
|
+
}
|
|
6
|
+
export function formatCompileSuccess(result) {
|
|
7
|
+
const lines = [
|
|
8
|
+
"olcx compile",
|
|
9
|
+
`Status: ${result.status}`,
|
|
10
|
+
`PDF: ${result.pdfPath}`,
|
|
11
|
+
`Bytes: ${result.bytesWritten}`,
|
|
12
|
+
`Elapsed: ${result.elapsedMs}ms`,
|
|
13
|
+
`Warnings: ${result.warnings.length}`,
|
|
14
|
+
];
|
|
15
|
+
if (result.fallbackUsed) {
|
|
16
|
+
lines.push("Fallback: fast/draft");
|
|
17
|
+
}
|
|
18
|
+
if (result.warnings.length > 0) {
|
|
19
|
+
lines.push(...result.warnings.map((warning) => `- ${warning}`));
|
|
20
|
+
}
|
|
21
|
+
lines.push(`Next: open ${result.pdfPath}`);
|
|
22
|
+
return redactSensitive(`${lines.join("\n")}\n`);
|
|
23
|
+
}
|
|
24
|
+
export function formatCompileFailure(error) {
|
|
25
|
+
const lines = [`Error: ${error.message}`];
|
|
26
|
+
const logSummary = readLogSummary(error.details);
|
|
27
|
+
const normalFailure = readFailureSummary(error.details, "normalFailure");
|
|
28
|
+
const fallbackFailure = readFailureSummary(error.details, "fallbackFailure");
|
|
29
|
+
const restoreStatus = readStringDetail(error.details, "restoreStatus");
|
|
30
|
+
const restoreWarning = readStringDetail(error.details, "restoreWarning");
|
|
31
|
+
if (normalFailure)
|
|
32
|
+
lines.push(`Normal compile failure: ${normalFailure}`);
|
|
33
|
+
if (fallbackFailure)
|
|
34
|
+
lines.push(`Fast/draft fallback failure: ${fallbackFailure}`);
|
|
35
|
+
if (restoreStatus)
|
|
36
|
+
lines.push(`Restore: ${restoreStatus}`);
|
|
37
|
+
if (restoreWarning)
|
|
38
|
+
lines.push(`Restore warning: ${restoreWarning}`);
|
|
39
|
+
if (logSummary.length > 0) {
|
|
40
|
+
lines.push("Compile log summary:", ...logSummary.map((entry) => `- ${entry}`));
|
|
41
|
+
}
|
|
42
|
+
lines.push(`Next: ${error.hint ?? "Fix the compile issue and retry olcx compile."}`);
|
|
43
|
+
return redactSensitive(`${lines.join("\n")}\n`);
|
|
44
|
+
}
|
|
45
|
+
function readLogSummary(details) {
|
|
46
|
+
if (!details || typeof details !== "object" || !("logSummary" in details)) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
const logSummary = details.logSummary;
|
|
50
|
+
if (!Array.isArray(logSummary)) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
return logSummary.filter((entry) => typeof entry === "string");
|
|
54
|
+
}
|
|
55
|
+
function readStringDetail(details, key) {
|
|
56
|
+
if (!details || typeof details !== "object" || !(key in details)) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const value = details[key];
|
|
60
|
+
return typeof value === "string" ? value : undefined;
|
|
61
|
+
}
|
|
62
|
+
function readFailureSummary(details, key) {
|
|
63
|
+
if (!details || typeof details !== "object" || !(key in details)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const value = details[key];
|
|
67
|
+
if (!value || typeof value !== "object") {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const message = value.message;
|
|
71
|
+
return typeof message === "string" ? message : undefined;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExitCode } from "../errors.js";
|
|
2
|
+
export interface GetDoctorOutputOptions {
|
|
3
|
+
cwd: string;
|
|
4
|
+
nodeVersion?: string;
|
|
5
|
+
backendAvailable?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DoctorCommandOutput {
|
|
8
|
+
exitCode: ExitCode;
|
|
9
|
+
output: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function getDoctorOutput(options: GetDoctorOutputOptions): Promise<DoctorCommandOutput>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { formatDoctorReport, runDoctorDiagnostics } from "../diagnostics/doctor.js";
|
|
2
|
+
export async function getDoctorOutput(options) {
|
|
3
|
+
const report = await runDoctorDiagnostics(options);
|
|
4
|
+
return {
|
|
5
|
+
exitCode: report.exitCode,
|
|
6
|
+
output: formatDoctorReport(report),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAcpF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B;IACnE,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ExitCode } from "../cli-behavior.js";
|
|
2
|
+
import { type FetchLike } from "../endpoint/overleafEndpoint.js";
|
|
3
|
+
export interface EndpointCommandRuntime {
|
|
4
|
+
fetchImpl?: FetchLike;
|
|
5
|
+
nowMs?: () => number;
|
|
6
|
+
}
|
|
7
|
+
export declare function getEndpointStatusOutput(input: {
|
|
8
|
+
cwd: string;
|
|
9
|
+
}): Promise<string>;
|
|
10
|
+
export declare function setEndpoint(input: {
|
|
11
|
+
cwd: string;
|
|
12
|
+
endpoint: string;
|
|
13
|
+
}): Promise<string>;
|
|
14
|
+
export declare function testEndpoint(input: {
|
|
15
|
+
cwd: string;
|
|
16
|
+
apply?: boolean;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
fetchImpl?: FetchLike;
|
|
19
|
+
nowMs?: () => number;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
output: string;
|
|
22
|
+
exitCode: ExitCode;
|
|
23
|
+
}>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { EXIT_CODES, createOlcxError } from "../cli-behavior.js";
|
|
2
|
+
import { findProjectRoot } from "../config/projectRoot.js";
|
|
3
|
+
import { readProjectConfig, writeProjectConfig } from "../config/projectConfig.js";
|
|
4
|
+
import { endpointAliasFromBaseUrl, formatEndpointProbeResult, resolveEndpointInput, selectFastestAvailableEndpoint, testOverleafEndpoints, } from "../endpoint/overleafEndpoint.js";
|
|
5
|
+
export async function getEndpointStatusOutput(input) {
|
|
6
|
+
const projectRoot = await findProjectRoot(input.cwd);
|
|
7
|
+
const config = await readProjectConfig(projectRoot);
|
|
8
|
+
const alias = endpointAliasFromBaseUrl(config.overleaf.baseUrl);
|
|
9
|
+
return [
|
|
10
|
+
"olcx endpoint status",
|
|
11
|
+
`Current: ${alias} (${config.overleaf.baseUrl})`,
|
|
12
|
+
"Probe: not run",
|
|
13
|
+
].join("\n") + "\n";
|
|
14
|
+
}
|
|
15
|
+
export async function setEndpoint(input) {
|
|
16
|
+
const endpoint = resolveEndpointInput(input.endpoint);
|
|
17
|
+
const projectRoot = await findProjectRoot(input.cwd);
|
|
18
|
+
const config = await readProjectConfig(projectRoot);
|
|
19
|
+
await writeProjectConfig(projectRoot, {
|
|
20
|
+
...config,
|
|
21
|
+
overleaf: { baseUrl: endpoint.baseUrl },
|
|
22
|
+
});
|
|
23
|
+
return [
|
|
24
|
+
"olcx endpoint set",
|
|
25
|
+
`Set: ${endpoint.alias} (${endpoint.baseUrl})`,
|
|
26
|
+
].join("\n") + "\n";
|
|
27
|
+
}
|
|
28
|
+
export async function testEndpoint(input) {
|
|
29
|
+
const timeoutMs = input.timeoutMs ?? 5000;
|
|
30
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {
|
|
31
|
+
throw createOlcxError({
|
|
32
|
+
code: "USER_INPUT_ERROR",
|
|
33
|
+
message: "Endpoint probe timeout must be a positive integer in milliseconds.",
|
|
34
|
+
hint: "Use --timeout with a value greater than 0.",
|
|
35
|
+
details: { timeoutMs },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const projectRoot = await findProjectRoot(input.cwd);
|
|
39
|
+
const config = await readProjectConfig(projectRoot);
|
|
40
|
+
const currentAlias = endpointAliasFromBaseUrl(config.overleaf.baseUrl);
|
|
41
|
+
const results = await testOverleafEndpoints({
|
|
42
|
+
timeoutMs,
|
|
43
|
+
fetchImpl: input.fetchImpl,
|
|
44
|
+
now: input.nowMs,
|
|
45
|
+
});
|
|
46
|
+
const fastest = selectFastestAvailableEndpoint(results);
|
|
47
|
+
const lines = [
|
|
48
|
+
"olcx endpoint test",
|
|
49
|
+
`Current: ${currentAlias} (${config.overleaf.baseUrl})`,
|
|
50
|
+
"Results:",
|
|
51
|
+
...results.map(formatEndpointProbeResult),
|
|
52
|
+
];
|
|
53
|
+
if (fastest === undefined) {
|
|
54
|
+
lines.push("Applied: no", "Error: No Overleaf endpoint is reachable.", "Next: Check network access, proxy, firewall, or retry without --apply.");
|
|
55
|
+
return { output: `${lines.join("\n")}\n`, exitCode: EXIT_CODES.NETWORK_ERROR };
|
|
56
|
+
}
|
|
57
|
+
if (input.apply === true) {
|
|
58
|
+
await writeProjectConfig(projectRoot, {
|
|
59
|
+
...config,
|
|
60
|
+
overleaf: { baseUrl: fastest.baseUrl },
|
|
61
|
+
});
|
|
62
|
+
lines.push(`Applied: ${fastest.alias}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
lines.push("Applied: no", `Next: olcx endpoint set ${fastest.alias}`);
|
|
66
|
+
}
|
|
67
|
+
return { output: `${lines.join("\n")}\n`, exitCode: EXIT_CODES.SUCCESS };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/commands/endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface InitProjectOptions {
|
|
2
|
+
cwd: string;
|
|
3
|
+
project: string;
|
|
4
|
+
vscode?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface InitProjectResult {
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
projectId: string;
|
|
9
|
+
pdfPath: string;
|
|
10
|
+
configCreated: boolean;
|
|
11
|
+
gitignoreChanged: boolean;
|
|
12
|
+
vscodeChanged: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function initProject(options: InitProjectOptions): Promise<InitProjectResult>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createOlcxError, isOlcxError } from "../errors.js";
|
|
2
|
+
import { ensureGitignoreEntries } from "../config/ignoreRules.js";
|
|
3
|
+
import { parseProjectReference } from "../config/overleafProject.js";
|
|
4
|
+
import { readProjectConfig, writeProjectConfig } from "../config/projectConfig.js";
|
|
5
|
+
import { findProjectRoot } from "../config/projectRoot.js";
|
|
6
|
+
import { createDefaultProjectConfig } from "../config/types.js";
|
|
7
|
+
import { ensureVsCodeConfig } from "../config/vscode.js";
|
|
8
|
+
export async function initProject(options) {
|
|
9
|
+
const projectRef = parseProjectReference(options.project);
|
|
10
|
+
const projectRoot = await findProjectRoot(options.cwd);
|
|
11
|
+
const { config, created } = await readOrCreateConfig(projectRoot, projectRef);
|
|
12
|
+
const gitignore = await ensureGitignoreEntries(projectRoot);
|
|
13
|
+
const vscode = await ensureVsCodeConfig(projectRoot, {
|
|
14
|
+
pdfPath: config.pdfPath,
|
|
15
|
+
rootDocument: config.rootDocument,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
projectRoot,
|
|
19
|
+
projectId: config.projectId,
|
|
20
|
+
pdfPath: config.pdfPath,
|
|
21
|
+
configCreated: created,
|
|
22
|
+
gitignoreChanged: gitignore.changed,
|
|
23
|
+
vscodeChanged: vscode.changed,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function readOrCreateConfig(projectRoot, projectRef) {
|
|
27
|
+
try {
|
|
28
|
+
const existing = await readProjectConfig(projectRoot);
|
|
29
|
+
if (existing.projectId !== projectRef.projectId) {
|
|
30
|
+
throw createOlcxError({
|
|
31
|
+
code: "PROJECT_CONFIG_INVALID",
|
|
32
|
+
message: "This repository is already bound to a different Overleaf project.",
|
|
33
|
+
hint: "Use the existing binding or edit .olcx/config.json intentionally.",
|
|
34
|
+
details: { path: ".olcx/config.json" },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return { config: existing, created: false };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!isOlcxError(error) || error.code !== "PROJECT_CONFIG_NOT_FOUND") {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const config = createDefaultProjectConfig(projectRef);
|
|
45
|
+
await writeProjectConfig(projectRoot, config);
|
|
46
|
+
return { config, created: true };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAA+B,MAAM,8BAA8B,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAsB,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAiBzD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE;QACnD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,OAAO;QACtB,gBAAgB,EAAE,SAAS,CAAC,OAAO;QACnC,aAAa,EAAE,MAAM,CAAC,OAAO;KAC9B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,UAAkC;IAElC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEtD,IAAI,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC;YAChD,MAAM,eAAe,CAAC;gBACpB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,mEAAmE;gBAC5E,IAAI,EAAE,mEAAmE;gBACzE,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMrF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B;IACnE,OAAO,mBAAmB,CAAC,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type OverleafBackend, type OverleafBackendFactory } from "../backend/index.js";
|
|
2
|
+
import { type SyncPlan } from "../sync/types.js";
|
|
3
|
+
export interface SyncProjectOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
backend?: OverleafBackend;
|
|
7
|
+
createBackend?: OverleafBackendFactory;
|
|
8
|
+
env?: Record<string, string | undefined>;
|
|
9
|
+
now?: () => Date;
|
|
10
|
+
}
|
|
11
|
+
export interface SyncProjectResult {
|
|
12
|
+
projectRoot: string;
|
|
13
|
+
dryRun: boolean;
|
|
14
|
+
plan: SyncPlan;
|
|
15
|
+
output: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function syncProject(options: SyncProjectOptions): Promise<SyncProjectResult>;
|
|
18
|
+
export declare function formatSyncPlanOutput(result: SyncProjectResult): string;
|
|
19
|
+
export declare function formatSyncConflictFailure(input: {
|
|
20
|
+
conflicts: {
|
|
21
|
+
path: string;
|
|
22
|
+
reason: string;
|
|
23
|
+
}[];
|
|
24
|
+
dryRun: boolean;
|
|
25
|
+
reportWritten: boolean;
|
|
26
|
+
}): string;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { resolveProjectAuth } from "../auth/projectAuth.js";
|
|
2
|
+
import { createOlcliOverleafBackend, } from "../backend/index.js";
|
|
3
|
+
import { redactSensitive } from "../cli-behavior.js";
|
|
4
|
+
import { readProjectConfig } from "../config/projectConfig.js";
|
|
5
|
+
import { findProjectRoot } from "../config/projectRoot.js";
|
|
6
|
+
import { createOlcxError } from "../errors.js";
|
|
7
|
+
import { applySyncPlan } from "../sync/apply.js";
|
|
8
|
+
import { createConflictReport } from "../sync/conflicts.js";
|
|
9
|
+
import { createSyncPlan } from "../sync/plan.js";
|
|
10
|
+
import { createLocalSnapshot, createRemoteSnapshot } from "../sync/snapshot.js";
|
|
11
|
+
import { buildNextSyncState, clearConflictReport, readSyncState, writeConflictReport, writeSyncState, } from "../sync/state.js";
|
|
12
|
+
import { CONFLICT_REPORT_PATH, SYNC_STATE_PATH } from "../sync/types.js";
|
|
13
|
+
export async function syncProject(options) {
|
|
14
|
+
const now = options.now ?? (() => new Date());
|
|
15
|
+
const createdAt = now().toISOString();
|
|
16
|
+
const dryRun = options.dryRun === true;
|
|
17
|
+
const projectRoot = await findProjectRoot(options.cwd);
|
|
18
|
+
const config = await readProjectConfig(projectRoot);
|
|
19
|
+
const auth = await resolveProjectAuth(projectRoot, { env: options.env, now });
|
|
20
|
+
const state = await readSyncState(projectRoot, { now });
|
|
21
|
+
const backend = options.backend ??
|
|
22
|
+
(options.createBackend ?? createOlcliOverleafBackend)({ baseUrl: config.overleaf.baseUrl });
|
|
23
|
+
const localFiles = await createLocalSnapshot({
|
|
24
|
+
projectRoot,
|
|
25
|
+
userIgnorePatterns: config.sync.ignore,
|
|
26
|
+
});
|
|
27
|
+
const remoteFiles = await createRemoteSnapshot({
|
|
28
|
+
backend,
|
|
29
|
+
projectId: config.projectId,
|
|
30
|
+
auth,
|
|
31
|
+
userIgnorePatterns: config.sync.ignore,
|
|
32
|
+
});
|
|
33
|
+
const plan = createSyncPlan({
|
|
34
|
+
projectId: config.projectId,
|
|
35
|
+
createdAt,
|
|
36
|
+
dryRun,
|
|
37
|
+
state,
|
|
38
|
+
localFiles,
|
|
39
|
+
remoteFiles,
|
|
40
|
+
userIgnorePatterns: config.sync.ignore,
|
|
41
|
+
allowDeletes: false,
|
|
42
|
+
});
|
|
43
|
+
if (plan.conflicts.length > 0) {
|
|
44
|
+
let reportWritten = false;
|
|
45
|
+
if (!dryRun) {
|
|
46
|
+
await writeConflictReport(projectRoot, createConflictReport({
|
|
47
|
+
generatedAt: createdAt,
|
|
48
|
+
conflicts: plan.conflicts,
|
|
49
|
+
watchPaused: true,
|
|
50
|
+
}));
|
|
51
|
+
reportWritten = true;
|
|
52
|
+
}
|
|
53
|
+
throw createOlcxError({
|
|
54
|
+
code: "SYNC_CONFLICT",
|
|
55
|
+
message: `Sync paused because ${plan.conflicts.length} conflict(s) were detected.`,
|
|
56
|
+
hint: "Review the listed files, then run olcx sync --dry-run.",
|
|
57
|
+
details: {
|
|
58
|
+
conflicts: summarizeConflicts(plan.conflicts),
|
|
59
|
+
...(reportWritten ? { reportPath: CONFLICT_REPORT_PATH } : {}),
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (!dryRun) {
|
|
64
|
+
const applyResult = await applySyncPlan({
|
|
65
|
+
projectRoot,
|
|
66
|
+
backend,
|
|
67
|
+
projectId: config.projectId,
|
|
68
|
+
auth,
|
|
69
|
+
plan,
|
|
70
|
+
});
|
|
71
|
+
await writeSyncState(projectRoot, buildNextSyncState({
|
|
72
|
+
previous: state,
|
|
73
|
+
plan,
|
|
74
|
+
appliedAt: createdAt,
|
|
75
|
+
uploadResults: applyResult.uploaded,
|
|
76
|
+
}));
|
|
77
|
+
await clearConflictReport(projectRoot);
|
|
78
|
+
}
|
|
79
|
+
const result = {
|
|
80
|
+
projectRoot,
|
|
81
|
+
dryRun,
|
|
82
|
+
plan,
|
|
83
|
+
output: "",
|
|
84
|
+
};
|
|
85
|
+
result.output = formatSyncPlanOutput(result);
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
export function formatSyncPlanOutput(result) {
|
|
89
|
+
const uploadPaths = operationPaths(result.plan, "upload");
|
|
90
|
+
const downloadPaths = operationPaths(result.plan, "download");
|
|
91
|
+
const lines = [
|
|
92
|
+
result.dryRun ? "olcx sync --dry-run" : "olcx sync",
|
|
93
|
+
`Plan: upload ${result.plan.summary.upload}, download ${result.plan.summary.download}, unchanged ${result.plan.summary.unchanged}, ignored ${result.plan.summary.ignored}`,
|
|
94
|
+
];
|
|
95
|
+
if (result.dryRun) {
|
|
96
|
+
appendPathSection(lines, "Uploads:", uploadPaths);
|
|
97
|
+
appendPathSection(lines, "Downloads:", downloadPaths);
|
|
98
|
+
lines.push("No files changed.");
|
|
99
|
+
return redactSensitive(`${lines.join("\n")}\n`);
|
|
100
|
+
}
|
|
101
|
+
appendPathSection(lines, "Uploaded:", uploadPaths);
|
|
102
|
+
appendPathSection(lines, "Downloaded:", downloadPaths);
|
|
103
|
+
if (uploadPaths.length === 0 && downloadPaths.length === 0) {
|
|
104
|
+
lines.push("No file changes to apply.");
|
|
105
|
+
}
|
|
106
|
+
lines.push(`State: ${SYNC_STATE_PATH}`, "Next: olcx compile");
|
|
107
|
+
return redactSensitive(`${lines.join("\n")}\n`);
|
|
108
|
+
}
|
|
109
|
+
export function formatSyncConflictFailure(input) {
|
|
110
|
+
const lines = [
|
|
111
|
+
`Error: Sync paused because ${input.conflicts.length} conflict(s) were detected.`,
|
|
112
|
+
"Conflicts:",
|
|
113
|
+
...input.conflicts.map((conflict) => `- ${conflict.path} (${conflict.reason})`),
|
|
114
|
+
"Next: review the listed files, then run olcx sync --dry-run.",
|
|
115
|
+
];
|
|
116
|
+
if (!input.dryRun && input.reportWritten) {
|
|
117
|
+
lines.push(`Conflict report: ${CONFLICT_REPORT_PATH}`);
|
|
118
|
+
}
|
|
119
|
+
return redactSensitive(`${lines.join("\n")}\n`);
|
|
120
|
+
}
|
|
121
|
+
function operationPaths(plan, type) {
|
|
122
|
+
return plan.operations
|
|
123
|
+
.filter((operation) => operation.type === type)
|
|
124
|
+
.map((operation) => operation.path)
|
|
125
|
+
.sort();
|
|
126
|
+
}
|
|
127
|
+
function appendPathSection(lines, title, paths) {
|
|
128
|
+
if (paths.length === 0) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
lines.push(title, ...paths.map((path) => `- ${path}`));
|
|
132
|
+
}
|
|
133
|
+
function summarizeConflicts(conflicts) {
|
|
134
|
+
return conflicts.map((conflict) => ({
|
|
135
|
+
path: conflict.path,
|
|
136
|
+
reason: conflict.reason,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type OverleafBackend, type OverleafBackendFactory } from "../backend/index.js";
|
|
2
|
+
import { type PreparedWatchProject, type WatchCycleInput, type WatchCycleResult } from "../watch/workflow.js";
|
|
3
|
+
import type { WatchAdapter, WatchCommandResult, WatchSignalRuntime } from "../watch/types.js";
|
|
4
|
+
export interface RunWatchCommandInput {
|
|
5
|
+
cwd: string;
|
|
6
|
+
debounceMs: number;
|
|
7
|
+
backend?: OverleafBackend;
|
|
8
|
+
createBackend?: OverleafBackendFactory;
|
|
9
|
+
env?: Record<string, string | undefined>;
|
|
10
|
+
now?: () => Date;
|
|
11
|
+
watchAdapter?: WatchAdapter;
|
|
12
|
+
signals?: WatchSignalRuntime;
|
|
13
|
+
writeOut: (value: string) => void;
|
|
14
|
+
writeErr: (value: string) => void;
|
|
15
|
+
prepareProject?: (input: {
|
|
16
|
+
cwd: string;
|
|
17
|
+
env?: Record<string, string | undefined>;
|
|
18
|
+
now?: () => Date;
|
|
19
|
+
}) => Promise<PreparedWatchProject>;
|
|
20
|
+
runCycle?: (input: WatchCycleInput) => Promise<WatchCycleResult>;
|
|
21
|
+
}
|
|
22
|
+
export declare function runWatchCommand(input: RunWatchCommandInput): Promise<WatchCommandResult>;
|
|
23
|
+
export declare function formatWatchStarted(input: {
|
|
24
|
+
projectRoot: string;
|
|
25
|
+
debounceMs: number;
|
|
26
|
+
}): string;
|
|
27
|
+
export declare function formatWatchCycleSuccess(result: WatchCycleResult): string;
|
|
28
|
+
export declare function formatWatchFailure(error: unknown): string;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { EXIT_CODES, isOlcxError, redactSensitive } from "../cli-behavior.js";
|
|
2
|
+
import { createWatchQueue } from "../watch/queue.js";
|
|
3
|
+
import { createChokidarWatchAdapter, createWatchIgnoredPredicate } from "../watch/watcher.js";
|
|
4
|
+
import { prepareWatchProject, runWatchCycle, } from "../watch/workflow.js";
|
|
5
|
+
export async function runWatchCommand(input) {
|
|
6
|
+
const prepare = input.prepareProject ?? prepareWatchProject;
|
|
7
|
+
const cycle = input.runCycle ?? runWatchCycle;
|
|
8
|
+
const adapter = input.watchAdapter ?? createChokidarWatchAdapter();
|
|
9
|
+
const signals = input.signals ?? processSignals();
|
|
10
|
+
const prepared = await prepare({ cwd: input.cwd, env: input.env, now: input.now });
|
|
11
|
+
const ignored = createWatchIgnoredPredicate({
|
|
12
|
+
projectRoot: prepared.projectRoot,
|
|
13
|
+
userIgnorePatterns: prepared.config.sync.ignore,
|
|
14
|
+
});
|
|
15
|
+
let resolved = false;
|
|
16
|
+
let resolveDone;
|
|
17
|
+
const done = new Promise((resolve) => {
|
|
18
|
+
resolveDone = resolve;
|
|
19
|
+
});
|
|
20
|
+
let lastExitCode = EXIT_CODES.SUCCESS;
|
|
21
|
+
let paused = false;
|
|
22
|
+
const queue = createWatchQueue({
|
|
23
|
+
debounceMs: input.debounceMs,
|
|
24
|
+
run: async () => {
|
|
25
|
+
input.writeOut("Running: olcx sync\n");
|
|
26
|
+
const result = await cycle({
|
|
27
|
+
cwd: prepared.projectRoot,
|
|
28
|
+
backend: input.backend,
|
|
29
|
+
createBackend: input.createBackend,
|
|
30
|
+
env: input.env,
|
|
31
|
+
now: input.now,
|
|
32
|
+
});
|
|
33
|
+
input.writeOut(formatWatchCycleSuccess(result));
|
|
34
|
+
},
|
|
35
|
+
onFailure: async (error) => {
|
|
36
|
+
paused = true;
|
|
37
|
+
lastExitCode = isOlcxError(error) ? error.exitCode : EXIT_CODES.INTERNAL_ERROR;
|
|
38
|
+
input.writeErr(formatWatchFailure(error));
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const handle = await adapter.watch({
|
|
42
|
+
projectRoot: prepared.projectRoot,
|
|
43
|
+
ignored,
|
|
44
|
+
onChange: (event) => {
|
|
45
|
+
queue.trigger(event);
|
|
46
|
+
},
|
|
47
|
+
onError: (error) => {
|
|
48
|
+
queue.pause(error);
|
|
49
|
+
paused = true;
|
|
50
|
+
lastExitCode = EXIT_CODES.INTERNAL_ERROR;
|
|
51
|
+
input.writeErr(formatWatchFailure(error));
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const cleanupCallbacks = [];
|
|
55
|
+
async function shutdown() {
|
|
56
|
+
if (resolved)
|
|
57
|
+
return;
|
|
58
|
+
resolved = true;
|
|
59
|
+
for (const cleanup of cleanupCallbacks.splice(0))
|
|
60
|
+
cleanup();
|
|
61
|
+
await queue.shutdown();
|
|
62
|
+
await handle.close();
|
|
63
|
+
input.writeOut("Stopped: olcx watch\n");
|
|
64
|
+
const lastError = queue.status().lastError;
|
|
65
|
+
resolveDone(lastError === undefined ? { exitCode: lastExitCode, paused } : { exitCode: lastExitCode, paused, lastError });
|
|
66
|
+
}
|
|
67
|
+
cleanupCallbacks.push(signals.on("SIGINT", shutdown));
|
|
68
|
+
cleanupCallbacks.push(signals.on("SIGTERM", shutdown));
|
|
69
|
+
input.writeOut(formatWatchStarted({ projectRoot: prepared.projectRoot, debounceMs: input.debounceMs }));
|
|
70
|
+
return done;
|
|
71
|
+
}
|
|
72
|
+
export function formatWatchStarted(input) {
|
|
73
|
+
return redactSensitive([
|
|
74
|
+
"olcx watch",
|
|
75
|
+
`Watching: ${input.projectRoot}`,
|
|
76
|
+
`Debounce: ${input.debounceMs}ms`,
|
|
77
|
+
"Next: edit local files; press Ctrl-C to stop.",
|
|
78
|
+
].join("\n") + "\n");
|
|
79
|
+
}
|
|
80
|
+
export function formatWatchCycleSuccess(result) {
|
|
81
|
+
return redactSensitive([
|
|
82
|
+
"Synced: olcx sync",
|
|
83
|
+
`Compiled PDF: ${result.compile.pdfPath}`,
|
|
84
|
+
`Bytes: ${result.compile.bytesWritten}`,
|
|
85
|
+
"Waiting for changes.",
|
|
86
|
+
].join("\n") + "\n");
|
|
87
|
+
}
|
|
88
|
+
export function formatWatchFailure(error) {
|
|
89
|
+
if (isOlcxError(error)) {
|
|
90
|
+
const phase = readWatchPhase(error.details);
|
|
91
|
+
return redactSensitive([`Error: Watch paused after ${phase} failed: ${error.message}`, `Next: ${nextStepForFailure(error.code)}`].join("\n") + "\n");
|
|
92
|
+
}
|
|
93
|
+
const message = error instanceof Error ? error.message : "Unexpected watch failure.";
|
|
94
|
+
return redactSensitive(`Error: Watch paused after workflow failed: ${message}\nNext: stop olcx watch, inspect the error, then restart olcx watch.\n`);
|
|
95
|
+
}
|
|
96
|
+
function readWatchPhase(details) {
|
|
97
|
+
if (details && typeof details === "object" && details.watchPhase === "sync")
|
|
98
|
+
return "sync";
|
|
99
|
+
if (details && typeof details === "object" && details.watchPhase === "compile") {
|
|
100
|
+
return "compile";
|
|
101
|
+
}
|
|
102
|
+
return "workflow";
|
|
103
|
+
}
|
|
104
|
+
function nextStepForFailure(code) {
|
|
105
|
+
if (code === "SYNC_CONFLICT" || code === "SYNC_UNSAFE_OPERATION") {
|
|
106
|
+
return "review conflicts, run olcx sync --dry-run, run olcx sync after it is clean, then restart olcx watch.";
|
|
107
|
+
}
|
|
108
|
+
if (code === "COMPILE_FAILED" || code === "COMPILE_TIMEOUT") {
|
|
109
|
+
return "run olcx compile, fix the compile issue, then restart olcx watch.";
|
|
110
|
+
}
|
|
111
|
+
return "fix the reported issue, then restart olcx watch.";
|
|
112
|
+
}
|
|
113
|
+
function processSignals() {
|
|
114
|
+
return {
|
|
115
|
+
on(signal, listener) {
|
|
116
|
+
const wrapped = () => {
|
|
117
|
+
void listener();
|
|
118
|
+
};
|
|
119
|
+
process.once(signal, wrapped);
|
|
120
|
+
return () => process.off(signal, wrapped);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|