@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.
Files changed (92) hide show
  1. package/generated/prisma-mongodb/edge.js +2 -2
  2. package/generated/prisma-mongodb/index.js +2 -2
  3. package/generated/prisma-mongodb/package.json +1 -1
  4. package/generated/prisma-mongodb/schema.prisma +2 -2
  5. package/generated/prisma-mongodb/wasm.js +2 -2
  6. package/generated/prisma-postgresql/edge.js +2 -2
  7. package/generated/prisma-postgresql/index.js +2 -2
  8. package/generated/prisma-postgresql/package.json +1 -1
  9. package/generated/prisma-postgresql/schema.prisma +2 -2
  10. package/generated/prisma-postgresql/wasm.js +2 -2
  11. package/handlers/app-handler-helpers.js +5 -2
  12. package/handlers/integration-event-dispatcher.js +1 -1
  13. package/integrations/{data-defined → definitions}/README.md +12 -12
  14. package/integrations/{data-defined → definitions}/capabilities/AUDIT.md +104 -75
  15. package/integrations/{data-defined → definitions}/capabilities/asana.capabilities.json +13 -8
  16. package/integrations/{data-defined → definitions}/capabilities/fathom.capabilities.json +4 -4
  17. package/integrations/{data-defined → definitions}/capabilities/hubspot.capabilities.json +77 -49
  18. package/integrations/{data-defined → definitions}/capabilities/linear.capabilities.json +38 -20
  19. package/integrations/{data-defined → definitions}/capabilities/phone.capabilities.json +1 -2
  20. package/integrations/{data-defined → definitions}/capabilities/pipedrive.capabilities.json +8 -6
  21. package/integrations/{data-defined → definitions}/capabilities/salesforce.capabilities.json +30 -15
  22. package/integrations/{data-defined → definitions}/capabilities/slack.capabilities.json +7 -4
  23. package/integrations/{data-defined → definitions}/capabilities/stripe.capabilities.json +27 -18
  24. package/integrations/{data-defined → definitions}/config-form.js +1 -1
  25. package/integrations/{data-defined → definitions}/examples/fathom-hubspot-notion.definition.json +9 -9
  26. package/integrations/{data-defined → definitions}/examples/hubspot-slack.definition.json +25 -7
  27. package/integrations/{data-defined → definitions}/examples/phone-hubspot.definition.json +1 -1
  28. package/integrations/{data-defined → definitions}/examples/pipedrive-hubspot.definition.json +1 -1
  29. package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.definition-version.json +1 -1
  30. package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.integration.json +1 -1
  31. package/integrations/{data-defined → definitions}/expressions.js +1 -1
  32. package/integrations/{data-defined → definitions}/index.js +2 -2
  33. package/integrations/{data-defined/data-defined-integration.js → definitions/integration-runtime.js} +22 -21
  34. package/integrations/{data-defined → definitions}/renderers/hubspot.js +13 -8
  35. package/integrations/{data-defined → definitions}/router.js +11 -11
  36. package/integrations/{data-defined → definitions}/runtime.js +1 -1
  37. package/integrations/{data-defined → definitions}/schema/installation.v0.1.schema.json +1 -1
  38. package/integrations/{data-defined → definitions}/schema/records.md +1 -1
  39. package/integrations/{data-defined → definitions}/scripts/validate.js +1 -1
  40. package/integrations/{data-defined → definitions}/use-cases/definition-use-cases.js +1 -1
  41. package/integrations/{data-defined → definitions}/versioning.js +1 -1
  42. package/integrations/integration-base.js +31 -1
  43. package/integrations/integration-router.js +1 -1
  44. package/package.json +6 -6
  45. package/prisma-mongodb/schema.prisma +2 -2
  46. package/prisma-postgresql/schema.prisma +2 -2
  47. /package/integrations/{data-defined → definitions}/canonical.js +0 -0
  48. /package/integrations/{data-defined → definitions}/capabilities/acmeerp.capabilities.json +0 -0
  49. /package/integrations/{data-defined → definitions}/capabilities/calendly.capabilities.json +0 -0
  50. /package/integrations/{data-defined → definitions}/capabilities/docusign.capabilities.json +0 -0
  51. /package/integrations/{data-defined → definitions}/capabilities/github.capabilities.json +0 -0
  52. /package/integrations/{data-defined → definitions}/capabilities/jira.capabilities.json +0 -0
  53. /package/integrations/{data-defined → definitions}/capabilities/klaviyo.capabilities.json +0 -0
  54. /package/integrations/{data-defined → definitions}/capabilities/netsuite.capabilities.json +0 -0
  55. /package/integrations/{data-defined → definitions}/capabilities/notion.capabilities.json +0 -0
  56. /package/integrations/{data-defined → definitions}/capabilities/quickbooks.capabilities.json +0 -0
  57. /package/integrations/{data-defined → definitions}/capabilities/shopify.capabilities.json +0 -0
  58. /package/integrations/{data-defined → definitions}/capabilities/webflow.capabilities.json +0 -0
  59. /package/integrations/{data-defined → definitions}/capabilities/zendesk.capabilities.json +0 -0
  60. /package/integrations/{data-defined → definitions}/compile.js +0 -0
  61. /package/integrations/{data-defined → definitions}/examples/acme-erp-quickbooks.definition.json +0 -0
  62. /package/integrations/{data-defined → definitions}/examples/asana-slack.definition.json +0 -0
  63. /package/integrations/{data-defined → definitions}/examples/calendly-salesforce.definition.json +0 -0
  64. /package/integrations/{data-defined → definitions}/examples/docusign-salesforce.definition.json +0 -0
  65. /package/integrations/{data-defined → definitions}/examples/github-linear.definition.json +0 -0
  66. /package/integrations/{data-defined → definitions}/examples/klaviyo-hubspot.definition.json +0 -0
  67. /package/integrations/{data-defined → definitions}/examples/pipedrive-phone.definition.json +0 -0
  68. /package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.mappings.json +0 -0
  69. /package/integrations/{data-defined → definitions}/examples/records/phone-hubspot.workflow-run.json +0 -0
  70. /package/integrations/{data-defined → definitions}/examples/shopify-klaviyo.definition.json +0 -0
  71. /package/integrations/{data-defined → definitions}/examples/shopify-netsuite.definition.json +0 -0
  72. /package/integrations/{data-defined → definitions}/examples/stripe-quickbooks.definition.json +0 -0
  73. /package/integrations/{data-defined → definitions}/examples/webflow-hubspot-slack.definition.json +0 -0
  74. /package/integrations/{data-defined → definitions}/examples/zendesk-jira.definition.json +0 -0
  75. /package/integrations/{data-defined → definitions}/interpreter.js +0 -0
  76. /package/integrations/{data-defined → definitions}/manifests.js +0 -0
  77. /package/integrations/{data-defined → definitions}/renderers/common.js +0 -0
  78. /package/integrations/{data-defined → definitions}/renderers/html.js +0 -0
  79. /package/integrations/{data-defined → definitions}/renderers/preview.js +0 -0
  80. /package/integrations/{data-defined → definitions}/renderers/slack.js +0 -0
  81. /package/integrations/{data-defined → definitions}/repositories/definition-version-repository.js +0 -0
  82. /package/integrations/{data-defined → definitions}/repositories/workflow-run-repository.js +0 -0
  83. /package/integrations/{data-defined → definitions}/schema/capability-manifest.v0.1.schema.json +0 -0
  84. /package/integrations/{data-defined → definitions}/schema/integration-definition.v0.1.schema.json +0 -0
  85. /package/integrations/{data-defined → definitions}/schema-check.js +0 -0
  86. /package/integrations/{data-defined → definitions}/scripts/check-manifests.js +0 -0
  87. /package/integrations/{data-defined → definitions}/steps.js +0 -0
  88. /package/integrations/{data-defined → definitions}/sync-engine.js +0 -0
  89. /package/integrations/{data-defined → definitions}/tests/helpers-fake-crm.js +0 -0
  90. /package/integrations/{data-defined → definitions}/transforms.js +0 -0
  91. /package/integrations/{data-defined → definitions}/validate.js +0 -0
  92. /package/integrations/{data-defined → definitions}/webhooks.js +0 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Application layer for data-defined integrations (ADR-063): publishing definition versions, the catalogue the
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 data-defined integrations.
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 (data-defined integrations, `Definition.instanceTriggers`) overrides it.
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('./data-defined/router').setDataDefinedRoutes(router, authenticateUser, {
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.698.b1a2d30.0",
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.698.b1a2d30.0",
51
- "@friggframework/prettier-config": "2.0.0--canary.698.b1a2d30.0",
52
- "@friggframework/test": "2.0.0--canary.698.b1a2d30.0",
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/data-defined/scripts/validate.js",
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": "b1a2d30f3296992d698742a0c0a99b916c7fbfbe"
93
+ "gitHead": "80ec1cc658ebdfbe53482d0705c42129685eb47f"
94
94
  }
@@ -455,7 +455,7 @@ model UsageCounter {
455
455
  @@map("UsageCounter")
456
456
  }
457
457
 
458
- // Data-defined integrations (ADR-063): one immutable row per published definition version.
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 data-defined workflow run. trace holds step ids, statuses, timings and error messages, never request or
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
- // Data-defined integrations (ADR-063): one immutable row per published definition version.
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 data-defined workflow run. trace holds step ids, statuses, timings and error messages, never request or
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())