@adatechnology/meta-whatsapp-module 0.2.0-rc.7 → 0.2.0-rc.9

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.
@@ -0,0 +1,3 @@
1
+ ALTER TABLE "meta_whatsapp"."messages" ADD COLUMN "moderation_flagged" boolean;--> statement-breakpoint
2
+ ALTER TABLE "meta_whatsapp"."messages" ADD COLUMN "moderation_terms" jsonb;--> statement-breakpoint
3
+ CREATE INDEX "idx_messages_moderation_flagged" ON "meta_whatsapp"."messages" ("company_id","created_at") WHERE "moderation_flagged";
@@ -36,6 +36,13 @@
36
36
  "when": 1785023108000,
37
37
  "tag": "0004_widen_message_type",
38
38
  "breakpoints": true
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "version": "7",
43
+ "when": 1785176501657,
44
+ "tag": "0005_message_moderation",
45
+ "breakpoints": true
39
46
  }
40
47
  ]
41
- }
48
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/testing/index.ts
22
+ var testing_exports = {};
23
+ __export(testing_exports, {
24
+ PREVIEW_AUDIO_MIME_TYPE: () => import_testing2.PREVIEW_AUDIO_MIME_TYPE,
25
+ PREVIEW_DISPLAY_PHONE_NUMBER: () => import_testing2.PREVIEW_DISPLAY_PHONE_NUMBER,
26
+ PREVIEW_PHONE_NUMBER_ID: () => import_testing2.PREVIEW_PHONE_NUMBER_ID,
27
+ PREVIEW_WABA_ID: () => import_testing2.PREVIEW_WABA_ID,
28
+ buildInboundAudioPayload: () => import_testing2.buildInboundAudioPayload,
29
+ buildInboundInteractivePayload: () => import_testing2.buildInboundInteractivePayload,
30
+ buildInboundTextPayload: () => import_testing2.buildInboundTextPayload,
31
+ serializeWebhookPayload: () => import_testing2.serializeWebhookPayload,
32
+ signWebhookPayload: () => signWebhookPayload,
33
+ toSignedWebhookRequest: () => toSignedWebhookRequest
34
+ });
35
+ module.exports = __toCommonJS(testing_exports);
36
+ var import_testing2 = require("@adatechnology/meta-whatsapp-contracts/testing");
37
+
38
+ // src/testing/inboundPayloads.ts
39
+ var import_node_crypto = require("crypto");
40
+ var import_testing = require("@adatechnology/meta-whatsapp-contracts/testing");
41
+ function signWebhookPayload(params) {
42
+ return `sha256=${(0, import_node_crypto.createHmac)("sha256", params.appSecret).update(params.rawBody).digest("hex")}`;
43
+ }
44
+ __name(signWebhookPayload, "signWebhookPayload");
45
+ function toSignedWebhookRequest(params) {
46
+ const rawBody = (0, import_testing.serializeWebhookPayload)(params.payload);
47
+ return {
48
+ rawBody,
49
+ headers: {
50
+ "content-type": "application/json",
51
+ "x-hub-signature-256": signWebhookPayload({
52
+ rawBody,
53
+ appSecret: params.appSecret
54
+ })
55
+ }
56
+ };
57
+ }
58
+ __name(toSignedWebhookRequest, "toSignedWebhookRequest");
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ PREVIEW_AUDIO_MIME_TYPE,
62
+ PREVIEW_DISPLAY_PHONE_NUMBER,
63
+ PREVIEW_PHONE_NUMBER_ID,
64
+ PREVIEW_WABA_ID,
65
+ buildInboundAudioPayload,
66
+ buildInboundInteractivePayload,
67
+ buildInboundTextPayload,
68
+ serializeWebhookPayload,
69
+ signWebhookPayload,
70
+ toSignedWebhookRequest
71
+ });
72
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/testing/index.ts","../../src/testing/inboundPayloads.ts"],"sourcesContent":["/**\n * Export separado (`@adatechnology/meta-whatsapp-module/testing`) para que utilitário de\n * desenvolvimento não entre no grafo de import de quem só consome o módulo em produção.\n *\n * Os builders são reexportados dos contratos por conveniência de quem já depende do módulo\n * (scripts de CLI, `make test-msg`): quem monta payload no navegador deve importar direto de\n * `@adatechnology/meta-whatsapp-contracts/testing`, que não toca em `node:crypto`.\n */\n\nexport {\n buildInboundTextPayload,\n buildInboundInteractivePayload,\n buildInboundAudioPayload,\n serializeWebhookPayload,\n PREVIEW_PHONE_NUMBER_ID,\n PREVIEW_WABA_ID,\n PREVIEW_DISPLAY_PHONE_NUMBER,\n PREVIEW_AUDIO_MIME_TYPE,\n} from '@adatechnology/meta-whatsapp-contracts/testing'\n\nexport type {\n BuildInboundTextPayloadParams,\n BuildInboundInteractivePayloadParams,\n BuildInboundAudioPayloadParams,\n InteractiveReplyOption,\n} from '@adatechnology/meta-whatsapp-contracts/testing'\n\nexport { signWebhookPayload, toSignedWebhookRequest } from './inboundPayloads'\nexport type { SignWebhookPayloadParams, SignedWebhookRequest, ToSignedWebhookRequestParams } from './inboundPayloads'\n","/**\n * Assinatura de payload de preview no runtime do servidor. Os builders vivem em\n * `@adatechnology/meta-whatsapp-contracts/testing` porque precisam rodar também no navegador;\n * aqui fica só o que depende de `node:crypto`.\n *\n * Não existe bypass de assinatura em lugar nenhum: o preview bate na mesma rota, com a mesma\n * validação de HMAC de staging e produção. O que muda é apenas quem assina — a Meta lá, o app\n * secret local aqui.\n */\n\nimport { createHmac } from 'node:crypto'\nimport type { WhatsAppWebhookPayload } from '@adatechnology/meta-whatsapp-contracts'\nimport { serializeWebhookPayload } from '@adatechnology/meta-whatsapp-contracts/testing'\n\nexport type SignWebhookPayloadParams = {\n readonly rawBody: string\n readonly appSecret: string\n}\n\nexport function signWebhookPayload(params: SignWebhookPayloadParams): string {\n return `sha256=${createHmac('sha256', params.appSecret).update(params.rawBody).digest('hex')}`\n}\n\nexport type SignedWebhookRequest = {\n readonly rawBody: string\n readonly headers: Readonly<Record<string, string>>\n}\n\nexport type ToSignedWebhookRequestParams = {\n readonly payload: WhatsAppWebhookPayload\n readonly appSecret: string\n}\n\n/**\n * Devolve o corpo JÁ serializado junto da assinatura, porque a validação assina os bytes exatos:\n * quem serializar de novo antes de enviar (ou deixar o cliente HTTP serializar o objeto) muda\n * espaçamento/ordem e derruba a assinatura. Enviar `rawBody` como está é o contrato.\n */\nexport function toSignedWebhookRequest(params: ToSignedWebhookRequestParams): SignedWebhookRequest {\n const rawBody = serializeWebhookPayload(params.payload)\n\n return {\n rawBody,\n headers: {\n 'content-type': 'application/json',\n 'x-hub-signature-256': signWebhookPayload({ rawBody, appSecret: params.appSecret }),\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;AASA,IAAAA,kBASO;;;ACRP,yBAA2B;AAE3B,qBAAwC;AAOjC,SAASC,mBAAmBC,QAAgC;AACjE,SAAO,cAAUC,+BAAW,UAAUD,OAAOE,SAAS,EAAEC,OAAOH,OAAOI,OAAO,EAAEC,OAAO,KAAA,CAAA;AACxF;AAFgBN;AAmBT,SAASO,uBAAuBN,QAAoC;AACzE,QAAMI,cAAUG,wCAAwBP,OAAOQ,OAAO;AAEtD,SAAO;IACLJ;IACAK,SAAS;MACP,gBAAgB;MAChB,uBAAuBV,mBAAmB;QAAEK;QAASF,WAAWF,OAAOE;MAAU,CAAA;IACnF;EACF;AACF;AAVgBI;","names":["import_testing","signWebhookPayload","params","createHmac","appSecret","update","rawBody","digest","toSignedWebhookRequest","serializeWebhookPayload","payload","headers"]}
@@ -0,0 +1,34 @@
1
+ export { BuildInboundAudioPayloadParams, BuildInboundInteractivePayloadParams, BuildInboundTextPayloadParams, InteractiveReplyOption, PREVIEW_AUDIO_MIME_TYPE, PREVIEW_DISPLAY_PHONE_NUMBER, PREVIEW_PHONE_NUMBER_ID, PREVIEW_WABA_ID, buildInboundAudioPayload, buildInboundInteractivePayload, buildInboundTextPayload, serializeWebhookPayload } from '@adatechnology/meta-whatsapp-contracts/testing';
2
+ import { WhatsAppWebhookPayload } from '@adatechnology/meta-whatsapp-contracts';
3
+
4
+ /**
5
+ * Assinatura de payload de preview no runtime do servidor. Os builders vivem em
6
+ * `@adatechnology/meta-whatsapp-contracts/testing` porque precisam rodar também no navegador;
7
+ * aqui fica só o que depende de `node:crypto`.
8
+ *
9
+ * Não existe bypass de assinatura em lugar nenhum: o preview bate na mesma rota, com a mesma
10
+ * validação de HMAC de staging e produção. O que muda é apenas quem assina — a Meta lá, o app
11
+ * secret local aqui.
12
+ */
13
+
14
+ type SignWebhookPayloadParams = {
15
+ readonly rawBody: string;
16
+ readonly appSecret: string;
17
+ };
18
+ declare function signWebhookPayload(params: SignWebhookPayloadParams): string;
19
+ type SignedWebhookRequest = {
20
+ readonly rawBody: string;
21
+ readonly headers: Readonly<Record<string, string>>;
22
+ };
23
+ type ToSignedWebhookRequestParams = {
24
+ readonly payload: WhatsAppWebhookPayload;
25
+ readonly appSecret: string;
26
+ };
27
+ /**
28
+ * Devolve o corpo JÁ serializado junto da assinatura, porque a validação assina os bytes exatos:
29
+ * quem serializar de novo antes de enviar (ou deixar o cliente HTTP serializar o objeto) muda
30
+ * espaçamento/ordem e derruba a assinatura. Enviar `rawBody` como está é o contrato.
31
+ */
32
+ declare function toSignedWebhookRequest(params: ToSignedWebhookRequestParams): SignedWebhookRequest;
33
+
34
+ export { type SignWebhookPayloadParams, type SignedWebhookRequest, type ToSignedWebhookRequestParams, signWebhookPayload, toSignedWebhookRequest };
@@ -0,0 +1,34 @@
1
+ export { BuildInboundAudioPayloadParams, BuildInboundInteractivePayloadParams, BuildInboundTextPayloadParams, InteractiveReplyOption, PREVIEW_AUDIO_MIME_TYPE, PREVIEW_DISPLAY_PHONE_NUMBER, PREVIEW_PHONE_NUMBER_ID, PREVIEW_WABA_ID, buildInboundAudioPayload, buildInboundInteractivePayload, buildInboundTextPayload, serializeWebhookPayload } from '@adatechnology/meta-whatsapp-contracts/testing';
2
+ import { WhatsAppWebhookPayload } from '@adatechnology/meta-whatsapp-contracts';
3
+
4
+ /**
5
+ * Assinatura de payload de preview no runtime do servidor. Os builders vivem em
6
+ * `@adatechnology/meta-whatsapp-contracts/testing` porque precisam rodar também no navegador;
7
+ * aqui fica só o que depende de `node:crypto`.
8
+ *
9
+ * Não existe bypass de assinatura em lugar nenhum: o preview bate na mesma rota, com a mesma
10
+ * validação de HMAC de staging e produção. O que muda é apenas quem assina — a Meta lá, o app
11
+ * secret local aqui.
12
+ */
13
+
14
+ type SignWebhookPayloadParams = {
15
+ readonly rawBody: string;
16
+ readonly appSecret: string;
17
+ };
18
+ declare function signWebhookPayload(params: SignWebhookPayloadParams): string;
19
+ type SignedWebhookRequest = {
20
+ readonly rawBody: string;
21
+ readonly headers: Readonly<Record<string, string>>;
22
+ };
23
+ type ToSignedWebhookRequestParams = {
24
+ readonly payload: WhatsAppWebhookPayload;
25
+ readonly appSecret: string;
26
+ };
27
+ /**
28
+ * Devolve o corpo JÁ serializado junto da assinatura, porque a validação assina os bytes exatos:
29
+ * quem serializar de novo antes de enviar (ou deixar o cliente HTTP serializar o objeto) muda
30
+ * espaçamento/ordem e derruba a assinatura. Enviar `rawBody` como está é o contrato.
31
+ */
32
+ declare function toSignedWebhookRequest(params: ToSignedWebhookRequestParams): SignedWebhookRequest;
33
+
34
+ export { type SignWebhookPayloadParams, type SignedWebhookRequest, type ToSignedWebhookRequestParams, signWebhookPayload, toSignedWebhookRequest };
@@ -0,0 +1,40 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/testing/index.ts
5
+ import { buildInboundTextPayload, buildInboundInteractivePayload, buildInboundAudioPayload, serializeWebhookPayload as serializeWebhookPayload2, PREVIEW_PHONE_NUMBER_ID, PREVIEW_WABA_ID, PREVIEW_DISPLAY_PHONE_NUMBER, PREVIEW_AUDIO_MIME_TYPE } from "@adatechnology/meta-whatsapp-contracts/testing";
6
+
7
+ // src/testing/inboundPayloads.ts
8
+ import { createHmac } from "crypto";
9
+ import { serializeWebhookPayload } from "@adatechnology/meta-whatsapp-contracts/testing";
10
+ function signWebhookPayload(params) {
11
+ return `sha256=${createHmac("sha256", params.appSecret).update(params.rawBody).digest("hex")}`;
12
+ }
13
+ __name(signWebhookPayload, "signWebhookPayload");
14
+ function toSignedWebhookRequest(params) {
15
+ const rawBody = serializeWebhookPayload(params.payload);
16
+ return {
17
+ rawBody,
18
+ headers: {
19
+ "content-type": "application/json",
20
+ "x-hub-signature-256": signWebhookPayload({
21
+ rawBody,
22
+ appSecret: params.appSecret
23
+ })
24
+ }
25
+ };
26
+ }
27
+ __name(toSignedWebhookRequest, "toSignedWebhookRequest");
28
+ export {
29
+ PREVIEW_AUDIO_MIME_TYPE,
30
+ PREVIEW_DISPLAY_PHONE_NUMBER,
31
+ PREVIEW_PHONE_NUMBER_ID,
32
+ PREVIEW_WABA_ID,
33
+ buildInboundAudioPayload,
34
+ buildInboundInteractivePayload,
35
+ buildInboundTextPayload,
36
+ serializeWebhookPayload2 as serializeWebhookPayload,
37
+ signWebhookPayload,
38
+ toSignedWebhookRequest
39
+ };
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/testing/index.ts","../../src/testing/inboundPayloads.ts"],"sourcesContent":["/**\n * Export separado (`@adatechnology/meta-whatsapp-module/testing`) para que utilitário de\n * desenvolvimento não entre no grafo de import de quem só consome o módulo em produção.\n *\n * Os builders são reexportados dos contratos por conveniência de quem já depende do módulo\n * (scripts de CLI, `make test-msg`): quem monta payload no navegador deve importar direto de\n * `@adatechnology/meta-whatsapp-contracts/testing`, que não toca em `node:crypto`.\n */\n\nexport {\n buildInboundTextPayload,\n buildInboundInteractivePayload,\n buildInboundAudioPayload,\n serializeWebhookPayload,\n PREVIEW_PHONE_NUMBER_ID,\n PREVIEW_WABA_ID,\n PREVIEW_DISPLAY_PHONE_NUMBER,\n PREVIEW_AUDIO_MIME_TYPE,\n} from '@adatechnology/meta-whatsapp-contracts/testing'\n\nexport type {\n BuildInboundTextPayloadParams,\n BuildInboundInteractivePayloadParams,\n BuildInboundAudioPayloadParams,\n InteractiveReplyOption,\n} from '@adatechnology/meta-whatsapp-contracts/testing'\n\nexport { signWebhookPayload, toSignedWebhookRequest } from './inboundPayloads'\nexport type { SignWebhookPayloadParams, SignedWebhookRequest, ToSignedWebhookRequestParams } from './inboundPayloads'\n","/**\n * Assinatura de payload de preview no runtime do servidor. Os builders vivem em\n * `@adatechnology/meta-whatsapp-contracts/testing` porque precisam rodar também no navegador;\n * aqui fica só o que depende de `node:crypto`.\n *\n * Não existe bypass de assinatura em lugar nenhum: o preview bate na mesma rota, com a mesma\n * validação de HMAC de staging e produção. O que muda é apenas quem assina — a Meta lá, o app\n * secret local aqui.\n */\n\nimport { createHmac } from 'node:crypto'\nimport type { WhatsAppWebhookPayload } from '@adatechnology/meta-whatsapp-contracts'\nimport { serializeWebhookPayload } from '@adatechnology/meta-whatsapp-contracts/testing'\n\nexport type SignWebhookPayloadParams = {\n readonly rawBody: string\n readonly appSecret: string\n}\n\nexport function signWebhookPayload(params: SignWebhookPayloadParams): string {\n return `sha256=${createHmac('sha256', params.appSecret).update(params.rawBody).digest('hex')}`\n}\n\nexport type SignedWebhookRequest = {\n readonly rawBody: string\n readonly headers: Readonly<Record<string, string>>\n}\n\nexport type ToSignedWebhookRequestParams = {\n readonly payload: WhatsAppWebhookPayload\n readonly appSecret: string\n}\n\n/**\n * Devolve o corpo JÁ serializado junto da assinatura, porque a validação assina os bytes exatos:\n * quem serializar de novo antes de enviar (ou deixar o cliente HTTP serializar o objeto) muda\n * espaçamento/ordem e derruba a assinatura. Enviar `rawBody` como está é o contrato.\n */\nexport function toSignedWebhookRequest(params: ToSignedWebhookRequestParams): SignedWebhookRequest {\n const rawBody = serializeWebhookPayload(params.payload)\n\n return {\n rawBody,\n headers: {\n 'content-type': 'application/json',\n 'x-hub-signature-256': signWebhookPayload({ rawBody, appSecret: params.appSecret }),\n },\n }\n}\n"],"mappings":";;;;AASA,SACEA,yBACAC,gCACAC,0BACAC,2BAAAA,0BACAC,yBACAC,iBACAC,8BACAC,+BACK;;;ACRP,SAASC,kBAAkB;AAE3B,SAASC,+BAA+B;AAOjC,SAASC,mBAAmBC,QAAgC;AACjE,SAAO,UAAUC,WAAW,UAAUD,OAAOE,SAAS,EAAEC,OAAOH,OAAOI,OAAO,EAAEC,OAAO,KAAA,CAAA;AACxF;AAFgBN;AAmBT,SAASO,uBAAuBN,QAAoC;AACzE,QAAMI,UAAUG,wBAAwBP,OAAOQ,OAAO;AAEtD,SAAO;IACLJ;IACAK,SAAS;MACP,gBAAgB;MAChB,uBAAuBV,mBAAmB;QAAEK;QAASF,WAAWF,OAAOE;MAAU,CAAA;IACnF;EACF;AACF;AAVgBI;","names":["buildInboundTextPayload","buildInboundInteractivePayload","buildInboundAudioPayload","serializeWebhookPayload","PREVIEW_PHONE_NUMBER_ID","PREVIEW_WABA_ID","PREVIEW_DISPLAY_PHONE_NUMBER","PREVIEW_AUDIO_MIME_TYPE","createHmac","serializeWebhookPayload","signWebhookPayload","params","createHmac","appSecret","update","rawBody","digest","toSignedWebhookRequest","serializeWebhookPayload","payload","headers"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adatechnology/meta-whatsapp-module",
3
- "version": "0.2.0-rc.7",
3
+ "version": "0.2.0-rc.9",
4
4
  "description": "Stateful conversation/flow module for WhatsApp — schema, migrations, repositories, and use-cases behind pluggable ports (Fase 3-5 of the meta-whatsapp trio)",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -8,13 +8,25 @@
8
8
  "type": "module",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ },
17
+ "./testing": {
18
+ "types": "./dist/testing/index.d.ts",
19
+ "import": "./dist/testing/index.js",
20
+ "require": "./dist/testing/index.cjs"
21
+ }
22
+ },
11
23
  "files": [
12
24
  "dist"
13
25
  ],
14
26
  "dependencies": {
15
27
  "@adatechnology/meta-graph-core": "0.2.0-rc.1",
16
- "@adatechnology/meta-whatsapp-provider": "0.2.0-rc.2",
17
- "@adatechnology/meta-whatsapp-contracts": "0.2.0-rc.1"
28
+ "@adatechnology/meta-whatsapp-contracts": "0.2.0-rc.3",
29
+ "@adatechnology/meta-whatsapp-provider": "0.2.0-rc.2"
18
30
  },
19
31
  "devDependencies": {
20
32
  "@types/bun": "1.3.14",