sweetlink 0.1.0 → 0.2.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/CHANGELOG.md +20 -0
- package/LICENSE +1 -1
- package/README.md +22 -11
- package/dist/daemon/src/codename.d.ts.map +1 -1
- package/dist/daemon/src/codename.js +11 -11
- package/dist/daemon/src/codename.js.map +1 -1
- package/dist/daemon/src/index.d.ts +1 -1
- package/dist/daemon/src/index.js +131 -122
- package/dist/daemon/src/index.js.map +1 -1
- package/dist/shared/src/env.d.ts.map +1 -1
- package/dist/shared/src/env.js +12 -12
- package/dist/shared/src/env.js.map +1 -1
- package/dist/shared/src/index.d.ts +30 -30
- package/dist/shared/src/index.d.ts.map +1 -1
- package/dist/shared/src/index.js +17 -17
- package/dist/shared/src/index.js.map +1 -1
- package/dist/shared/src/node.d.ts +1 -1
- package/dist/shared/src/node.d.ts.map +1 -1
- package/dist/shared/src/node.js +18 -18
- package/dist/shared/src/node.js.map +1 -1
- package/dist/src/codex.d.ts +1 -1
- package/dist/src/codex.js +19 -19
- package/dist/src/codex.js.map +1 -1
- package/dist/src/commands/click.d.ts +1 -1
- package/dist/src/commands/click.d.ts.map +1 -1
- package/dist/src/commands/click.js +32 -24
- package/dist/src/commands/click.js.map +1 -1
- package/dist/src/commands/run-js.d.ts +1 -1
- package/dist/src/commands/run-js.d.ts.map +1 -1
- package/dist/src/commands/run-js.js +10 -10
- package/dist/src/commands/run-js.js.map +1 -1
- package/dist/src/commands/trust-ca.d.ts +1 -1
- package/dist/src/commands/trust-ca.js +15 -15
- package/dist/src/core/config-file.d.ts +6 -0
- package/dist/src/core/config-file.d.ts.map +1 -1
- package/dist/src/core/config-file.js +73 -38
- package/dist/src/core/config-file.js.map +1 -1
- package/dist/src/core/config.d.ts +3 -2
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +31 -18
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/dev-bootstrap.d.ts +10 -0
- package/dist/src/core/dev-bootstrap.d.ts.map +1 -0
- package/dist/src/core/dev-bootstrap.js +112 -0
- package/dist/src/core/dev-bootstrap.js.map +1 -0
- package/dist/src/core/env.d.ts +1 -1
- package/dist/src/core/env.d.ts.map +1 -1
- package/dist/src/core/env.js +3 -3
- package/dist/src/core/env.js.map +1 -1
- package/dist/src/devtools-registry.d.ts.map +1 -1
- package/dist/src/devtools-registry.js +48 -46
- package/dist/src/devtools-registry.js.map +1 -1
- package/dist/src/env.d.ts +1 -1
- package/dist/src/env.js +1 -1
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +7 -6
- package/dist/src/http.js.map +1 -1
- package/dist/src/index.d.ts +7 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +450 -363
- package/dist/src/index.js.map +1 -1
- package/dist/src/runtime/browser/client.d.ts +3 -3
- package/dist/src/runtime/browser/client.d.ts.map +1 -1
- package/dist/src/runtime/browser/client.js +79 -72
- package/dist/src/runtime/browser/client.js.map +1 -1
- package/dist/src/runtime/browser/commands/index.d.ts +2 -2
- package/dist/src/runtime/browser/commands/index.js +17 -17
- package/dist/src/runtime/browser/commands/index.js.map +1 -1
- package/dist/src/runtime/browser/dom-to-image-loader.d.ts.map +1 -1
- package/dist/src/runtime/browser/dom-to-image-loader.js +7 -7
- package/dist/src/runtime/browser/dom-to-image-loader.js.map +1 -1
- package/dist/src/runtime/browser/index.d.ts +3 -3
- package/dist/src/runtime/browser/index.js +2 -2
- package/dist/src/runtime/browser/module-loader.js +2 -2
- package/dist/src/runtime/browser/screenshot/hooks.d.ts +25 -53
- package/dist/src/runtime/browser/screenshot/hooks.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/hooks.js +32 -29
- package/dist/src/runtime/browser/screenshot/hooks.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/index.d.ts +3 -3
- package/dist/src/runtime/browser/screenshot/index.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/index.js +17 -15
- package/dist/src/runtime/browser/screenshot/index.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js +13 -13
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js +24 -24
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js.map +1 -1
- package/dist/src/runtime/browser/screenshot/targets.d.ts +2 -2
- package/dist/src/runtime/browser/screenshot/targets.js +9 -9
- package/dist/src/runtime/browser/screenshot/utils.d.ts +1 -1
- package/dist/src/runtime/browser/screenshot/utils.d.ts.map +1 -1
- package/dist/src/runtime/browser/screenshot/utils.js +73 -71
- package/dist/src/runtime/browser/screenshot/utils.js.map +1 -1
- package/dist/src/runtime/browser/selector-discovery.d.ts +1 -1
- package/dist/src/runtime/browser/selector-discovery.d.ts.map +1 -1
- package/dist/src/runtime/browser/selector-discovery.js +24 -22
- package/dist/src/runtime/browser/selector-discovery.js.map +1 -1
- package/dist/src/runtime/browser/storage/session-storage.d.ts +1 -1
- package/dist/src/runtime/browser/storage/session-storage.d.ts.map +1 -1
- package/dist/src/runtime/browser/storage/session-storage.js +12 -10
- package/dist/src/runtime/browser/storage/session-storage.js.map +1 -1
- package/dist/src/runtime/browser/types.d.ts +7 -7
- package/dist/src/runtime/browser/types.js +1 -1
- package/dist/src/runtime/browser/utils/console.d.ts +1 -1
- package/dist/src/runtime/browser/utils/console.js +16 -16
- package/dist/src/runtime/browser/utils/console.js.map +1 -1
- package/dist/src/runtime/browser/utils/environment.js +2 -2
- package/dist/src/runtime/browser/utils/errors.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/errors.js +11 -11
- package/dist/src/runtime/browser/utils/number.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/number.js.map +1 -1
- package/dist/src/runtime/browser/utils/object.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/object.js +2 -2
- package/dist/src/runtime/browser/utils/object.js.map +1 -1
- package/dist/src/runtime/browser/utils/sanitize.js +2 -2
- package/dist/src/runtime/browser/utils/time.d.ts.map +1 -1
- package/dist/src/runtime/browser/utils/time.js +1 -1
- package/dist/src/runtime/chrome/cookies.d.ts +4 -4
- package/dist/src/runtime/chrome/cookies.d.ts.map +1 -1
- package/dist/src/runtime/chrome/cookies.js +31 -31
- package/dist/src/runtime/chrome/cookies.js.map +1 -1
- package/dist/src/runtime/chrome/deep-link.d.ts +13 -0
- package/dist/src/runtime/chrome/deep-link.d.ts.map +1 -0
- package/dist/src/runtime/chrome/deep-link.js +292 -0
- package/dist/src/runtime/chrome/deep-link.js.map +1 -0
- package/dist/src/runtime/chrome/diagnostics.d.ts.map +1 -1
- package/dist/src/runtime/chrome/diagnostics.js +13 -11
- package/dist/src/runtime/chrome/diagnostics.js.map +1 -1
- package/dist/src/runtime/chrome/focus.d.ts.map +1 -1
- package/dist/src/runtime/chrome/focus.js +5 -5
- package/dist/src/runtime/chrome/focus.js.map +1 -1
- package/dist/src/runtime/chrome/launch.d.ts.map +1 -1
- package/dist/src/runtime/chrome/launch.js +30 -30
- package/dist/src/runtime/chrome/launch.js.map +1 -1
- package/dist/src/runtime/chrome/puppeteer.d.ts +2 -2
- package/dist/src/runtime/chrome/puppeteer.d.ts.map +1 -1
- package/dist/src/runtime/chrome/puppeteer.js +16 -11
- package/dist/src/runtime/chrome/puppeteer.js.map +1 -1
- package/dist/src/runtime/chrome/reuse.d.ts.map +1 -1
- package/dist/src/runtime/chrome/reuse.js +38 -35
- package/dist/src/runtime/chrome/reuse.js.map +1 -1
- package/dist/src/runtime/chrome/session.d.ts +1 -1
- package/dist/src/runtime/chrome/session.d.ts.map +1 -1
- package/dist/src/runtime/chrome/session.js +12 -10
- package/dist/src/runtime/chrome/session.js.map +1 -1
- package/dist/src/runtime/chrome.d.ts +8 -8
- package/dist/src/runtime/chrome.js +8 -8
- package/dist/src/runtime/cookies.d.ts +1 -16
- package/dist/src/runtime/cookies.d.ts.map +1 -1
- package/dist/src/runtime/cookies.js +177 -281
- package/dist/src/runtime/cookies.js.map +1 -1
- package/dist/src/runtime/devstack.d.ts +1 -1
- package/dist/src/runtime/devstack.d.ts.map +1 -1
- package/dist/src/runtime/devstack.js +31 -28
- package/dist/src/runtime/devstack.js.map +1 -1
- package/dist/src/runtime/devtools/background.js +22 -22
- package/dist/src/runtime/devtools/cdp.d.ts +3 -2
- package/dist/src/runtime/devtools/cdp.d.ts.map +1 -1
- package/dist/src/runtime/devtools/cdp.js +61 -56
- package/dist/src/runtime/devtools/cdp.js.map +1 -1
- package/dist/src/runtime/devtools/config.d.ts +44 -1
- package/dist/src/runtime/devtools/config.d.ts.map +1 -1
- package/dist/src/runtime/devtools/config.js +15 -15
- package/dist/src/runtime/devtools/config.js.map +1 -1
- package/dist/src/runtime/devtools/constants.d.ts.map +1 -1
- package/dist/src/runtime/devtools/constants.js +18 -10
- package/dist/src/runtime/devtools/constants.js.map +1 -1
- package/dist/src/runtime/devtools/diagnostics.d.ts +6 -3
- package/dist/src/runtime/devtools/diagnostics.d.ts.map +1 -1
- package/dist/src/runtime/devtools/diagnostics.js +40 -38
- package/dist/src/runtime/devtools/diagnostics.js.map +1 -1
- package/dist/src/runtime/devtools/oauth.d.ts +1 -1
- package/dist/src/runtime/devtools/oauth.d.ts.map +1 -1
- package/dist/src/runtime/devtools/oauth.js +35 -28
- package/dist/src/runtime/devtools/oauth.js.map +1 -1
- package/dist/src/runtime/devtools/types.d.ts +3 -48
- package/dist/src/runtime/devtools/types.d.ts.map +1 -1
- package/dist/src/runtime/devtools.d.ts +7 -7
- package/dist/src/runtime/devtools.js +7 -7
- package/dist/src/runtime/next-devtools.d.ts.map +1 -1
- package/dist/src/runtime/next-devtools.js +12 -12
- package/dist/src/runtime/next-devtools.js.map +1 -1
- package/dist/src/runtime/screenshot.d.ts +9 -9
- package/dist/src/runtime/screenshot.d.ts.map +1 -1
- package/dist/src/runtime/screenshot.js +65 -46
- package/dist/src/runtime/screenshot.js.map +1 -1
- package/dist/src/runtime/scripts.d.ts +1 -1
- package/dist/src/runtime/scripts.d.ts.map +1 -1
- package/dist/src/runtime/scripts.js +28 -28
- package/dist/src/runtime/scripts.js.map +1 -1
- package/dist/src/runtime/session.d.ts +6 -6
- package/dist/src/runtime/session.d.ts.map +1 -1
- package/dist/src/runtime/session.js +35 -35
- package/dist/src/runtime/session.js.map +1 -1
- package/dist/src/runtime/smoke.d.ts +3 -3
- package/dist/src/runtime/smoke.d.ts.map +1 -1
- package/dist/src/runtime/smoke.js +85 -79
- package/dist/src/runtime/smoke.js.map +1 -1
- package/dist/src/runtime/url.d.ts +2 -2
- package/dist/src/runtime/url.d.ts.map +1 -1
- package/dist/src/runtime/url.js +20 -20
- package/dist/src/runtime/url.js.map +1 -1
- package/dist/src/screenshot-hooks.d.ts +1 -1
- package/dist/src/screenshot-hooks.d.ts.map +1 -1
- package/dist/src/screenshot-hooks.js +12 -12
- package/dist/src/screenshot-hooks.js.map +1 -1
- package/dist/src/shared/env.d.ts.map +1 -1
- package/dist/src/shared/env.js +11 -11
- package/dist/src/shared/env.js.map +1 -1
- package/dist/src/shared/index.d.ts +30 -30
- package/dist/src/shared/index.d.ts.map +1 -1
- package/dist/src/shared/index.js +17 -17
- package/dist/src/shared/index.js.map +1 -1
- package/dist/src/shared/node.d.ts +1 -1
- package/dist/src/shared/node.d.ts.map +1 -1
- package/dist/src/shared/node.js +18 -18
- package/dist/src/shared/node.js.map +1 -1
- package/dist/src/token.d.ts +1 -1
- package/dist/src/token.d.ts.map +1 -1
- package/dist/src/token.js +21 -18
- package/dist/src/token.js.map +1 -1
- package/dist/src/types.d.ts +7 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/util/app-label.js +4 -4
- package/dist/src/util/errors.d.ts.map +1 -1
- package/dist/src/util/errors.js +12 -10
- package/dist/src/util/errors.js.map +1 -1
- package/dist/src/util/path.js +2 -2
- package/dist/src/util/regex.js +4 -4
- package/package.json +48 -40
package/dist/src/shared/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createHmac, randomUUID, timingSafeEqual } from
|
|
1
|
+
import { createHmac, randomUUID, timingSafeEqual } from "node:crypto";
|
|
2
2
|
export const SWEETLINK_DEFAULT_PORT = 4455;
|
|
3
|
-
export const SWEETLINK_WS_PATH =
|
|
3
|
+
export const SWEETLINK_WS_PATH = "/bridge";
|
|
4
4
|
export const SWEETLINK_SESSION_EXP_SECONDS = 60 * 5; // 5 minutes
|
|
5
5
|
export const SWEETLINK_CLI_EXP_SECONDS = 60 * 60; // 1 hour
|
|
6
6
|
export const SWEETLINK_HEARTBEAT_INTERVAL_MS = 15_000;
|
|
7
7
|
export const SWEETLINK_HEARTBEAT_TOLERANCE_MS = 45_000;
|
|
8
|
-
export function signSweetLinkToken({ secret, scope, subject, ttlSeconds, sessionId }) {
|
|
8
|
+
export function signSweetLinkToken({ secret, scope, subject, ttlSeconds, sessionId, }) {
|
|
9
9
|
// We encode the payload ourselves (instead of relying on a JWT lib) so both daemon and browser
|
|
10
10
|
// can verify tokens without pulling in heavyweight dependencies.
|
|
11
11
|
if (!secret) {
|
|
12
|
-
throw new Error(
|
|
12
|
+
throw new Error("SweetLink secret is not configured");
|
|
13
13
|
}
|
|
14
14
|
const issuedAt = Math.floor(Date.now() / 1000);
|
|
15
15
|
const payload = {
|
|
@@ -20,37 +20,37 @@ export function signSweetLinkToken({ secret, scope, subject, ttlSeconds, session
|
|
|
20
20
|
issuedAt,
|
|
21
21
|
expiresAt: issuedAt + ttlSeconds,
|
|
22
22
|
};
|
|
23
|
-
const encodedPayload = Buffer.from(JSON.stringify(payload),
|
|
23
|
+
const encodedPayload = Buffer.from(JSON.stringify(payload), "utf8").toString("base64url");
|
|
24
24
|
const signature = signEncodedPayload(secret, encodedPayload);
|
|
25
25
|
return `${encodedPayload}.${signature}`;
|
|
26
26
|
}
|
|
27
|
-
export function verifySweetLinkToken({ secret, token, expectedScope }) {
|
|
27
|
+
export function verifySweetLinkToken({ secret, token, expectedScope, }) {
|
|
28
28
|
if (!secret) {
|
|
29
|
-
throw new Error(
|
|
29
|
+
throw new Error("SweetLink secret is not configured");
|
|
30
30
|
}
|
|
31
|
-
const [encodedPayload, providedSignature] = token.split(
|
|
31
|
+
const [encodedPayload, providedSignature] = token.split(".", 2);
|
|
32
32
|
if (!(encodedPayload && providedSignature)) {
|
|
33
|
-
throw new Error(
|
|
33
|
+
throw new Error("Malformed SweetLink token");
|
|
34
34
|
}
|
|
35
35
|
const expectedSignature = signEncodedPayload(secret, encodedPayload);
|
|
36
|
-
if (!timingSafeCompare(Buffer.from(providedSignature,
|
|
37
|
-
throw new Error(
|
|
36
|
+
if (!timingSafeCompare(Buffer.from(providedSignature, "base64url"), Buffer.from(expectedSignature, "base64url"))) {
|
|
37
|
+
throw new Error("Invalid SweetLink token signature");
|
|
38
38
|
}
|
|
39
|
-
const decoded = JSON.parse(Buffer.from(encodedPayload,
|
|
40
|
-
if (!decoded || typeof decoded !==
|
|
41
|
-
throw new Error(
|
|
39
|
+
const decoded = JSON.parse(Buffer.from(encodedPayload, "base64url").toString("utf8"));
|
|
40
|
+
if (!decoded || typeof decoded !== "object") {
|
|
41
|
+
throw new Error("Invalid SweetLink token payload");
|
|
42
42
|
}
|
|
43
43
|
const now = Math.floor(Date.now() / 1000);
|
|
44
44
|
if (decoded.expiresAt < now) {
|
|
45
|
-
throw new Error(
|
|
45
|
+
throw new Error("SweetLink token expired");
|
|
46
46
|
}
|
|
47
47
|
if (expectedScope && decoded.scope !== expectedScope) {
|
|
48
|
-
throw new Error(
|
|
48
|
+
throw new Error("SweetLink token scope mismatch");
|
|
49
49
|
}
|
|
50
50
|
return decoded;
|
|
51
51
|
}
|
|
52
52
|
function signEncodedPayload(secret, encodedPayload) {
|
|
53
|
-
return createHmac(
|
|
53
|
+
return createHmac("sha256", secret).update(encodedPayload).digest("base64url");
|
|
54
54
|
}
|
|
55
55
|
function timingSafeCompare(a, b) {
|
|
56
56
|
if (a.length !== b.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAC3C,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS;AAC3D,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC;AACtD,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAqBvD,MAAM,UAAU,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ export interface ResolveSweetLinkSecretOptions {
|
|
|
4
4
|
}
|
|
5
5
|
export interface SweetLinkSecretResolution {
|
|
6
6
|
readonly secret: string;
|
|
7
|
-
readonly source:
|
|
7
|
+
readonly source: "env" | "file" | "generated";
|
|
8
8
|
readonly path?: string;
|
|
9
9
|
}
|
|
10
10
|
export declare function resolveSweetLinkSecret(options?: ResolveSweetLinkSecretOptions): Promise<SweetLinkSecretResolution>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/shared/node.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/shared/node.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAqCD,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,yBAAyB,CAAC,CAqCpC;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD"}
|
package/dist/src/shared/node.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { randomBytes } from
|
|
2
|
-
import { constants as fsConstants } from
|
|
3
|
-
import os from
|
|
4
|
-
import path from
|
|
5
|
-
import { debuglog } from
|
|
6
|
-
import { sweetLinkEnv } from
|
|
7
|
-
const DEFAULT_SECRET_PATH = path.join(os.homedir(),
|
|
8
|
-
const FS_PROMISES_MODULE =
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { constants as fsConstants } from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { debuglog } from "node:util";
|
|
6
|
+
import { sweetLinkEnv } from "./env.js";
|
|
7
|
+
const DEFAULT_SECRET_PATH = path.join(os.homedir(), ".sweetlink", "secret.key");
|
|
8
|
+
const FS_PROMISES_MODULE = "node:fs/promises";
|
|
9
9
|
let cachedFsPromises = null;
|
|
10
|
-
const debug = debuglog(
|
|
10
|
+
const debug = debuglog("sweetlink");
|
|
11
11
|
function ensureNodeRuntime() {
|
|
12
12
|
const globalScope = globalThis;
|
|
13
13
|
const nodeVersion = globalScope.process?.versions?.node;
|
|
@@ -15,9 +15,9 @@ function ensureNodeRuntime() {
|
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
17
|
if (globalScope.window !== undefined) {
|
|
18
|
-
throw new TypeError(
|
|
18
|
+
throw new TypeError("SweetLink secret resolution requires a Node.js runtime; detected browser-like window without Node metadata.");
|
|
19
19
|
}
|
|
20
|
-
throw new TypeError(
|
|
20
|
+
throw new TypeError("Node.js runtime metadata is unavailable; refusing to access SweetLink secrets.");
|
|
21
21
|
}
|
|
22
22
|
async function loadFsModule() {
|
|
23
23
|
if (cachedFsPromises) {
|
|
@@ -30,36 +30,36 @@ async function loadFsModule() {
|
|
|
30
30
|
export async function resolveSweetLinkSecret(options = {}) {
|
|
31
31
|
const envSecret = sweetLinkEnv.secret;
|
|
32
32
|
if (envSecret && envSecret.length >= 32) {
|
|
33
|
-
return { secret: envSecret, source:
|
|
33
|
+
return { secret: envSecret, source: "env" };
|
|
34
34
|
}
|
|
35
35
|
const secretPath = options.secretPath ?? DEFAULT_SECRET_PATH;
|
|
36
36
|
try {
|
|
37
37
|
const fsModule = await loadFsModule();
|
|
38
38
|
const readSecretFile = async () => {
|
|
39
39
|
await fsModule.access(secretPath, fsConstants.R_OK);
|
|
40
|
-
return fsModule.readFile(secretPath,
|
|
40
|
+
return fsModule.readFile(secretPath, "utf8");
|
|
41
41
|
};
|
|
42
42
|
const secretFileContents = await readSecretFile();
|
|
43
43
|
const fileSecret = secretFileContents.trim();
|
|
44
44
|
if (fileSecret.length >= 32) {
|
|
45
|
-
return { secret: fileSecret, source:
|
|
45
|
+
return { secret: fileSecret, source: "file", path: secretPath };
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
catch (error) {
|
|
49
|
-
debug(
|
|
49
|
+
debug("Unable to read SweetLink secret from file; falling back to autoCreate logic.", {
|
|
50
50
|
path: secretPath,
|
|
51
51
|
error,
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
if (!options.autoCreate) {
|
|
55
|
-
throw new Error(
|
|
55
|
+
throw new Error("SWEETLINK_SECRET is not configured; provide env var or run daemon with autoCreate enabled");
|
|
56
56
|
}
|
|
57
|
-
const generated = randomBytes(48).toString(
|
|
57
|
+
const generated = randomBytes(48).toString("base64url");
|
|
58
58
|
const directory = path.dirname(secretPath);
|
|
59
59
|
const { mkdir, writeFile } = await loadFsModule();
|
|
60
60
|
await mkdir(directory, { recursive: true });
|
|
61
61
|
await writeFile(secretPath, `${generated}\n`, { mode: 0o600 });
|
|
62
|
-
return { secret: generated, source:
|
|
62
|
+
return { secret: generated, source: "generated", path: secretPath };
|
|
63
63
|
}
|
|
64
64
|
export function getDefaultSweetLinkSecretPath() {
|
|
65
65
|
return DEFAULT_SECRET_PATH;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/shared/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAahF,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAI9C,IAAI,gBAAgB,GAA4B,IAAI,CAAC;AACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAEpC,SAAS,iBAAiB;IACxB,MAAM,WAAW,GAAG,UAGnB,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;IACxD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,SAAS,CACjB,6GAA6G,CAC9G,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/shared/node.ts"],"names":[],"mappings":"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"}
|
package/dist/src/token.d.ts
CHANGED
package/dist/src/token.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/token.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAwB,SAAS,EAAE,MAAM,YAAY,CAAC;AAalE,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDtE"}
|
package/dist/src/token.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { SWEETLINK_CLI_EXP_SECONDS, signSweetLinkToken } from
|
|
2
|
-
import { resolveSweetLinkSecret } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { SWEETLINK_CLI_EXP_SECONDS, signSweetLinkToken } from "../shared/src/index.js";
|
|
2
|
+
import { resolveSweetLinkSecret } from "../shared/src/node.js";
|
|
3
|
+
import { loadDevBootstrap } from "./core/dev-bootstrap.js";
|
|
4
|
+
import { fetchJson } from "./http.js";
|
|
5
|
+
import { describeAppForPrompt } from "./util/app-label.js";
|
|
6
|
+
import { describeUnknown } from "./util/errors.js";
|
|
7
|
+
import { TRAILING_SLASH_PATTERN } from "./util/regex.js";
|
|
7
8
|
let cachedCliToken = null;
|
|
8
9
|
export function resetCliTokenCache() {
|
|
9
10
|
cachedCliToken = null;
|
|
@@ -13,45 +14,47 @@ export async function fetchCliToken(config) {
|
|
|
13
14
|
if (cachedCliToken && cachedCliToken.expiresAt - 30 > now) {
|
|
14
15
|
return cachedCliToken.token;
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
const bootstrap = await loadDevBootstrap(config).catch(() => null);
|
|
18
|
+
const adminApiKey = config.adminApiKey ?? bootstrap?.adminApiKey ?? null;
|
|
19
|
+
if (adminApiKey) {
|
|
17
20
|
try {
|
|
18
|
-
const response = await fetchJson(`${config.appBaseUrl.replace(TRAILING_SLASH_PATTERN,
|
|
19
|
-
method:
|
|
21
|
+
const response = await fetchJson(`${config.appBaseUrl.replace(TRAILING_SLASH_PATTERN, "")}/api/admin/sweetlink/cli-token`, {
|
|
22
|
+
method: "POST",
|
|
20
23
|
headers: {
|
|
21
|
-
Authorization: `Bearer ${
|
|
22
|
-
|
|
24
|
+
Authorization: `Bearer ${adminApiKey}`,
|
|
25
|
+
"Content-Type": "application/json",
|
|
23
26
|
},
|
|
24
27
|
});
|
|
25
28
|
cachedCliToken = {
|
|
26
29
|
token: response.accessToken,
|
|
27
30
|
expiresAt: response.expiresAt,
|
|
28
|
-
source:
|
|
31
|
+
source: "api",
|
|
29
32
|
};
|
|
30
33
|
return response.accessToken;
|
|
31
34
|
}
|
|
32
35
|
catch (error) {
|
|
33
36
|
const detail = error instanceof Error ? error.message : String(error);
|
|
34
|
-
console.warn(
|
|
37
|
+
console.warn("[SweetLink CLI] Falling back to local secret after CLI token request failed:", detail);
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
try {
|
|
38
41
|
const secretResolution = await resolveSweetLinkSecret();
|
|
39
42
|
const token = signSweetLinkToken({
|
|
40
43
|
secret: secretResolution.secret,
|
|
41
|
-
scope:
|
|
42
|
-
subject:
|
|
44
|
+
scope: "cli",
|
|
45
|
+
subject: "local-cli",
|
|
43
46
|
ttlSeconds: SWEETLINK_CLI_EXP_SECONDS,
|
|
44
47
|
});
|
|
45
48
|
const expiresAt = Math.floor(Date.now() / 1000) + SWEETLINK_CLI_EXP_SECONDS;
|
|
46
|
-
cachedCliToken = { token, expiresAt, source:
|
|
49
|
+
cachedCliToken = { token, expiresAt, source: "secret" };
|
|
47
50
|
return token;
|
|
48
51
|
}
|
|
49
52
|
catch (error) {
|
|
50
53
|
const detail = error instanceof Error ? error.message : describeUnknown(error);
|
|
51
54
|
const targetDescription = describeAppForPrompt(config.appLabel);
|
|
52
|
-
const hint =
|
|
55
|
+
const hint = adminApiKey
|
|
53
56
|
? `Check that your admin key is valid or ensure ${targetDescription} is running.`
|
|
54
|
-
:
|
|
57
|
+
: "Provide --admin-key or start the SweetLink daemon once (pnpm sweetlink) to generate the shared secret.";
|
|
55
58
|
throw new Error(`Unable to resolve SweetLink CLI token. Reason: ${detail}. ${hint}`);
|
|
56
59
|
}
|
|
57
60
|
}
|
package/dist/src/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAkC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/token.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -3,10 +3,16 @@ export interface CliConfig {
|
|
|
3
3
|
readonly appBaseUrl: string;
|
|
4
4
|
readonly daemonBaseUrl: string;
|
|
5
5
|
readonly adminApiKey: string | null;
|
|
6
|
+
readonly devBootstrap: DevBootstrapConfig | null;
|
|
6
7
|
readonly oauthScriptPath: string | null;
|
|
7
8
|
readonly servers: Record<string, ServerConfig>;
|
|
8
9
|
}
|
|
9
|
-
export
|
|
10
|
+
export interface DevBootstrapConfig {
|
|
11
|
+
readonly endpoint: string | null;
|
|
12
|
+
readonly loginPath: string | null;
|
|
13
|
+
readonly redirectParam: string | null;
|
|
14
|
+
}
|
|
15
|
+
export type CachedCliTokenSource = "secret" | "api";
|
|
10
16
|
export interface ServerConfig {
|
|
11
17
|
readonly env: string;
|
|
12
18
|
readonly start: string[] | null;
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { regex } from
|
|
2
|
-
export const DEFAULT_APP_LABEL =
|
|
3
|
-
const LEADING_ARTICLE_PATTERN = regex.as(String.raw `^(?:the|a|an|your)\b`,
|
|
1
|
+
import { regex } from "arkregex";
|
|
2
|
+
export const DEFAULT_APP_LABEL = "your application";
|
|
3
|
+
const LEADING_ARTICLE_PATTERN = regex.as(String.raw `^(?:the|a|an|your)\b`, "i");
|
|
4
4
|
export function normalizeAppLabel(value) {
|
|
5
|
-
if (typeof value !==
|
|
5
|
+
if (typeof value !== "string") {
|
|
6
6
|
return null;
|
|
7
7
|
}
|
|
8
8
|
const trimmed = value.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/util/errors.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB3E;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/util/errors.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB3E;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,CAM/E;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAY,GAAG,MAAM,CAkB5E;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAMnE"}
|
package/dist/src/util/errors.js
CHANGED
|
@@ -1,41 +1,43 @@
|
|
|
1
|
-
import { sweetLinkDebug } from
|
|
1
|
+
import { sweetLinkDebug } from "../env.js";
|
|
2
2
|
/** Extracts a readable message from unknown error-like values. */
|
|
3
3
|
export function extractEventMessage(event, prefix) {
|
|
4
4
|
const parts = [];
|
|
5
5
|
if (prefix) {
|
|
6
6
|
parts.push(prefix);
|
|
7
7
|
}
|
|
8
|
-
if (typeof event ===
|
|
8
|
+
if (typeof event === "string") {
|
|
9
9
|
parts.push(event);
|
|
10
10
|
}
|
|
11
11
|
else if (event instanceof Error) {
|
|
12
|
-
parts.push(event.message || event.name ||
|
|
12
|
+
parts.push(event.message || event.name || "Unknown error");
|
|
13
13
|
}
|
|
14
|
-
else if (event && typeof event ===
|
|
14
|
+
else if (event && typeof event === "object" && "message" in event) {
|
|
15
15
|
const message = event.message;
|
|
16
|
-
parts.push(typeof message ===
|
|
16
|
+
parts.push(typeof message === "string" ? message : JSON.stringify(message));
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
19
|
parts.push(String(event));
|
|
20
20
|
}
|
|
21
|
-
return parts.join(
|
|
21
|
+
return parts.join(": ");
|
|
22
22
|
}
|
|
23
23
|
/** Type guard for Node errno exceptions. */
|
|
24
24
|
export function isErrnoException(value) {
|
|
25
|
-
return typeof value ===
|
|
25
|
+
return (typeof value === "object" &&
|
|
26
|
+
value !== null &&
|
|
27
|
+
typeof value.code === "string");
|
|
26
28
|
}
|
|
27
29
|
/** Formats unknown values for human-readable logging. */
|
|
28
|
-
export function describeUnknown(value, fallback =
|
|
30
|
+
export function describeUnknown(value, fallback = "unknown") {
|
|
29
31
|
if (value === null || value === undefined) {
|
|
30
32
|
return fallback;
|
|
31
33
|
}
|
|
32
34
|
if (value instanceof Error) {
|
|
33
35
|
return value.message || value.name || fallback;
|
|
34
36
|
}
|
|
35
|
-
if (typeof value ===
|
|
37
|
+
if (typeof value === "string") {
|
|
36
38
|
return value;
|
|
37
39
|
}
|
|
38
|
-
if (typeof value ===
|
|
40
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
|
|
39
41
|
return String(value);
|
|
40
42
|
}
|
|
41
43
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/util/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,MAAe;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACpE,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/util/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,MAAe;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACpE,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CACvD,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAQ,GAAG,SAAS;IAClE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAc;IAC3D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChF,OAAO,CAAC,IAAI,CAAC,mBAAmB,OAAO,KAAK,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
package/dist/src/util/path.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import os from
|
|
1
|
+
import os from "node:os";
|
|
2
2
|
/** Collapses the current home directory so paths read cleanly in logs. */
|
|
3
3
|
export function formatPathForDisplay(value) {
|
|
4
|
-
return value.replace(os.homedir(),
|
|
4
|
+
return value.replace(os.homedir(), "~");
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=path.js.map
|
package/dist/src/util/regex.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { regex } from
|
|
2
|
-
export const TRAILING_SLASH_PATTERN = regex.as(
|
|
3
|
-
export const OPTIONAL_TRAILING_SLASH_PATTERN = regex.as(
|
|
4
|
-
export const LEADING_SLASH_PATTERN = regex.as(
|
|
1
|
+
import { regex } from "arkregex";
|
|
2
|
+
export const TRAILING_SLASH_PATTERN = regex.as("/+$");
|
|
3
|
+
export const OPTIONAL_TRAILING_SLASH_PATTERN = regex.as("/?$");
|
|
4
|
+
export const LEADING_SLASH_PATTERN = regex.as("^/+");
|
|
5
5
|
//# sourceMappingURL=regex.js.map
|
package/package.json
CHANGED
|
@@ -1,37 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sweetlink",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"license": "MIT",
|
|
3
|
+
"version": "0.2.1",
|
|
5
4
|
"private": false,
|
|
6
|
-
"type": "module",
|
|
7
5
|
"description": "Controlled-browser automation CLI for SweetLink sessions.",
|
|
8
|
-
"homepage": "https://github.com/steipete/sweetlink",
|
|
9
|
-
"repository": {
|
|
10
|
-
"type": "git",
|
|
11
|
-
"url": "https://github.com/steipete/sweetlink.git",
|
|
12
|
-
"directory": "apps/sweetlink"
|
|
13
|
-
},
|
|
14
|
-
"bugs": {
|
|
15
|
-
"url": "https://github.com/steipete/sweetlink/issues"
|
|
16
|
-
},
|
|
17
6
|
"keywords": [
|
|
18
|
-
"sweetlink",
|
|
19
7
|
"automation",
|
|
20
8
|
"browser",
|
|
9
|
+
"cli",
|
|
21
10
|
"devtools",
|
|
22
|
-
"
|
|
11
|
+
"sweetlink"
|
|
23
12
|
],
|
|
24
|
-
"
|
|
25
|
-
|
|
13
|
+
"homepage": "https://github.com/steipete/sweetlink",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/steipete/sweetlink/issues"
|
|
26
16
|
},
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
"
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/steipete/sweetlink.git"
|
|
21
|
+
},
|
|
22
|
+
"bin": {
|
|
23
|
+
"sweetlink": "./dist/src/index.js",
|
|
24
|
+
"sweetlinkd": "./dist/daemon/src/index.js"
|
|
35
25
|
},
|
|
36
26
|
"files": [
|
|
37
27
|
"dist",
|
|
@@ -39,6 +29,7 @@
|
|
|
39
29
|
"LICENSE",
|
|
40
30
|
"CHANGELOG.md"
|
|
41
31
|
],
|
|
32
|
+
"type": "module",
|
|
42
33
|
"main": "./dist/src/index.js",
|
|
43
34
|
"module": "./dist/src/index.js",
|
|
44
35
|
"types": "./dist/src/index.d.ts",
|
|
@@ -57,30 +48,47 @@
|
|
|
57
48
|
"publishConfig": {
|
|
58
49
|
"access": "public"
|
|
59
50
|
},
|
|
60
|
-
"engines": {
|
|
61
|
-
"node": ">=22.0.0",
|
|
62
|
-
"pnpm": ">=10.16.0"
|
|
63
|
-
},
|
|
64
51
|
"dependencies": {
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"commander": "^
|
|
68
|
-
"dotenv": "^17.2
|
|
69
|
-
"es-toolkit": "^1.
|
|
52
|
+
"@steipete/sweet-cookie": "0.3.0",
|
|
53
|
+
"arkregex": "^0.0.5",
|
|
54
|
+
"commander": "^15.0.0",
|
|
55
|
+
"dotenv": "^17.4.2",
|
|
56
|
+
"es-toolkit": "^1.47.0",
|
|
70
57
|
"html2canvas": "^1.4.1",
|
|
71
|
-
"playwright-core": "^1.
|
|
72
|
-
"puppeteer": "^
|
|
58
|
+
"playwright-core": "^1.60.0",
|
|
59
|
+
"puppeteer-core": "^25.1.0",
|
|
73
60
|
"random-word-slugs": "^0.1.7",
|
|
74
61
|
"tldjs": "^2.3.2",
|
|
75
|
-
"undici": "^
|
|
76
|
-
"ws": "^8.
|
|
77
|
-
"zod": "^
|
|
62
|
+
"undici": "^8.4.1",
|
|
63
|
+
"ws": "^8.21.0",
|
|
64
|
+
"zod": "^4.4.3"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/node": "^25.9.2",
|
|
68
|
+
"@types/ws": "^8.18.1",
|
|
69
|
+
"@typescript/native-preview": "7.0.0-dev.20260609.1",
|
|
70
|
+
"jsdom": "^29.1.1",
|
|
71
|
+
"oxfmt": "^0.54.0",
|
|
72
|
+
"oxlint": "^1.69.0",
|
|
73
|
+
"tsx": "^4.22.4",
|
|
74
|
+
"typescript": "^6.0.3",
|
|
75
|
+
"ultracite": "^7.8.2",
|
|
76
|
+
"vite": "^8.0.16",
|
|
77
|
+
"vitest": "^4.1.8"
|
|
78
|
+
},
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": ">=24.0.0",
|
|
81
|
+
"pnpm": ">=10.16.0"
|
|
78
82
|
},
|
|
79
83
|
"scripts": {
|
|
80
84
|
"dev": "tsx src/index.ts",
|
|
81
|
-
"build": "
|
|
85
|
+
"build": "tsgo --project tsconfig.build.json",
|
|
82
86
|
"test": "vitest run --config vitest.config.ts",
|
|
83
|
-
"
|
|
87
|
+
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
|
88
|
+
"format": "node scripts/format.mjs --write",
|
|
89
|
+
"format:check": "node scripts/format.mjs",
|
|
90
|
+
"lint": "pnpm format:check && oxlint --deny-warnings ./src ./shared/src ./daemon/src ./tests",
|
|
91
|
+
"lint:fix": "pnpm format && oxlint --fix ./src ./shared/src ./daemon/src ./tests",
|
|
84
92
|
"standalone:post-sync": "tsx scripts/post-sync.ts"
|
|
85
93
|
}
|
|
86
94
|
}
|