@hostwebhook/platform-contracts 0.15.0 → 0.17.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.
@@ -34,20 +34,28 @@
34
34
  export declare const FILTER_OPERATORS: readonly ["eq", "neq", "gt", "gte", "lt", "lte", "contains", "not_contains", "starts_with", "not_starts_with", "ends_with", "not_ends_with", "matches_regex", "is_empty", "is_not_empty", "exists", "not_exists", "has_key", "is_true", "is_false", "array_contains", "array_not_contains", "array_empty", "array_not_empty", "array_length_eq", "array_length_gt", "array_length_lt", "date_eq", "date_before", "date_after"];
35
35
  export type FilterOperator = (typeof FILTER_OPERATORS)[number];
36
36
  /**
37
- * Lo que `RoutersService.evaluateRule` sabe resolver. Nueve.
37
+ * Lo que una regla de router sabe resolver: los treinta de arriba y dos más.
38
38
  *
39
- * ⚠️ **Parece la lista de arriba recortada y no lo es.** Tiene dos que allí no
40
- * existen —`in` y `not_in`, que parten el valor por comas y miran si el del
41
- * campo está dentro— y le faltan los otros veintitrés.
39
+ * Hasta [2026-09-11] eran nueve, y el aviso que había aquí decía por qué no
40
+ * se unificaban: el router tenía su propio `switch` y heredar los treinta
41
+ * habría dejado guardar reglas que caían en `default: false` sin ruido. Ya
42
+ * no hay dos evaluadores: `RoutersService.matchRule` delega en
43
+ * `evaluateFilters` de `filter-utils` para todo lo que está en
44
+ * `FILTER_OPERATORS`, así que la lista del router ES la de los filtros más
45
+ * lo que sólo tiene sentido en un router:
42
46
  *
43
- * Por eso no se unifican. Si el router heredara los treinta, se podrían
44
- * guardar reglas que su `switch` no resuelve: caerían en el `default: false`
45
- * y la regla nunca casaría. No daría error — sencillamente no enrutaría, que
46
- * es más difícil de ver que un fallo.
47
+ * - `in` / `not_in` — parten el valor por comas y miran si el del campo
48
+ * está dentro. Un filtro no los tiene porque un filtro es una puerta
49
+ * («¿pasa o no?») y una lista de valores es la forma natural de decir
50
+ * «esta rama es para estos tres»; en un filtro se escribe con `or`.
47
51
  *
48
- * Quien quiera unificarlas de verdad tiene que escribir los `case` primero.
52
+ * Lo pidió el dueño al ver que al router le faltaba `is empty`.
53
+ *
54
+ * ⚠️ Derivada y no copiada: el día que `filter-utils` aprenda un operador,
55
+ * el router lo tiene sin tocar nada aquí. `una-sola-lista-de-operadores.spec`
56
+ * de hw-nodes ata los `case` propios del router a los dos de la cola.
49
57
  */
50
- export declare const ROUTER_OPERATORS: readonly ["eq", "neq", "contains", "gt", "lt", "exists", "not_exists", "in", "not_in"];
58
+ export declare const ROUTER_OPERATORS: readonly ["eq", "neq", "gt", "gte", "lt", "lte", "contains", "not_contains", "starts_with", "not_starts_with", "ends_with", "not_ends_with", "matches_regex", "is_empty", "is_not_empty", "exists", "not_exists", "has_key", "is_true", "is_false", "array_contains", "array_not_contains", "array_empty", "array_not_empty", "array_length_eq", "array_length_gt", "array_length_lt", "date_eq", "date_before", "date_after", "in", "not_in"];
51
59
  export type RouterOperator = (typeof ROUTER_OPERATORS)[number];
52
60
  /**
53
61
  * Los operadores que no llevan valor.
@@ -76,30 +76,28 @@ exports.FILTER_OPERATORS = [
76
76
  ];
77
77
  /* ── Router ──────────────────────────────────────────────────────── */
