latchkey 2.21.0 → 3.0.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/README.md +36 -4
- package/dist/skills/generic/latchkey/SKILL.md +21 -0
- package/dist/skills/openclaw/latchkey/SKILL.md +21 -0
- package/dist/src/apiCredentials/account.d.ts +28 -0
- package/dist/src/apiCredentials/account.d.ts.map +1 -0
- package/dist/src/apiCredentials/account.js +49 -0
- package/dist/src/apiCredentials/account.js.map +1 -0
- package/dist/src/apiCredentials/store.d.ts +70 -4
- package/dist/src/apiCredentials/store.d.ts.map +1 -1
- package/dist/src/apiCredentials/store.js +161 -19
- package/dist/src/apiCredentials/store.js.map +1 -1
- package/dist/src/apiCredentials/utils.d.ts +2 -2
- package/dist/src/apiCredentials/utils.d.ts.map +1 -1
- package/dist/src/apiCredentials/utils.js +5 -5
- package/dist/src/apiCredentials/utils.js.map +1 -1
- package/dist/src/cli.js +1 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +118 -22
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/config.d.ts +6 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +8 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/configDataStore.d.ts +3 -0
- package/dist/src/configDataStore.d.ts.map +1 -1
- package/dist/src/configDataStore.js +1 -0
- package/dist/src/configDataStore.js.map +1 -1
- package/dist/src/curl.d.ts +21 -16
- package/dist/src/curl.d.ts.map +1 -1
- package/dist/src/curl.js +17 -24
- package/dist/src/curl.js.map +1 -1
- package/dist/src/curlInjection.d.ts +8 -2
- package/dist/src/curlInjection.d.ts.map +1 -1
- package/dist/src/curlInjection.js +13 -8
- package/dist/src/curlInjection.js.map +1 -1
- package/dist/src/errorMessages.d.ts +2 -2
- package/dist/src/errorMessages.d.ts.map +1 -1
- package/dist/src/errorMessages.js +22 -6
- package/dist/src/errorMessages.js.map +1 -1
- package/dist/src/gateway/gatewayEndpoint.d.ts +1 -1
- package/dist/src/gateway/gatewayEndpoint.d.ts.map +1 -1
- package/dist/src/gateway/gatewayEndpoint.js +3 -1
- package/dist/src/gateway/gatewayEndpoint.js.map +1 -1
- package/dist/src/gateway/latchkeyEndpoint.d.ts +6 -0
- package/dist/src/gateway/latchkeyEndpoint.d.ts.map +1 -1
- package/dist/src/gateway/latchkeyEndpoint.js +6 -4
- package/dist/src/gateway/latchkeyEndpoint.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations.d.ts +21 -1
- package/dist/src/migrations.d.ts.map +1 -1
- package/dist/src/migrations.js +112 -4
- package/dist/src/migrations.js.map +1 -1
- package/dist/src/oauthUtils.d.ts +2 -2
- package/dist/src/oauthUtils.d.ts.map +1 -1
- package/dist/src/oauthUtils.js +5 -5
- package/dist/src/oauthUtils.js.map +1 -1
- package/dist/src/services/aws.d.ts +1 -0
- package/dist/src/services/aws.d.ts.map +1 -1
- package/dist/src/services/aws.js +13 -0
- package/dist/src/services/aws.js.map +1 -1
- package/dist/src/services/calendly.d.ts +2 -0
- package/dist/src/services/calendly.d.ts.map +1 -1
- package/dist/src/services/calendly.js +7 -0
- package/dist/src/services/calendly.js.map +1 -1
- package/dist/src/services/coolify.d.ts +3 -1
- package/dist/src/services/coolify.d.ts.map +1 -1
- package/dist/src/services/coolify.js +10 -1
- package/dist/src/services/coolify.js.map +1 -1
- package/dist/src/services/core/base.d.ts +43 -1
- package/dist/src/services/core/base.d.ts.map +1 -1
- package/dist/src/services/core/base.js +29 -9
- package/dist/src/services/core/base.js.map +1 -1
- package/dist/src/services/core/registered.d.ts +1 -0
- package/dist/src/services/core/registered.d.ts.map +1 -1
- package/dist/src/services/core/registered.js +5 -0
- package/dist/src/services/core/registered.js.map +1 -1
- package/dist/src/services/discord.d.ts +1 -0
- package/dist/src/services/discord.d.ts.map +1 -1
- package/dist/src/services/discord.js +9 -0
- package/dist/src/services/discord.js.map +1 -1
- package/dist/src/services/dropbox.d.ts +2 -1
- package/dist/src/services/dropbox.d.ts.map +1 -1
- package/dist/src/services/dropbox.js +17 -11
- package/dist/src/services/dropbox.js.map +1 -1
- package/dist/src/services/figma.d.ts +2 -0
- package/dist/src/services/figma.d.ts.map +1 -1
- package/dist/src/services/figma.js +7 -0
- package/dist/src/services/figma.js.map +1 -1
- package/dist/src/services/github.d.ts +1 -0
- package/dist/src/services/github.d.ts.map +1 -1
- package/dist/src/services/github.js +9 -0
- package/dist/src/services/github.js.map +1 -1
- package/dist/src/services/gitlab.d.ts +2 -0
- package/dist/src/services/gitlab.d.ts.map +1 -1
- package/dist/src/services/gitlab.js +9 -0
- package/dist/src/services/gitlab.js.map +1 -1
- package/dist/src/services/google/analytics.d.ts +0 -1
- package/dist/src/services/google/analytics.d.ts.map +1 -1
- package/dist/src/services/google/analytics.js +0 -3
- package/dist/src/services/google/analytics.js.map +1 -1
- package/dist/src/services/google/base.d.ts +11 -0
- package/dist/src/services/google/base.d.ts.map +1 -1
- package/dist/src/services/google/base.js +26 -7
- package/dist/src/services/google/base.js.map +1 -1
- package/dist/src/services/google/calendar.d.ts +0 -1
- package/dist/src/services/google/calendar.d.ts.map +1 -1
- package/dist/src/services/google/calendar.js +0 -3
- package/dist/src/services/google/calendar.js.map +1 -1
- package/dist/src/services/google/directions.d.ts +1 -0
- package/dist/src/services/google/directions.d.ts.map +1 -1
- package/dist/src/services/google/directions.js +5 -0
- package/dist/src/services/google/directions.js.map +1 -1
- package/dist/src/services/google/docs.d.ts +0 -1
- package/dist/src/services/google/docs.d.ts.map +1 -1
- package/dist/src/services/google/docs.js +0 -3
- package/dist/src/services/google/docs.js.map +1 -1
- package/dist/src/services/google/drive.d.ts +0 -1
- package/dist/src/services/google/drive.d.ts.map +1 -1
- package/dist/src/services/google/drive.js +0 -3
- package/dist/src/services/google/drive.js.map +1 -1
- package/dist/src/services/google/gmail.d.ts +0 -1
- package/dist/src/services/google/gmail.d.ts.map +1 -1
- package/dist/src/services/google/gmail.js +0 -3
- package/dist/src/services/google/gmail.js.map +1 -1
- package/dist/src/services/google/people.d.ts +0 -1
- package/dist/src/services/google/people.d.ts.map +1 -1
- package/dist/src/services/google/people.js +0 -3
- package/dist/src/services/google/people.js.map +1 -1
- package/dist/src/services/google/sheets.d.ts +0 -1
- package/dist/src/services/google/sheets.d.ts.map +1 -1
- package/dist/src/services/google/sheets.js +0 -3
- package/dist/src/services/google/sheets.js.map +1 -1
- package/dist/src/services/google/slides.d.ts +0 -1
- package/dist/src/services/google/slides.d.ts.map +1 -1
- package/dist/src/services/google/slides.js +0 -3
- package/dist/src/services/google/slides.js.map +1 -1
- package/dist/src/services/index.d.ts +1 -1
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/linear.d.ts +2 -1
- package/dist/src/services/linear.d.ts.map +1 -1
- package/dist/src/services/linear.js +8 -1
- package/dist/src/services/linear.js.map +1 -1
- package/dist/src/services/mailchimp.d.ts +2 -0
- package/dist/src/services/mailchimp.d.ts.map +1 -1
- package/dist/src/services/mailchimp.js +7 -0
- package/dist/src/services/mailchimp.js.map +1 -1
- package/dist/src/services/notion-mcp.d.ts +3 -2
- package/dist/src/services/notion-mcp.d.ts.map +1 -1
- package/dist/src/services/notion-mcp.js +111 -14
- package/dist/src/services/notion-mcp.js.map +1 -1
- package/dist/src/services/notion.d.ts +2 -0
- package/dist/src/services/notion.d.ts.map +1 -1
- package/dist/src/services/notion.js +17 -0
- package/dist/src/services/notion.js.map +1 -1
- package/dist/src/services/ramp.d.ts +11 -2
- package/dist/src/services/ramp.d.ts.map +1 -1
- package/dist/src/services/ramp.js +35 -9
- package/dist/src/services/ramp.js.map +1 -1
- package/dist/src/services/sentry.d.ts +3 -2
- package/dist/src/services/sentry.d.ts.map +1 -1
- package/dist/src/services/sentry.js +12 -27
- package/dist/src/services/sentry.js.map +1 -1
- package/dist/src/services/slack.d.ts +3 -2
- package/dist/src/services/slack.d.ts.map +1 -1
- package/dist/src/services/slack.js +19 -13
- package/dist/src/services/slack.js.map +1 -1
- package/dist/src/services/stripe.d.ts +7 -0
- package/dist/src/services/stripe.d.ts.map +1 -1
- package/dist/src/services/stripe.js +15 -0
- package/dist/src/services/stripe.js.map +1 -1
- package/dist/src/services/telegram.d.ts +1 -0
- package/dist/src/services/telegram.d.ts.map +1 -1
- package/dist/src/services/telegram.js +7 -0
- package/dist/src/services/telegram.js.map +1 -1
- package/dist/src/services/todoist.d.ts +2 -1
- package/dist/src/services/todoist.d.ts.map +1 -1
- package/dist/src/services/todoist.js +9 -1
- package/dist/src/services/todoist.js.map +1 -1
- package/dist/src/services/umami.d.ts +3 -1
- package/dist/src/services/umami.d.ts.map +1 -1
- package/dist/src/services/umami.js +11 -1
- package/dist/src/services/umami.js.map +1 -1
- package/dist/src/services/yelp.d.ts +1 -0
- package/dist/src/services/yelp.d.ts.map +1 -1
- package/dist/src/services/yelp.js +5 -0
- package/dist/src/services/yelp.js.map +1 -1
- package/dist/src/services/zoom.d.ts +8 -0
- package/dist/src/services/zoom.d.ts.map +1 -1
- package/dist/src/services/zoom.js +16 -0
- package/dist/src/services/zoom.js.map +1 -1
- package/dist/src/sharedOperations.d.ts +30 -10
- package/dist/src/sharedOperations.d.ts.map +1 -1
- package/dist/src/sharedOperations.js +67 -29
- package/dist/src/sharedOperations.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.d.ts.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/tests/apiCredentialStore.test.js +155 -2
- package/dist/tests/apiCredentialStore.test.js.map +1 -1
- package/dist/tests/apiCredentialsUtils.test.js +1 -1
- package/dist/tests/apiCredentialsUtils.test.js.map +1 -1
- package/dist/tests/cli.test.js +334 -147
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/config.test.js +5 -0
- package/dist/tests/config.test.js.map +1 -1
- package/dist/tests/gateway.test.js +8 -18
- package/dist/tests/gateway.test.js.map +1 -1
- package/dist/tests/latchkeyEndpoint.test.js +18 -28
- package/dist/tests/latchkeyEndpoint.test.js.map +1 -1
- package/dist/tests/migrations.test.js +220 -39
- package/dist/tests/migrations.test.js.map +1 -1
- package/dist/tests/mockService.d.ts +25 -0
- package/dist/tests/mockService.d.ts.map +1 -0
- package/dist/tests/mockService.js +40 -0
- package/dist/tests/mockService.js.map +1 -0
- package/dist/tests/oauthUtils.test.js +12 -12
- package/dist/tests/oauthUtils.test.js.map +1 -1
- package/dist/tests/serviceAccounts.test.d.ts +12 -0
- package/dist/tests/serviceAccounts.test.d.ts.map +1 -0
- package/dist/tests/serviceAccounts.test.js +278 -0
- package/dist/tests/serviceAccounts.test.js.map +1 -0
- package/dist/tests/sharedOperations.test.js +327 -58
- package/dist/tests/sharedOperations.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,8 @@ import { Config } from '../src/config.js';
|
|
|
6
6
|
import { EncryptedStorage } from '../src/encryptedStorage.js';
|
|
7
7
|
import { generateKey } from '../src/encryption.js';
|
|
8
8
|
import { runMigrations, readDataFormatVersion, LATEST_VERSION, MigrationError, } from '../src/migrations.js';
|
|
9
|
+
import { ApiCredentialStatus } from '../src/apiCredentials/base.js';
|
|
10
|
+
import { setAsyncSubprocessRunner, resetAsyncSubprocessRunner } from '../src/curl.js';
|
|
9
11
|
function createTestConfig(directory) {
|
|
10
12
|
return new Config((name) => {
|
|
11
13
|
if (name === 'LATCHKEY_DIRECTORY')
|
|
@@ -13,6 +15,19 @@ function createTestConfig(directory) {
|
|
|
13
15
|
return undefined;
|
|
14
16
|
});
|
|
15
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolver that never hits the network. It reports every credential as
|
|
20
|
+
* inconclusive, which makes the accounts migration keep each service under the
|
|
21
|
+
* default account (the pre-network behaviour these tests were written for).
|
|
22
|
+
*/
|
|
23
|
+
const inconclusiveResolver = () => Promise.resolve({ status: ApiCredentialStatus.Unknown, account: null });
|
|
24
|
+
/**
|
|
25
|
+
* Build a resolver from a fixed map of service name to resolved credential,
|
|
26
|
+
* defaulting to inconclusive for anything not listed.
|
|
27
|
+
*/
|
|
28
|
+
function resolverFromMap(results) {
|
|
29
|
+
return (serviceName) => Promise.resolve(results[serviceName] ?? { status: ApiCredentialStatus.Unknown, account: null });
|
|
30
|
+
}
|
|
16
31
|
describe('migrations', () => {
|
|
17
32
|
let tempDir;
|
|
18
33
|
let encryptionKey;
|
|
@@ -25,6 +40,7 @@ describe('migrations', () => {
|
|
|
25
40
|
config = createTestConfig(tempDir);
|
|
26
41
|
});
|
|
27
42
|
afterEach(() => {
|
|
43
|
+
resetAsyncSubprocessRunner();
|
|
28
44
|
rmSync(tempDir, { recursive: true, force: true });
|
|
29
45
|
});
|
|
30
46
|
describe('readDataFormatVersion', () => {
|
|
@@ -49,40 +65,40 @@ describe('migrations', () => {
|
|
|
49
65
|
});
|
|
50
66
|
});
|
|
51
67
|
describe('runMigrations', () => {
|
|
52
|
-
it('should skip migrations on first installation (no directory)', () => {
|
|
68
|
+
it('should skip migrations but stamp the version on first installation (no directory)', async () => {
|
|
53
69
|
const freshConfig = createTestConfig(join(tempDir, 'nonexistent'));
|
|
54
|
-
runMigrations(freshConfig, encryptedStorage);
|
|
55
|
-
//
|
|
56
|
-
|
|
70
|
+
await runMigrations(freshConfig, encryptedStorage, inconclusiveResolver);
|
|
71
|
+
// A fresh installation starts in the newest format; the version stamp
|
|
72
|
+
// prevents future runs from "migrating" a store created in that format.
|
|
73
|
+
expect(readDataFormatVersion(freshConfig)).toBe(LATEST_VERSION);
|
|
74
|
+
expect(existsSync(join(tempDir, 'nonexistent', 'credentials.json'))).toBe(false);
|
|
57
75
|
});
|
|
58
|
-
it('should skip migrations on first installation (directory exists but no credentials)', () => {
|
|
76
|
+
it('should skip migrations but stamp the version on first installation (directory exists but no credentials)', async () => {
|
|
59
77
|
// tempDir exists but has no credentials file
|
|
60
|
-
runMigrations(config, encryptedStorage);
|
|
61
|
-
expect(
|
|
78
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
79
|
+
expect(readDataFormatVersion(config)).toBe(LATEST_VERSION);
|
|
62
80
|
});
|
|
63
|
-
it('should run migrations when credentials exist and version is 0', () => {
|
|
81
|
+
it('should run migrations when credentials exist and version is 0', async () => {
|
|
64
82
|
// Create a credentials store with no "google" entry
|
|
65
83
|
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: { objectType: 'slack', token: 't', dCookie: 'd' } }));
|
|
66
|
-
runMigrations(config, encryptedStorage);
|
|
84
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
67
85
|
expect(readDataFormatVersion(config)).toBe(LATEST_VERSION);
|
|
68
86
|
});
|
|
69
|
-
it('should not run migrations when already at latest version', () => {
|
|
87
|
+
it('should not run migrations when already at latest version', async () => {
|
|
70
88
|
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: { objectType: 'slack', token: 't', dCookie: 'd' } }));
|
|
71
89
|
writeFileSync(join(tempDir, 'data-format-version'), String(LATEST_VERSION), 'utf-8');
|
|
72
90
|
// Should not throw
|
|
73
|
-
runMigrations(config, encryptedStorage);
|
|
91
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
74
92
|
expect(readDataFormatVersion(config)).toBe(LATEST_VERSION);
|
|
75
93
|
});
|
|
76
|
-
it('should throw when version is newer than latest', () => {
|
|
94
|
+
it('should throw when version is newer than latest', async () => {
|
|
77
95
|
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: { objectType: 'slack', token: 't', dCookie: 'd' } }));
|
|
78
96
|
writeFileSync(join(tempDir, 'data-format-version'), String(LATEST_VERSION + 1), 'utf-8');
|
|
79
|
-
expect((
|
|
80
|
-
runMigrations(config, encryptedStorage);
|
|
81
|
-
}).toThrow(MigrationError);
|
|
97
|
+
await expect(runMigrations(config, encryptedStorage, inconclusiveResolver)).rejects.toThrow(MigrationError);
|
|
82
98
|
});
|
|
83
99
|
});
|
|
84
100
|
describe('migration 1: split google credentials', () => {
|
|
85
|
-
it('should replace "google" with individual service entries', () => {
|
|
101
|
+
it('should replace "google" with individual service entries', async () => {
|
|
86
102
|
const googleCredentials = {
|
|
87
103
|
objectType: 'oauth',
|
|
88
104
|
clientId: 'test-client-id',
|
|
@@ -91,21 +107,34 @@ describe('migrations', () => {
|
|
|
91
107
|
refreshToken: 'test-refresh-token',
|
|
92
108
|
};
|
|
93
109
|
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ google: googleCredentials }));
|
|
94
|
-
runMigrations(config, encryptedStorage);
|
|
110
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
95
111
|
const content = encryptedStorage.readFile(config.credentialStorePath);
|
|
96
112
|
const store = JSON.parse(content);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
113
|
+
// The accounts-and-preparations migration additionally wraps each entry
|
|
114
|
+
// under the default account (the empty string) and derives a token-less
|
|
115
|
+
// OAuth client preparation for each Google service.
|
|
116
|
+
const expectedPreparation = {
|
|
117
|
+
objectType: 'oauth',
|
|
118
|
+
clientId: 'test-client-id',
|
|
119
|
+
clientSecret: 'test-client-secret',
|
|
120
|
+
};
|
|
121
|
+
expect(store.credentials).not.toHaveProperty('google');
|
|
122
|
+
for (const serviceName of [
|
|
123
|
+
'google-gmail',
|
|
124
|
+
'google-calendar',
|
|
125
|
+
'google-drive',
|
|
126
|
+
'google-sheets',
|
|
127
|
+
'google-docs',
|
|
128
|
+
'google-people',
|
|
129
|
+
]) {
|
|
130
|
+
expect(store.credentials[serviceName]).toEqual({ '': googleCredentials });
|
|
131
|
+
expect(store.preparations[serviceName]).toEqual(expectedPreparation);
|
|
132
|
+
}
|
|
104
133
|
// analytics and maps should NOT be created
|
|
105
|
-
expect(store).not.toHaveProperty('google-analytics');
|
|
106
|
-
expect(store).not.toHaveProperty('google-directions');
|
|
134
|
+
expect(store.credentials).not.toHaveProperty('google-analytics');
|
|
135
|
+
expect(store.credentials).not.toHaveProperty('google-directions');
|
|
107
136
|
});
|
|
108
|
-
it('should not overwrite existing individual service credentials', () => {
|
|
137
|
+
it('should not overwrite existing individual service credentials', async () => {
|
|
109
138
|
const googleCredentials = {
|
|
110
139
|
objectType: 'oauth',
|
|
111
140
|
clientId: 'old-client',
|
|
@@ -122,13 +151,17 @@ describe('migrations', () => {
|
|
|
122
151
|
google: googleCredentials,
|
|
123
152
|
'google-drive': existingDriveCredentials,
|
|
124
153
|
}));
|
|
125
|
-
runMigrations(config, encryptedStorage);
|
|
154
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
126
155
|
const content = encryptedStorage.readFile(config.credentialStorePath);
|
|
127
156
|
const store = JSON.parse(content);
|
|
128
|
-
expect(store['google-drive']).toEqual(existingDriveCredentials);
|
|
129
|
-
|
|
157
|
+
expect(store.credentials['google-drive']).toEqual({ '': existingDriveCredentials });
|
|
158
|
+
// The old shared "google" credentials carry no tokens, so the
|
|
159
|
+
// accounts-and-preparations migration treats them as prepared
|
|
160
|
+
// placeholders.
|
|
161
|
+
expect(store.credentials['google-gmail']).toBeUndefined();
|
|
162
|
+
expect(store.preparations['google-gmail']).toEqual(googleCredentials);
|
|
130
163
|
});
|
|
131
|
-
it('should preserve non-google credentials', () => {
|
|
164
|
+
it('should preserve non-google credentials', async () => {
|
|
132
165
|
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
133
166
|
const googleCredentials = {
|
|
134
167
|
objectType: 'oauth',
|
|
@@ -139,26 +172,174 @@ describe('migrations', () => {
|
|
|
139
172
|
slack: slackCredentials,
|
|
140
173
|
google: googleCredentials,
|
|
141
174
|
}));
|
|
142
|
-
runMigrations(config, encryptedStorage);
|
|
175
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
143
176
|
const content = encryptedStorage.readFile(config.credentialStorePath);
|
|
144
177
|
const store = JSON.parse(content);
|
|
145
|
-
expect(store.slack).toEqual(slackCredentials);
|
|
178
|
+
expect(store.credentials.slack).toEqual({ '': slackCredentials });
|
|
146
179
|
});
|
|
147
|
-
it('should be a no-op when there is no "google" entry', () => {
|
|
180
|
+
it('should be a no-op when there is no "google" entry', async () => {
|
|
148
181
|
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
149
182
|
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
|
|
150
|
-
runMigrations(config, encryptedStorage);
|
|
183
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
151
184
|
const content = encryptedStorage.readFile(config.credentialStorePath);
|
|
152
185
|
const store = JSON.parse(content);
|
|
153
|
-
expect(store.slack).toEqual(slackCredentials);
|
|
154
|
-
expect(Object.keys(store)).toEqual(['slack']);
|
|
186
|
+
expect(store.credentials.slack).toEqual({ '': slackCredentials });
|
|
187
|
+
expect(Object.keys(store.credentials)).toEqual(['slack']);
|
|
155
188
|
});
|
|
156
|
-
it('should update the version file after migration', () => {
|
|
189
|
+
it('should update the version file after migration', async () => {
|
|
157
190
|
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ google: { objectType: 'oauth', clientId: 'c', clientSecret: 's' } }));
|
|
158
|
-
runMigrations(config, encryptedStorage);
|
|
191
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
159
192
|
const versionContent = readFileSync(join(tempDir, 'data-format-version'), 'utf-8');
|
|
160
193
|
expect(versionContent).toBe(String(LATEST_VERSION));
|
|
161
194
|
});
|
|
162
195
|
});
|
|
196
|
+
describe('migration 2: introduce accounts and separate preparations', () => {
|
|
197
|
+
it('should wrap each service credential under the default account', async () => {
|
|
198
|
+
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
199
|
+
const discordCredentials = { objectType: 'authorizationBare', token: 'discord' };
|
|
200
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials, discord: discordCredentials }));
|
|
201
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
202
|
+
const content = encryptedStorage.readFile(config.credentialStorePath);
|
|
203
|
+
const store = JSON.parse(content);
|
|
204
|
+
expect(store.credentials.slack).toEqual({ '': slackCredentials });
|
|
205
|
+
expect(store.credentials.discord).toEqual({ '': discordCredentials });
|
|
206
|
+
});
|
|
207
|
+
it('should produce an empty store for an empty store', async () => {
|
|
208
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({}));
|
|
209
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
210
|
+
const content = encryptedStorage.readFile(config.credentialStorePath);
|
|
211
|
+
expect(JSON.parse(content)).toEqual({ credentials: {}, preparations: {} });
|
|
212
|
+
});
|
|
213
|
+
it('should key valid credentials by their resolved account', async () => {
|
|
214
|
+
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
215
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
|
|
216
|
+
await runMigrations(config, encryptedStorage, resolverFromMap({
|
|
217
|
+
slack: { status: ApiCredentialStatus.Valid, account: 'user@example.com' },
|
|
218
|
+
}));
|
|
219
|
+
const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
220
|
+
expect(store.credentials.slack).toEqual({ 'user@example.com': slackCredentials });
|
|
221
|
+
});
|
|
222
|
+
it('should keep valid credentials under the default account when the account is unknown', async () => {
|
|
223
|
+
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
224
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
|
|
225
|
+
await runMigrations(config, encryptedStorage, resolverFromMap({ slack: { status: ApiCredentialStatus.Valid, account: null } }));
|
|
226
|
+
const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
227
|
+
expect(store.credentials.slack).toEqual({ '': slackCredentials });
|
|
228
|
+
});
|
|
229
|
+
it('should preserve the OAuth client of dropped invalid credentials as a preparation', async () => {
|
|
230
|
+
const gmailCredentials = {
|
|
231
|
+
objectType: 'oauth',
|
|
232
|
+
clientId: 'client',
|
|
233
|
+
clientSecret: 'secret',
|
|
234
|
+
accessToken: 'expired-access-token',
|
|
235
|
+
refreshToken: 'expired-refresh-token',
|
|
236
|
+
};
|
|
237
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ 'google-gmail': gmailCredentials }));
|
|
238
|
+
await runMigrations(config, encryptedStorage, resolverFromMap({
|
|
239
|
+
'google-gmail': { status: ApiCredentialStatus.Invalid, account: null },
|
|
240
|
+
}));
|
|
241
|
+
const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
242
|
+
expect(store.credentials).not.toHaveProperty('google-gmail');
|
|
243
|
+
expect(store.preparations['google-gmail']).toEqual({
|
|
244
|
+
objectType: 'oauth',
|
|
245
|
+
clientId: 'client',
|
|
246
|
+
clientSecret: 'secret',
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
it('should drop invalid credentials', async () => {
|
|
250
|
+
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
251
|
+
const discordCredentials = { objectType: 'authorizationBare', token: 'discord' };
|
|
252
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials, discord: discordCredentials }));
|
|
253
|
+
await runMigrations(config, encryptedStorage, resolverFromMap({
|
|
254
|
+
slack: { status: ApiCredentialStatus.Invalid, account: null },
|
|
255
|
+
discord: { status: ApiCredentialStatus.Valid, account: 'me#1234' },
|
|
256
|
+
}));
|
|
257
|
+
const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
258
|
+
expect(store.credentials).not.toHaveProperty('slack');
|
|
259
|
+
expect(store.credentials.discord).toEqual({ 'me#1234': discordCredentials });
|
|
260
|
+
});
|
|
261
|
+
it('should key google credentials by the account from the userinfo endpoint', async () => {
|
|
262
|
+
// Google services learn validity from their credential check and the
|
|
263
|
+
// account from getAccount(), both against the OpenID userinfo endpoint.
|
|
264
|
+
// This exercises the real registry resolver (no injected resolver) to
|
|
265
|
+
// ensure that path runs during the migration. The curl runner is stubbed
|
|
266
|
+
// so nothing hits the network; only the check appends the HTTP status
|
|
267
|
+
// code as the final line (via `-w '\n%{http_code}'`), the account
|
|
268
|
+
// request receives the bare body.
|
|
269
|
+
setAsyncSubprocessRunner((args) => {
|
|
270
|
+
const isCredentialCheck = args.includes('-w');
|
|
271
|
+
const joined = args.join(' ');
|
|
272
|
+
const body = joined.includes('openidconnect.googleapis.com')
|
|
273
|
+
? JSON.stringify({ email: 'alice@example.com' })
|
|
274
|
+
: '{}';
|
|
275
|
+
return Promise.resolve({
|
|
276
|
+
returncode: 0,
|
|
277
|
+
stdout: Buffer.from(isCredentialCheck ? `${body}\n200` : body),
|
|
278
|
+
stderr: '',
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
const gmailCredentials = {
|
|
282
|
+
objectType: 'oauth',
|
|
283
|
+
clientId: 'client',
|
|
284
|
+
clientSecret: 'secret',
|
|
285
|
+
accessToken: 'access-token',
|
|
286
|
+
refreshToken: 'refresh-token',
|
|
287
|
+
};
|
|
288
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ 'google-gmail': gmailCredentials }));
|
|
289
|
+
// Note: no resolver is injected, so the default registry resolver runs.
|
|
290
|
+
await runMigrations(config, encryptedStorage);
|
|
291
|
+
const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
292
|
+
expect(store.credentials['google-gmail']).toEqual({
|
|
293
|
+
'alice@example.com': gmailCredentials,
|
|
294
|
+
});
|
|
295
|
+
expect(store.preparations['google-gmail']).toEqual({
|
|
296
|
+
objectType: 'oauth',
|
|
297
|
+
clientId: 'client',
|
|
298
|
+
clientSecret: 'secret',
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
it('should leave credentials under the default account on inconclusive checks', async () => {
|
|
302
|
+
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
303
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
|
|
304
|
+
await runMigrations(config, encryptedStorage, resolverFromMap({ slack: { status: ApiCredentialStatus.Unknown, account: null } }));
|
|
305
|
+
const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
306
|
+
expect(store.credentials.slack).toEqual({ '': slackCredentials });
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('migration 2: preparations', () => {
|
|
310
|
+
async function runMigrationOn(store) {
|
|
311
|
+
encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify(store));
|
|
312
|
+
await runMigrations(config, encryptedStorage, inconclusiveResolver);
|
|
313
|
+
return JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
|
|
314
|
+
}
|
|
315
|
+
it('moves a token-less OAuth client (a prepared placeholder) into preparations', async () => {
|
|
316
|
+
const preparedClient = { objectType: 'oauth', clientId: 'cid', clientSecret: 'csecret' };
|
|
317
|
+
const store = await runMigrationOn({ 'google-gmail': preparedClient });
|
|
318
|
+
expect(store.credentials).not.toHaveProperty('google-gmail');
|
|
319
|
+
expect(store.preparations['google-gmail']).toEqual(preparedClient);
|
|
320
|
+
});
|
|
321
|
+
it('derives a token-less preparation from complete OAuth credentials', async () => {
|
|
322
|
+
const fullCredentials = {
|
|
323
|
+
objectType: 'oauth',
|
|
324
|
+
clientId: 'cid',
|
|
325
|
+
clientSecret: 'csecret',
|
|
326
|
+
accessToken: 'access-token',
|
|
327
|
+
refreshToken: 'refresh-token',
|
|
328
|
+
};
|
|
329
|
+
const store = await runMigrationOn({ 'google-docs': fullCredentials });
|
|
330
|
+
expect(store.credentials['google-docs']).toEqual({ '': fullCredentials });
|
|
331
|
+
expect(store.preparations['google-docs']).toEqual({
|
|
332
|
+
objectType: 'oauth',
|
|
333
|
+
clientId: 'cid',
|
|
334
|
+
clientSecret: 'csecret',
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
it('creates no preparation for non-OAuth credentials', async () => {
|
|
338
|
+
const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
|
|
339
|
+
const store = await runMigrationOn({ slack: slackCredentials });
|
|
340
|
+
expect(store.credentials.slack).toEqual({ '': slackCredentials });
|
|
341
|
+
expect(store.preparations).toEqual({});
|
|
342
|
+
});
|
|
343
|
+
});
|
|
163
344
|
});
|
|
164
345
|
//# sourceMappingURL=migrations.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../tests/migrations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,IAAI,KAAK,oBAAoB;YAAE,OAAO,SAAS,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,OAAe,CAAC;IACpB,IAAI,aAAqB,CAAC;IAC1B,IAAI,gBAAkC,CAAC;IACvC,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAClE,aAAa,GAAG,WAAW,EAAE,CAAC;QAC9B,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YACnE,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YAC7C,mDAAmD;YACnD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;YAC5F,6CAA6C;YAC7C,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,oDAAoD;YACpD,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAC7E,CAAC;YAEF,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAExC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAC7E,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;YAErF,mBAAmB;YACnB,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACxC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAC7E,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEzF,MAAM,CAAC,GAAG,EAAE;gBACV,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,iBAAiB,GAAG;gBACxB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY,EAAE,oBAAoB;gBAClC,WAAW,EAAE,mBAAmB;gBAChC,YAAY,EAAE,oBAAoB;aACnC,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAC9C,CAAC;YAEF,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAExC,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE7D,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC1D,2CAA2C;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,iBAAiB,GAAG;gBACxB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,YAAY;gBACtB,YAAY,EAAE,YAAY;aAC3B,CAAC;YACF,MAAM,wBAAwB,GAAG;gBAC/B,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,cAAc;gBACxB,YAAY,EAAE,cAAc;gBAC5B,WAAW,EAAE,aAAa;gBAC1B,YAAY,EAAE,eAAe;aAC9B,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC;gBACb,MAAM,EAAE,iBAAiB;gBACzB,cAAc,EAAE,wBAAwB;aACzC,CAAC,CACH,CAAC;YAEF,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAExC,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE7D,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAC3E,MAAM,iBAAiB,GAAG;gBACxB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,QAAQ;aACvB,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,iBAAiB;aAC1B,CAAC,CACH,CAAC;YAEF,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAExC,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAE3E,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAC5C,CAAC;YAEF,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAExC,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC,CACtF,CAAC;YAEF,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAExC,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,OAAO,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../tests/migrations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEtF,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,IAAI,KAAK,oBAAoB;YAAE,OAAO,SAAS,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,oBAAoB,GAAuB,GAAG,EAAE,CACpD,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAE1E;;;GAGG;AACH,SAAS,eAAe,CAAC,OAA2C;IAClE,OAAO,CAAC,WAAW,EAAE,EAAE,CACrB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACpG,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,OAAe,CAAC;IACpB,IAAI,aAAqB,CAAC;IAC1B,IAAI,gBAAkC,CAAC;IACvC,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAClE,aAAa,GAAG,WAAW,EAAE,CAAC;QAC9B,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;YACjG,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YACnE,MAAM,aAAa,CAAC,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YACzE,sEAAsE;YACtE,wEAAwE;YACxE,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0GAA0G,EAAE,KAAK,IAAI,EAAE;YACxH,6CAA6C;YAC7C,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YACpE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,oDAAoD;YACpD,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAC7E,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAC7E,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;YAErF,mBAAmB;YACnB,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YACpE,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAC7E,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEzF,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzF,cAAc,CACf,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,iBAAiB,GAAG;gBACxB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY,EAAE,oBAAoB;gBAClC,WAAW,EAAE,mBAAmB;gBAChC,YAAY,EAAE,oBAAoB;aACnC,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAC9C,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAG/B,CAAC;YAEF,wEAAwE;YACxE,wEAAwE;YACxE,oDAAoD;YACpD,MAAM,mBAAmB,GAAG;gBAC1B,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY,EAAE,oBAAoB;aACnC,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvD,KAAK,MAAM,WAAW,IAAI;gBACxB,cAAc;gBACd,iBAAiB;gBACjB,cAAc;gBACd,eAAe;gBACf,aAAa;gBACb,eAAe;aAChB,EAAE,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBAC1E,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACvE,CAAC;YACD,2CAA2C;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,iBAAiB,GAAG;gBACxB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,YAAY;gBACtB,YAAY,EAAE,YAAY;aAC3B,CAAC;YACF,MAAM,wBAAwB,GAAG;gBAC/B,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,cAAc;gBACxB,YAAY,EAAE,cAAc;gBAC5B,WAAW,EAAE,aAAa;gBAC1B,YAAY,EAAE,eAAe;aAC9B,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC;gBACb,MAAM,EAAE,iBAAiB;gBACzB,cAAc,EAAE,wBAAwB;aACzC,CAAC,CACH,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAG/B,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,wBAAwB,EAAE,CAAC,CAAC;YACpF,8DAA8D;YAC9D,8DAA8D;YAC9D,gBAAgB;YAChB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAC3E,MAAM,iBAAiB,GAAG;gBACxB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,QAAQ;aACvB,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,iBAAiB;aAC1B,CAAC,CACH,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6C,CAAC;YAE9E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAE3E,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAC5C,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6C,CAAC;YAE9E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC,CACtF,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,OAAO,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACzE,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAC3E,MAAM,kBAAkB,GAAG,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAEjF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CACzE,CAAC;YAEF,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6C,CAAC;YAE9E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAE3E,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAE3E,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAC5C,CAAC;YAEF,MAAM,aAAa,CACjB,MAAM,EACN,gBAAgB,EAChB,eAAe,CAAC;gBACd,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE;aAC1E,CAAC,CACH,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAE9E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;YACnG,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAE3E,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAC5C,CAAC;YAEF,MAAM,aAAa,CACjB,MAAM,EACN,gBAAgB,EAChB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CACjF,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAE9E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;YAChG,MAAM,gBAAgB,GAAG;gBACvB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,QAAQ;gBACtB,WAAW,EAAE,sBAAsB;gBACnC,YAAY,EAAE,uBAAuB;aACtC,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CACrD,CAAC;YAEF,MAAM,aAAa,CACjB,MAAM,EACN,gBAAgB,EAChB,eAAe,CAAC;gBACd,cAAc,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;aACvE,CAAC,CACH,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAG9E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjD,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAC3E,MAAM,kBAAkB,GAAG,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAEjF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CACzE,CAAC;YAEF,MAAM,aAAa,CACjB,MAAM,EACN,gBAAgB,EAChB,eAAe,CAAC;gBACd,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC7D,OAAO,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE;aACnE,CAAC,CACH,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAE9E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,qEAAqE;YACrE,wEAAwE;YACxE,sEAAsE;YACtE,yEAAyE;YACzE,sEAAsE;YACtE,kEAAkE;YAClE,kCAAkC;YAClC,wBAAwB,CAAC,CAAC,IAAuB,EAAE,EAAE;gBACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC;oBAC1D,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;oBAChD,CAAC,CAAC,IAAI,CAAC;gBACT,OAAO,OAAO,CAAC,OAAO,CAAC;oBACrB,UAAU,EAAE,CAAC;oBACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9D,MAAM,EAAE,EAAE;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG;gBACvB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,QAAQ;gBACtB,WAAW,EAAE,cAAc;gBAC3B,YAAY,EAAE,eAAe;aAC9B,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CACrD,CAAC;YAEF,wEAAwE;YACxE,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAG9E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;gBAChD,mBAAmB,EAAE,gBAAgB;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjD,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAE3E,gBAAgB,CAAC,SAAS,CACxB,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAC5C,CAAC;YAEF,MAAM,aAAa,CACjB,MAAM,EACN,gBAAgB,EAChB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CACnF,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAE9E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,KAAK,UAAU,cAAc,CAC3B,KAA8B;YAE9B,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9E,MAAM,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAE,CAGvE,CAAC;QACJ,CAAC;QAED,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,cAAc,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YAEzF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;YAEvE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,eAAe,GAAG;gBACtB,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,SAAS;gBACvB,WAAW,EAAE,cAAc;gBAC3B,YAAY,EAAE,eAAe;aAC9B,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;YAEvE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YAC1E,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;gBAChD,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,gBAAgB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAE3E,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAEhE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Service test double.
|
|
3
|
+
*
|
|
4
|
+
* Service has protected members (the credential-check hooks), so plain object
|
|
5
|
+
* literals can no longer satisfy the Service type; fakes must subclass it.
|
|
6
|
+
* MockService exposes every configurable member as a public, writable field
|
|
7
|
+
* with Slack-flavored defaults matching the historical inline fakes.
|
|
8
|
+
*/
|
|
9
|
+
import { type ApiCredentials } from '../src/apiCredentials/base.js';
|
|
10
|
+
import { Service } from '../src/services/core/base.js';
|
|
11
|
+
export declare class MockService extends Service {
|
|
12
|
+
name: string;
|
|
13
|
+
displayName: string;
|
|
14
|
+
baseApiUrls: readonly (string | RegExp)[];
|
|
15
|
+
loginUrl: string;
|
|
16
|
+
info: string;
|
|
17
|
+
credentialCheckCurlArguments: readonly string[];
|
|
18
|
+
checkApiCredentials: Service['checkApiCredentials'];
|
|
19
|
+
getAccount: Service['getAccount'];
|
|
20
|
+
setCredentialsExample(serviceName: string): string;
|
|
21
|
+
getCredentialsNoCurl(_arguments: readonly string[]): ApiCredentials;
|
|
22
|
+
getSession: Service['getSession'];
|
|
23
|
+
}
|
|
24
|
+
export declare function createMockService(overrides?: Partial<MockService>): MockService;
|
|
25
|
+
//# sourceMappingURL=mockService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockService.d.ts","sourceRoot":"","sources":["../../tests/mockService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EAAsC,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE3F,qBAAa,WAAY,SAAQ,OAAO;IACtC,IAAI,SAAW;IACf,WAAW,SAAW;IACtB,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAA8B;IACvE,QAAQ,SAA8B;IACtC,IAAI,SAAkC;IACtC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAuC;IAE7E,mBAAmB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAEZ;IAEvC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAmC;IAE7E,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc;IAInE,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAKvC;CACJ;AAED,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAEnF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Service test double.
|
|
3
|
+
*
|
|
4
|
+
* Service has protected members (the credential-check hooks), so plain object
|
|
5
|
+
* literals can no longer satisfy the Service type; fakes must subclass it.
|
|
6
|
+
* MockService exposes every configurable member as a public, writable field
|
|
7
|
+
* with Slack-flavored defaults matching the historical inline fakes.
|
|
8
|
+
*/
|
|
9
|
+
import { vi } from 'vitest';
|
|
10
|
+
import { ApiCredentialStatus } from '../src/apiCredentials/base.js';
|
|
11
|
+
import { SlackApiCredentials } from '../src/services/slack.js';
|
|
12
|
+
import { NoCurlCredentialsNotSupportedError, Service } from '../src/services/core/base.js';
|
|
13
|
+
export class MockService extends Service {
|
|
14
|
+
name = 'slack';
|
|
15
|
+
displayName = 'Slack';
|
|
16
|
+
baseApiUrls = ['https://slack.com/api/'];
|
|
17
|
+
loginUrl = 'https://slack.com/signin';
|
|
18
|
+
info = 'Test info for Slack service.';
|
|
19
|
+
credentialCheckCurlArguments = ['https://slack.com/api/auth.test'];
|
|
20
|
+
checkApiCredentials = vi
|
|
21
|
+
.fn()
|
|
22
|
+
.mockResolvedValue(ApiCredentialStatus.Valid);
|
|
23
|
+
getAccount = vi.fn().mockResolvedValue(null);
|
|
24
|
+
setCredentialsExample(serviceName) {
|
|
25
|
+
return `latchkey auth set ${serviceName} -H "Authorization: Bearer xoxb-your-token"`;
|
|
26
|
+
}
|
|
27
|
+
getCredentialsNoCurl(_arguments) {
|
|
28
|
+
throw new NoCurlCredentialsNotSupportedError(this.name);
|
|
29
|
+
}
|
|
30
|
+
getSession = vi.fn().mockReturnValue({
|
|
31
|
+
login: vi.fn().mockResolvedValue({
|
|
32
|
+
credentials: new SlackApiCredentials('xoxc-test-token', 'test-cookie'),
|
|
33
|
+
account: '',
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function createMockService(overrides = {}) {
|
|
38
|
+
return Object.assign(new MockService(), overrides);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=mockService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockService.js","sourceRoot":"","sources":["../../tests/mockService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAuB,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE3F,MAAM,OAAO,WAAY,SAAQ,OAAO;IACtC,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,OAAO,CAAC;IACtB,WAAW,GAAiC,CAAC,wBAAwB,CAAC,CAAC;IACvE,QAAQ,GAAG,0BAA0B,CAAC;IACtC,IAAI,GAAG,8BAA8B,CAAC;IACtC,4BAA4B,GAAsB,CAAC,iCAAiC,CAAC,CAAC;IAE7E,mBAAmB,GAAmC,EAAE;SAC9D,EAAE,EAAE;SACJ,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEvC,UAAU,GAA0B,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7E,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,6CAA6C,CAAC;IACvF,CAAC;IAEQ,oBAAoB,CAAC,UAA6B;QACzD,MAAM,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAEQ,UAAU,GAA0B,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QACnE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/B,WAAW,EAAE,IAAI,mBAAmB,CAAC,iBAAiB,EAAE,aAAa,CAAC;YACtE,OAAO,EAAE,EAAE;SACZ,CAAC;KACH,CAAC,CAAC;CACJ;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAkC,EAAE;IACpE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -32,40 +32,40 @@ describe('generateCodeChallenge', () => {
|
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
describe('exchangeCodeForTokens', () => {
|
|
35
|
-
it('with PKCE: includes code_verifier in body', () => {
|
|
36
|
-
const spy = vi.spyOn(curl, '
|
|
35
|
+
it('with PKCE: includes code_verifier in body', async () => {
|
|
36
|
+
const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
|
|
37
37
|
throw new Error('STOP');
|
|
38
38
|
});
|
|
39
|
-
expect(
|
|
39
|
+
await expect(exchangeCodeForTokens('https://api.notion.com/v1/oauth/token', 'auth-code-abc123', 'test-client-id', 'test-client-secret', 'http://localhost:12345/oauth2callback', 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk')).rejects.toThrow('STOP');
|
|
40
40
|
const args = spy.mock.calls[0][0];
|
|
41
41
|
const body = args[args.indexOf('-d') + 1];
|
|
42
42
|
expect(body).toBe('code=auth-code-abc123&client_id=test-client-id&redirect_uri=http%3A%2F%2Flocalhost%3A12345%2Foauth2callback&grant_type=authorization_code&client_secret=test-client-secret&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk');
|
|
43
43
|
});
|
|
44
|
-
it('without PKCE: omits code_verifier from body', () => {
|
|
45
|
-
const spy = vi.spyOn(curl, '
|
|
44
|
+
it('without PKCE: omits code_verifier from body', async () => {
|
|
45
|
+
const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
|
|
46
46
|
throw new Error('STOP');
|
|
47
47
|
});
|
|
48
|
-
expect(
|
|
48
|
+
await expect(exchangeCodeForTokens('https://api.notion.com/v1/oauth/token', 'auth-code-abc123', 'test-client-id', 'test-client-secret', 'http://localhost:12345/oauth2callback')).rejects.toThrow('STOP');
|
|
49
49
|
const args = spy.mock.calls[0][0];
|
|
50
50
|
const body = args[args.indexOf('-d') + 1];
|
|
51
51
|
expect(body).toBe('code=auth-code-abc123&client_id=test-client-id&redirect_uri=http%3A%2F%2Flocalhost%3A12345%2Foauth2callback&grant_type=authorization_code&client_secret=test-client-secret');
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
54
|
describe('refreshAccessToken', () => {
|
|
55
|
-
it('confidential client: includes client_secret in body', () => {
|
|
56
|
-
const spy = vi.spyOn(curl, '
|
|
55
|
+
it('confidential client: includes client_secret in body', async () => {
|
|
56
|
+
const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
|
|
57
57
|
throw new Error('STOP');
|
|
58
58
|
});
|
|
59
|
-
expect(
|
|
59
|
+
await expect(refreshAccessToken('https://api.notion.com/v1/oauth/token', 'refresh-token-xyz789', 'test-client-id', 'test-client-secret')).rejects.toThrow('STOP');
|
|
60
60
|
const args = spy.mock.calls[0][0];
|
|
61
61
|
const body = args[args.indexOf('-d') + 1];
|
|
62
62
|
expect(body).toBe('refresh_token=refresh-token-xyz789&client_id=test-client-id&grant_type=refresh_token&client_secret=test-client-secret');
|
|
63
63
|
});
|
|
64
|
-
it('public client: omits client_secret from body', () => {
|
|
65
|
-
const spy = vi.spyOn(curl, '
|
|
64
|
+
it('public client: omits client_secret from body', async () => {
|
|
65
|
+
const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
|
|
66
66
|
throw new Error('STOP');
|
|
67
67
|
});
|
|
68
|
-
expect(
|
|
68
|
+
await expect(refreshAccessToken('https://api.notion.com/v1/oauth/token', 'refresh-token-xyz789', 'test-client-id', '')).rejects.toThrow('STOP');
|
|
69
69
|
const args = spy.mock.calls[0][0];
|
|
70
70
|
const body = args[args.indexOf('-d') + 1];
|
|
71
71
|
expect(body).toBe('refresh_token=refresh-token-xyz789&client_id=test-client-id&grant_type=refresh_token');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauthUtils.test.js","sourceRoot":"","sources":["../../tests/oauthUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAEvC,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,KAAK,wBAAwB,CAAC;AAC9B,KAAK,uBAAuB,CAAC;AAC7B,KAAK,+BAA+B,CAAC;AAErC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,wEAAwE;QACxE,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,yCAAyC;QACzC,MAAM,CAAC,qBAAqB,CAAC,6CAA6C,CAAC,CAAC,CAAC,IAAI,CAC/E,6CAA6C,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,SAAS,GAAG,qBAAqB,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,2CAA2C,EAAE,
|
|
1
|
+
{"version":3,"file":"oauthUtils.test.js","sourceRoot":"","sources":["../../tests/oauthUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the credential check and for account determination.
|
|
3
|
+
*
|
|
4
|
+
* The credential check runs a single curl call whose output is the response
|
|
5
|
+
* body followed by the HTTP status code on the final line (produced by
|
|
6
|
+
* `-w '\n%{http_code}'`). Account determination (`getAccount`) runs its own
|
|
7
|
+
* curl call against an identity-revealing endpoint and parses the account
|
|
8
|
+
* from the raw response body. These tests mock the async subprocess runner
|
|
9
|
+
* to feed service implementations recorded response bodies.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=serviceAccounts.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceAccounts.test.d.ts","sourceRoot":"","sources":["../../tests/serviceAccounts.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|