@friggframework/core 2.0.0--canary.698.b1a2d30.0 → 2.0.0--canary.700.80ec1cc.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/generated/prisma-mongodb/edge.js +2 -2
- package/generated/prisma-mongodb/index.js +2 -2
- package/generated/prisma-mongodb/package.json +1 -1
- package/generated/prisma-mongodb/schema.prisma +2 -2
- package/generated/prisma-mongodb/wasm.js +2 -2
- package/generated/prisma-postgresql/edge.js +2 -2
- package/generated/prisma-postgresql/index.js +2 -2
- package/generated/prisma-postgresql/package.json +1 -1
- package/generated/prisma-postgresql/schema.prisma +2 -2
- package/generated/prisma-postgresql/wasm.js +2 -2
- package/handlers/app-handler-helpers.js +5 -2
- package/handlers/integration-event-dispatcher.js +1 -1
- package/integrations/{data-defined → definitions}/README.md +12 -12
- package/integrations/{data-defined → definitions}/capabilities/AUDIT.md +104 -75
- package/integrations/{data-defined → definitions}/capabilities/asana.capabilities.json +13 -8
- package/integrations/{data-defined → definitions}/capabilities/fathom.capabilities.json +4 -4
- package/integrations/{data-defined → definitions}/capabilities/hubspot.capabilities.json +77 -49
- package/integrations/{data-defined → definitions}/capabilities/linear.capabilities.json +38 -20
- package/integrations/{data-defined → definitions}/capabilities/phone.capabilities.json +1 -2
- package/integrations/{data-defined → definitions}/capabilities/pipedrive.capabilities.json +8 -6
- package/integrations/{data-defined → definitions}/capabilities/salesforce.capabilities.json +30 -15
- package/integrations/{data-defined → definitions}/capabilities/slack.capabilities.json +7 -4
- package/integrations/{data-defined → definitions}/capabilities/stripe.capabilities.json +27 -18
- package/integrations/{data-defined → definitions}/config-form.js +1 -1
- package/integrations/{data-defined → definitions}/examples/fathom-hubspot-notion.definition.json +9 -9
- package/integrations/{data-defined → definitions}/examples/hubspot-slack.definition.json +25 -7
- package/integrations/{data-defined → definitions}/examples/phone-hubspot.definition.json +1 -1
- package/integrations/{data-defined → definitions}/examples/pipedrive-hubspot.definition.json +1 -1
- package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.definition-version.json +1 -1
- package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.integration.json +1 -1
- package/integrations/{data-defined → definitions}/expressions.js +1 -1
- package/integrations/{data-defined → definitions}/index.js +2 -2
- package/integrations/{data-defined/data-defined-integration.js → definitions/integration-runtime.js} +22 -21
- package/integrations/{data-defined → definitions}/renderers/hubspot.js +13 -8
- package/integrations/{data-defined → definitions}/router.js +11 -11
- package/integrations/{data-defined → definitions}/runtime.js +1 -1
- package/integrations/{data-defined → definitions}/schema/installation.v0.1.schema.json +1 -1
- package/integrations/{data-defined → definitions}/schema/records.md +1 -1
- package/integrations/{data-defined → definitions}/scripts/validate.js +1 -1
- package/integrations/{data-defined → definitions}/use-cases/definition-use-cases.js +1 -1
- package/integrations/{data-defined → definitions}/versioning.js +1 -1
- package/integrations/integration-base.js +31 -1
- package/integrations/integration-router.js +1 -1
- package/package.json +6 -6
- package/prisma-mongodb/schema.prisma +2 -2
- package/prisma-postgresql/schema.prisma +2 -2
- /package/integrations/{data-defined → definitions}/canonical.js +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/acmeerp.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/calendly.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/docusign.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/github.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/jira.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/klaviyo.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/netsuite.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/notion.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/quickbooks.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/shopify.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/webflow.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/capabilities/zendesk.capabilities.json +0 -0
- /package/integrations/{data-defined → definitions}/compile.js +0 -0
- /package/integrations/{data-defined → definitions}/examples/acme-erp-quickbooks.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/asana-slack.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/calendly-salesforce.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/docusign-salesforce.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/github-linear.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/klaviyo-hubspot.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/pipedrive-phone.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.mappings.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.workflow-run.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/shopify-klaviyo.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/shopify-netsuite.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/stripe-quickbooks.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/webflow-hubspot-slack.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/examples/zendesk-jira.definition.json +0 -0
- /package/integrations/{data-defined → definitions}/interpreter.js +0 -0
- /package/integrations/{data-defined → definitions}/manifests.js +0 -0
- /package/integrations/{data-defined → definitions}/renderers/common.js +0 -0
- /package/integrations/{data-defined → definitions}/renderers/html.js +0 -0
- /package/integrations/{data-defined → definitions}/renderers/preview.js +0 -0
- /package/integrations/{data-defined → definitions}/renderers/slack.js +0 -0
- /package/integrations/{data-defined → definitions}/repositories/definition-version-repository.js +0 -0
- /package/integrations/{data-defined → definitions}/repositories/workflow-run-repository.js +0 -0
- /package/integrations/{data-defined → definitions}/schema/capability-manifest.v0.1.schema.json +0 -0
- /package/integrations/{data-defined → definitions}/schema/integration-definition.v0.1.schema.json +0 -0
- /package/integrations/{data-defined → definitions}/schema-check.js +0 -0
- /package/integrations/{data-defined → definitions}/scripts/check-manifests.js +0 -0
- /package/integrations/{data-defined → definitions}/steps.js +0 -0
- /package/integrations/{data-defined → definitions}/sync-engine.js +0 -0
- /package/integrations/{data-defined → definitions}/tests/helpers-fake-crm.js +0 -0
- /package/integrations/{data-defined → definitions}/transforms.js +0 -0
- /package/integrations/{data-defined → definitions}/validate.js +0 -0
- /package/integrations/{data-defined → definitions}/webhooks.js +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Application layer for
|
|
2
|
+
* Application layer for integrations published as definitions (ADR-063): publishing definition versions, the catalogue the
|
|
3
3
|
* runtime reads from, and per-installation upgrades. Business rules live here; the repositories only store rows.
|
|
4
4
|
*
|
|
5
5
|
* createDefinitionCatalog() what defineSharedIntegrationClass({ definitions }) reads: get(id, version), latest(id)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Versioning for
|
|
2
|
+
* Versioning for integrations published as definitions.
|
|
3
3
|
*
|
|
4
4
|
* A published version is immutable and every installation pins one exact version, so a release never changes a
|
|
5
5
|
* running customer until that installation is upgraded. Three questions are answered here:
|
|
@@ -46,6 +46,26 @@ const constantsToBeMigrated = {
|
|
|
46
46
|
},
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* The facts about a webhook request that signature checks need, small enough to travel in the queue message: the
|
|
51
|
+
* method, the public URL the vendor called, and the raw body (up to 96 KB; beyond that it is left out and a check that
|
|
52
|
+
* needs it fails closed, because SQS messages are capped at 256 KB and the parsed body travels too).
|
|
53
|
+
*/
|
|
54
|
+
const RAW_BODY_LIMIT = 96 * 1024;
|
|
55
|
+
function webhookRequestFacts(req) {
|
|
56
|
+
const h = req.headers || {};
|
|
57
|
+
const proto = String(h['x-forwarded-proto'] || req.protocol || 'https').split(',')[0].trim();
|
|
58
|
+
const host = h['x-forwarded-host'] || h.host;
|
|
59
|
+
const url = host ? `${proto}://${host}${req.originalUrl || req.url || ''}` : undefined;
|
|
60
|
+
const raw = req.rawBody;
|
|
61
|
+
const rawBody = raw == null ? undefined : (Buffer.isBuffer(raw) ? raw.toString('utf8') : String(raw));
|
|
62
|
+
return {
|
|
63
|
+
method: req.method,
|
|
64
|
+
...(url ? { url } : {}),
|
|
65
|
+
...(rawBody !== undefined && Buffer.byteLength(rawBody) <= RAW_BODY_LIMIT ? { rawBody } : {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
49
69
|
class IntegrationBase {
|
|
50
70
|
// todo: maybe we can pass this as Dependency Injection in the sub-class constructor
|
|
51
71
|
integrationRepository = createIntegrationRepository();
|
|
@@ -552,7 +572,7 @@ class IntegrationBase {
|
|
|
552
572
|
/**
|
|
553
573
|
* The recurring triggers declared for one installation (ADR-055): `Definition.triggers`, each with its `name`.
|
|
554
574
|
* Static so the tick can read them from a record without hydrating the installation; a class whose triggers
|
|
555
|
-
* depend on the installation (
|
|
575
|
+
* depend on the installation (integrations published as definitions, `Definition.instanceTriggers`) overrides it.
|
|
556
576
|
* @param {{ config?: Object, record?: Object }} [installation]
|
|
557
577
|
* @returns {Promise<Array<Object>>}
|
|
558
578
|
*/
|
|
@@ -699,6 +719,7 @@ class IntegrationBase {
|
|
|
699
719
|
body,
|
|
700
720
|
headers: req.headers,
|
|
701
721
|
query: req.query,
|
|
722
|
+
...webhookRequestFacts(req),
|
|
702
723
|
});
|
|
703
724
|
|
|
704
725
|
res.status(200).json({ received: true });
|
|
@@ -708,6 +729,15 @@ class IntegrationBase {
|
|
|
708
729
|
// Default: no-op, integrations override this
|
|
709
730
|
}
|
|
710
731
|
|
|
732
|
+
/**
|
|
733
|
+
* What a module's verifyWebhookSignature needs about a queued delivery (onWebhookReceived put it there): the
|
|
734
|
+
* headers, the parsed body, the raw body exactly as received, and the method and public URL some vendors sign
|
|
735
|
+
* (HubSpot v3). Call as `this.<module>.api.verifyWebhookSignature(this.webhookVerificationInput(data))`.
|
|
736
|
+
*/
|
|
737
|
+
webhookVerificationInput(data = {}) {
|
|
738
|
+
return { headers: data.headers || {}, body: data.body, query: data.query || {}, rawBody: data.rawBody, method: data.method, url: data.url };
|
|
739
|
+
}
|
|
740
|
+
|
|
711
741
|
/**
|
|
712
742
|
* Queue a webhook for asynchronous worker dispatch.
|
|
713
743
|
*
|
|
@@ -210,7 +210,7 @@ function createIntegrationRouter() {
|
|
|
210
210
|
getPossibleIntegrations,
|
|
211
211
|
});
|
|
212
212
|
// Integration versions, run history, sync progress and approvals (ADR-063): mounted when the app registers the integration runtime.
|
|
213
|
-
require('./
|
|
213
|
+
require('./definitions/router').setIntegrationRuntimeRoutes(router, authenticateUser, {
|
|
214
214
|
getIntegrationInstance,
|
|
215
215
|
integrationClasses,
|
|
216
216
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@friggframework/core",
|
|
3
3
|
"prettier": "@friggframework/prettier-config",
|
|
4
|
-
"version": "2.0.0--canary.
|
|
4
|
+
"version": "2.0.0--canary.700.80ec1cc.0",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@aws-sdk/client-apigatewaymanagementapi": "^3.588.0",
|
|
7
7
|
"@aws-sdk/client-kms": "^3.588.0",
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@friggframework/eslint-config": "2.0.0--canary.
|
|
51
|
-
"@friggframework/prettier-config": "2.0.0--canary.
|
|
52
|
-
"@friggframework/test": "2.0.0--canary.
|
|
50
|
+
"@friggframework/eslint-config": "2.0.0--canary.700.80ec1cc.0",
|
|
51
|
+
"@friggframework/prettier-config": "2.0.0--canary.700.80ec1cc.0",
|
|
52
|
+
"@friggframework/test": "2.0.0--canary.700.80ec1cc.0",
|
|
53
53
|
"@prisma/client": "^6.19.3",
|
|
54
54
|
"@types/lodash": "4.17.15",
|
|
55
55
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"scripts": {
|
|
68
68
|
"lint:fix": "prettier --write --loglevel error . && eslint . --fix",
|
|
69
69
|
"test": "jest --passWithNoTests # TODO",
|
|
70
|
-
"validate:definitions": "node integrations/
|
|
70
|
+
"validate:definitions": "node integrations/definitions/scripts/validate.js",
|
|
71
71
|
"prisma:generate:mongo": "npx prisma generate --schema ./prisma-mongodb/schema.prisma",
|
|
72
72
|
"prisma:generate:postgres": "npx prisma generate --schema ./prisma-postgresql/schema.prisma",
|
|
73
73
|
"prisma:generate": "npm run prisma:generate:mongo && npm run prisma:generate:postgres",
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
"publishConfig": {
|
|
91
91
|
"access": "public"
|
|
92
92
|
},
|
|
93
|
-
"gitHead": "
|
|
93
|
+
"gitHead": "80ec1cc658ebdfbe53482d0705c42129685eb47f"
|
|
94
94
|
}
|
|
@@ -455,7 +455,7 @@ model UsageCounter {
|
|
|
455
455
|
@@map("UsageCounter")
|
|
456
456
|
}
|
|
457
457
|
|
|
458
|
-
//
|
|
458
|
+
// Integrations published as definitions (ADR-063): one immutable row per published definition version.
|
|
459
459
|
enum DefinitionStatus {
|
|
460
460
|
DRAFT
|
|
461
461
|
PUBLISHED
|
|
@@ -487,7 +487,7 @@ model IntegrationDefinitionVersion {
|
|
|
487
487
|
@@map("IntegrationDefinitionVersion")
|
|
488
488
|
}
|
|
489
489
|
|
|
490
|
-
// One row per
|
|
490
|
+
// One row per workflow run. trace holds step ids, statuses, timings and error messages, never request or
|
|
491
491
|
// response bodies.
|
|
492
492
|
model WorkflowRun {
|
|
493
493
|
id String @id @default(auto()) @map("_id") @db.ObjectId
|
|
@@ -436,7 +436,7 @@ model UsageCounter {
|
|
|
436
436
|
@@index([metric, integrationType, window])
|
|
437
437
|
}
|
|
438
438
|
|
|
439
|
-
//
|
|
439
|
+
// Integrations published as definitions (ADR-063): one immutable row per published definition version.
|
|
440
440
|
enum DefinitionStatus {
|
|
441
441
|
DRAFT
|
|
442
442
|
PUBLISHED
|
|
@@ -467,7 +467,7 @@ model IntegrationDefinitionVersion {
|
|
|
467
467
|
@@index([workspaceId, status])
|
|
468
468
|
}
|
|
469
469
|
|
|
470
|
-
// One row per
|
|
470
|
+
// One row per workflow run. trace holds step ids, statuses, timings and error messages, never request or
|
|
471
471
|
// response bodies.
|
|
472
472
|
model WorkflowRun {
|
|
473
473
|
id Int @id @default(autoincrement())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/capabilities/quickbooks.capabilities.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/acme-erp-quickbooks.definition.json
RENAMED
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/calendly-salesforce.definition.json
RENAMED
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/docusign-salesforce.definition.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.mappings.json
RENAMED
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.workflow-run.json
RENAMED
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/shopify-netsuite.definition.json
RENAMED
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/stripe-quickbooks.definition.json
RENAMED
|
File without changes
|
/package/integrations/{data-defined → definitions}/examples/webflow-hubspot-slack.definition.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/repositories/definition-version-repository.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/integrations/{data-defined → definitions}/schema/capability-manifest.v0.1.schema.json
RENAMED
|
File without changes
|
/package/integrations/{data-defined → definitions}/schema/integration-definition.v0.1.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|