@reachy/audience-module 1.0.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/PUBLISH.md ADDED
@@ -0,0 +1,157 @@
1
+ # Como Publicar o @reachy/audience-module no NPM
2
+
3
+ ## 📦 Pré-requisitos
4
+
5
+ 1. Conta no [npmjs.com](https://www.npmjs.com)
6
+ 2. Configurar autenticação local
7
+
8
+ ## 🚀 Passo a Passo
9
+
10
+ ### 1. Fazer Login no NPM
11
+
12
+ ```bash
13
+ cd /Users/vitorhugo/reachy/audience-module
14
+ npm login
15
+ ```
16
+
17
+ Será solicitado:
18
+ - Username
19
+ - Password
20
+ - Email
21
+ - OTP (se tiver 2FA habilitado)
22
+
23
+ ### 2. Verificar se o Nome está Disponível
24
+
25
+ ```bash
26
+ npm view @reachy/audience-module
27
+ ```
28
+
29
+ Se retornar erro 404, o nome está disponível! ✅
30
+
31
+ Se já existir, você precisa:
32
+ - Mudar o nome no `package.json`, ou
33
+ - Publicar sem escopo: `audience-module` (não recomendado)
34
+
35
+ ### 3. Atualizar Informações do Pacote
36
+
37
+ Edite `/Users/vitorhugo/reachy/audience-module/package.json`:
38
+
39
+ ```json
40
+ {
41
+ "name": "@reachy/audience-module",
42
+ "version": "1.0.0",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/seu-usuario/audience-module.git"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/seu-usuario/audience-module/issues"
49
+ },
50
+ "homepage": "https://github.com/seu-usuario/audience-module#readme"
51
+ }
52
+ ```
53
+
54
+ ### 4. Build Final
55
+
56
+ ```bash
57
+ cd /Users/vitorhugo/reachy/audience-module
58
+
59
+ # Limpar dist antiga
60
+ npm run clean
61
+
62
+ # Build
63
+ npm run build
64
+
65
+ # Verificar arquivos que serão publicados
66
+ npm pack --dry-run
67
+ ```
68
+
69
+ ### 5. Publicar
70
+
71
+ ```bash
72
+ # Primeira publicação
73
+ npm publish --access public
74
+
75
+ # Ou se já existir, apenas atualizar versão
76
+ npm version patch # 1.0.0 -> 1.0.1
77
+ npm publish
78
+ ```
79
+
80
+ ### 6. Verificar Publicação
81
+
82
+ ```bash
83
+ npm view @reachy/audience-module
84
+ ```
85
+
86
+ ## 📝 Versionamento Semântico
87
+
88
+ ```bash
89
+ # Patch (1.0.0 -> 1.0.1) - Correções de bugs
90
+ npm version patch
91
+
92
+ # Minor (1.0.0 -> 1.1.0) - Novas features
93
+ npm version minor
94
+
95
+ # Major (1.0.0 -> 2.0.0) - Breaking changes
96
+ npm version major
97
+ ```
98
+
99
+ Após cada `npm version`, faça:
100
+
101
+ ```bash
102
+ npm publish
103
+ ```
104
+
105
+ ## 🔄 Atualizar no reachy-api
106
+
107
+ Depois de publicar no NPM:
108
+
109
+ ```bash
110
+ cd /Users/vitorhugo/reachy/reachy-api
111
+
112
+ # Atualizar package.json para usar a versão do NPM
113
+ # Mudar de: "file:../audience-module"
114
+ # Para: "^1.0.0"
115
+
116
+ # Ou instalar diretamente
117
+ npm install @reachy/audience-module@latest
118
+ ```
119
+
120
+ ## 🏷️ Tags (Opcional)
121
+
122
+ Para versões beta ou canary:
123
+
124
+ ```bash
125
+ # Publicar como beta
126
+ npm publish --tag beta
127
+
128
+ # Instalar beta
129
+ npm install @reachy/audience-module@beta
130
+ ```
131
+
132
+ ## 🔐 Organização no NPM
133
+
134
+ Se quiser criar uma organização "@reachy":
135
+
136
+ 1. Acesse https://www.npmjs.com/org/create
137
+ 2. Crie a organização "reachy"
138
+ 3. Adicione membros da equipe
139
+ 4. Publique pacotes sob @reachy/
140
+
141
+ ## ⚠️ Importante
142
+
143
+ - ✅ Sempre faça `npm run build` antes de publicar
144
+ - ✅ Teste localmente antes (`npm pack` e instalar o .tgz)
145
+ - ✅ Use versionamento semântico
146
+ - ✅ Documente mudanças no README
147
+ - ❌ Não publique com `node_modules/` (já está no `.npmignore`)
148
+ - ❌ Não publique `src/` se não quiser expor TypeScript
149
+
150
+ ## 📊 Status do Pacote
151
+
152
+ Depois de publicar, você verá no NPM:
153
+ - Versão atual
154
+ - Downloads por semana
155
+ - Link do repositório
156
+ - README renderizado
157
+
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @reachy/audience-module
2
+
3
+ Módulo reutilizável para consultas e criação de audiences em múltiplos projetos Reachy.
4
+
5
+ ## 🚀 Instalação
6
+
7
+ ```bash
8
+ npm install @reachy/audience-module
9
+ ```
10
+
11
+ ## 📋 Uso Básico
12
+
13
+ ```typescript
14
+ import { AudienceModule } from '@reachy/audience-module'
15
+ import { ContactRepository } from './repositories/contactRepository'
16
+ import { AudienceRepository } from './repositories/audienceRepository'
17
+
18
+ // Criar instância do módulo
19
+ const audienceModule = new AudienceModule({
20
+ enableDebugLogs: true
21
+ })
22
+
23
+ // Configurar repositórios necessários
24
+ audienceModule.setRepositories({
25
+ contactRepository: new ContactRepository(),
26
+ audienceRepository: new AudienceRepository()
27
+ })
28
+
29
+ // Executar query de audiência
30
+ const result = await audienceModule.executeQuery(
31
+ {
32
+ filters: [
33
+ {
34
+ id: '1',
35
+ operator: 'AND',
36
+ conditions: [
37
+ { field: 'city', operator: 'equals', value: 'São Paulo' },
38
+ { field: 'opted_in', operator: 'equals', value: true }
39
+ ]
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ organizationId: 'org-123',
45
+ projectId: 'proj-456',
46
+ pagination: { page: 1, limit: 50 }
47
+ }
48
+ )
49
+
50
+ console.log(`Encontrados ${result.count} contatos`)
51
+ ```
52
+
53
+ ## 🔧 Features
54
+
55
+ - ✅ Suporte a múltiplos formatos de critérios
56
+ - ✅ Query builder otimizado
57
+ - ✅ Execução de audiences estáticas e live
58
+ - ✅ Validação de critérios
59
+ - ✅ Type-safe com TypeScript
60
+ - ✅ Fácil integração com Supabase
61
+
62
+ ## 📖 API
63
+
64
+ ### AudienceModule
65
+
66
+ #### `executeQuery(criteria, options)`
67
+
68
+ Executa uma query de audiência e retorna os resultados.
69
+
70
+ #### `getContactCount(criteria, options)`
71
+
72
+ Retorna apenas a contagem de contatos (mais rápido).
73
+
74
+ #### `getContactIds(criteria, organizationId, projectId)`
75
+
76
+ Retorna apenas os IDs dos contatos.
77
+
78
+ #### `validateCriteria(criteria)`
79
+
80
+ Valida se os critérios são válidos.
81
+
82
+ ## 📦 Build
83
+
84
+ ```bash
85
+ npm run build
86
+ ```
87
+
88
+ ## 🔗 Links
89
+
90
+ - [Repository](https://github.com/reachy/audience-module)
91
+ - [Issues](https://github.com/reachy/audience-module/issues)
92
+
93
+ ## 📄 License
94
+
95
+ MIT
96
+
@@ -0,0 +1,38 @@
1
+ import { AudienceCriteria, AudienceQueryOptions, AudienceExecutionResult, AudienceBuilderConfig, CreateAudienceData, UpdateAudienceData } from './types';
2
+ export declare class AudienceModule {
3
+ private audienceRepository;
4
+ private memberRepository;
5
+ private contactRepository;
6
+ private staticExecutor;
7
+ constructor(config?: AudienceBuilderConfig);
8
+ setRepositories(repositories: {
9
+ contactRepository?: any;
10
+ audienceRepository?: any;
11
+ memberRepository?: any;
12
+ }): void;
13
+ executeQuery(criteria: string | AudienceCriteria, options: AudienceQueryOptions): Promise<AudienceExecutionResult>;
14
+ getContactCount(criteria: string | AudienceCriteria, options: Omit<AudienceQueryOptions, 'pagination'>): Promise<number>;
15
+ getContactIds(criteria: string | AudienceCriteria, organizationId: string, projectId: string): Promise<Set<string>>;
16
+ createAudience(data: CreateAudienceData): Promise<{
17
+ data: any;
18
+ error: null;
19
+ }>;
20
+ updateAudience(id: string, updateData: UpdateAudienceData, organizationId: string, projectId: string): Promise<{
21
+ data: any;
22
+ error: null;
23
+ }>;
24
+ getAudienceById(id: string, organizationId: string, projectId: string): Promise<any>;
25
+ deleteAudience(id: string): Promise<any>;
26
+ addMembers(audienceId: string, contactIds: string[], organizationId: string, projectId: string, origin?: 'realtime' | 'backfill'): Promise<any>;
27
+ getMembers(audienceId: string, organizationId: string, projectId: string, pagination?: {
28
+ page?: number;
29
+ limit?: number;
30
+ }): Promise<any>;
31
+ validateCriteria(criteria: string | AudienceCriteria): {
32
+ valid: boolean;
33
+ errors: string[];
34
+ };
35
+ getAudienceType(criteria: string | AudienceCriteria): 'static' | 'live';
36
+ private executeLiveQuery;
37
+ }
38
+ //# sourceMappingURL=AudienceModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudienceModule.d.ts","sourceRoot":"","sources":["../src/AudienceModule.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAuBhB,qBAAa,cAAc;IACzB,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAwB;gBAElC,MAAM,GAAE,qBAA0B;IAa9C,eAAe,CAAC,YAAY,EAAE;QAC5B,iBAAiB,CAAC,EAAE,GAAG,CAAA;QACvB,kBAAkB,CAAC,EAAE,GAAG,CAAA;QACxB,gBAAgB,CAAC,EAAE,GAAG,CAAA;KACvB;IAoBK,YAAY,CAChB,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EACnC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC;IAc7B,eAAe,CACnB,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EACnC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC;IAQZ,aAAa,CACjB,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EACnC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAoBjB,cAAc,CAAC,IAAI,EAAE,kBAAkB;;;;IA8BvC,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,kBAAkB,EAC9B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM;;;;IAmCb,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAUrE,cAAc,CAAC,EAAE,EAAE,MAAM;IAczB,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,UAAU,GAAG,UAAuB;IAkBxC,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAqBhD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;;;;IAQpD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,QAAQ,GAAG,MAAM;YAYzD,gBAAgB;CA6B/B"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudienceModule = void 0;
4
+ const StaticAudienceExecutor_1 = require("./executors/StaticAudienceExecutor");
5
+ const CriteriaParser_1 = require("./builders/CriteriaParser");
6
+ class AudienceModule {
7
+ constructor(config = {}) {
8
+ this.staticExecutor = new StaticAudienceExecutor_1.StaticAudienceExecutor();
9
+ if (config.enableDebugLogs) {
10
+ console.log('🔧 AudienceModule configurado:', config);
11
+ }
12
+ }
13
+ setRepositories(repositories) {
14
+ if (repositories.contactRepository) {
15
+ this.contactRepository = repositories.contactRepository;
16
+ this.staticExecutor.setContactRepository(repositories.contactRepository);
17
+ }
18
+ if (repositories.audienceRepository) {
19
+ this.audienceRepository = repositories.audienceRepository;
20
+ }
21
+ if (repositories.memberRepository) {
22
+ this.memberRepository = repositories.memberRepository;
23
+ }
24
+ }
25
+ async executeQuery(criteria, options) {
26
+ const parsed = CriteriaParser_1.CriteriaParser.parse(criteria);
27
+ const type = CriteriaParser_1.CriteriaParser.getAudienceType(parsed);
28
+ if (type === 'static') {
29
+ return this.staticExecutor.execute(parsed, options);
30
+ }
31
+ else {
32
+ return this.executeLiveQuery(parsed, options);
33
+ }
34
+ }
35
+ async getContactCount(criteria, options) {
36
+ const parsed = CriteriaParser_1.CriteriaParser.parse(criteria);
37
+ return this.staticExecutor.executeCount(parsed, options);
38
+ }
39
+ async getContactIds(criteria, organizationId, projectId) {
40
+ if (!this.contactRepository) {
41
+ throw new Error('ContactRepository não configurado');
42
+ }
43
+ const parsed = CriteriaParser_1.CriteriaParser.parse(criteria);
44
+ return this.contactRepository.getContactIdsByAudienceCriteriaV2(organizationId, projectId, parsed);
45
+ }
46
+ async createAudience(data) {
47
+ if (!this.audienceRepository) {
48
+ throw new Error('AudienceRepository não configurado');
49
+ }
50
+ const validation = CriteriaParser_1.CriteriaParser.validate(data.criteria);
51
+ if (!validation.valid) {
52
+ throw new Error(`Critérios inválidos: ${validation.errors.join(', ')}`);
53
+ }
54
+ const { data: audience, error } = await this.audienceRepository.create(data);
55
+ if (error)
56
+ throw error;
57
+ const type = CriteriaParser_1.CriteriaParser.getAudienceType(data.criteria);
58
+ if (type === 'static') {
59
+ const count = await this.getContactCount(data.criteria, {
60
+ organizationId: data.organization_id,
61
+ projectId: data.project_id
62
+ });
63
+ await this.audienceRepository.updateCount(audience.id, count);
64
+ audience.count = count;
65
+ }
66
+ return { data: audience, error: null };
67
+ }
68
+ async updateAudience(id, updateData, organizationId, projectId) {
69
+ if (!this.audienceRepository) {
70
+ throw new Error('AudienceRepository não configurado');
71
+ }
72
+ if (updateData.criteria) {
73
+ const validation = CriteriaParser_1.CriteriaParser.validate(updateData.criteria);
74
+ if (!validation.valid) {
75
+ throw new Error(`Critérios inválidos: ${validation.errors.join(', ')}`);
76
+ }
77
+ }
78
+ const { data: audience, error } = await this.audienceRepository.update(id, updateData);
79
+ if (error)
80
+ throw error;
81
+ if (updateData.criteria) {
82
+ const type = CriteriaParser_1.CriteriaParser.getAudienceType(updateData.criteria);
83
+ if (type === 'static') {
84
+ const count = await this.getContactCount(updateData.criteria, {
85
+ organizationId,
86
+ projectId
87
+ });
88
+ await this.audienceRepository.updateCount(id, count);
89
+ audience.count = count;
90
+ }
91
+ }
92
+ return { data: audience, error: null };
93
+ }
94
+ async getAudienceById(id, organizationId, projectId) {
95
+ if (!this.audienceRepository) {
96
+ throw new Error('AudienceRepository não configurado');
97
+ }
98
+ return this.audienceRepository.findById(id, organizationId, projectId);
99
+ }
100
+ async deleteAudience(id) {
101
+ if (!this.audienceRepository) {
102
+ throw new Error('AudienceRepository não configurado');
103
+ }
104
+ return this.audienceRepository.delete(id);
105
+ }
106
+ async addMembers(audienceId, contactIds, organizationId, projectId, origin = 'backfill') {
107
+ if (!this.memberRepository) {
108
+ throw new Error('MemberRepository não configurado');
109
+ }
110
+ return this.memberRepository.bulkUpsert(audienceId, organizationId, projectId, contactIds, origin);
111
+ }
112
+ async getMembers(audienceId, organizationId, projectId, pagination) {
113
+ if (!this.memberRepository) {
114
+ throw new Error('MemberRepository não configurado');
115
+ }
116
+ return this.memberRepository.listMembers(audienceId, organizationId, projectId, pagination);
117
+ }
118
+ validateCriteria(criteria) {
119
+ const parsed = CriteriaParser_1.CriteriaParser.parse(criteria);
120
+ return CriteriaParser_1.CriteriaParser.validate(parsed);
121
+ }
122
+ getAudienceType(criteria) {
123
+ const parsed = CriteriaParser_1.CriteriaParser.parse(criteria);
124
+ return CriteriaParser_1.CriteriaParser.getAudienceType(parsed);
125
+ }
126
+ async executeLiveQuery(_criteria, options) {
127
+ const startTime = Date.now();
128
+ if (!this.memberRepository) {
129
+ throw new Error('MemberRepository não configurado para audiences live');
130
+ }
131
+ const { data: members, count } = await this.memberRepository.listMembers('', options.organizationId, options.projectId, options.pagination);
132
+ const contactIds = new Set(members?.map((m) => m.id) || []);
133
+ return {
134
+ contactIds,
135
+ contacts: members || [],
136
+ count: count || 0,
137
+ metadata: {
138
+ executionTime: Date.now() - startTime,
139
+ criteriaType: 'live'
140
+ }
141
+ };
142
+ }
143
+ }
144
+ exports.AudienceModule = AudienceModule;
145
+ //# sourceMappingURL=AudienceModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudienceModule.js","sourceRoot":"","sources":["../src/AudienceModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { AudienceCriteria } from '../types';
2
+ export declare class CriteriaParser {
3
+ static parse(criteria: string | AudienceCriteria): AudienceCriteria;
4
+ private static normalizeCriteria;
5
+ static getAudienceType(criteria: AudienceCriteria): 'static' | 'live';
6
+ static validate(criteria: AudienceCriteria): {
7
+ valid: boolean;
8
+ errors: string[];
9
+ };
10
+ }
11
+ //# sourceMappingURL=CriteriaParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CriteriaParser.d.ts","sourceRoot":"","sources":["../../src/builders/CriteriaParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAK3C,qBAAa,cAAc;IAIzB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,gBAAgB;IAoBnE,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA4BhC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,QAAQ,GAAG,MAAM;IAQrE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CAqBlF"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CriteriaParser = void 0;
4
+ class CriteriaParser {
5
+ static parse(criteria) {
6
+ let parsed;
7
+ if (typeof criteria === 'string') {
8
+ try {
9
+ parsed = JSON.parse(criteria);
10
+ }
11
+ catch (error) {
12
+ console.error('❌ Erro ao fazer parse de critérios:', error);
13
+ throw new Error('Critérios inválidos');
14
+ }
15
+ }
16
+ else {
17
+ parsed = criteria;
18
+ }
19
+ return this.normalizeCriteria(parsed);
20
+ }
21
+ static normalizeCriteria(criteria) {
22
+ if (criteria.filters && Array.isArray(criteria.filters)) {
23
+ return {
24
+ ...criteria,
25
+ conditions: criteria.filters.map(filter => ({
26
+ groupId: filter.id,
27
+ operator: filter.operator,
28
+ conditions: filter.conditions.map(cond => ({
29
+ field: cond.field,
30
+ operator: cond.operator,
31
+ value: cond.value,
32
+ customFieldKey: cond.customFieldKey,
33
+ logicalOperator: cond.logicalOperator
34
+ }))
35
+ }))
36
+ };
37
+ }
38
+ if (criteria.groups) {
39
+ return criteria;
40
+ }
41
+ return criteria;
42
+ }
43
+ static getAudienceType(criteria) {
44
+ const liveTypes = ['live-actions', 'live-page-visit', 'live-referrer', 'live-page-count'];
45
+ return liveTypes.includes(criteria.type || '') ? 'live' : 'static';
46
+ }
47
+ static validate(criteria) {
48
+ const errors = [];
49
+ if (!criteria || typeof criteria !== 'object') {
50
+ errors.push('Critérios devem ser um objeto');
51
+ return { valid: false, errors };
52
+ }
53
+ const hasConditions = criteria.conditions && Array.isArray(criteria.conditions);
54
+ const hasFilters = criteria.filters && Array.isArray(criteria.filters);
55
+ const hasGroups = criteria.groups && Array.isArray(criteria.groups);
56
+ if (!hasConditions && !hasFilters && !hasGroups) {
57
+ errors.push('Critérios devem conter conditions, filters ou groups');
58
+ }
59
+ return {
60
+ valid: errors.length === 0,
61
+ errors
62
+ };
63
+ }
64
+ }
65
+ exports.CriteriaParser = CriteriaParser;
66
+ //# sourceMappingURL=CriteriaParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CriteriaParser.js","sourceRoot":"","sources":["../../src/builders/CriteriaParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { AudienceCriteria } from '../types';
2
+ export declare class QueryBuilder {
3
+ static buildFilters(query: any, criteria: AudienceCriteria, organizationId: string, projectId: string): any;
4
+ private static applyAudienceCriteria;
5
+ private static applyGroupsCriteria;
6
+ private static applyFiltersCriteria;
7
+ private static applyConditionsCriteria;
8
+ private static applyCondition;
9
+ private static buildConditionString;
10
+ private static mapFieldToColumn;
11
+ }
12
+ //# sourceMappingURL=QueryBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/QueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAK3C,qBAAa,YAAY;IAIvB,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG;IAW3G,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAmBpC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA8BlC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAuCnC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAoBtC,OAAO,CAAC,MAAM,CAAC,cAAc;IAwC7B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAyCnC,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAoBhC"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryBuilder = void 0;
4
+ class QueryBuilder {
5
+ static buildFilters(query, criteria, organizationId, projectId) {
6
+ query = query
7
+ .eq('organization_id', organizationId)
8
+ .eq('project_id', projectId);
9
+ return this.applyAudienceCriteria(query, criteria);
10
+ }
11
+ static applyAudienceCriteria(query, criteria) {
12
+ if (criteria.groups && Array.isArray(criteria.groups)) {
13
+ return this.applyGroupsCriteria(query, criteria.groups);
14
+ }
15
+ if (criteria.filters && Array.isArray(criteria.filters)) {
16
+ return this.applyFiltersCriteria(query, criteria.filters);
17
+ }
18
+ if (criteria.conditions && Array.isArray(criteria.conditions)) {
19
+ return this.applyConditionsCriteria(query, criteria.conditions);
20
+ }
21
+ return query;
22
+ }
23
+ static applyGroupsCriteria(query, groups) {
24
+ const orConditions = [];
25
+ for (const group of groups) {
26
+ if (!group.rules || !Array.isArray(group.rules))
27
+ continue;
28
+ const groupConditions = [];
29
+ for (const rule of group.rules) {
30
+ const condition = this.buildConditionString(rule);
31
+ if (condition) {
32
+ groupConditions.push(condition);
33
+ }
34
+ }
35
+ if (groupConditions.length > 0) {
36
+ orConditions.push(groupConditions.join(','));
37
+ }
38
+ }
39
+ if (orConditions.length > 0) {
40
+ query = query.or(orConditions.join(','));
41
+ }
42
+ return query;
43
+ }
44
+ static applyFiltersCriteria(query, filters) {
45
+ const orGroups = filters.filter(f => f.operator === 'OR');
46
+ const andGroups = filters.filter(f => f.operator !== 'OR');
47
+ if (orGroups.length > 0) {
48
+ const orConditions = [];
49
+ for (const filterGroup of orGroups) {
50
+ const groupConditions = [];
51
+ for (const condition of filterGroup.conditions) {
52
+ const condStr = this.buildConditionString(condition);
53
+ if (condStr) {
54
+ groupConditions.push(condStr);
55
+ }
56
+ }
57
+ if (groupConditions.length > 0) {
58
+ orConditions.push(groupConditions.join(','));
59
+ }
60
+ }
61
+ if (orConditions.length > 0) {
62
+ query = query.or(orConditions.join(','));
63
+ }
64
+ }
65
+ for (const filterGroup of andGroups) {
66
+ for (const condition of filterGroup.conditions) {
67
+ query = this.applyCondition(query, condition);
68
+ }
69
+ }
70
+ return query;
71
+ }
72
+ static applyConditionsCriteria(query, conditions) {
73
+ for (const group of conditions) {
74
+ if (group.operator === 'OR') {
75
+ const orConditions = group.conditions.map((c) => this.buildConditionString(c)).filter(Boolean);
76
+ if (orConditions.length > 0) {
77
+ query = query.or(orConditions.join(','));
78
+ }
79
+ }
80
+ else {
81
+ for (const condition of group.conditions) {
82
+ query = this.applyCondition(query, condition);
83
+ }
84
+ }
85
+ }
86
+ return query;
87
+ }
88
+ static applyCondition(query, condition) {
89
+ const { field, operator, value } = condition;
90
+ const dbField = this.mapFieldToColumn(field, condition.customFieldKey);
91
+ switch (operator) {
92
+ case 'equals':
93
+ case 'eq':
94
+ return query.eq(dbField, value);
95
+ case 'not_equals':
96
+ case 'neq':
97
+ return query.neq(dbField, value);
98
+ case 'contains':
99
+ case 'ilike':
100
+ return query.ilike(dbField, `%${value}%`);
101
+ case 'not_contains':
102
+ return query.not.ilike(dbField, `%${value}%`);
103
+ case 'starts_with':
104
+ return query.ilike(dbField, `${value}%`);
105
+ case 'ends_with':
106
+ return query.ilike(dbField, `%${value}`);
107
+ case 'greater_than':
108
+ case 'gt':
109
+ return query.gt(dbField, value);
110
+ case 'less_than':
111
+ case 'lt':
112
+ return query.lt(dbField, value);
113
+ case 'is_empty':
114
+ return query.or(`${dbField}.is.null,${dbField}.eq.`);
115
+ case 'is_not_empty':
116
+ return query.not.is(dbField, null);
117
+ default:
118
+ console.warn(`⚠️ Operador desconhecido: ${operator}`);
119
+ return query;
120
+ }
121
+ }
122
+ static buildConditionString(condition) {
123
+ const { field, operator, value } = condition;
124
+ if (!field || !operator)
125
+ return null;
126
+ const dbField = this.mapFieldToColumn(field, condition.customFieldKey);
127
+ switch (operator) {
128
+ case 'equals':
129
+ case 'eq':
130
+ return `${dbField}.eq.${value}`;
131
+ case 'not_equals':
132
+ case 'neq':
133
+ return `${dbField}.neq.${value}`;
134
+ case 'contains':
135
+ case 'ilike':
136
+ return `${dbField}.ilike.*${value}*`;
137
+ case 'not_contains':
138
+ return `${dbField}.not.ilike.*${value}*`;
139
+ case 'starts_with':
140
+ return `${dbField}.ilike.${value}*`;
141
+ case 'ends_with':
142
+ return `${dbField}.ilike.*${value}`;
143
+ case 'greater_than':
144
+ case 'gt':
145
+ return `${dbField}.gt.${value}`;
146
+ case 'less_than':
147
+ case 'lt':
148
+ return `${dbField}.lt.${value}`;
149
+ case 'is_empty':
150
+ return `${dbField}.is.null`;
151
+ case 'is_not_empty':
152
+ return `${dbField}.not.is.null`;
153
+ default:
154
+ return null;
155
+ }
156
+ }
157
+ static mapFieldToColumn(field, customFieldKey) {
158
+ if (field === 'custom_field' && customFieldKey) {
159
+ return `properties->>${customFieldKey}`;
160
+ }
161
+ const fieldMap = {
162
+ email: 'email',
163
+ name: 'name',
164
+ phone: 'phone',
165
+ city: 'city',
166
+ state: 'state',
167
+ country: 'country',
168
+ created_at: 'created_at',
169
+ updated_at: 'updated_at',
170
+ opted_in: 'opted_in',
171
+ is_subscribed: 'is_subscribed'
172
+ };
173
+ return fieldMap[field] || field;
174
+ }
175
+ }
176
+ exports.QueryBuilder = QueryBuilder;
177
+ //# sourceMappingURL=QueryBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../src/builders/QueryBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AudienceCriteria, AudienceQueryOptions, AudienceExecutionResult } from '../types';
2
+ export declare class StaticAudienceExecutor {
3
+ private contactRepository;
4
+ constructor(contactRepository?: any);
5
+ setContactRepository(repository: any): void;
6
+ execute(criteria: AudienceCriteria, options: AudienceQueryOptions): Promise<AudienceExecutionResult>;
7
+ executeCount(criteria: AudienceCriteria, options: Omit<AudienceQueryOptions, 'pagination'>): Promise<number>;
8
+ }
9
+ //# sourceMappingURL=StaticAudienceExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticAudienceExecutor.d.ts","sourceRoot":"","sources":["../../src/executors/StaticAudienceExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAS1F,qBAAa,sBAAsB;IACjC,OAAO,CAAC,iBAAiB,CAAK;gBAElB,iBAAiB,CAAC,EAAE,GAAG;IAOnC,oBAAoB,CAAC,UAAU,EAAE,GAAG;IAO9B,OAAO,CACX,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC;IAmE7B,YAAY,CAChB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC;CAInB"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StaticAudienceExecutor = void 0;
4
+ const CriteriaParser_1 = require("../builders/CriteriaParser");
5
+ class StaticAudienceExecutor {
6
+ constructor(contactRepository) {
7
+ this.contactRepository = contactRepository;
8
+ }
9
+ setContactRepository(repository) {
10
+ this.contactRepository = repository;
11
+ }
12
+ async execute(criteria, options) {
13
+ const startTime = Date.now();
14
+ try {
15
+ if (!this.contactRepository) {
16
+ throw new Error('ContactRepository não foi configurado. Use setContactRepository() antes de executar.');
17
+ }
18
+ const parsed = CriteriaParser_1.CriteriaParser.parse(criteria);
19
+ const validation = CriteriaParser_1.CriteriaParser.validate(parsed);
20
+ if (!validation.valid) {
21
+ console.error('❌ Critérios inválidos:', validation.errors);
22
+ return {
23
+ contactIds: new Set(),
24
+ contacts: [],
25
+ count: 0,
26
+ metadata: {
27
+ executionTime: Date.now() - startTime,
28
+ criteriaType: 'static'
29
+ }
30
+ };
31
+ }
32
+ const contactIds = await this.contactRepository.getContactIdsByAudienceCriteriaV2(options.organizationId, options.projectId, parsed);
33
+ let contacts;
34
+ if (options.includeCount || options.pagination) {
35
+ const { page = 1, limit = 10 } = options.pagination || {};
36
+ const contactIdsArray = Array.from(contactIds);
37
+ if (contactIdsArray.length > 0) {
38
+ const paginatedIds = contactIdsArray.slice((page - 1) * limit, page * limit);
39
+ const { data } = await this.contactRepository.findByIds(options.organizationId, options.projectId, paginatedIds);
40
+ contacts = data || [];
41
+ }
42
+ }
43
+ return {
44
+ contactIds,
45
+ contacts,
46
+ count: contactIds.size,
47
+ metadata: {
48
+ executionTime: Date.now() - startTime,
49
+ criteriaType: 'static'
50
+ }
51
+ };
52
+ }
53
+ catch (error) {
54
+ console.error('❌ Erro ao executar audiência estática:', error);
55
+ throw error;
56
+ }
57
+ }
58
+ async executeCount(criteria, options) {
59
+ const result = await this.execute(criteria, { ...options, includeCount: true });
60
+ return result.count;
61
+ }
62
+ }
63
+ exports.StaticAudienceExecutor = StaticAudienceExecutor;
64
+ //# sourceMappingURL=StaticAudienceExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticAudienceExecutor.js","sourceRoot":"","sources":["../../src/executors/StaticAudienceExecutor.ts"],"names":[],"mappings":";;;AACA,+DAA2D;AAQ3D,MAAa,sBAAsB;IAGjC,YAAY,iBAAuB;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;IAKD,oBAAoB,CAAC,UAAe;QAClC,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAA;IACrC,CAAC;IAKD,KAAK,CAAC,OAAO,CACX,QAA0B,EAC1B,OAA6B;QAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;YACzG,CAAC;YAED,MAAM,MAAM,GAAG,+BAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC7C,MAAM,UAAU,GAAG,+BAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAElD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;gBAC1D,OAAO;oBACL,UAAU,EAAE,IAAI,GAAG,EAAE;oBACrB,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE;wBACR,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;wBACrC,YAAY,EAAE,QAAQ;qBACvB;iBACF,CAAA;YACH,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,iCAAiC,CAC/E,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,SAAS,EACjB,MAAM,CACP,CAAA;YAED,IAAI,QAA2B,CAAA;YAE/B,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAA;gBACzD,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAE9C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAA;oBAE5E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,CACrD,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,SAAS,EACjB,YAAY,CACb,CAAA;oBAED,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAA;gBACvB,CAAC;YACH,CAAC;YAED,OAAO;gBACL,UAAU;gBACV,QAAQ;gBACR,KAAK,EAAE,UAAU,CAAC,IAAI;gBACtB,QAAQ,EAAE;oBACR,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACrC,YAAY,EAAE,QAAQ;iBACvB;aACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAA;YAC9D,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,YAAY,CAChB,QAA0B,EAC1B,OAAiD;QAEjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/E,OAAO,MAAM,CAAC,KAAK,CAAA;IACrB,CAAC;CACF;AA9FD,wDA8FC"}
@@ -0,0 +1,6 @@
1
+ export { AudienceModule } from './AudienceModule';
2
+ export { CriteriaParser } from './builders/CriteriaParser';
3
+ export { QueryBuilder } from './builders/QueryBuilder';
4
+ export { StaticAudienceExecutor } from './executors/StaticAudienceExecutor';
5
+ export * from './types';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,cAAc,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.StaticAudienceExecutor = exports.QueryBuilder = exports.CriteriaParser = exports.AudienceModule = void 0;
18
+ var AudienceModule_1 = require("./AudienceModule");
19
+ Object.defineProperty(exports, "AudienceModule", { enumerable: true, get: function () { return AudienceModule_1.AudienceModule; } });
20
+ var CriteriaParser_1 = require("./builders/CriteriaParser");
21
+ Object.defineProperty(exports, "CriteriaParser", { enumerable: true, get: function () { return CriteriaParser_1.CriteriaParser; } });
22
+ var QueryBuilder_1 = require("./builders/QueryBuilder");
23
+ Object.defineProperty(exports, "QueryBuilder", { enumerable: true, get: function () { return QueryBuilder_1.QueryBuilder; } });
24
+ var StaticAudienceExecutor_1 = require("./executors/StaticAudienceExecutor");
25
+ Object.defineProperty(exports, "StaticAudienceExecutor", { enumerable: true, get: function () { return StaticAudienceExecutor_1.StaticAudienceExecutor; } });
26
+ __exportStar(require("./types"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAAiD;AAAxC,gHAAA,cAAc,OAAA;AACvB,4DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,wDAAsD;AAA7C,4GAAA,YAAY,OAAA;AACrB,6EAA2E;AAAlE,gIAAA,sBAAsB,OAAA;AAC/B,0CAAuB"}
@@ -0,0 +1,101 @@
1
+ export interface AudienceCriteria {
2
+ type?: string;
3
+ conditions?: Array<{
4
+ groupId?: string;
5
+ operator?: 'AND' | 'OR';
6
+ conditions?: Array<{
7
+ field: string;
8
+ operator: string;
9
+ value: any;
10
+ customFieldKey?: string;
11
+ logicalOperator?: 'AND' | 'OR';
12
+ }>;
13
+ }>;
14
+ groups?: Array<{
15
+ id?: string;
16
+ operator?: 'AND' | 'OR';
17
+ rules?: Array<{
18
+ kind?: string;
19
+ field?: string;
20
+ operator?: string;
21
+ value?: any;
22
+ eventName?: string;
23
+ customFieldKey?: string;
24
+ }>;
25
+ }>;
26
+ filters?: Array<{
27
+ id: string;
28
+ operator: string;
29
+ conditions: Array<{
30
+ id: string;
31
+ field: string;
32
+ value: string;
33
+ operator: string;
34
+ logicalOperator: string;
35
+ customFieldKey?: string;
36
+ }>;
37
+ }>;
38
+ segmentType?: string;
39
+ config?: {
40
+ name?: string;
41
+ type?: string;
42
+ pageUrl?: string;
43
+ isActive?: boolean;
44
+ eventType?: string;
45
+ pageCount?: string;
46
+ timeFrame?: string;
47
+ conditions?: any[];
48
+ description?: string;
49
+ referrerUrl?: string;
50
+ behaviorCriteria?: {
51
+ engaged?: boolean;
52
+ purchased?: boolean;
53
+ visitedPages?: boolean;
54
+ };
55
+ };
56
+ live_options?: {
57
+ include_past_behavior?: boolean;
58
+ window_days?: number;
59
+ [key: string]: any;
60
+ };
61
+ isActive?: boolean;
62
+ [key: string]: any;
63
+ }
64
+ export interface AudienceQueryOptions {
65
+ organizationId: string;
66
+ projectId: string;
67
+ pagination?: {
68
+ page?: number;
69
+ limit?: number;
70
+ };
71
+ includeCount?: boolean;
72
+ }
73
+ export interface AudienceExecutionResult {
74
+ contactIds: Set<string>;
75
+ contacts?: any[];
76
+ count: number;
77
+ metadata?: {
78
+ executionTime: number;
79
+ criteriaType: string;
80
+ cacheHit?: boolean;
81
+ };
82
+ }
83
+ export interface AudienceBuilderConfig {
84
+ enableCache?: boolean;
85
+ cacheTimeout?: number;
86
+ enableDebugLogs?: boolean;
87
+ }
88
+ export interface CreateAudienceData {
89
+ name: string;
90
+ description?: string;
91
+ criteria: AudienceCriteria;
92
+ organization_id: string;
93
+ project_id: string;
94
+ user_id: string;
95
+ }
96
+ export interface UpdateAudienceData {
97
+ name?: string;
98
+ description?: string;
99
+ criteria?: AudienceCriteria;
100
+ }
101
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@reachy/audience-module",
3
+ "version": "1.0.0",
4
+ "description": "Módulo reutilizável para consultas e criação de audiences",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "watch": "tsc --watch",
10
+ "clean": "rm -rf dist",
11
+ "prepublishOnly": "npm run clean && npm run build"
12
+ },
13
+ "keywords": [
14
+ "audience",
15
+ "query",
16
+ "contacts",
17
+ "segmentation",
18
+ "reachy"
19
+ ],
20
+ "author": "Reachy Team",
21
+ "license": "MIT",
22
+ "peerDependencies": {
23
+ "@supabase/supabase-js": "^2.x"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^20.0.0",
27
+ "typescript": "^5.0.0"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/reachy/audience-module.git"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ }
36
+ }
37
+