@easyflow/javascript-sdk 2.1.7

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 (93) hide show
  1. package/.babelrc +5 -0
  2. package/.github/workflows/deploy-sdk-cf.yml +49 -0
  3. package/.github/workflows/release-sdk-cdn.yml +144 -0
  4. package/.github/workflows/release-sdk.yml +112 -0
  5. package/.prettierrc +6 -0
  6. package/CDN-DEPLOYMENT.md +175 -0
  7. package/DEMO.md +258 -0
  8. package/DEPLOYMENT.md +224 -0
  9. package/INTEGRATION-GUIDE.md +521 -0
  10. package/README.md +1013 -0
  11. package/coverage/base.css +224 -0
  12. package/coverage/block-navigation.js +87 -0
  13. package/coverage/easyflow-javascript-sdk/index.html +116 -0
  14. package/coverage/easyflow-javascript-sdk/libs/constants.mjs.html +268 -0
  15. package/coverage/easyflow-javascript-sdk/libs/errors.mjs.html +271 -0
  16. package/coverage/easyflow-javascript-sdk/libs/exception-handler.mjs.html +148 -0
  17. package/coverage/easyflow-javascript-sdk/libs/fingerprint.mjs.html +895 -0
  18. package/coverage/easyflow-javascript-sdk/libs/http.mjs.html +502 -0
  19. package/coverage/easyflow-javascript-sdk/libs/index.html +266 -0
  20. package/coverage/easyflow-javascript-sdk/libs/logger.mjs.html +568 -0
  21. package/coverage/easyflow-javascript-sdk/libs/sanitizer.mjs.html +1099 -0
  22. package/coverage/easyflow-javascript-sdk/libs/security.mjs.html +733 -0
  23. package/coverage/easyflow-javascript-sdk/libs/types.mjs.html +508 -0
  24. package/coverage/easyflow-javascript-sdk/libs/utils.mjs.html +379 -0
  25. package/coverage/easyflow-javascript-sdk/libs/validator.mjs.html +2623 -0
  26. package/coverage/easyflow-javascript-sdk/sdk.mjs.html +2434 -0
  27. package/coverage/favicon.png +0 -0
  28. package/coverage/index.html +131 -0
  29. package/coverage/lcov-report/base.css +224 -0
  30. package/coverage/lcov-report/block-navigation.js +87 -0
  31. package/coverage/lcov-report/easyflow-javascript-sdk/index.html +116 -0
  32. package/coverage/lcov-report/easyflow-javascript-sdk/libs/constants.mjs.html +268 -0
  33. package/coverage/lcov-report/easyflow-javascript-sdk/libs/errors.mjs.html +271 -0
  34. package/coverage/lcov-report/easyflow-javascript-sdk/libs/exception-handler.mjs.html +148 -0
  35. package/coverage/lcov-report/easyflow-javascript-sdk/libs/fingerprint.mjs.html +895 -0
  36. package/coverage/lcov-report/easyflow-javascript-sdk/libs/http.mjs.html +502 -0
  37. package/coverage/lcov-report/easyflow-javascript-sdk/libs/index.html +266 -0
  38. package/coverage/lcov-report/easyflow-javascript-sdk/libs/logger.mjs.html +568 -0
  39. package/coverage/lcov-report/easyflow-javascript-sdk/libs/sanitizer.mjs.html +1099 -0
  40. package/coverage/lcov-report/easyflow-javascript-sdk/libs/security.mjs.html +733 -0
  41. package/coverage/lcov-report/easyflow-javascript-sdk/libs/types.mjs.html +508 -0
  42. package/coverage/lcov-report/easyflow-javascript-sdk/libs/utils.mjs.html +379 -0
  43. package/coverage/lcov-report/easyflow-javascript-sdk/libs/validator.mjs.html +2623 -0
  44. package/coverage/lcov-report/easyflow-javascript-sdk/sdk.mjs.html +2434 -0
  45. package/coverage/lcov-report/favicon.png +0 -0
  46. package/coverage/lcov-report/index.html +131 -0
  47. package/coverage/lcov-report/prettify.css +1 -0
  48. package/coverage/lcov-report/prettify.js +2 -0
  49. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  50. package/coverage/lcov-report/sorter.js +196 -0
  51. package/coverage/lcov.info +1429 -0
  52. package/coverage/prettify.css +1 -0
  53. package/coverage/prettify.js +2 -0
  54. package/coverage/sort-arrow-sprite.png +0 -0
  55. package/coverage/sorter.js +196 -0
  56. package/dist/435.easyflow-sdk.min.js +1 -0
  57. package/dist/easyflow-sdk.min.js +1 -0
  58. package/dist/easyflow-sdk.min.js.LICENSE.txt +1 -0
  59. package/dist/index.html +756 -0
  60. package/docs/index.html +775 -0
  61. package/examples/lovable-integration.html +410 -0
  62. package/index.html +981 -0
  63. package/jest.config.js +37 -0
  64. package/jsdoc.json +42 -0
  65. package/libs/auto-integration.mjs +333 -0
  66. package/libs/constants.mjs +61 -0
  67. package/libs/constants.spec.js +198 -0
  68. package/libs/errors.mjs +62 -0
  69. package/libs/errors.spec.js +178 -0
  70. package/libs/exception-handler.mjs +21 -0
  71. package/libs/exception-handler.spec.js +237 -0
  72. package/libs/fingerprint.mjs +270 -0
  73. package/libs/http.mjs +163 -0
  74. package/libs/http.spec.js +427 -0
  75. package/libs/integration-wrapper.mjs +285 -0
  76. package/libs/logger.mjs +161 -0
  77. package/libs/logger.spec.js +389 -0
  78. package/libs/sanitizer.mjs +340 -0
  79. package/libs/sanitizer.spec.js +583 -0
  80. package/libs/security.mjs +217 -0
  81. package/libs/types.mjs +141 -0
  82. package/libs/utils.mjs +368 -0
  83. package/libs/utils.spec.js +231 -0
  84. package/libs/validator.mjs +952 -0
  85. package/libs/validator.spec.js +615 -0
  86. package/mocks/offer.mock.js +77 -0
  87. package/package.json +72 -0
  88. package/scripts/publish-npm.sh +82 -0
  89. package/sdk.mjs +945 -0
  90. package/sdk.spec.js +796 -0
  91. package/test-setup.cjs +211 -0
  92. package/test.html +154 -0
  93. package/webpack.config.cjs +41 -0
