@elevasis/core 0.22.0 → 0.24.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/index.d.ts +3214 -2501
- package/dist/index.js +3112 -1222
- package/dist/knowledge/index.d.ts +1108 -1264
- package/dist/knowledge/index.js +112 -9
- package/dist/organization-model/index.d.ts +3214 -2501
- package/dist/organization-model/index.js +3112 -1222
- package/dist/test-utils/index.d.ts +985 -1103
- package/dist/test-utils/index.js +2464 -1165
- package/package.json +5 -5
- package/src/README.md +14 -14
- package/src/__tests__/publish.test.ts +24 -24
- package/src/__tests__/template-core-compatibility.test.ts +9 -80
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2389 -2121
- package/src/_gen/__tests__/scaffold-contracts.test.ts +30 -30
- package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +217 -217
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +69 -69
- package/src/auth/multi-tenancy/credentials/server/kek-loader.ts +37 -37
- package/src/auth/multi-tenancy/index.ts +26 -26
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +104 -104
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +143 -143
- package/src/auth/multi-tenancy/memberships/index.ts +26 -26
- package/src/auth/multi-tenancy/memberships/membership.ts +130 -130
- package/src/auth/multi-tenancy/organizations/__tests__/api-schemas.test.ts +194 -194
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +136 -136
- package/src/auth/multi-tenancy/permissions.test.ts +42 -42
- package/src/auth/multi-tenancy/permissions.ts +123 -123
- package/src/auth/multi-tenancy/role-management/api-schemas.ts +78 -78
- package/src/auth/multi-tenancy/role-management/index.ts +16 -16
- package/src/auth/multi-tenancy/theme-presets.ts +45 -45
- package/src/auth/multi-tenancy/types.ts +57 -57
- package/src/auth/multi-tenancy/users/api-schemas.ts +165 -165
- package/src/business/README.md +2 -2
- package/src/business/acquisition/activity-events.test.ts +250 -250
- package/src/business/acquisition/activity-events.ts +93 -93
- package/src/business/acquisition/api-schemas.test.ts +1883 -1843
- package/src/business/acquisition/api-schemas.ts +1493 -1500
- package/src/business/acquisition/build-templates.test.ts +240 -240
- package/src/business/acquisition/build-templates.ts +83 -41
- package/src/business/acquisition/crm-next-action.test.ts +262 -262
- package/src/business/acquisition/crm-next-action.ts +220 -220
- package/src/business/acquisition/crm-priority.test.ts +216 -216
- package/src/business/acquisition/crm-priority.ts +349 -349
- package/src/business/acquisition/crm-state-actions.test.ts +153 -151
- package/src/business/acquisition/deal-ownership.test.ts +351 -351
- package/src/business/acquisition/deal-ownership.ts +120 -120
- package/src/business/acquisition/derive-actions.test.ts +129 -104
- package/src/business/acquisition/derive-actions.ts +74 -84
- package/src/business/acquisition/index.ts +171 -170
- package/src/business/acquisition/ontology-validation.ts +309 -0
- package/src/business/acquisition/stateful.ts +30 -30
- package/src/business/acquisition/types.ts +396 -392
- package/src/business/clients/api-schemas.test.ts +115 -115
- package/src/business/clients/api-schemas.ts +158 -158
- package/src/business/clients/index.ts +1 -1
- package/src/business/crm/api-schemas.ts +40 -40
- package/src/business/crm/index.ts +1 -1
- package/src/business/deals/api-schemas.ts +87 -87
- package/src/business/deals/index.ts +1 -1
- package/src/business/index.ts +5 -5
- package/src/business/projects/types.ts +144 -144
- package/src/commands/queue/types/task.ts +15 -15
- package/src/execution/core/runner-types.ts +61 -61
- package/src/execution/core/sse-executions.ts +7 -7
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -10
- package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -16
- package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -4
- package/src/execution/engine/agent/core/types.ts +25 -25
- package/src/execution/engine/agent/index.ts +6 -6
- package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -24
- package/src/execution/engine/index.ts +443 -443
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +298 -298
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -55
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -48
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -1
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -363
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -316
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -194
- package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -7
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -204
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/google-calendar-adapter.ts +428 -428
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/index.ts +2 -2
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1474 -1474
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +103 -103
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -88
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +182 -182
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +310 -310
- package/src/execution/engine/tools/integration/service.test.ts +239 -239
- package/src/execution/engine/tools/integration/service.ts +172 -172
- package/src/execution/engine/tools/integration/tool.ts +255 -255
- package/src/execution/engine/tools/lead-service-types.ts +1005 -1005
- package/src/execution/engine/tools/messages.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +7 -7
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/types.ts +280 -280
- package/src/execution/engine/tools/platform/email/types.ts +97 -97
- package/src/execution/engine/tools/registry.ts +704 -704
- package/src/execution/engine/tools/tool-maps.ts +831 -831
- package/src/execution/engine/tools/types.ts +234 -234
- package/src/execution/engine/workflow/types.ts +202 -202
- package/src/execution/external/__tests__/api-schemas.test.ts +127 -127
- package/src/execution/external/api-schemas.ts +40 -40
- package/src/execution/external/index.ts +1 -1
- package/src/index.ts +18 -18
- package/src/integrations/credentials/__tests__/api-schemas.test.ts +420 -420
- package/src/integrations/credentials/api-schemas.ts +146 -146
- package/src/integrations/credentials/schemas.ts +200 -200
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +7 -7
- package/src/integrations/oauth/provider-registry.ts +74 -74
- package/src/integrations/oauth/server/credentials.ts +43 -43
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +327 -327
- package/src/integrations/webhook-endpoints/api-schemas.ts +103 -103
- package/src/integrations/webhook-endpoints/types.ts +58 -58
- package/src/knowledge/README.md +33 -32
- package/src/knowledge/__tests__/queries.test.ts +633 -541
- package/src/knowledge/format.ts +100 -99
- package/src/knowledge/index.ts +5 -5
- package/src/knowledge/published.ts +5 -5
- package/src/knowledge/queries.ts +274 -222
- package/src/operations/activities/api-schemas.ts +80 -80
- package/src/operations/activities/types.ts +64 -64
- package/src/organization-model/README.md +149 -109
- package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
- package/src/organization-model/__tests__/defaults.test.ts +168 -194
- package/src/organization-model/__tests__/domains/actions.test.ts +78 -0
- package/src/organization-model/__tests__/domains/customers.test.ts +48 -44
- package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
- package/src/organization-model/__tests__/domains/goals.test.ts +110 -96
- package/src/organization-model/__tests__/domains/identity.test.ts +4 -3
- package/src/organization-model/__tests__/domains/navigation.test.ts +222 -166
- package/src/organization-model/__tests__/domains/offerings.test.ts +83 -88
- package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +30 -30
- package/src/organization-model/__tests__/domains/resources.test.ts +396 -175
- package/src/organization-model/__tests__/domains/roles.test.ts +463 -402
- package/src/organization-model/__tests__/domains/statuses.test.ts +13 -10
- package/src/organization-model/__tests__/domains/systems.test.ts +209 -193
- package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -0
- package/src/organization-model/__tests__/foundation.test.ts +47 -75
- package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
- package/src/organization-model/__tests__/graph.test.ts +1336 -149
- package/src/organization-model/__tests__/icons.test.ts +10 -1
- package/src/organization-model/__tests__/knowledge.test.ts +418 -61
- package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -0
- package/src/organization-model/__tests__/migration-helpers.test.ts +591 -0
- package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -94
- package/src/organization-model/__tests__/recursive-system-schema.test.ts +549 -0
- package/src/organization-model/__tests__/resolve.test.ts +303 -42
- package/src/organization-model/__tests__/schema.test.ts +863 -153
- package/src/organization-model/__tests__/surface-projection.test.ts +284 -174
- package/src/organization-model/catalogs/lead-gen.ts +144 -0
- package/src/organization-model/content-kinds/config.ts +36 -0
- package/src/organization-model/content-kinds/index.ts +78 -0
- package/src/organization-model/content-kinds/pipeline.ts +68 -0
- package/src/organization-model/content-kinds/registry.ts +44 -0
- package/src/organization-model/content-kinds/status.ts +71 -0
- package/src/organization-model/content-kinds/template.ts +83 -0
- package/src/organization-model/content-kinds/types.ts +117 -0
- package/src/organization-model/contracts.ts +27 -17
- package/src/organization-model/defaults.ts +489 -107
- package/src/organization-model/domains/actions.ts +333 -0
- package/src/organization-model/domains/customers.ts +10 -7
- package/src/organization-model/domains/entities.ts +144 -0
- package/src/organization-model/domains/goals.ts +9 -6
- package/src/organization-model/domains/knowledge.ts +128 -54
- package/src/organization-model/domains/navigation.ts +139 -416
- package/src/organization-model/domains/offerings.ts +15 -10
- package/src/organization-model/domains/policies.ts +102 -0
- package/src/organization-model/domains/projects.ts +6 -40
- package/src/organization-model/domains/prospecting.ts +395 -514
- package/src/organization-model/domains/resources.ts +173 -81
- package/src/organization-model/domains/roles.ts +96 -93
- package/src/organization-model/domains/sales.test.ts +218 -218
- package/src/organization-model/domains/sales.ts +380 -589
- package/src/organization-model/domains/shared.ts +8 -8
- package/src/organization-model/domains/statuses.ts +298 -89
- package/src/organization-model/domains/systems.ts +240 -38
- package/src/organization-model/foundation.ts +35 -48
- package/src/organization-model/graph/build.ts +1035 -279
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/link.ts +10 -10
- package/src/organization-model/graph/schema.ts +77 -56
- package/src/organization-model/graph/types.ts +75 -56
- package/src/organization-model/helpers.ts +312 -59
- package/src/organization-model/icons.ts +78 -66
- package/src/organization-model/index.ts +129 -16
- package/src/organization-model/migration-helpers.ts +252 -0
- package/src/organization-model/ontology.ts +661 -0
- package/src/organization-model/organization-graph.mdx +110 -89
- package/src/organization-model/organization-model.mdx +226 -171
- package/src/organization-model/published.ts +295 -139
- package/src/organization-model/resolve.ts +139 -21
- package/src/organization-model/schema.ts +841 -301
- package/src/organization-model/surface-projection.ts +212 -218
- package/src/organization-model/types.ts +181 -90
- package/src/platform/api/types.ts +38 -38
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/index.ts +23 -23
- package/src/platform/registry/__tests__/command-view.test.ts +5 -7
- package/src/platform/registry/__tests__/resource-link.test.ts +35 -30
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +17 -32
- package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
- package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2051
- package/src/platform/registry/__tests__/validation.test.ts +1347 -1343
- package/src/platform/registry/command-view.ts +10 -10
- package/src/platform/registry/index.ts +103 -103
- package/src/platform/registry/resource-link.ts +32 -32
- package/src/platform/registry/resource-registry.ts +890 -878
- package/src/platform/registry/serialization.ts +295 -295
- package/src/platform/registry/serialized-types.ts +166 -166
- package/src/platform/registry/stats-types.ts +68 -68
- package/src/platform/registry/types.ts +425 -425
- package/src/platform/registry/validation.ts +745 -743
- package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.test.ts +39 -39
- package/src/projects/api-schemas.ts +291 -291
- package/src/reference/_generated/contracts.md +2389 -2121
- package/src/reference/glossary.md +76 -76
- package/src/scaffold-registry/__tests__/index.test.ts +206 -206
- package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
- package/src/scaffold-registry/index.ts +392 -392
- package/src/scaffold-registry/schema.ts +243 -243
- package/src/server.ts +289 -289
- package/src/supabase/database.types.ts +3153 -3093
- package/src/test-utils/README.md +37 -37
- package/src/test-utils/entities.ts +108 -108
- package/src/test-utils/fixtures/memberships.ts +82 -82
- package/src/test-utils/index.ts +12 -12
- package/src/test-utils/organization-model.ts +65 -65
- package/src/test-utils/published.ts +6 -6
- package/src/test-utils/rls/RLSTestContext.ts +588 -588
- package/src/test-utils/test-utils.test.ts +44 -49
- package/src/organization-model/__tests__/domains/operations.test.ts +0 -203
- package/src/organization-model/domains/features.ts +0 -31
- package/src/organization-model/domains/operations.ts +0 -85
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
-
import { ApifyAdapter } from './apify-adapter'
|
|
3
|
-
|
|
4
|
-
describe('ApifyAdapter', () => {
|
|
5
|
-
const adapter = new ApifyAdapter()
|
|
6
|
-
const originalFetch = globalThis.fetch
|
|
7
|
-
|
|
8
|
-
afterEach(() => {
|
|
9
|
-
vi.restoreAllMocks()
|
|
10
|
-
globalThis.fetch = originalFetch
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
it('accepts Apify tokens stored in provider-specific apiToken shape', () => {
|
|
14
|
-
expect(adapter.validateCredentials({ apiToken: 'apify_api_test' })).toBe(true)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('accepts Apify tokens stored in generic api-key shape', () => {
|
|
18
|
-
expect(adapter.validateCredentials({ apiKey: 'apify_api_test' })).toBe(true)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('rejects blank tokens', () => {
|
|
22
|
-
expect(adapter.validateCredentials({ apiKey: ' ' })).toBe(false)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('verifies credentials against the Apify current-user endpoint', async () => {
|
|
26
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
27
|
-
ok: true,
|
|
28
|
-
json: vi.fn().mockResolvedValue({
|
|
29
|
-
data: {
|
|
30
|
-
username: 'elevasis',
|
|
31
|
-
plan: {
|
|
32
|
-
id: 'TEAM',
|
|
33
|
-
description: 'Team plan'
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
globalThis.fetch = fetchMock as unknown as typeof fetch
|
|
39
|
-
|
|
40
|
-
await expect(adapter.verify({ apiKey: ' apify_api_test ' })).resolves.toEqual({
|
|
41
|
-
ok: true,
|
|
42
|
-
provider: 'apify',
|
|
43
|
-
username: 'elevasis',
|
|
44
|
-
plan: 'TEAM'
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
expect(fetchMock).toHaveBeenCalledWith('https://api.apify.com/v2/users/me', {
|
|
48
|
-
method: 'GET',
|
|
49
|
-
headers: {
|
|
50
|
-
Authorization: 'Bearer apify_api_test',
|
|
51
|
-
'Content-Type': 'application/json'
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
})
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { ApifyAdapter } from './apify-adapter'
|
|
3
|
+
|
|
4
|
+
describe('ApifyAdapter', () => {
|
|
5
|
+
const adapter = new ApifyAdapter()
|
|
6
|
+
const originalFetch = globalThis.fetch
|
|
7
|
+
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
vi.restoreAllMocks()
|
|
10
|
+
globalThis.fetch = originalFetch
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('accepts Apify tokens stored in provider-specific apiToken shape', () => {
|
|
14
|
+
expect(adapter.validateCredentials({ apiToken: 'apify_api_test' })).toBe(true)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('accepts Apify tokens stored in generic api-key shape', () => {
|
|
18
|
+
expect(adapter.validateCredentials({ apiKey: 'apify_api_test' })).toBe(true)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it('rejects blank tokens', () => {
|
|
22
|
+
expect(adapter.validateCredentials({ apiKey: ' ' })).toBe(false)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('verifies credentials against the Apify current-user endpoint', async () => {
|
|
26
|
+
const fetchMock = vi.fn().mockResolvedValue({
|
|
27
|
+
ok: true,
|
|
28
|
+
json: vi.fn().mockResolvedValue({
|
|
29
|
+
data: {
|
|
30
|
+
username: 'elevasis',
|
|
31
|
+
plan: {
|
|
32
|
+
id: 'TEAM',
|
|
33
|
+
description: 'Team plan'
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
globalThis.fetch = fetchMock as unknown as typeof fetch
|
|
39
|
+
|
|
40
|
+
await expect(adapter.verify({ apiKey: ' apify_api_test ' })).resolves.toEqual({
|
|
41
|
+
ok: true,
|
|
42
|
+
provider: 'apify',
|
|
43
|
+
username: 'elevasis',
|
|
44
|
+
plan: 'TEAM'
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
expect(fetchMock).toHaveBeenCalledWith('https://api.apify.com/v2/users/me', {
|
|
48
|
+
method: 'GET',
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: 'Bearer apify_api_test',
|
|
51
|
+
'Content-Type': 'application/json'
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
})
|
|
@@ -1,60 +1,60 @@
|
|
|
1
1
|
import type { BaseIntegrationAdapter } from '../../../base-integration-adapter'
|
|
2
2
|
import { ToolingError } from '../../../../types'
|
|
3
|
-
import type { ExecutionContext } from '../../../../../base/types'
|
|
4
|
-
import { runActor } from './fetch/run-actor/index'
|
|
5
|
-
import { getDatasetItems } from './fetch/get-dataset-items/index'
|
|
6
|
-
import { startActor } from './fetch/start-actor/index'
|
|
7
|
-
import type { StartActorParams } from '../../../../integration/types/apify'
|
|
8
|
-
import { createHttpError, withRetry, DEFAULT_RETRY_POLICY } from '../../../../../../../platform/resilience'
|
|
9
|
-
|
|
10
|
-
interface ApifyCredentials {
|
|
11
|
-
apiToken?: string
|
|
12
|
-
apiKey?: string
|
|
13
|
-
api_token?: string
|
|
14
|
-
token?: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface ApifyVerifyResult {
|
|
18
|
-
ok: true
|
|
19
|
-
provider: 'apify'
|
|
20
|
-
username?: string
|
|
21
|
-
plan?: string
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
type ApifyPlan =
|
|
25
|
-
| string
|
|
26
|
-
| {
|
|
27
|
-
id?: string
|
|
28
|
-
name?: string
|
|
29
|
-
description?: string
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
interface ApifyUserResponse {
|
|
33
|
-
data?: {
|
|
34
|
-
username?: string
|
|
35
|
-
plan?: ApifyPlan
|
|
36
|
-
id?: string
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
interface RunActorParams {
|
|
41
|
-
actorId: string
|
|
42
|
-
input?: Record<string, unknown>
|
|
43
|
-
timeoutSecs?: number
|
|
3
|
+
import type { ExecutionContext } from '../../../../../base/types'
|
|
4
|
+
import { runActor } from './fetch/run-actor/index'
|
|
5
|
+
import { getDatasetItems } from './fetch/get-dataset-items/index'
|
|
6
|
+
import { startActor } from './fetch/start-actor/index'
|
|
7
|
+
import type { StartActorParams } from '../../../../integration/types/apify'
|
|
8
|
+
import { createHttpError, withRetry, DEFAULT_RETRY_POLICY } from '../../../../../../../platform/resilience'
|
|
9
|
+
|
|
10
|
+
interface ApifyCredentials {
|
|
11
|
+
apiToken?: string
|
|
12
|
+
apiKey?: string
|
|
13
|
+
api_token?: string
|
|
14
|
+
token?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ApifyVerifyResult {
|
|
18
|
+
ok: true
|
|
19
|
+
provider: 'apify'
|
|
20
|
+
username?: string
|
|
21
|
+
plan?: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type ApifyPlan =
|
|
25
|
+
| string
|
|
26
|
+
| {
|
|
27
|
+
id?: string
|
|
28
|
+
name?: string
|
|
29
|
+
description?: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface ApifyUserResponse {
|
|
33
|
+
data?: {
|
|
34
|
+
username?: string
|
|
35
|
+
plan?: ApifyPlan
|
|
36
|
+
id?: string
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface RunActorParams {
|
|
41
|
+
actorId: string
|
|
42
|
+
input?: Record<string, unknown>
|
|
43
|
+
timeoutSecs?: number
|
|
44
44
|
pollIntervalSecs?: number
|
|
45
45
|
maxItems?: number
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
interface GetDatasetItemsParams {
|
|
49
49
|
datasetId: string
|
|
50
|
-
maxItems?: number
|
|
51
|
-
offset?: number
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const APIFY_API_BASE_URL = 'https://api.apify.com/v2'
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Apify integration adapter
|
|
50
|
+
maxItems?: number
|
|
51
|
+
offset?: number
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const APIFY_API_BASE_URL = 'https://api.apify.com/v2'
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Apify integration adapter
|
|
58
58
|
*
|
|
59
59
|
* Provides access to Apify actor automation platform for web scraping
|
|
60
60
|
* and browser automation tasks.
|
|
@@ -88,14 +88,14 @@ export class ApifyAdapter implements BaseIntegrationAdapter {
|
|
|
88
88
|
// Normalize credentials to consistent field name
|
|
89
89
|
const normalizedCreds = this.normalizeCredentials(credentials as unknown as ApifyCredentials)
|
|
90
90
|
|
|
91
|
-
// Route to method handler
|
|
92
|
-
switch (method) {
|
|
93
|
-
case 'verify':
|
|
94
|
-
return this.verify(normalizedCreds, context)
|
|
95
|
-
case 'runActor':
|
|
96
|
-
return runActor(normalizedCreds, params as RunActorParams, context)
|
|
97
|
-
case 'getDatasetItems':
|
|
98
|
-
return getDatasetItems(normalizedCreds, params as GetDatasetItemsParams, context)
|
|
91
|
+
// Route to method handler
|
|
92
|
+
switch (method) {
|
|
93
|
+
case 'verify':
|
|
94
|
+
return this.verify(normalizedCreds, context)
|
|
95
|
+
case 'runActor':
|
|
96
|
+
return runActor(normalizedCreds, params as RunActorParams, context)
|
|
97
|
+
case 'getDatasetItems':
|
|
98
|
+
return getDatasetItems(normalizedCreds, params as GetDatasetItemsParams, context)
|
|
99
99
|
case 'startActor':
|
|
100
100
|
return startActor(normalizedCreds, params as StartActorParams, context)
|
|
101
101
|
default:
|
|
@@ -107,47 +107,47 @@ export class ApifyAdapter implements BaseIntegrationAdapter {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
validateCredentials(credentials: Record<string, unknown>): boolean {
|
|
111
|
-
const creds = credentials as unknown as ApifyCredentials
|
|
112
|
-
const token = creds.apiToken || creds.apiKey || creds.api_token || creds.token
|
|
113
|
-
return typeof token === 'string' && token.trim().length > 0
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
async verify(credentials: ApifyCredentials, context?: ExecutionContext): Promise<ApifyVerifyResult> {
|
|
117
|
-
const normalizedCreds = this.normalizeCredentials(credentials)
|
|
118
|
-
const response = await withRetry(async () => {
|
|
119
|
-
const result = await fetch(`${APIFY_API_BASE_URL}/users/me`, {
|
|
120
|
-
method: 'GET',
|
|
121
|
-
headers: {
|
|
122
|
-
Authorization: `Bearer ${normalizedCreds.apiToken}`,
|
|
123
|
-
'Content-Type': 'application/json'
|
|
124
|
-
}
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
if (!result.ok) {
|
|
128
|
-
throw await createHttpError(result, {
|
|
129
|
-
integration: this.name,
|
|
130
|
-
method: 'verify',
|
|
131
|
-
organizationId: context?.organizationId
|
|
132
|
-
})
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return result
|
|
136
|
-
}, DEFAULT_RETRY_POLICY)
|
|
137
|
-
|
|
138
|
-
const data = (await response.json()) as ApifyUserResponse
|
|
139
|
-
|
|
140
|
-
return {
|
|
141
|
-
ok: true,
|
|
142
|
-
provider: 'apify',
|
|
143
|
-
username: data.data?.username ?? data.data?.id,
|
|
144
|
-
plan: formatApifyPlan(data.data?.plan)
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Normalize credentials to use consistent field name
|
|
150
|
-
*/
|
|
110
|
+
validateCredentials(credentials: Record<string, unknown>): boolean {
|
|
111
|
+
const creds = credentials as unknown as ApifyCredentials
|
|
112
|
+
const token = creds.apiToken || creds.apiKey || creds.api_token || creds.token
|
|
113
|
+
return typeof token === 'string' && token.trim().length > 0
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async verify(credentials: ApifyCredentials, context?: ExecutionContext): Promise<ApifyVerifyResult> {
|
|
117
|
+
const normalizedCreds = this.normalizeCredentials(credentials)
|
|
118
|
+
const response = await withRetry(async () => {
|
|
119
|
+
const result = await fetch(`${APIFY_API_BASE_URL}/users/me`, {
|
|
120
|
+
method: 'GET',
|
|
121
|
+
headers: {
|
|
122
|
+
Authorization: `Bearer ${normalizedCreds.apiToken}`,
|
|
123
|
+
'Content-Type': 'application/json'
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
if (!result.ok) {
|
|
128
|
+
throw await createHttpError(result, {
|
|
129
|
+
integration: this.name,
|
|
130
|
+
method: 'verify',
|
|
131
|
+
organizationId: context?.organizationId
|
|
132
|
+
})
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return result
|
|
136
|
+
}, DEFAULT_RETRY_POLICY)
|
|
137
|
+
|
|
138
|
+
const data = (await response.json()) as ApifyUserResponse
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
ok: true,
|
|
142
|
+
provider: 'apify',
|
|
143
|
+
username: data.data?.username ?? data.data?.id,
|
|
144
|
+
plan: formatApifyPlan(data.data?.plan)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Normalize credentials to use consistent field name
|
|
150
|
+
*/
|
|
151
151
|
private normalizeCredentials(credentials: ApifyCredentials): { apiToken: string } {
|
|
152
152
|
const token = credentials.apiToken || credentials.apiKey || credentials.api_token || credentials.token
|
|
153
153
|
if (!token) {
|
|
@@ -155,12 +155,12 @@ export class ApifyAdapter implements BaseIntegrationAdapter {
|
|
|
155
155
|
integration: this.name
|
|
156
156
|
})
|
|
157
157
|
}
|
|
158
|
-
return { apiToken: token.trim() }
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function formatApifyPlan(plan: ApifyPlan | undefined): string | undefined {
|
|
163
|
-
if (!plan) return undefined
|
|
164
|
-
if (typeof plan === 'string') return plan
|
|
165
|
-
return plan.id ?? plan.name ?? plan.description
|
|
166
|
-
}
|
|
158
|
+
return { apiToken: token.trim() }
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function formatApifyPlan(plan: ApifyPlan | undefined): string | undefined {
|
|
163
|
+
if (!plan) return undefined
|
|
164
|
+
if (typeof plan === 'string') return plan
|
|
165
|
+
return plan.id ?? plan.name ?? plan.description
|
|
166
|
+
}
|
package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
-
import { ApolloAdapter } from './apollo-adapter'
|
|
3
|
-
|
|
4
|
-
describe('ApolloAdapter', () => {
|
|
5
|
-
const adapter = new ApolloAdapter()
|
|
6
|
-
const originalFetch = globalThis.fetch
|
|
7
|
-
|
|
8
|
-
afterEach(() => {
|
|
9
|
-
vi.restoreAllMocks()
|
|
10
|
-
globalThis.fetch = originalFetch
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
it('accepts Apollo API keys stored in generic apiKey shape', () => {
|
|
14
|
-
expect(adapter.validateCredentials({ apiKey: 'apollo-key' })).toBe(true)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('accepts Apollo API keys stored in legacy Apollo alias shapes', () => {
|
|
18
|
-
expect(adapter.validateCredentials({ apolloApiKey: 'apollo-key' })).toBe(true)
|
|
19
|
-
expect(adapter.validateCredentials({ APOLLO_API_KEY: 'apollo-key' })).toBe(true)
|
|
20
|
-
expect(adapter.validateCredentials({ key: 'apollo-key' })).toBe(true)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('rejects blank tokens', () => {
|
|
24
|
-
expect(adapter.validateCredentials({ apiKey: ' ' })).toBe(false)
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('verifies credentials against the Apollo auth health endpoint', async () => {
|
|
28
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
29
|
-
ok: true
|
|
30
|
-
})
|
|
31
|
-
globalThis.fetch = fetchMock as unknown as typeof fetch
|
|
32
|
-
|
|
33
|
-
await expect(adapter.verify({ apiKey: ' apollo-key ' })).resolves.toEqual({
|
|
34
|
-
ok: true,
|
|
35
|
-
provider: 'apollo',
|
|
36
|
-
authenticated: true
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
expect(fetchMock).toHaveBeenCalledWith('https://api.apollo.io/v1/auth/health', {
|
|
40
|
-
method: 'GET',
|
|
41
|
-
headers: {
|
|
42
|
-
accept: 'application/json',
|
|
43
|
-
'x-api-key': 'apollo-key',
|
|
44
|
-
authorization: 'Bearer apollo-key'
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
})
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { ApolloAdapter } from './apollo-adapter'
|
|
3
|
+
|
|
4
|
+
describe('ApolloAdapter', () => {
|
|
5
|
+
const adapter = new ApolloAdapter()
|
|
6
|
+
const originalFetch = globalThis.fetch
|
|
7
|
+
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
vi.restoreAllMocks()
|
|
10
|
+
globalThis.fetch = originalFetch
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('accepts Apollo API keys stored in generic apiKey shape', () => {
|
|
14
|
+
expect(adapter.validateCredentials({ apiKey: 'apollo-key' })).toBe(true)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('accepts Apollo API keys stored in legacy Apollo alias shapes', () => {
|
|
18
|
+
expect(adapter.validateCredentials({ apolloApiKey: 'apollo-key' })).toBe(true)
|
|
19
|
+
expect(adapter.validateCredentials({ APOLLO_API_KEY: 'apollo-key' })).toBe(true)
|
|
20
|
+
expect(adapter.validateCredentials({ key: 'apollo-key' })).toBe(true)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('rejects blank tokens', () => {
|
|
24
|
+
expect(adapter.validateCredentials({ apiKey: ' ' })).toBe(false)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('verifies credentials against the Apollo auth health endpoint', async () => {
|
|
28
|
+
const fetchMock = vi.fn().mockResolvedValue({
|
|
29
|
+
ok: true
|
|
30
|
+
})
|
|
31
|
+
globalThis.fetch = fetchMock as unknown as typeof fetch
|
|
32
|
+
|
|
33
|
+
await expect(adapter.verify({ apiKey: ' apollo-key ' })).resolves.toEqual({
|
|
34
|
+
ok: true,
|
|
35
|
+
provider: 'apollo',
|
|
36
|
+
authenticated: true
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
expect(fetchMock).toHaveBeenCalledWith('https://api.apollo.io/v1/auth/health', {
|
|
40
|
+
method: 'GET',
|
|
41
|
+
headers: {
|
|
42
|
+
accept: 'application/json',
|
|
43
|
+
'x-api-key': 'apollo-key',
|
|
44
|
+
authorization: 'Bearer apollo-key'
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
})
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import type { BaseIntegrationAdapter } from '../../../base-integration-adapter'
|
|
2
|
-
import { ToolingError } from '../../../../types'
|
|
3
|
-
import type { ExecutionContext } from '../../../../../base/types'
|
|
4
|
-
import { createHttpError, withRetry, DEFAULT_RETRY_POLICY } from '../../../../../../../platform/resilience'
|
|
5
|
-
|
|
6
|
-
export interface ApolloCredentials {
|
|
7
|
-
apiKey?: string
|
|
8
|
-
apolloApiKey?: string
|
|
9
|
-
APOLLO_API_KEY?: string
|
|
10
|
-
key?: string
|
|
11
|
-
token?: string
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface ApolloVerifyResult {
|
|
15
|
-
ok: true
|
|
16
|
-
provider: 'apollo'
|
|
17
|
-
authenticated: boolean
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const APOLLO_AUTH_HEALTH_URL = 'https://api.apollo.io/v1/auth/health'
|
|
21
|
-
|
|
22
|
-
export class ApolloAdapter implements BaseIntegrationAdapter {
|
|
23
|
-
readonly name = 'apollo'
|
|
24
|
-
|
|
25
|
-
async call(
|
|
26
|
-
method: string,
|
|
27
|
-
params: unknown,
|
|
28
|
-
credentials: Record<string, unknown>,
|
|
29
|
-
context?: ExecutionContext
|
|
30
|
-
): Promise<unknown> {
|
|
31
|
-
if (!this.validateCredentials(credentials)) {
|
|
32
|
-
throw new ToolingError('credentials_invalid', 'Invalid Apollo credentials', {
|
|
33
|
-
integration: this.name,
|
|
34
|
-
organizationId: context?.organizationId
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
switch (method) {
|
|
39
|
-
case 'verify':
|
|
40
|
-
return this.verify(credentials as unknown as ApolloCredentials, context)
|
|
41
|
-
default:
|
|
42
|
-
throw new ToolingError('method_not_found', `Unknown Apollo method: ${method}`, {
|
|
43
|
-
integration: this.name,
|
|
44
|
-
method,
|
|
45
|
-
organizationId: context?.organizationId
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
validateCredentials(credentials: Record<string, unknown>): boolean {
|
|
51
|
-
const token = this.getToken(credentials as unknown as ApolloCredentials)
|
|
52
|
-
return typeof token === 'string' && token.trim().length > 0
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async verify(credentials: ApolloCredentials, context?: ExecutionContext): Promise<ApolloVerifyResult> {
|
|
56
|
-
const token = this.normalizeCredentials(credentials).apiKey
|
|
57
|
-
await withRetry(async () => {
|
|
58
|
-
const response = await fetch(APOLLO_AUTH_HEALTH_URL, {
|
|
59
|
-
method: 'GET',
|
|
60
|
-
headers: {
|
|
61
|
-
accept: 'application/json',
|
|
62
|
-
'x-api-key': token,
|
|
63
|
-
authorization: `Bearer ${token}`
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
if (!response.ok) {
|
|
68
|
-
throw await createHttpError(response, {
|
|
69
|
-
integration: this.name,
|
|
70
|
-
method: 'verify',
|
|
71
|
-
organizationId: context?.organizationId
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return response
|
|
76
|
-
}, DEFAULT_RETRY_POLICY)
|
|
77
|
-
|
|
78
|
-
return {
|
|
79
|
-
ok: true,
|
|
80
|
-
provider: 'apollo',
|
|
81
|
-
authenticated: true
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private normalizeCredentials(credentials: ApolloCredentials): { apiKey: string } {
|
|
86
|
-
const token = this.getToken(credentials)
|
|
87
|
-
if (!token) {
|
|
88
|
-
throw new ToolingError('credentials_invalid', 'Missing Apollo API key', {
|
|
89
|
-
integration: this.name
|
|
90
|
-
})
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return { apiKey: token.trim() }
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private getToken(credentials: ApolloCredentials): string | undefined {
|
|
97
|
-
return credentials.apiKey ?? credentials.apolloApiKey ?? credentials.APOLLO_API_KEY ?? credentials.key ?? credentials.token
|
|
98
|
-
}
|
|
99
|
-
}
|
|
1
|
+
import type { BaseIntegrationAdapter } from '../../../base-integration-adapter'
|
|
2
|
+
import { ToolingError } from '../../../../types'
|
|
3
|
+
import type { ExecutionContext } from '../../../../../base/types'
|
|
4
|
+
import { createHttpError, withRetry, DEFAULT_RETRY_POLICY } from '../../../../../../../platform/resilience'
|
|
5
|
+
|
|
6
|
+
export interface ApolloCredentials {
|
|
7
|
+
apiKey?: string
|
|
8
|
+
apolloApiKey?: string
|
|
9
|
+
APOLLO_API_KEY?: string
|
|
10
|
+
key?: string
|
|
11
|
+
token?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ApolloVerifyResult {
|
|
15
|
+
ok: true
|
|
16
|
+
provider: 'apollo'
|
|
17
|
+
authenticated: boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const APOLLO_AUTH_HEALTH_URL = 'https://api.apollo.io/v1/auth/health'
|
|
21
|
+
|
|
22
|
+
export class ApolloAdapter implements BaseIntegrationAdapter {
|
|
23
|
+
readonly name = 'apollo'
|
|
24
|
+
|
|
25
|
+
async call(
|
|
26
|
+
method: string,
|
|
27
|
+
params: unknown,
|
|
28
|
+
credentials: Record<string, unknown>,
|
|
29
|
+
context?: ExecutionContext
|
|
30
|
+
): Promise<unknown> {
|
|
31
|
+
if (!this.validateCredentials(credentials)) {
|
|
32
|
+
throw new ToolingError('credentials_invalid', 'Invalid Apollo credentials', {
|
|
33
|
+
integration: this.name,
|
|
34
|
+
organizationId: context?.organizationId
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
switch (method) {
|
|
39
|
+
case 'verify':
|
|
40
|
+
return this.verify(credentials as unknown as ApolloCredentials, context)
|
|
41
|
+
default:
|
|
42
|
+
throw new ToolingError('method_not_found', `Unknown Apollo method: ${method}`, {
|
|
43
|
+
integration: this.name,
|
|
44
|
+
method,
|
|
45
|
+
organizationId: context?.organizationId
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
validateCredentials(credentials: Record<string, unknown>): boolean {
|
|
51
|
+
const token = this.getToken(credentials as unknown as ApolloCredentials)
|
|
52
|
+
return typeof token === 'string' && token.trim().length > 0
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async verify(credentials: ApolloCredentials, context?: ExecutionContext): Promise<ApolloVerifyResult> {
|
|
56
|
+
const token = this.normalizeCredentials(credentials).apiKey
|
|
57
|
+
await withRetry(async () => {
|
|
58
|
+
const response = await fetch(APOLLO_AUTH_HEALTH_URL, {
|
|
59
|
+
method: 'GET',
|
|
60
|
+
headers: {
|
|
61
|
+
accept: 'application/json',
|
|
62
|
+
'x-api-key': token,
|
|
63
|
+
authorization: `Bearer ${token}`
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw await createHttpError(response, {
|
|
69
|
+
integration: this.name,
|
|
70
|
+
method: 'verify',
|
|
71
|
+
organizationId: context?.organizationId
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return response
|
|
76
|
+
}, DEFAULT_RETRY_POLICY)
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
ok: true,
|
|
80
|
+
provider: 'apollo',
|
|
81
|
+
authenticated: true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private normalizeCredentials(credentials: ApolloCredentials): { apiKey: string } {
|
|
86
|
+
const token = this.getToken(credentials)
|
|
87
|
+
if (!token) {
|
|
88
|
+
throw new ToolingError('credentials_invalid', 'Missing Apollo API key', {
|
|
89
|
+
integration: this.name
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { apiKey: token.trim() }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private getToken(credentials: ApolloCredentials): string | undefined {
|
|
97
|
+
return credentials.apiKey ?? credentials.apolloApiKey ?? credentials.APOLLO_API_KEY ?? credentials.key ?? credentials.token
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { ApolloAdapter, type ApolloCredentials, type ApolloVerifyResult } from './apollo-adapter'
|
|
1
|
+
export { ApolloAdapter, type ApolloCredentials, type ApolloVerifyResult } from './apollo-adapter'
|