opensoma 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -1
- package/dist/src/credential-manager.js +2 -2
- package/dist/src/credential-manager.js.map +1 -1
- package/dist/src/shared/utils/config-dir.d.ts +11 -0
- package/dist/src/shared/utils/config-dir.d.ts.map +1 -0
- package/dist/src/shared/utils/config-dir.js +19 -0
- package/dist/src/shared/utils/config-dir.js.map +1 -0
- package/dist/src/toz-pending-store.d.ts.map +1 -1
- package/dist/src/toz-pending-store.js +2 -2
- package/dist/src/toz-pending-store.js.map +1 -1
- package/package.json +1 -1
- package/src/credential-manager.ts +2 -2
- package/src/shared/utils/config-dir.test.ts +41 -0
- package/src/shared/utils/config-dir.ts +20 -0
- package/src/toz-pending-store.ts +3 -2
package/dist/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { homedir } from 'node:os';
|
|
5
4
|
import { join } from 'node:path';
|
|
5
|
+
import { getConfigDir } from './shared/utils/config-dir.js';
|
|
6
6
|
export class CredentialManager {
|
|
7
7
|
configDir;
|
|
8
8
|
credentialsPath;
|
|
9
9
|
encryptionKeyPath;
|
|
10
10
|
constructor(configDir) {
|
|
11
|
-
this.configDir = configDir ??
|
|
11
|
+
this.configDir = configDir ?? getConfigDir();
|
|
12
12
|
this.credentialsPath = join(this.configDir, 'credentials.json');
|
|
13
13
|
this.encryptionKeyPath = join(this.configDir, 'credentials.key');
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/credential-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/credential-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const CONFIG_DIR_ENV_VAR = "OPENSOMA_CONFIG_DIR";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the directory used to persist opensoma state (credentials, pending
|
|
4
|
+
* reservations, etc.).
|
|
5
|
+
*
|
|
6
|
+
* Resolution order:
|
|
7
|
+
* 1. `OPENSOMA_CONFIG_DIR` environment variable (if set and non-empty)
|
|
8
|
+
* 2. `~/.config/opensoma`
|
|
9
|
+
*/
|
|
10
|
+
export declare function getConfigDir(): string;
|
|
11
|
+
//# sourceMappingURL=config-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-dir.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/config-dir.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,wBAAwB,CAAA;AAEvD;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const CONFIG_DIR_ENV_VAR = 'OPENSOMA_CONFIG_DIR';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the directory used to persist opensoma state (credentials, pending
|
|
6
|
+
* reservations, etc.).
|
|
7
|
+
*
|
|
8
|
+
* Resolution order:
|
|
9
|
+
* 1. `OPENSOMA_CONFIG_DIR` environment variable (if set and non-empty)
|
|
10
|
+
* 2. `~/.config/opensoma`
|
|
11
|
+
*/
|
|
12
|
+
export function getConfigDir() {
|
|
13
|
+
const fromEnv = process.env[CONFIG_DIR_ENV_VAR];
|
|
14
|
+
if (fromEnv && fromEnv.length > 0) {
|
|
15
|
+
return fromEnv;
|
|
16
|
+
}
|
|
17
|
+
return join(homedir(), '.config', 'opensoma');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=config-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-dir.js","sourceRoot":"","sources":["../../../../src/shared/utils/config-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAA;AAEvD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC/C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toz-pending-store.d.ts","sourceRoot":"","sources":["../../src/toz-pending-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toz-pending-store.d.ts","sourceRoot":"","sources":["../../src/toz-pending-store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;gBAEjB,SAAS,CAAC,EAAE,MAAM;IAKxB,GAAG,IAAI,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAW5C,GAAG,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
3
|
import { dirname, join } from 'node:path';
|
|
4
|
+
import { getConfigDir } from './shared/utils/config-dir.js';
|
|
5
5
|
export class TozPendingStore {
|
|
6
6
|
path;
|
|
7
7
|
constructor(configDir) {
|
|
8
|
-
const dir = configDir ??
|
|
8
|
+
const dir = configDir ?? getConfigDir();
|
|
9
9
|
this.path = join(dir, 'toz-pending.json');
|
|
10
10
|
}
|
|
11
11
|
async get() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toz-pending-store.js","sourceRoot":"","sources":["../../src/toz-pending-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"toz-pending-store.js","sourceRoot":"","sources":["../../src/toz-pending-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAyBxD,MAAM,OAAO,eAAe;IACT,IAAI,CAAQ;IAE7B,YAAY,SAAkB;QAC5B,MAAM,GAAG,GAAG,SAAS,IAAI,YAAY,EAAE,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAkC;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,yEAAyE;QACzE,uEAAuE;QACvE,+EAA+E;QAC/E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3E,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto'
|
|
2
2
|
import { existsSync } from 'node:fs'
|
|
3
3
|
import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
|
|
4
|
-
import { homedir } from 'node:os'
|
|
5
4
|
import { join } from 'node:path'
|
|
6
5
|
|
|
6
|
+
import { getConfigDir } from './shared/utils/config-dir'
|
|
7
7
|
import type { Credentials } from './types'
|
|
8
8
|
|
|
9
9
|
interface EncryptedSecret {
|
|
@@ -26,7 +26,7 @@ export class CredentialManager {
|
|
|
26
26
|
private encryptionKeyPath: string
|
|
27
27
|
|
|
28
28
|
constructor(configDir?: string) {
|
|
29
|
-
this.configDir = configDir ??
|
|
29
|
+
this.configDir = configDir ?? getConfigDir()
|
|
30
30
|
this.credentialsPath = join(this.configDir, 'credentials.json')
|
|
31
31
|
this.encryptionKeyPath = join(this.configDir, 'credentials.key')
|
|
32
32
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
|
+
import { homedir } from 'node:os'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
|
|
5
|
+
import { CONFIG_DIR_ENV_VAR, getConfigDir } from './config-dir'
|
|
6
|
+
|
|
7
|
+
let originalValue: string | undefined
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
originalValue = process.env[CONFIG_DIR_ENV_VAR]
|
|
11
|
+
delete process.env[CONFIG_DIR_ENV_VAR]
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
if (originalValue === undefined) {
|
|
16
|
+
delete process.env[CONFIG_DIR_ENV_VAR]
|
|
17
|
+
} else {
|
|
18
|
+
process.env[CONFIG_DIR_ENV_VAR] = originalValue
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
describe('getConfigDir', () => {
|
|
23
|
+
it('falls back to ~/.config/opensoma when env var is unset', () => {
|
|
24
|
+
expect(getConfigDir()).toBe(join(homedir(), '.config', 'opensoma'))
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('returns OPENSOMA_CONFIG_DIR when set', () => {
|
|
28
|
+
process.env[CONFIG_DIR_ENV_VAR] = '/custom/config/path'
|
|
29
|
+
expect(getConfigDir()).toBe('/custom/config/path')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('falls back to default when env var is empty string', () => {
|
|
33
|
+
process.env[CONFIG_DIR_ENV_VAR] = ''
|
|
34
|
+
expect(getConfigDir()).toBe(join(homedir(), '.config', 'opensoma'))
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('preserves relative paths verbatim', () => {
|
|
38
|
+
process.env[CONFIG_DIR_ENV_VAR] = './local-config'
|
|
39
|
+
expect(getConfigDir()).toBe('./local-config')
|
|
40
|
+
})
|
|
41
|
+
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { homedir } from 'node:os'
|
|
2
|
+
import { join } from 'node:path'
|
|
3
|
+
|
|
4
|
+
export const CONFIG_DIR_ENV_VAR = 'OPENSOMA_CONFIG_DIR'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Resolves the directory used to persist opensoma state (credentials, pending
|
|
8
|
+
* reservations, etc.).
|
|
9
|
+
*
|
|
10
|
+
* Resolution order:
|
|
11
|
+
* 1. `OPENSOMA_CONFIG_DIR` environment variable (if set and non-empty)
|
|
12
|
+
* 2. `~/.config/opensoma`
|
|
13
|
+
*/
|
|
14
|
+
export function getConfigDir(): string {
|
|
15
|
+
const fromEnv = process.env[CONFIG_DIR_ENV_VAR]
|
|
16
|
+
if (fromEnv && fromEnv.length > 0) {
|
|
17
|
+
return fromEnv
|
|
18
|
+
}
|
|
19
|
+
return join(homedir(), '.config', 'opensoma')
|
|
20
|
+
}
|
package/src/toz-pending-store.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises'
|
|
3
|
-
import { homedir } from 'node:os'
|
|
4
3
|
import { dirname, join } from 'node:path'
|
|
5
4
|
|
|
5
|
+
import { getConfigDir } from './shared/utils/config-dir'
|
|
6
|
+
|
|
6
7
|
export interface TozPendingReservation {
|
|
7
8
|
reservationId: string
|
|
8
9
|
cookies: Record<string, string>
|
|
@@ -30,7 +31,7 @@ export class TozPendingStore {
|
|
|
30
31
|
private readonly path: string
|
|
31
32
|
|
|
32
33
|
constructor(configDir?: string) {
|
|
33
|
-
const dir = configDir ??
|
|
34
|
+
const dir = configDir ?? getConfigDir()
|
|
34
35
|
this.path = join(dir, 'toz-pending.json')
|
|
35
36
|
}
|
|
36
37
|
|