package/DEMO.md ADDED
@@ -0,0 +1,258 @@
1
+ # EasyFlow JavaScript SDK - Demonstração Completa
2
+
3
+ Este arquivo demonstra como usar todas as funcionalidades implementadas no EasyFlow JavaScript SDK, incluindo as novas funcionalidades de gerenciamento de clientes e cartões de crédito.
4
+
5
+ ## 🚀 Inicialização
6
+
7
+ ```javascript
8
+ // Inicializar o SDK
9
+ const sdk = new EasyflowSDK('your-business-id')
10
+
11
+ // Ou com configuração completa
12
+ const sdk = new EasyflowSDK({
13
+ businessId: 'your-business-id',
14
+ additionalOptions: {},
15
+ })
16
+ ```
17
+
18
+ ## 👥 Gerenciamento de Clientes
19
+
20
+ ### 1. Criar Cliente
21
+
22
+ ```javascript
23
+ const customer = await sdk.createCustomer({
24
+ name: 'Diego Moura',
25
+ email: 'diegomoura637+20@gmail.com',
26
+ deliveryAddress: {
27
+ zipCode: '37540114',
28
+ street: 'Rua Marechal Deodoro',
29
+ complement: 'Apt',
30
+ neighborhood: 'Centro',
31
+ city: 'Pouso Alegre',
32
+ state: 'MG',
33
+ number: '33',
34
+ },
35
+ address: {
36
+ zipCode: '37540114',
37
+ street: 'Rua Marechal Deodoro',
38
+ complement: 'Apt',
39
+ neighborhood: 'Centro',
40
+ city: 'Pouso Alegre',
41
+ state: 'MG',
42
+ number: '33',
43
+ },
44
+ document: {
45
+ type: 'CPF',
46
+ number: '01234567890',
47
+ },
48
+ phone: {
49
+ areaCode: '+55',
50
+ ddd: '11',
51
+ number: '998862782',
52
+ isMobile: true,
53
+ },
54
+ })
55
+
56
+ console.log('Cliente criado:', customer.id)
57
+ ```
58
+
59
+ ### 2. Buscar Cliente
60
+
61
+ ```javascript
62
+ const customerInfo = await sdk.getCustomer('customer-1234567890123456')
63
+ console.log('Nome:', customerInfo.name)
64
+ console.log('Email:', customerInfo.email)
65
+ console.log('Documento:', customerInfo.document)
66
+ ```
67
+
68
+ ### 3. Atualizar Cliente
69
+
70
+ ```javascript
71
+ const updateResult = await sdk.updateCustomer('customer-1234567890123456', {
72
+ name: 'Diego Moura Atualizado',
73
+ email: 'diegomoura637+21@gmail.com',
74
+ phone: {
75
+ areaCode: '+55',
76
+ ddd: '11',
77
+ number: '998862783',
78
+ isMobile: true,
79
+ },
80
+ })
81
+
82
+ console.log('Cliente atualizado:', updateResult.success)
83
+ ```
84
+
85
+ ### 4. Listar Clientes
86
+
87
+ ```javascript
88
+ const customers = await sdk.listCustomers(1, 10)
89
+ console.log(`Página ${customers.currentPage} de ${customers.totalPages}`)
90
+ console.log(`Total: ${customers.totalDocs} clientes`)
91
+
92
+ customers.docs.forEach((customer) => {
93
+ console.log(`- ${customer.name} (${customer.email})`)
94
+ })
95
+ ```
96
+
97
+ ## 💳 Gerenciamento de Cartões de Crédito
98
+
99
+ ### 1. Adicionar Cartão
100
+
101
+ ```javascript
102
+ const cardResult = await sdk.addCreditCard(
103
+ 'customer-1234567890123456',
104
+ 'gGAVbMqIWZD0ftaHEMYSbU+YHVyUPU67ITGsfeawLtg51e7UE/UF4rYferWVjy6OPkJ+ep1B4hDhospUPsskIsXf4i8I9BvJzgwbwPUH8ScbwwDbUIWq0H9gY/7gHrnnQ1SqgNpcrGVhe3wa3mt2ilNOO5LUuIUpo/WbRuWQQUxjibfvLrTlGqBNdUKU/83xVJTSbT4mLxzatwnFVBM7MaT4zDO2IgcRbyjX38iFslJIPP2nFfIVwuIdRbSMIqEH38SHetovGgHaQ58YA1ATN5ksxBFC4qt3jvmtz/dhol/CQhty/4o40h33eQZrJPCrMAcDcbT2obto7L8='
105
+ )
106
+
107
+ console.log('Cartão adicionado:', cardResult.creditCardId)
108
+ ```
109
+
110
+ ### 2. Buscar Cartão
111
+
112
+ ```javascript
113
+ const creditCard = await sdk.getCreditCard(
114
+ 'customer-1234567890123456',
115
+ '201abf40-e64e-4743-88b9-b5d47830904a'
116
+ )
117
+
118
+ console.log('Bandeira:', creditCard.brand)
119
+ console.log('Últimos 4 dígitos:', creditCard.last4Numbers)
120
+ console.log(
121
+ 'Expira:',
122
+ `${creditCard.expiresAtMonth}/${creditCard.expiresAtYear}`
123
+ )
124
+ ```
125
+
126
+ ### 3. Atualizar Cartão
127
+
128
+ ```javascript
129
+ const updateCardResult = await sdk.updateCreditCard(
130
+ '201abf40-e64e-4743-88b9-b5d47830904a',
131
+ 'new-encrypted-token-789'
132
+ )
133
+
134
+ console.log('Cartão atualizado:', updateCardResult.success)
135
+ ```
136
+
137
+ ### 4. Remover Cartão
138
+
139
+ ```javascript
140
+ const removeResult = await sdk.removeCreditCard(
141
+ 'customer-1234567890123456',
142
+ '201abf40-e64e-4743-88b9-b5d47830904a'
143
+ )
144
+
145
+ console.log('Cartão removido:', removeResult.success)
146
+ ```
147
+
148
+ ### 5. Listar Cartões
149
+
150
+ ```javascript
151
+ const creditCards = await sdk.listCreditCards('customer-1234567890123456')
152
+
153
+ creditCards.forEach((card) => {
154
+ console.log(`${card.brand} terminando em ${card.last4Numbers}`)
155
+ console.log(`Expira: ${card.expiresAtMonth}/${card.expiresAtYear}`)
156
+ console.log('---')
157
+ })
158
+ ```
159
+
160
+ ## 🔐 Headers de Segurança
161
+
162
+ ```javascript
163
+ const secureHeaders = {
164
+ 'x-fingerprint-id': '12345678',
165
+ 'x-recaptcha-token': 'your_recaptcha_token',
166
+ 'ef-signature': 'your_hmac_signature',
167
+ 'x-custom-header': 'custom_value',
168
+ }
169
+
170
+ // Usar headers em qualquer operação
171
+ const customer = await sdk.createCustomer(customerData, secureHeaders)
172
+ const creditCard = await sdk.addCreditCard(customerId, token, secureHeaders)
173
+ ```
174
+
175
+ ## Tratamento de Erros
176
+
177
+ ```javascript
178
+ try {
179
+ const customer = await sdk.createCustomer(customerData)
180
+ console.log('Sucesso:', customer.id)
181
+ } catch (error) {
182
+ if (error instanceof ValidationError) {
183
+ console.error('Erro de validação:', error.message)
184
+ console.error('Campo:', error.field)
185
+ } else if (error instanceof NetworkError) {
186
+ console.error('Erro de rede:', error.message)
187
+ } else if (error instanceof SecurityError) {
188
+ console.error('Erro de segurança:', error.message)
189
+ } else {
190
+ console.error('Erro inesperado:', error)
191
+ }
192
+ }
193
+ ```
194
+
195
+ ## 📋 Validações Automáticas
196
+
197
+ O SDK valida automaticamente todos os dados:
198
+
199
+ - **Email**: Formato válido e segurança
200
+ - **CPF/CNPJ**: Algoritmo oficial brasileiro
201
+ - **Telefone**: Formato brasileiro com DDD
202
+ - **Endereço**: Estrutura brasileira completa
203
+ - **IDs**: Formato e unicidade
204
+ - **Tokens**: Comprimento e formato
205
+
206
+ ## 🔄 Rate Limiting
207
+
208
+ O SDK inclui proteção automática contra abuso:
209
+
210
+ ```javascript
211
+ // Cada método tem seu próprio limite
212
+ await sdk.createCustomer(customerData) // Rate limit: createCustomer
213
+ await sdk.getCustomer(customerId) // Rate limit: getCustomer
214
+ await sdk.addCreditCard(customerId, token) // Rate limit: addCreditCard
215
+ ```
216
+
217
+ ## 🧪 Testes
218
+
219
+ Execute os testes para verificar se tudo está funcionando:
220
+
221
+ ```bash
222
+ # Todos os testes
223
+ npm test
224
+
225
+ # Testes específicos
226
+ npm test -- --testNamePattern="Customer Management"
227
+ npm test -- --testNamePattern="Credit Card Management"
228
+
229
+ # Cobertura
230
+ npm run test:coverage
231
+ ```
232
+
233
+ ## Status dos Testes
234
+
235
+ - **Total de Testes**: 263
236
+ - **Taxa de Sucesso**: 100%
237
+ - **Cobertura**: Excelente
238
+ - **Funcionalidades**: Todas implementadas
239
+
240
+ ## Próximos Passos
241
+
242
+ 1. **Integração**: Use o SDK em sua aplicação
243
+ 2. **Webhooks**: Configure notificações automáticas
244
+ 3. **Monitoramento**: Implemente logs e métricas
245
+ 4. **Segurança**: Configure headers de segurança
246
+ 5. **Produção**: Deploy em ambiente de produção
247
+
248
+ ## 📞 Suporte
249
+
250
+ - **Documentação**: [docs.easyflow.digital](https://docs.easyflow.digital)
251
+ - **Suporte**: [easyflow.digital/contact](https://easyflow.digital/contact)
252
+ - **Issues**: [GitHub Issues](https://github.com/easyflow-cash/easyflow-javascript-sdk/issues)
253
+
254
+ ---
255
+
256
+ **EasyFlow JavaScript SDK** - Versão 2.1.4
257
+ **Última atualização**: Dezembro 2024
258
+ **Status**: Pronto para produção
package/DEPLOYMENT.md ADDED
@@ -0,0 +1,224 @@
1
+ # 🚀 Deploy e Releases - Easyflow SDK
2
+
3
+ Este documento explica como funciona o sistema de deploy e releases do Easyflow SDK.
4
+
5
+ ## 📋 Workflows Disponíveis
6
+
7
+ ### 1. Deploy Automático (`deploy-sdk-cf.yml`)
8
+
9
+ **Trigger:** Push para branch `main`
10
+
11
+ **O que faz:**
12
+
13
+ - Instala dependências
14
+ - Executa testes
15
+ - Gera build do SDK
16
+ - Verifica se o build foi gerado
17
+ - Deploy para Cloudflare Pages
18
+
19
+ **Arquivos gerados:**
20
+
21
+ - `dist/easyflow-sdk.min.js` - SDK minificado
22
+
23
+ **URLs de acesso:**
24
+
25
+ - **Cloudflare Pages**: `https://easyflow-sdk.pages.dev/easyflow-sdk.min.js`
26
+ - **jsDelivr CDN**: `https://cdn.jsdelivr.net/npm/@easyflow/javascript-sdk@latest/dist/easyflow-sdk.min.js` (após publicação no NPM)
27
+
28
+ ### 2. Release com Versionamento (`release-sdk.yml`)
29
+
30
+ **Trigger:** Push de tag com padrão `v*` (ex: `v2.1.2`)
31
+
32
+ **O que faz:**
33
+
34
+ - Instala dependências
35
+ - Executa testes
36
+ - Gera build do SDK
37
+ - Cria arquivo versionado
38
+ - Gera hash SRI (Subresource Integrity)
39
+ - Cria arquivo de exemplo
40
+ - Deploy para Cloudflare Pages
41
+ - Cria release no GitHub
42
+
43
+ **Arquivos gerados:**
44
+
45
+ - `dist/easyflow-sdk.min.js` - SDK minificado (sem versão)
46
+ - `dist/easyflow-sdk.v2.1.2.min.js` - SDK versionado
47
+ - `dist/example.html` - Exemplo de uso com SRI
48
+
49
+ **URLs de acesso:**
50
+
51
+ - **Cloudflare Pages**:
52
+ - `https://easyflow-sdk.pages.dev/easyflow-sdk.min.js` (latest)
53
+ - `https://easyflow-sdk.pages.dev/easyflow-sdk.v2.1.2.min.js` (versionado)
54
+ - **jsDelivr CDN** (após publicação no NPM):
55
+ - `https://cdn.jsdelivr.net/npm/@easyflow/javascript-sdk@latest/dist/easyflow-sdk.min.js` (latest)
56
+ - `https://cdn.jsdelivr.net/npm/@easyflow/javascript-sdk@2.1.2/dist/easyflow-sdk.min.js` (versionado)
57
+
58
+ ## 🔧 Como Fazer um Release
59
+
60
+ ### 1. Atualizar Versão
61
+
62
+ ```bash
63
+ # Editar package.json
64
+ npm version patch # 2.1.2 -> 2.1.3
65
+ npm version minor # 2.1.2 -> 2.2.0
66
+ npm version major # 2.1.2 -> 3.0.0
67
+ ```
68
+
69
+ ### 2. Criar Tag e Push
70
+
71
+ ```bash
72
+ # Criar tag
73
+ git tag v2.1.2
74
+
75
+ # Push da tag
76
+ git push origin v2.1.2
77
+ ```
78
+
79
+ ### 3. Verificar Deploy
80
+
81
+ - Acesse: https://easyflow-sdk.pages.dev
82
+ - Verifique se o arquivo versionado está disponível
83
+ - Confirme o release no GitHub
84
+
85
+ ## Segurança (SRI)
86
+
87
+ O workflow de release gera automaticamente hashes SRI para verificação de integridade:
88
+
89
+ ### Cloudflare Pages
90
+
91
+ ```html
92
+ <script
93
+ src="https://easyflow-sdk.pages.dev/easyflow-sdk.v2.1.2.min.js"
94
+ integrity="sha384-ABC123..."
95
+ crossorigin="anonymous"
96
+ ></script>
97
+ ```
98
+
99
+ ### jsDelivr CDN
100
+
101
+ ```html
102
+ <script
103
+ src="https://cdn.jsdelivr.net/npm/@easyflow/javascript-sdk@2.1.2/dist/easyflow-sdk.min.js"
104
+ integrity="sha384-ABC123..."
105
+ crossorigin="anonymous"
106
+ ></script>
107
+ ```
108
+
109
+ ## 🌐 CDNs Disponíveis
110
+
111
+ ### 1. Cloudflare Pages
112
+
113
+ - **URL**: `https://easyflow-sdk.pages.dev`
114
+ - **Vantagens**:
115
+ - Deploy automático via GitHub Actions
116
+ - Controle total sobre o deploy
117
+ - Customização completa
118
+ - SRI hashes automáticos
119
+
120
+ ### 2. jsDelivr CDN
121
+
122
+ - **URL**: `https://cdn.jsdelivr.net/npm/@easyflow/javascript-sdk`
123
+ - **Vantagens**:
124
+ - CDN global com alta performance
125
+ - Cache inteligente
126
+ - Disponibilidade automática via NPM
127
+ - Redundância geográfica
128
+
129
+ ### Como Funciona o jsDelivr
130
+
131
+ 1. **Publicação no NPM**: Execute `npm publish --access public`
132
+ 2. **Sincronização**: jsDelivr sincroniza automaticamente com NPM
133
+ 3. **Disponibilidade**: SDK fica disponível em ~5 minutos
134
+ 4. **Cache Global**: Distribuição automática em CDNs globais
135
+
136
+ ## Configuração de Secrets
137
+
138
+ Os workflows precisam dos seguintes secrets configurados no GitHub:
139
+
140
+ - `CF_API_TOKEN` - Token da API do Cloudflare
141
+ - `CF_ACCOUNT_ID` - ID da conta Cloudflare
142
+
143
+ ### Como configurar:
144
+
145
+ 1. Vá para Settings > Secrets and variables > Actions
146
+ 2. Adicione os secrets necessários
147
+ 3. Configure as permissões do repositório se necessário
148
+
149
+ ## Monitoramento
150
+
151
+ ### Logs de Deploy
152
+
153
+ - Acesse: https://github.com/easyflow-cash/easyflow-javascript-sdk/actions
154
+ - Verifique os logs de cada workflow
155
+
156
+ ### Status do Cloudflare Pages
157
+
158
+ - Acesse: https://dash.cloudflare.com
159
+ - Vá para Pages > easyflow-sdk
160
+ - Verifique o status do deploy
161
+
162
+ ## Troubleshooting
163
+
164
+ ### Erro: npm ci falha
165
+
166
+ **Solução:** O workflow usa `npm install` em vez de `npm ci` para ser mais robusto.
167
+
168
+ ### Erro: Build não encontrado
169
+
170
+ **Solução:** Verifique se o webpack está configurado corretamente e se não há erros no build.
171
+
172
+ ### Erro: Cloudflare deploy falha
173
+
174
+ **Solução:**
175
+
176
+ 1. Verifique se os secrets estão configurados
177
+ 2. Confirme se o projeto `easyflow-sdk` existe no Cloudflare Pages
178
+ 3. Verifique os logs do Cloudflare
179
+
180
+ ### Erro: Release não criado
181
+
182
+ **Solução:**
183
+
184
+ 1. Verifique se a tag segue o padrão `v*`
185
+ 2. Confirme se o `GITHUB_TOKEN` tem permissões para criar releases
186
+ 3. Verifique os logs do workflow
187
+
188
+ ## 📝 Exemplos de Uso
189
+
190
+ ### Uso Básico (Latest)
191
+
192
+ ```html
193
+ <script src="https://easyflow-sdk.pages.dev/easyflow-sdk.min.js"></script>
194
+ ```
195
+
196
+ ### Uso com Versão Específica
197
+
198
+ ```html
199
+ <script src="https://easyflow-sdk.pages.dev/easyflow-sdk.v2.1.2.min.js"></script>
200
+ ```
201
+
202
+ ### Uso com SRI (Recomendado para Produção)
203
+
204
+ ```html
205
+ <script
206
+ src="https://easyflow-sdk.pages.dev/easyflow-sdk.v2.1.2.min.js"
207
+ integrity="sha384-ABC123..."
208
+ crossorigin="anonymous"
209
+ ></script>
210
+ ```
211
+
212
+ ## 🔄 Fluxo de Desenvolvimento
213
+
214
+ 1. **Desenvolvimento:** Push para `main` → Deploy automático
215
+ 2. **Release:** Tag `v*` → Release versionado
216
+ 3. **Hotfix:** Tag `v*` → Release de correção
217
+
218
+ ## 📞 Suporte
219
+
220
+ Para problemas com deploy:
221
+
222
+ 1. Verifique os logs do GitHub Actions
223
+ 2. Consulte a documentação do Cloudflare Pages
224
+ 3. Entre em contato com a equipe de DevOps