78
78
  /**
79
- * Lo que `RoutersService.evaluateRule` sabe resolver. Nueve.
79
+ * Lo que una regla de router sabe resolver: los treinta de arriba y dos más.
80
80
  *
81
- * ⚠️ **Parece la lista de arriba recortada y no lo es.** Tiene dos que allí no
82
- * existen —`in` y `not_in`, que parten el valor por comas y miran si el del
83
- * campo está dentro— y le faltan los otros veintitrés.
81
+ * Hasta [2026-09-11] eran nueve, y el aviso que había aquí decía por qué no
82
+ * se unificaban: el router tenía su propio `switch` y heredar los treinta
83
+ * habría dejado guardar reglas que caían en `default: false` sin ruido. Ya
84
+ * no hay dos evaluadores: `RoutersService.matchRule` delega en
85
+ * `evaluateFilters` de `filter-utils` para todo lo que está en
86
+ * `FILTER_OPERATORS`, así que la lista del router ES la de los filtros más
87
+ * lo que sólo tiene sentido en un router:
84
88
  *
85
- * Por eso no se unifican. Si el router heredara los treinta, se podrían
86
- * guardar reglas que su `switch` no resuelve: caerían en el `default: false`
87
- * y la regla nunca casaría. No daría error — sencillamente no enrutaría, que
88
- * es más difícil de ver que un fallo.
89
+ * - `in` / `not_in` — parten el valor por comas y miran si el del campo
90
+ * está dentro. Un filtro no los tiene porque un filtro es una puerta
91
+ * («¿pasa o no?») y una lista de valores es la forma natural de decir
92
+ * «esta rama es para estos tres»; en un filtro se escribe con `or`.
89
93
  *
90
- * Quien quiera unificarlas de verdad tiene que escribir los `case` primero.
94
+ * Lo pidió el dueño al ver que al router le faltaba `is empty`.
95
+ *
96
+ * ⚠️ Derivada y no copiada: el día que `filter-utils` aprenda un operador,
97
+ * el router lo tiene sin tocar nada aquí. `una-sola-lista-de-operadores.spec`
98
+ * de hw-nodes ata los `case` propios del router a los dos de la cola.
91
99
  */
92
- exports.ROUTER_OPERATORS = [
93
- 'eq',
94
- 'neq',
95
- 'contains',
96
- 'gt',
97
- 'lt',
98
- 'exists',
99
- 'not_exists',
100
- 'in',
101
- 'not_in',
102
- ];
100
+ exports.ROUTER_OPERATORS = [...exports.FILTER_OPERATORS, 'in', 'not_in'];
103
101
  /* ── Lo que tienen en común ──────────────────────────────────────── */
104
102
  /**
105
103
  * Los operadores que no llevan valor.
@@ -106,7 +106,7 @@ export interface DescripcionDeCredencial {
106
106
  * registro es forense, no un índice: se prefiere que de hoy en adelante diga
107
107
  * una sola cosa.
108
108
  */
109
- export type TipoDeEntidad = 'trigger' | 'webhook' | 'aiNode' | 'socialMediaAction' | 'socialPost' | 'calendarAction' | 'docsAction' | 'driveAction' | 'sheetsAction' | 'emailAction' | 'gmailAction' | 'approvalNode' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'mongoAction' | 'postgresAction' | 'httpAction' | 'githubAction' | 'notionAction' | 'jiraAction' | 'bucketAction' | 'shopifyAction' | 'mailchimpAction' | 'firecrawlAction' | 'notificationAction' | 'googleAnalyticsAction' | 'googleContactsAction' | 'vectorStore' | 'voiceAgent';
109
+ export type TipoDeEntidad = 'trigger' | 'webhook' | 'aiNode' | 'socialMediaAction' | 'socialPost' | 'calendarAction' | 'docsAction' | 'driveAction' | 'sheetsAction' | 'emailAction' | 'gmailAction' | 'approvalNode' | 'telegramAction' | 'whatsappAction' | 'discordAction' | 'slackAction' | 'mongoAction' | 'postgresAction' | 'httpAction' | 'githubAction' | 'notionAction' | 'jiraAction' | 'bucketAction' | 'apifyAction' | 'shopifyAction' | 'mailchimpAction' | 'firecrawlAction' | 'notificationAction' | 'googleAnalyticsAction' | 'googleContactsAction' | 'vectorStore' | 'voiceAgent';
110
110
  /**
111
111
  * Por qué esta lectura NO se puede comprobar contra el documento de hoy.
112
112
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostwebhook/platform-contracts",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "description": "Contratos compartidos entre los servicios de HostWebhook: addons del plan, identidad interna, y las formas que cruzan una frontera de red",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",