latchkey 2.1.0 → 2.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/README.md +12 -11
- package/dist/integrations/SKILL.md +9 -7
- package/dist/package.json +2 -2
- package/dist/src/atomicWrite.d.ts +18 -0
- package/dist/src/atomicWrite.d.ts.map +1 -0
- package/dist/src/atomicWrite.js +42 -0
- package/dist/src/atomicWrite.js.map +1 -0
- package/dist/src/cli.js +10 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +31 -5
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/configDataStore.d.ts.map +1 -1
- package/dist/src/configDataStore.js +3 -2
- package/dist/src/configDataStore.js.map +1 -1
- package/dist/src/encryptedStorage.d.ts.map +1 -1
- package/dist/src/encryptedStorage.js +3 -2
- package/dist/src/encryptedStorage.js.map +1 -1
- package/dist/src/migrations.d.ts.map +1 -1
- package/dist/src/migrations.js +3 -2
- package/dist/src/migrations.js.map +1 -1
- package/dist/src/playwrightUtils.d.ts +9 -0
- package/dist/src/playwrightUtils.d.ts.map +1 -1
- package/dist/src/playwrightUtils.js +21 -0
- package/dist/src/playwrightUtils.js.map +1 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +3 -1
- package/dist/src/registry.js.map +1 -1
- package/dist/src/services/coolify.d.ts +12 -0
- package/dist/src/services/coolify.d.ts.map +1 -0
- package/dist/src/services/coolify.js +14 -0
- package/dist/src/services/coolify.js.map +1 -0
- package/dist/src/services/index.d.ts +2 -0
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +2 -0
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/umami.d.ts +12 -0
- package/dist/src/services/umami.d.ts.map +1 -0
- package/dist/src/services/umami.js +14 -0
- package/dist/src/services/umami.js.map +1 -0
- package/dist/tests/atomicWrite.test.d.ts +2 -0
- package/dist/tests/atomicWrite.test.d.ts.map +1 -0
- package/dist/tests/atomicWrite.test.js +95 -0
- package/dist/tests/atomicWrite.test.js.map +1 -0
- package/dist/tests/cli.test.js +250 -6
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/lint.test.js +1 -1
- package/dist/tests/lint.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -7,6 +7,27 @@ export class BrowserDisabledError extends Error {
|
|
|
7
7
|
this.name = 'BrowserDisabledError';
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
+
export class GraphicalEnvironmentNotFoundError extends Error {
|
|
11
|
+
constructor() {
|
|
12
|
+
super('No graphical environment detected (neither DISPLAY nor WAYLAND_DISPLAY is set). ' +
|
|
13
|
+
'Browser-based authentication requires a graphical environment.');
|
|
14
|
+
this.name = 'GraphicalEnvironmentNotFoundError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check whether a graphical environment is available.
|
|
19
|
+
* On Linux, this requires DISPLAY or WAYLAND_DISPLAY to be set.
|
|
20
|
+
* On other platforms (macOS, Windows), a display is assumed to be available.
|
|
21
|
+
*/
|
|
22
|
+
export function hasGraphicalEnvironment() {
|
|
23
|
+
if (process.platform !== 'linux') {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const display = process.env.DISPLAY;
|
|
27
|
+
const waylandDisplay = process.env.WAYLAND_DISPLAY;
|
|
28
|
+
return ((display !== undefined && display !== '') ||
|
|
29
|
+
(waylandDisplay !== undefined && waylandDisplay !== ''));
|
|
30
|
+
}
|
|
10
31
|
export class BrowserFlowsNotSupportedError extends Error {
|
|
11
32
|
constructor(serviceName, authSubcommand = 'set') {
|
|
12
33
|
super(`Service '${serviceName}' does not support browser flows. Use 'latchkey auth ${authSubcommand} ${serviceName}' to set credentials manually.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightUtils.js","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"playwrightUtils.js","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,OAAO,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,OAAO,EA2BR,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,IAAI,EAAE,MAAM;CAMzB;AAID,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,QAAQ,EAAE,SAAS,OAAO,EAAE;IAIxC,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IASvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAgBtC;AAED,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAqB/F;AAED,eAAO,MAAM,QAAQ,UA2BnB,CAAC"}
|
package/dist/src/registry.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { loadRegisteredServices } from './configDataStore.js';
|
|
5
5
|
import { RegisteredService } from './services/core/registered.js';
|
|
6
|
-
import { SLACK, DISCORD, DROPBOX, GITHUB, LINEAR, NOTION, GOOGLE_GMAIL, GOOGLE_CALENDAR, GOOGLE_DRIVE, GOOGLE_SHEETS, GOOGLE_DOCS, GOOGLE_PEOPLE, MAILCHIMP, GITLAB, ZOOM, SENTRY, STRIPE, FIGMA, GOOGLE_ANALYTICS, CALENDLY, YELP, TELEGRAM, AWS, GOOGLE_DIRECTIONS, } from './services/index.js';
|
|
6
|
+
import { SLACK, DISCORD, DROPBOX, GITHUB, LINEAR, NOTION, GOOGLE_GMAIL, GOOGLE_CALENDAR, GOOGLE_DRIVE, GOOGLE_SHEETS, GOOGLE_DOCS, GOOGLE_PEOPLE, MAILCHIMP, GITLAB, ZOOM, SENTRY, STRIPE, FIGMA, GOOGLE_ANALYTICS, CALENDLY, YELP, TELEGRAM, AWS, GOOGLE_DIRECTIONS, COOLIFY, UMAMI, } from './services/index.js';
|
|
7
7
|
export class DuplicateServiceNameError extends Error {
|
|
8
8
|
constructor(name) {
|
|
9
9
|
super(`A service with the name '${name}' already exists.`);
|
|
@@ -106,5 +106,7 @@ export const REGISTRY = new Registry([
|
|
|
106
106
|
TELEGRAM,
|
|
107
107
|
AWS,
|
|
108
108
|
GOOGLE_DIRECTIONS,
|
|
109
|
+
COOLIFY,
|
|
110
|
+
UMAMI,
|
|
109
111
|
]);
|
|
110
112
|
//# sourceMappingURL=registry.js.map
|
package/dist/src/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAEL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACb,SAAS,EACT,MAAM,EACN,IAAI,EACJ,MAAM,EACN,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,GAAG,EACH,iBAAiB,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Service } from './core/base.js';
|
|
2
|
+
export declare class Coolify extends Service {
|
|
3
|
+
readonly name = "coolify";
|
|
4
|
+
readonly displayName = "Coolify";
|
|
5
|
+
readonly baseApiUrls: readonly ["https://app.coolify.io/api/"];
|
|
6
|
+
readonly loginUrl = "https://app.coolify.io/login";
|
|
7
|
+
readonly info = "https://coolify.io/docs/llms.txt";
|
|
8
|
+
readonly credentialCheckCurlArguments: readonly ["https://app.coolify.io/api/v1/version"];
|
|
9
|
+
setCredentialsExample(serviceName: string): string;
|
|
10
|
+
}
|
|
11
|
+
export declare const COOLIFY: Coolify;
|
|
12
|
+
//# sourceMappingURL=coolify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.d.ts","sourceRoot":"","sources":["../../../src/services/coolify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,OAAQ,SAAQ,OAAO;IAClC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IACjC,QAAQ,CAAC,WAAW,2CAA4C;IAChE,QAAQ,CAAC,QAAQ,kCAAkC;IACnD,QAAQ,CAAC,IAAI,sCAAsC;IAEnD,QAAQ,CAAC,4BAA4B,qDAAsD;IAE3F,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAGnD;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Service } from './core/base.js';
|
|
2
|
+
export class Coolify extends Service {
|
|
3
|
+
name = 'coolify';
|
|
4
|
+
displayName = 'Coolify';
|
|
5
|
+
baseApiUrls = ['https://app.coolify.io/api/'];
|
|
6
|
+
loginUrl = 'https://app.coolify.io/login';
|
|
7
|
+
info = 'https://coolify.io/docs/llms.txt';
|
|
8
|
+
credentialCheckCurlArguments = ['https://app.coolify.io/api/v1/version'];
|
|
9
|
+
setCredentialsExample(serviceName) {
|
|
10
|
+
return `latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export const COOLIFY = new Coolify();
|
|
14
|
+
//# sourceMappingURL=coolify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.js","sourceRoot":"","sources":["../../../src/services/coolify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,OAAQ,SAAQ,OAAO;IACzB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IACxB,WAAW,GAAG,CAAC,6BAA6B,CAAU,CAAC;IACvD,QAAQ,GAAG,8BAA8B,CAAC;IAC1C,IAAI,GAAG,kCAAkC,CAAC;IAE1C,4BAA4B,GAAG,CAAC,uCAAuC,CAAU,CAAC;IAE3F,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -29,4 +29,6 @@ export { GoogleAnalytics, GOOGLE_ANALYTICS } from './google/analytics.js';
|
|
|
29
29
|
export { Calendly, CALENDLY } from './calendly.js';
|
|
30
30
|
export { GoogleDirections, GOOGLE_DIRECTIONS } from './google/directions.js';
|
|
31
31
|
export { Yelp, YELP } from './yelp.js';
|
|
32
|
+
export { Coolify, COOLIFY } from './coolify.js';
|
|
33
|
+
export { Umami, UMAMI } from './umami.js';
|
|
32
34
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -29,4 +29,6 @@ export { GoogleAnalytics, GOOGLE_ANALYTICS } from './google/analytics.js';
|
|
|
29
29
|
export { Calendly, CALENDLY } from './calendly.js';
|
|
30
30
|
export { GoogleDirections, GOOGLE_DIRECTIONS } from './google/directions.js';
|
|
31
31
|
export { Yelp, YELP } from './yelp.js';
|
|
32
|
+
export { Coolify, COOLIFY } from './coolify.js';
|
|
33
|
+
export { Umami, UMAMI } from './umami.js';
|
|
32
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Service } from './core/base.js';
|
|
2
|
+
export declare class Umami extends Service {
|
|
3
|
+
readonly name = "umami";
|
|
4
|
+
readonly displayName = "Umami";
|
|
5
|
+
readonly baseApiUrls: readonly ["https://api.umami.is/"];
|
|
6
|
+
readonly loginUrl = "https://cloud.umami.is/login";
|
|
7
|
+
readonly info = "https://umami.is/docs/api.";
|
|
8
|
+
readonly credentialCheckCurlArguments: readonly ["https://api.umami.is/v1/websites"];
|
|
9
|
+
setCredentialsExample(serviceName: string): string;
|
|
10
|
+
}
|
|
11
|
+
export declare const UMAMI: Umami;
|
|
12
|
+
//# sourceMappingURL=umami.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"umami.d.ts","sourceRoot":"","sources":["../../../src/services/umami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,KAAM,SAAQ,OAAO;IAChC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,WAAW;IAC/B,QAAQ,CAAC,WAAW,qCAAsC;IAC1D,QAAQ,CAAC,QAAQ,kCAAkC;IACnD,QAAQ,CAAC,IAAI,gCAAgC;IAE7C,QAAQ,CAAC,4BAA4B,gDAAiD;IAEtF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAGnD;AAED,eAAO,MAAM,KAAK,OAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Service } from './core/base.js';
|
|
2
|
+
export class Umami extends Service {
|
|
3
|
+
name = 'umami';
|
|
4
|
+
displayName = 'Umami';
|
|
5
|
+
baseApiUrls = ['https://api.umami.is/'];
|
|
6
|
+
loginUrl = 'https://cloud.umami.is/login';
|
|
7
|
+
info = 'https://umami.is/docs/api.';
|
|
8
|
+
credentialCheckCurlArguments = ['https://api.umami.is/v1/websites'];
|
|
9
|
+
setCredentialsExample(serviceName) {
|
|
10
|
+
return `latchkey auth set ${serviceName} -H "x-umami-api-key: <api-key>"`;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export const UMAMI = new Umami();
|
|
14
|
+
//# sourceMappingURL=umami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"umami.js","sourceRoot":"","sources":["../../../src/services/umami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,KAAM,SAAQ,OAAO;IACvB,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,OAAO,CAAC;IACtB,WAAW,GAAG,CAAC,uBAAuB,CAAU,CAAC;IACjD,QAAQ,GAAG,8BAA8B,CAAC;IAC1C,IAAI,GAAG,4BAA4B,CAAC;IAEpC,4BAA4B,GAAG,CAAC,kCAAkC,CAAU,CAAC;IAEtF,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,kCAAkC,CAAC;IAC5E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicWrite.test.d.ts","sourceRoot":"","sources":["../../tests/atomicWrite.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync, readFileSync, statSync, mkdirSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { writeFileAtomic, AtomicWriteError } from '../src/atomicWrite.js';
|
|
6
|
+
describe('writeFileAtomic', () => {
|
|
7
|
+
let tempDir;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
tempDir = mkdtempSync(join(tmpdir(), 'latchkey-atomic-test-'));
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
it('should write content to the target file', () => {
|
|
15
|
+
const filePath = join(tempDir, 'test.txt');
|
|
16
|
+
writeFileAtomic(filePath, 'hello world');
|
|
17
|
+
expect(readFileSync(filePath, 'utf-8')).toBe('hello world');
|
|
18
|
+
});
|
|
19
|
+
it('should overwrite an existing file', () => {
|
|
20
|
+
const filePath = join(tempDir, 'test.txt');
|
|
21
|
+
writeFileAtomic(filePath, 'first');
|
|
22
|
+
writeFileAtomic(filePath, 'second');
|
|
23
|
+
expect(readFileSync(filePath, 'utf-8')).toBe('second');
|
|
24
|
+
});
|
|
25
|
+
it('should set file permissions via mode option', () => {
|
|
26
|
+
const filePath = join(tempDir, 'secure.txt');
|
|
27
|
+
writeFileAtomic(filePath, 'secret', { mode: 0o600 });
|
|
28
|
+
const permissions = statSync(filePath).mode & 0o777;
|
|
29
|
+
expect(permissions).toBe(0o600);
|
|
30
|
+
});
|
|
31
|
+
it('should not leave temporary files on success', () => {
|
|
32
|
+
const filePath = join(tempDir, 'test.txt');
|
|
33
|
+
writeFileAtomic(filePath, 'hello');
|
|
34
|
+
const files = readdirSync(tempDir);
|
|
35
|
+
expect(files).toEqual(['test.txt']);
|
|
36
|
+
});
|
|
37
|
+
it('should not leave temporary files on write failure', () => {
|
|
38
|
+
// Try writing to a path where the directory doesn't exist
|
|
39
|
+
const filePath = join(tempDir, 'nonexistent-dir', 'test.txt');
|
|
40
|
+
expect(() => {
|
|
41
|
+
writeFileAtomic(filePath, 'hello');
|
|
42
|
+
}).toThrow(AtomicWriteError);
|
|
43
|
+
// The parent dir of tempDir still exists, check no temp files leaked into tempDir
|
|
44
|
+
const files = readdirSync(tempDir);
|
|
45
|
+
expect(files).toEqual([]);
|
|
46
|
+
});
|
|
47
|
+
it('should throw AtomicWriteError on failure', () => {
|
|
48
|
+
const filePath = join(tempDir, 'nonexistent-dir', 'test.txt');
|
|
49
|
+
expect(() => {
|
|
50
|
+
writeFileAtomic(filePath, 'hello');
|
|
51
|
+
}).toThrow(AtomicWriteError);
|
|
52
|
+
});
|
|
53
|
+
it('should include the target path in the error', () => {
|
|
54
|
+
const filePath = join(tempDir, 'nonexistent-dir', 'test.txt');
|
|
55
|
+
try {
|
|
56
|
+
writeFileAtomic(filePath, 'hello');
|
|
57
|
+
expect.unreachable('should have thrown');
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
expect(error).toBeInstanceOf(AtomicWriteError);
|
|
61
|
+
expect(error.targetPath).toBe(filePath);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
it('should handle unicode content', () => {
|
|
65
|
+
const filePath = join(tempDir, 'unicode.txt');
|
|
66
|
+
const content = '{"key": "Héllo Wörld 日本語"}';
|
|
67
|
+
writeFileAtomic(filePath, content);
|
|
68
|
+
expect(readFileSync(filePath, 'utf-8')).toBe(content);
|
|
69
|
+
});
|
|
70
|
+
it('should handle empty content', () => {
|
|
71
|
+
const filePath = join(tempDir, 'empty.txt');
|
|
72
|
+
writeFileAtomic(filePath, '');
|
|
73
|
+
expect(readFileSync(filePath, 'utf-8')).toBe('');
|
|
74
|
+
});
|
|
75
|
+
it('should handle large content', () => {
|
|
76
|
+
const filePath = join(tempDir, 'large.txt');
|
|
77
|
+
const content = 'x'.repeat(1_000_000);
|
|
78
|
+
writeFileAtomic(filePath, content);
|
|
79
|
+
expect(readFileSync(filePath, 'utf-8')).toBe(content);
|
|
80
|
+
});
|
|
81
|
+
it('should not corrupt the target file if rename would fail', () => {
|
|
82
|
+
// Write initial content
|
|
83
|
+
const filePath = join(tempDir, 'existing.txt');
|
|
84
|
+
writeFileAtomic(filePath, 'original');
|
|
85
|
+
// Make the target a directory so rename fails
|
|
86
|
+
const dirPath = join(tempDir, 'target-is-dir');
|
|
87
|
+
mkdirSync(dirPath);
|
|
88
|
+
expect(() => {
|
|
89
|
+
writeFileAtomic(dirPath, 'new content');
|
|
90
|
+
}).toThrow(AtomicWriteError);
|
|
91
|
+
// Original file should be untouched
|
|
92
|
+
expect(readFileSync(filePath, 'utf-8')).toBe('original');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=atomicWrite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicWrite.test.js","sourceRoot":"","sources":["../../tests/atomicWrite.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/cli.test.js
CHANGED
|
@@ -6,6 +6,7 @@ import { execSync } from 'node:child_process';
|
|
|
6
6
|
import { Command } from 'commander';
|
|
7
7
|
import { registerCommands } from '../src/cliCommands.js';
|
|
8
8
|
import { extractUrlFromCurlArguments } from '../src/curl.js';
|
|
9
|
+
import { hasGraphicalEnvironment } from '../src/playwrightUtils.js';
|
|
9
10
|
import { EncryptedStorage } from '../src/encryptedStorage.js';
|
|
10
11
|
import { Config } from '../src/config.js';
|
|
11
12
|
import { Registry } from '../src/registry.js';
|
|
@@ -42,12 +43,14 @@ function getCliPath() {
|
|
|
42
43
|
return null;
|
|
43
44
|
}
|
|
44
45
|
const cliPath = getCliPath();
|
|
45
|
-
function runCli(args, env) {
|
|
46
|
-
const
|
|
46
|
+
function runCli(args, env, options) {
|
|
47
|
+
const keysToRemove = new Set(options?.removeEnvVars ?? []);
|
|
48
|
+
const baseEnv = Object.fromEntries(Object.entries(process.env).filter(([key]) => !keysToRemove.has(key)));
|
|
49
|
+
const execOptions = {
|
|
47
50
|
cwd: join(__dirname, '..'),
|
|
48
51
|
encoding: 'utf-8',
|
|
49
52
|
env: {
|
|
50
|
-
...
|
|
53
|
+
...baseEnv,
|
|
51
54
|
LATCHKEY_ENCRYPTION_KEY: TEST_ENCRYPTION_KEY,
|
|
52
55
|
...env,
|
|
53
56
|
},
|
|
@@ -57,7 +60,7 @@ function runCli(args, env) {
|
|
|
57
60
|
if (!cliPath) {
|
|
58
61
|
throw new Error('CLI not built');
|
|
59
62
|
}
|
|
60
|
-
const stdout = execSync(`node ${cliPath} ${args.join(' ')}`,
|
|
63
|
+
const stdout = execSync(`node ${cliPath} ${args.join(' ')}`, execOptions);
|
|
61
64
|
return { exitCode: 0, stdout, stderr: '' };
|
|
62
65
|
}
|
|
63
66
|
catch (error) {
|
|
@@ -115,6 +118,114 @@ describe('extractUrlFromCurlArguments', () => {
|
|
|
115
118
|
expect(extractUrlFromCurlArguments(arguments_)).toBe('https://api.example.com');
|
|
116
119
|
});
|
|
117
120
|
});
|
|
121
|
+
describe('hasGraphicalEnvironment', () => {
|
|
122
|
+
const originalPlatform = process.platform;
|
|
123
|
+
afterEach(() => {
|
|
124
|
+
Object.defineProperty(process, 'platform', { value: originalPlatform });
|
|
125
|
+
});
|
|
126
|
+
it('should return true on non-linux platforms', () => {
|
|
127
|
+
Object.defineProperty(process, 'platform', { value: 'darwin' });
|
|
128
|
+
expect(hasGraphicalEnvironment()).toBe(true);
|
|
129
|
+
Object.defineProperty(process, 'platform', { value: 'win32' });
|
|
130
|
+
expect(hasGraphicalEnvironment()).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
it('should return true on linux when DISPLAY is set', () => {
|
|
133
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
134
|
+
const originalDisplay = process.env.DISPLAY;
|
|
135
|
+
const originalWayland = process.env.WAYLAND_DISPLAY;
|
|
136
|
+
try {
|
|
137
|
+
process.env.DISPLAY = ':0';
|
|
138
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
139
|
+
expect(hasGraphicalEnvironment()).toBe(true);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
if (originalDisplay !== undefined) {
|
|
143
|
+
process.env.DISPLAY = originalDisplay;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
delete process.env.DISPLAY;
|
|
147
|
+
}
|
|
148
|
+
if (originalWayland !== undefined) {
|
|
149
|
+
process.env.WAYLAND_DISPLAY = originalWayland;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
it('should return true on linux when WAYLAND_DISPLAY is set', () => {
|
|
157
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
158
|
+
const originalDisplay = process.env.DISPLAY;
|
|
159
|
+
const originalWayland = process.env.WAYLAND_DISPLAY;
|
|
160
|
+
try {
|
|
161
|
+
delete process.env.DISPLAY;
|
|
162
|
+
process.env.WAYLAND_DISPLAY = 'wayland-0';
|
|
163
|
+
expect(hasGraphicalEnvironment()).toBe(true);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
if (originalDisplay !== undefined) {
|
|
167
|
+
process.env.DISPLAY = originalDisplay;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
delete process.env.DISPLAY;
|
|
171
|
+
}
|
|
172
|
+
if (originalWayland !== undefined) {
|
|
173
|
+
process.env.WAYLAND_DISPLAY = originalWayland;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
it('should return false on linux when neither DISPLAY nor WAYLAND_DISPLAY is set', () => {
|
|
181
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
182
|
+
const originalDisplay = process.env.DISPLAY;
|
|
183
|
+
const originalWayland = process.env.WAYLAND_DISPLAY;
|
|
184
|
+
try {
|
|
185
|
+
delete process.env.DISPLAY;
|
|
186
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
187
|
+
expect(hasGraphicalEnvironment()).toBe(false);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
if (originalDisplay !== undefined) {
|
|
191
|
+
process.env.DISPLAY = originalDisplay;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
delete process.env.DISPLAY;
|
|
195
|
+
}
|
|
196
|
+
if (originalWayland !== undefined) {
|
|
197
|
+
process.env.WAYLAND_DISPLAY = originalWayland;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
it('should return false on linux when DISPLAY is empty string', () => {
|
|
205
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
206
|
+
const originalDisplay = process.env.DISPLAY;
|
|
207
|
+
const originalWayland = process.env.WAYLAND_DISPLAY;
|
|
208
|
+
try {
|
|
209
|
+
process.env.DISPLAY = '';
|
|
210
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
211
|
+
expect(hasGraphicalEnvironment()).toBe(false);
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
if (originalDisplay !== undefined) {
|
|
215
|
+
process.env.DISPLAY = originalDisplay;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
delete process.env.DISPLAY;
|
|
219
|
+
}
|
|
220
|
+
if (originalWayland !== undefined) {
|
|
221
|
+
process.env.WAYLAND_DISPLAY = originalWayland;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
});
|
|
118
229
|
describe('CLI commands with dependency injection', () => {
|
|
119
230
|
let tempDir;
|
|
120
231
|
let capturedArgs;
|
|
@@ -227,16 +338,106 @@ describe('CLI commands with dependency injection', () => {
|
|
|
227
338
|
expect(services).toContain('slack');
|
|
228
339
|
expect(services).toContain('my-gitlab');
|
|
229
340
|
});
|
|
230
|
-
it('should exclude registered services with --
|
|
341
|
+
it('should exclude registered services with --builtin', async () => {
|
|
231
342
|
const registeredService = new RegisteredService('my-gitlab', 'https://gitlab.example.com');
|
|
232
343
|
const deps = createMockDependencies();
|
|
233
344
|
deps.registry.addService(registeredService);
|
|
234
|
-
await runCommand(['services', 'list', '--
|
|
345
|
+
await runCommand(['services', 'list', '--builtin'], deps);
|
|
235
346
|
expect(logs).toHaveLength(1);
|
|
236
347
|
const services = JSON.parse(logs[0] ?? '');
|
|
237
348
|
expect(services).toContain('slack');
|
|
238
349
|
expect(services).not.toContain('my-gitlab');
|
|
239
350
|
});
|
|
351
|
+
it('should include services with stored credentials when using --viable', async () => {
|
|
352
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
353
|
+
writeSecureFile(storePath, JSON.stringify({
|
|
354
|
+
slack: { objectType: 'slack', token: 'test-token', dCookie: 'test-cookie' },
|
|
355
|
+
}));
|
|
356
|
+
const deps = createMockDependencies();
|
|
357
|
+
await runCommand(['services', 'list', '--viable'], deps);
|
|
358
|
+
expect(logs).toHaveLength(1);
|
|
359
|
+
const services = JSON.parse(logs[0] ?? '');
|
|
360
|
+
expect(services).toContain('slack');
|
|
361
|
+
});
|
|
362
|
+
it('should include services with browser auth when using --viable', async () => {
|
|
363
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
364
|
+
writeSecureFile(storePath, '{}');
|
|
365
|
+
// The default mock slack service has getSession defined, so it supports browser auth
|
|
366
|
+
const deps = createMockDependencies();
|
|
367
|
+
await runCommand(['services', 'list', '--viable'], deps);
|
|
368
|
+
expect(logs).toHaveLength(1);
|
|
369
|
+
const services = JSON.parse(logs[0] ?? '');
|
|
370
|
+
expect(services).toContain('slack');
|
|
371
|
+
});
|
|
372
|
+
it('should exclude services without credentials or browser auth when using --viable', async () => {
|
|
373
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
374
|
+
writeSecureFile(storePath, '{}');
|
|
375
|
+
const noLoginService = {
|
|
376
|
+
name: 'nologin',
|
|
377
|
+
displayName: 'No Login Service',
|
|
378
|
+
baseApiUrls: ['https://nologin.example.com/api/'],
|
|
379
|
+
loginUrl: 'https://nologin.example.com',
|
|
380
|
+
info: 'A service without browser login support.',
|
|
381
|
+
credentialCheckCurlArguments: [],
|
|
382
|
+
checkApiCredentials: vi.fn().mockReturnValue(ApiCredentialStatus.Missing),
|
|
383
|
+
setCredentialsExample(serviceName) {
|
|
384
|
+
return `latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`;
|
|
385
|
+
},
|
|
386
|
+
getCredentialsNoCurl() {
|
|
387
|
+
throw new NoCurlCredentialsNotSupportedError('nologin');
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
const deps = createMockDependencies({
|
|
391
|
+
registry: new Registry([noLoginService]),
|
|
392
|
+
});
|
|
393
|
+
await runCommand(['services', 'list', '--viable'], deps);
|
|
394
|
+
expect(logs).toHaveLength(1);
|
|
395
|
+
const services = JSON.parse(logs[0] ?? '');
|
|
396
|
+
expect(services).not.toContain('nologin');
|
|
397
|
+
});
|
|
398
|
+
it('should exclude browser-capable services when browser is disabled and no credentials with --viable', async () => {
|
|
399
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
400
|
+
writeSecureFile(storePath, '{}');
|
|
401
|
+
const deps = createMockDependencies({
|
|
402
|
+
config: createMockConfig({ browserDisabled: true }),
|
|
403
|
+
});
|
|
404
|
+
await runCommand(['services', 'list', '--viable'], deps);
|
|
405
|
+
expect(logs).toHaveLength(1);
|
|
406
|
+
const services = JSON.parse(logs[0] ?? '');
|
|
407
|
+
expect(services).not.toContain('slack');
|
|
408
|
+
});
|
|
409
|
+
it('should include services with credentials even when browser is disabled with --viable', async () => {
|
|
410
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
411
|
+
writeSecureFile(storePath, JSON.stringify({
|
|
412
|
+
slack: { objectType: 'slack', token: 'test-token', dCookie: 'test-cookie' },
|
|
413
|
+
}));
|
|
414
|
+
const deps = createMockDependencies({
|
|
415
|
+
config: createMockConfig({ browserDisabled: true }),
|
|
416
|
+
});
|
|
417
|
+
await runCommand(['services', 'list', '--viable'], deps);
|
|
418
|
+
expect(logs).toHaveLength(1);
|
|
419
|
+
const services = JSON.parse(logs[0] ?? '');
|
|
420
|
+
expect(services).toContain('slack');
|
|
421
|
+
});
|
|
422
|
+
it('should combine --builtin and --viable filters', async () => {
|
|
423
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
424
|
+
writeSecureFile(storePath, JSON.stringify({
|
|
425
|
+
'my-gitlab': {
|
|
426
|
+
objectType: 'rawCurl',
|
|
427
|
+
curlArguments: ['-H', 'PRIVATE-TOKEN: token'],
|
|
428
|
+
},
|
|
429
|
+
}));
|
|
430
|
+
const registeredService = new RegisteredService('my-gitlab', 'https://gitlab.example.com');
|
|
431
|
+
const deps = createMockDependencies();
|
|
432
|
+
deps.registry.addService(registeredService);
|
|
433
|
+
await runCommand(['services', 'list', '--builtin', '--viable'], deps);
|
|
434
|
+
expect(logs).toHaveLength(1);
|
|
435
|
+
const services = JSON.parse(logs[0] ?? '');
|
|
436
|
+
// slack is built-in and has browser auth, so it's viable
|
|
437
|
+
expect(services).toContain('slack');
|
|
438
|
+
// my-gitlab has credentials but is not built-in, so it's excluded by --builtin
|
|
439
|
+
expect(services).not.toContain('my-gitlab');
|
|
440
|
+
});
|
|
240
441
|
});
|
|
241
442
|
describe('services info command', () => {
|
|
242
443
|
it('should show login options, credentials status, and developer notes', async () => {
|
|
@@ -247,6 +448,7 @@ describe('CLI commands with dependency injection', () => {
|
|
|
247
448
|
expect(logs).toHaveLength(1);
|
|
248
449
|
const info = JSON.parse(logs[0] ?? '');
|
|
249
450
|
expect(info.type).toBe('built-in');
|
|
451
|
+
expect(info.baseApiUrls).toEqual(['https://slack.com/api/']);
|
|
250
452
|
expect(info.authOptions).toEqual(['browser', 'set']);
|
|
251
453
|
expect(info.credentialStatus).toBe('missing');
|
|
252
454
|
expect(info.setCredentialsExample).toBe('latchkey auth set slack -H "Authorization: Bearer xoxb-your-token"');
|
|
@@ -648,6 +850,37 @@ describe('CLI commands with dependency injection', () => {
|
|
|
648
850
|
await runCommand(['auth', 'browser', 'nologin'], deps);
|
|
649
851
|
expect(exitCode).toBe(1);
|
|
650
852
|
});
|
|
853
|
+
it('should return error when no graphical environment is available', async () => {
|
|
854
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
855
|
+
writeSecureFile(storePath, '{}');
|
|
856
|
+
const originalPlatform = process.platform;
|
|
857
|
+
const originalDisplay = process.env.DISPLAY;
|
|
858
|
+
const originalWayland = process.env.WAYLAND_DISPLAY;
|
|
859
|
+
try {
|
|
860
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
861
|
+
delete process.env.DISPLAY;
|
|
862
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
863
|
+
const deps = createMockDependencies();
|
|
864
|
+
await runCommand(['auth', 'browser', 'slack'], deps);
|
|
865
|
+
expect(exitCode).toBe(1);
|
|
866
|
+
expect(errorLogs[0]).toContain('No graphical environment detected');
|
|
867
|
+
}
|
|
868
|
+
finally {
|
|
869
|
+
Object.defineProperty(process, 'platform', { value: originalPlatform });
|
|
870
|
+
if (originalDisplay !== undefined) {
|
|
871
|
+
process.env.DISPLAY = originalDisplay;
|
|
872
|
+
}
|
|
873
|
+
else {
|
|
874
|
+
delete process.env.DISPLAY;
|
|
875
|
+
}
|
|
876
|
+
if (originalWayland !== undefined) {
|
|
877
|
+
process.env.WAYLAND_DISPLAY = originalWayland;
|
|
878
|
+
}
|
|
879
|
+
else {
|
|
880
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
});
|
|
651
884
|
it('should suggest set-nocurl when service supports nocurl credentials', async () => {
|
|
652
885
|
const nocurlService = {
|
|
653
886
|
name: 'nocurl-only',
|
|
@@ -1265,6 +1498,17 @@ describe.skipIf(!cliPath)('CLI integration tests (subprocess)', () => {
|
|
|
1265
1498
|
});
|
|
1266
1499
|
expect(result.exitCode).toBe(1);
|
|
1267
1500
|
});
|
|
1501
|
+
it('should return error for auth browser when no graphical environment is available on linux', () => {
|
|
1502
|
+
// This test only makes sense on Linux where the check is active
|
|
1503
|
+
if (process.platform !== 'linux') {
|
|
1504
|
+
return;
|
|
1505
|
+
}
|
|
1506
|
+
const result = runCli(['auth', 'browser', 'slack'], testEnv, {
|
|
1507
|
+
removeEnvVars: ['DISPLAY', 'WAYLAND_DISPLAY'],
|
|
1508
|
+
});
|
|
1509
|
+
expect(result.exitCode).toBe(1);
|
|
1510
|
+
expect(result.stderr).toContain('No graphical environment detected');
|
|
1511
|
+
});
|
|
1268
1512
|
it('should list services as JSON', () => {
|
|
1269
1513
|
const result = runCli(['services', 'list'], testEnv);
|
|
1270
1514
|
expect(result.exitCode).toBe(0);
|