@fias/plugin-dev-harness 1.2.0 → 1.3.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/cli/check-auth.d.ts +3 -3
- package/dist/cli/check-auth.d.ts.map +1 -1
- package/dist/cli/check-auth.js +19 -8
- package/dist/cli/check-auth.js.map +1 -1
- package/dist/cli/check-auth.test.d.ts +2 -0
- package/dist/cli/check-auth.test.d.ts.map +1 -0
- package/dist/cli/check-auth.test.js +49 -0
- package/dist/cli/check-auth.test.js.map +1 -0
- package/dist/cli/dev.d.ts +2 -2
- package/dist/cli/dev.d.ts.map +1 -1
- package/dist/cli/dev.js +4 -20
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/dev.test.js +10 -38
- package/dist/cli/dev.test.js.map +1 -1
- package/dist/cli/entities.d.ts.map +1 -1
- package/dist/cli/entities.js +8 -6
- package/dist/cli/entities.js.map +1 -1
- package/dist/cli/entities.test.js +15 -24
- package/dist/cli/entities.test.js.map +1 -1
- package/dist/cli/index.test.js +2 -2
- package/dist/cli/login.d.ts +2 -0
- package/dist/cli/login.d.ts.map +1 -1
- package/dist/cli/login.js +19 -14
- package/dist/cli/login.js.map +1 -1
- package/dist/cli/login.test.js +46 -24
- package/dist/cli/login.test.js.map +1 -1
- package/dist/cli/submit.d.ts.map +1 -1
- package/dist/cli/submit.js +13 -11
- package/dist/cli/submit.js.map +1 -1
- package/dist/cli/submit.test.js +13 -22
- package/dist/cli/submit.test.js.map +1 -1
- package/dist/config/config-loader.d.ts +6 -0
- package/dist/config/config-loader.d.ts.map +1 -1
- package/dist/config/config-loader.js +12 -0
- package/dist/config/config-loader.js.map +1 -1
- package/dist/config/credentials.d.ts +19 -1
- package/dist/config/credentials.d.ts.map +1 -1
- package/dist/config/credentials.js +46 -6
- package/dist/config/credentials.js.map +1 -1
- package/dist/config/credentials.test.js +72 -27
- package/dist/config/credentials.test.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/server/harness-server.d.ts +2 -3
- package/dist/server/harness-server.d.ts.map +1 -1
- package/dist/server/harness-server.js +233 -41
- package/dist/server/harness-server.js.map +1 -1
- package/dist/server/harness-server.test.js +60 -3
- package/dist/server/harness-server.test.js.map +1 -1
- package/dist/server/static/harness.css +58 -0
- package/dist/server/static/harness.html +20 -7
- package/dist/server/static/harness.js +162 -6
- package/package.json +10 -10
- package/dist/server/static/static/harness.css +0 -332
- package/dist/server/static/static/harness.html +0 -53
- package/dist/server/static/static/harness.js +0 -569
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":";AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEH,gCA6BC;AAjGD,uCAAyB;AACzB,2CAA6B;AAuB7B;;;GAGG;AACH,SAAS,iBAAiB,CAAC,MAAc;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,6CAA6C;QAC7C,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;QAClB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,iDAAiD;AACpC,QAAA,gBAAgB,GAAiE;IAC5F,OAAO,EAAE;QACP,MAAM,EAAE,gCAAgC;QACxC,WAAW,EAAE,yBAAyB;KACvC;IACD,UAAU,EAAE;QACV,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,iBAAiB;KAC/B;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD,MAAM,cAAc,GAAkB;IACpC,SAAS,EAAE,uBAAuB;IAClC,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;IACtF,QAAQ,EAAE;QACR,MAAM,EAAE,cAAc;QACtB,WAAW,EAAE,UAAU;QACvB,MAAM,EAAE,IAAI;KACb;IACD,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,eAAe;IACvB,WAAW,EAAE,iBAAiB,CAAC,eAAe,CAAC;CAChD,CAAC;AAEF,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG;YACb,GAAG,cAAc;YACjB,GAAG,UAAU;YACb,QAAQ,EAAE;gBACR,GAAG,cAAc,CAAC,QAAQ;gBAC1B,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;aAC/B;SACF,CAAC;QAEF,uDAAuD;QACvD,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -2,10 +2,28 @@
|
|
|
2
2
|
* Credentials Manager
|
|
3
3
|
*
|
|
4
4
|
* Manages the ~/.fias/credentials file for storing API keys.
|
|
5
|
+
* Supports per-environment keys (staging, production).
|
|
5
6
|
*/
|
|
7
|
+
export type Environment = 'staging' | 'production';
|
|
6
8
|
export interface Credentials {
|
|
7
|
-
|
|
9
|
+
/** Per-environment API keys */
|
|
10
|
+
environments?: {
|
|
11
|
+
staging?: string;
|
|
12
|
+
production?: string;
|
|
13
|
+
};
|
|
14
|
+
/** @deprecated Legacy single-key field — migrated to environments.staging on save */
|
|
15
|
+
apiKey?: string;
|
|
8
16
|
}
|
|
9
17
|
export declare function loadCredentials(): Credentials;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the API key for a specific environment.
|
|
20
|
+
* Handles backward compat: old `{ apiKey }` format is treated as staging.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadApiKeyForEnvironment(env: Environment): string;
|
|
23
|
+
/**
|
|
24
|
+
* Saves an API key for a specific environment.
|
|
25
|
+
* Preserves keys for other environments. Migrates legacy format on first save.
|
|
26
|
+
*/
|
|
27
|
+
export declare function saveApiKeyForEnvironment(env: Environment, apiKey: string): void;
|
|
10
28
|
export declare function saveCredentials(credentials: Credentials): void;
|
|
11
29
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAgB,eAAe,IAAI,WAAW,CAW7C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAcjE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsB/E;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAQ9D"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Credentials Manager
|
|
4
4
|
*
|
|
5
5
|
* Manages the ~/.fias/credentials file for storing API keys.
|
|
6
|
+
* Supports per-environment keys (staging, production).
|
|
6
7
|
*/
|
|
7
8
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
9
|
if (k2 === undefined) k2 = k;
|
|
@@ -39,6 +40,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
40
|
})();
|
|
40
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
42
|
exports.loadCredentials = loadCredentials;
|
|
43
|
+
exports.loadApiKeyForEnvironment = loadApiKeyForEnvironment;
|
|
44
|
+
exports.saveApiKeyForEnvironment = saveApiKeyForEnvironment;
|
|
42
45
|
exports.saveCredentials = saveCredentials;
|
|
43
46
|
const fs = __importStar(require("fs"));
|
|
44
47
|
const path = __importStar(require("path"));
|
|
@@ -47,18 +50,55 @@ const CREDENTIALS_DIR = path.join(os.homedir(), '.fias');
|
|
|
47
50
|
const CREDENTIALS_PATH = path.join(CREDENTIALS_DIR, 'credentials');
|
|
48
51
|
function loadCredentials() {
|
|
49
52
|
if (!fs.existsSync(CREDENTIALS_PATH)) {
|
|
50
|
-
return {
|
|
53
|
+
return {};
|
|
51
54
|
}
|
|
52
55
|
try {
|
|
53
56
|
const content = fs.readFileSync(CREDENTIALS_PATH, 'utf-8');
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
apiKey: parsed.apiKey || '',
|
|
57
|
-
};
|
|
57
|
+
return JSON.parse(content);
|
|
58
58
|
}
|
|
59
59
|
catch {
|
|
60
|
-
return {
|
|
60
|
+
return {};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the API key for a specific environment.
|
|
65
|
+
* Handles backward compat: old `{ apiKey }` format is treated as staging.
|
|
66
|
+
*/
|
|
67
|
+
function loadApiKeyForEnvironment(env) {
|
|
68
|
+
const creds = loadCredentials();
|
|
69
|
+
// New format
|
|
70
|
+
if (creds.environments?.[env]) {
|
|
71
|
+
return creds.environments[env];
|
|
72
|
+
}
|
|
73
|
+
// Legacy format — treat as staging
|
|
74
|
+
if (env === 'staging' && creds.apiKey) {
|
|
75
|
+
return creds.apiKey;
|
|
76
|
+
}
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Saves an API key for a specific environment.
|
|
81
|
+
* Preserves keys for other environments. Migrates legacy format on first save.
|
|
82
|
+
*/
|
|
83
|
+
function saveApiKeyForEnvironment(env, apiKey) {
|
|
84
|
+
const creds = loadCredentials();
|
|
85
|
+
// Build new environments map, migrating legacy apiKey if present
|
|
86
|
+
const environments = {};
|
|
87
|
+
// Carry forward legacy apiKey as staging if it exists
|
|
88
|
+
if (creds.apiKey) {
|
|
89
|
+
environments.staging = creds.apiKey;
|
|
90
|
+
}
|
|
91
|
+
// Carry forward existing per-env keys
|
|
92
|
+
if (creds.environments) {
|
|
93
|
+
if (creds.environments.staging)
|
|
94
|
+
environments.staging = creds.environments.staging;
|
|
95
|
+
if (creds.environments.production)
|
|
96
|
+
environments.production = creds.environments.production;
|
|
61
97
|
}
|
|
98
|
+
// Set the new key
|
|
99
|
+
environments[env] = apiKey;
|
|
100
|
+
// Write in new format only (drop legacy apiKey field)
|
|
101
|
+
saveCredentials({ environments });
|
|
62
102
|
}
|
|
63
103
|
function saveCredentials(credentials) {
|
|
64
104
|
if (!fs.existsSync(CREDENTIALS_DIR)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBH,0CAWC;AAMD,4DAcC;AAMD,4DAsBC;AAED,0CAQC;AAxFD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAczB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,SAAgB,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,GAAgB;IACvD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAEhC,aAAa;IACb,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAE,CAAC;IAClC,CAAC;IAED,mCAAmC;IACnC,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,GAAgB,EAAE,MAAc;IACvE,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAEhC,iEAAiE;IACjE,MAAM,YAAY,GAA2B,EAAE,CAAC;IAEhD,sDAAsD;IACtD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IACtC,CAAC;IAED,sCAAsC;IACtC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO;YAAE,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;QAClF,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU;YAAE,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC;IAC7F,CAAC;IAED,kBAAkB;IAClB,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAE3B,sDAAsD;IACtD,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,eAAe,CAAC,WAAwB;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC9E,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -42,70 +42,115 @@ describe('config/credentials', () => {
|
|
|
42
42
|
jest.resetAllMocks();
|
|
43
43
|
});
|
|
44
44
|
describe('loadCredentials()', () => {
|
|
45
|
-
it('returns empty
|
|
45
|
+
it('returns empty object when credentials file does not exist', () => {
|
|
46
46
|
mockedFs.existsSync.mockReturnValue(false);
|
|
47
47
|
const creds = (0, credentials_1.loadCredentials)();
|
|
48
|
-
expect(creds).toEqual({
|
|
48
|
+
expect(creds).toEqual({});
|
|
49
49
|
});
|
|
50
|
-
it('loads
|
|
50
|
+
it('loads new format with environments', () => {
|
|
51
51
|
mockedFs.existsSync.mockReturnValue(true);
|
|
52
|
-
mockedFs.readFileSync.mockReturnValue(JSON.stringify({
|
|
52
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ environments: { staging: 'fias_sk_stg', production: 'fias_sk_prod' } }));
|
|
53
53
|
const creds = (0, credentials_1.loadCredentials)();
|
|
54
|
-
expect(creds.
|
|
54
|
+
expect(creds.environments?.staging).toBe('fias_sk_stg');
|
|
55
|
+
expect(creds.environments?.production).toBe('fias_sk_prod');
|
|
55
56
|
});
|
|
56
|
-
it('
|
|
57
|
+
it('loads legacy format with apiKey', () => {
|
|
57
58
|
mockedFs.existsSync.mockReturnValue(true);
|
|
58
|
-
mockedFs.readFileSync.mockReturnValue(JSON.stringify({}));
|
|
59
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ apiKey: 'fias_sk_legacy' }));
|
|
59
60
|
const creds = (0, credentials_1.loadCredentials)();
|
|
60
|
-
expect(creds.apiKey).toBe('');
|
|
61
|
+
expect(creds.apiKey).toBe('fias_sk_legacy');
|
|
61
62
|
});
|
|
62
|
-
it('returns empty
|
|
63
|
+
it('returns empty object when file has invalid JSON', () => {
|
|
63
64
|
mockedFs.existsSync.mockReturnValue(true);
|
|
64
65
|
mockedFs.readFileSync.mockReturnValue('not json');
|
|
65
66
|
const creds = (0, credentials_1.loadCredentials)();
|
|
66
|
-
expect(creds
|
|
67
|
+
expect(creds).toEqual({});
|
|
67
68
|
});
|
|
68
|
-
it('returns empty
|
|
69
|
+
it('returns empty object when readFileSync throws', () => {
|
|
69
70
|
mockedFs.existsSync.mockReturnValue(true);
|
|
70
71
|
mockedFs.readFileSync.mockImplementation(() => {
|
|
71
72
|
throw new Error('EACCES');
|
|
72
73
|
});
|
|
73
74
|
const creds = (0, credentials_1.loadCredentials)();
|
|
74
|
-
expect(creds
|
|
75
|
+
expect(creds).toEqual({});
|
|
75
76
|
});
|
|
76
|
-
|
|
77
|
+
});
|
|
78
|
+
describe('loadApiKeyForEnvironment()', () => {
|
|
79
|
+
it('returns staging key from new format', () => {
|
|
77
80
|
mockedFs.existsSync.mockReturnValue(true);
|
|
78
|
-
mockedFs.readFileSync.mockReturnValue(JSON.stringify({
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ environments: { staging: 'fias_sk_stg' } }));
|
|
82
|
+
expect((0, credentials_1.loadApiKeyForEnvironment)('staging')).toBe('fias_sk_stg');
|
|
83
|
+
});
|
|
84
|
+
it('returns production key from new format', () => {
|
|
85
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
86
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ environments: { production: 'fias_sk_prod' } }));
|
|
87
|
+
expect((0, credentials_1.loadApiKeyForEnvironment)('production')).toBe('fias_sk_prod');
|
|
88
|
+
});
|
|
89
|
+
it('returns staging key from legacy apiKey field', () => {
|
|
90
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
91
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ apiKey: 'fias_sk_old' }));
|
|
92
|
+
expect((0, credentials_1.loadApiKeyForEnvironment)('staging')).toBe('fias_sk_old');
|
|
93
|
+
});
|
|
94
|
+
it('returns empty string for production with legacy format', () => {
|
|
95
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
96
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ apiKey: 'fias_sk_old' }));
|
|
97
|
+
expect((0, credentials_1.loadApiKeyForEnvironment)('production')).toBe('');
|
|
98
|
+
});
|
|
99
|
+
it('returns empty string when no credentials file exists', () => {
|
|
100
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
101
|
+
expect((0, credentials_1.loadApiKeyForEnvironment)('staging')).toBe('');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('saveApiKeyForEnvironment()', () => {
|
|
105
|
+
it('saves staging key in new format', () => {
|
|
106
|
+
// First call: existsSync for loadCredentials (file doesn't exist)
|
|
107
|
+
// Second call: existsSync for saveCredentials (dir exists)
|
|
108
|
+
mockedFs.existsSync.mockReturnValueOnce(false).mockReturnValue(true);
|
|
109
|
+
(0, credentials_1.saveApiKeyForEnvironment)('staging', 'fias_sk_new_stg');
|
|
110
|
+
const writtenContent = mockedFs.writeFileSync.mock.calls[0][1];
|
|
111
|
+
const parsed = JSON.parse(writtenContent.trim());
|
|
112
|
+
expect(parsed.environments.staging).toBe('fias_sk_new_stg');
|
|
113
|
+
expect(parsed.apiKey).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
it('preserves existing keys when saving another environment', () => {
|
|
116
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
117
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ environments: { staging: 'fias_sk_stg' } }));
|
|
118
|
+
(0, credentials_1.saveApiKeyForEnvironment)('production', 'fias_sk_prod');
|
|
119
|
+
const writtenContent = mockedFs.writeFileSync.mock.calls[0][1];
|
|
120
|
+
const parsed = JSON.parse(writtenContent.trim());
|
|
121
|
+
expect(parsed.environments.staging).toBe('fias_sk_stg');
|
|
122
|
+
expect(parsed.environments.production).toBe('fias_sk_prod');
|
|
123
|
+
});
|
|
124
|
+
it('migrates legacy apiKey to staging on save', () => {
|
|
125
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
126
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({ apiKey: 'fias_sk_legacy' }));
|
|
127
|
+
(0, credentials_1.saveApiKeyForEnvironment)('production', 'fias_sk_prod');
|
|
128
|
+
const writtenContent = mockedFs.writeFileSync.mock.calls[0][1];
|
|
129
|
+
const parsed = JSON.parse(writtenContent.trim());
|
|
130
|
+
expect(parsed.environments.staging).toBe('fias_sk_legacy');
|
|
131
|
+
expect(parsed.environments.production).toBe('fias_sk_prod');
|
|
132
|
+
expect(parsed.apiKey).toBeUndefined();
|
|
81
133
|
});
|
|
82
134
|
});
|
|
83
135
|
describe('saveCredentials()', () => {
|
|
84
136
|
it('creates directory if it does not exist and writes file', () => {
|
|
85
137
|
mockedFs.existsSync.mockReturnValue(false);
|
|
86
|
-
(0, credentials_1.saveCredentials)({
|
|
138
|
+
(0, credentials_1.saveCredentials)({ environments: { staging: 'fias_sk_test' } });
|
|
87
139
|
expect(mockedFs.mkdirSync).toHaveBeenCalledWith(expect.stringContaining('.fias'), {
|
|
88
140
|
recursive: true,
|
|
89
141
|
mode: 0o700,
|
|
90
142
|
});
|
|
91
|
-
expect(mockedFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('credentials'), expect.stringContaining('
|
|
143
|
+
expect(mockedFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('credentials'), expect.stringContaining('fias_sk_test'), { mode: 0o600 });
|
|
92
144
|
});
|
|
93
145
|
it('does not create directory if it already exists', () => {
|
|
94
146
|
mockedFs.existsSync.mockReturnValue(true);
|
|
95
|
-
(0, credentials_1.saveCredentials)({
|
|
147
|
+
(0, credentials_1.saveCredentials)({ environments: { staging: 'fias_sk_abc' } });
|
|
96
148
|
expect(mockedFs.mkdirSync).not.toHaveBeenCalled();
|
|
97
149
|
expect(mockedFs.writeFileSync).toHaveBeenCalled();
|
|
98
150
|
});
|
|
99
|
-
it('writes valid JSON to the file', () => {
|
|
100
|
-
mockedFs.existsSync.mockReturnValue(true);
|
|
101
|
-
(0, credentials_1.saveCredentials)({ apiKey: 'fias_sk_test_json' });
|
|
102
|
-
const writtenContent = mockedFs.writeFileSync.mock.calls[0][1];
|
|
103
|
-
const parsed = JSON.parse(writtenContent.trim());
|
|
104
|
-
expect(parsed).toEqual({ apiKey: 'fias_sk_test_json' });
|
|
105
|
-
});
|
|
106
151
|
it('writes file with restricted permissions (0o600)', () => {
|
|
107
152
|
mockedFs.existsSync.mockReturnValue(true);
|
|
108
|
-
(0, credentials_1.saveCredentials)({
|
|
153
|
+
(0, credentials_1.saveCredentials)({ environments: { staging: 'fias_sk_test' } });
|
|
109
154
|
expect(mockedFs.writeFileSync).toHaveBeenCalledWith(expect.any(String), expect.any(String), {
|
|
110
155
|
mode: 0o600,
|
|
111
156
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.test.js","sourceRoot":"","sources":["../../src/config/credentials.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,+
|
|
1
|
+
{"version":3,"file":"credentials.test.js","sourceRoot":"","sources":["../../src/config/credentials.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -5,12 +5,11 @@
|
|
|
5
5
|
* bridge API calls from the harness JavaScript.
|
|
6
6
|
*/
|
|
7
7
|
import type { MockEntityConfig } from '../config/config-loader';
|
|
8
|
+
import { type Environment } from '../config/credentials';
|
|
8
9
|
export interface HarnessServerOptions {
|
|
9
10
|
port: number;
|
|
10
11
|
pluginUrl: string;
|
|
11
|
-
|
|
12
|
-
apiKey: string;
|
|
13
|
-
apiUrl: string;
|
|
12
|
+
defaultEnvironment: Environment;
|
|
14
13
|
permissions: string[];
|
|
15
14
|
mockUser: {
|
|
16
15
|
userId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-server.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"harness-server.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,WAAW,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzE,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACjD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqRrF"}
|