jsegd-bpm 0.1.7 → 0.1.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.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # jsEGD BPM
2
2
 
3
- Biblioteca TypeScript de runtime para desenvolvimento de formulários e workflows no ambiente **EGD BPM** — EGD Tecnologia.
4
- Fornece componentes de anexo, gerenciamento de workers para datasets, controle do ciclo de vida do workflow e utilitários de formulário integrados ao DOM do EGD BPM.
3
+ Biblioteca TypeScript de runtime para desenvolvimento de formulários e workflows em um ambiente BPM genérico.
4
+ Fornece componentes de anexo, gerenciamento de workers para datasets, controle do ciclo de vida do fluxo e utilitários de formulário integrados ao DOM.
5
5
 
6
6
  > **Dependências par obrigatórias:** [`jsegd`](https://jsegd.netlify.app) ≥ 1.1.0 e [`alpinejs`](https://alpinejs.dev) ≥ 3.0.0
7
7
 
@@ -25,7 +25,7 @@ npm install jsegd-bpm jsegd alpinejs
25
25
 
26
26
  ## `WorkerManager` — Consultas de Dataset em Web Workers
27
27
 
28
- Gerencia um pool de Web Workers para executar consultas à API de Datasets do EGD BPM fora da thread principal. Suporta deduplicação de requisições, cache em IndexedDB e cancelamento HTTP real via `AbortController`.
28
+ Gerencia um pool de Web Workers para executar consultas à API de datasets fora da thread principal. Suporta deduplicação de requisições, cache em IndexedDB e cancelamento HTTP real via `AbortController`.
29
29
 
30
30
  ```typescript
31
31
  import { WorkerManager, ConstraintsType } from 'jsegd-bpm'
@@ -37,8 +37,8 @@ cache.initialize({ storeName: 'datasets', cacheExpirationMs: 60 * 60 * 1000 })
37
37
 
38
38
  const manager = new WorkerManager({ poolSize: 4, cache })
39
39
 
40
- const { promise, cancel } = manager.query('https://tenant.bpm.empresa.com', {
41
- datasetId: 'dsColaboradores',
40
+ const { promise, cancel } = manager.query('https://exemplo.local', {
41
+ datasetId: 'dsRegistros',
42
42
  field: ['nome', 'email', 'matricula'],
43
43
  constraintsField: ['ativo'],
44
44
  constraintsInitialValue: ['true'],
@@ -87,13 +87,13 @@ Botão com dropdown para upload de arquivos vinculados ao processo.
87
87
 
88
88
  ```html
89
89
  <!-- Tipo de anexo fixo -->
90
- <attachment-button description="CONTRATO"></attachment-button>
90
+ <attachment-button description="DOCUMENTO"></attachment-button>
91
91
 
92
92
  <!-- Prompt ao usuário para informar a descrição no upload -->
93
93
  <attachment-button></attachment-button>
94
94
 
95
95
  <!-- Somente leitura: oculta botão de adicionar -->
96
- <attachment-button description="CONTRATO" noaddbutton></attachment-button>
96
+ <attachment-button description="DOCUMENTO" noaddbutton></attachment-button>
97
97
  ```
98
98
 
99
99
  | Atributo | Tipo | Descrição |
@@ -117,7 +117,7 @@ Tabela que lista os anexos do processo com suporte a drag-and-drop para reordena
117
117
 
118
118
  ## `BeforeSendValidate` — Validação com feedback visual
119
119
 
120
- Integra validação de campos com o sistema de erros visuais do tema EGD BPM (`data-group` / `data-helper`).
120
+ Integra validação de campos com o sistema de erros visuais do tema do formulário (`data-group` / `data-helper`).
121
121
 
122
122
  ```typescript
123
123
  import { BeforeSendValidate } from 'jsegd-bpm'
@@ -126,9 +126,9 @@ import type { FieldError } from 'jsegd-bpm'
126
126
  function validarFormulario() {
127
127
  const erros: FieldError[] = []
128
128
 
129
- const campoNome = document.querySelector<HTMLInputElement>('[name="nome_solicitante"]')
130
- if (!campoNome?.value) {
131
- erros.push({ field: campoNome, errorMessage: 'Informe o nome do solicitante' })
129
+ const campoTexto = document.querySelector<HTMLInputElement>('[name="nome"]')
130
+ if (!campoTexto?.value) {
131
+ erros.push({ field: campoTexto, errorMessage: 'Informe o nome' })
132
132
  }
133
133
 
134
134
  if (erros.length > 0) {
@@ -138,13 +138,79 @@ function validarFormulario() {
138
138
  }
139
139
  ```
140
140
 
141
- `throwValidationError` lança sempre — use dentro de `beforeSendValidate` do EGD BPM ou em hooks de `WorkflowViewPatcher`.
141
+ `throwValidationError` lança sempre — use dentro de `beforeSendValidate` do formulário ou em hooks de `WorkflowViewPatcher`.
142
+
143
+ ---
144
+
145
+ ## `Validator` — Validação local e de submit
146
+
147
+ O `Validator` tem dois usos complementares:
148
+ - `Validator.add(...)` cria um validador isolado para cada instância de `Alpine.data(...)`
149
+ - `Validator.getInstance().register(code, rules)` agrupa várias regras de submit sob o mesmo código numérico
150
+
151
+ ```typescript
152
+ import { Validator } from 'jsegd-bpm'
153
+
154
+ function departamentoComponent() {
155
+ const regras: Record<string, () => boolean> = {
156
+ taxa: () => this.possuiTaxa === '1' && !this.taxa,
157
+ campoExtra: () => this.possuiTaxa === '1' && this.campoExtra === 'invalido',
158
+ campoIndependente: () => !this.campoIndependente,
159
+ }
160
+
161
+ const validadores = Validator.add(regras)
162
+
163
+ return {
164
+ possuiTaxa: '0',
165
+ taxa: '',
166
+ campoExtra: '',
167
+ campoIndependente: '',
168
+
169
+ init() {
170
+ this.$watch('possuiTaxa', () => {
171
+ validadores.validate('taxa')
172
+ validadores.validate('campoExtra')
173
+ })
174
+ },
175
+
176
+ get hasError() {
177
+ return validadores.hasError()
178
+ },
179
+
180
+ onInput(field: string) {
181
+ validadores.validate(field)
182
+ },
183
+ }
184
+ }
185
+ ```
186
+
187
+ `hasError()` reavalia o conjunto atual de regras do componente e `validate(field)` permite atualizar apenas o campo alterado no `@input`.
188
+
189
+ ```typescript
190
+ import { Validator } from 'jsegd-bpm'
191
+
192
+ const cancelarSubmit = Validator.getInstance().register(100, {
193
+ taxa: () => this.possuiTaxa === '1' && !this.taxa,
194
+ campoExtra: () => this.possuiTaxa === '1' && this.campoExtra === 'invalido',
195
+ campoIndependente: () => !this.campoIndependente,
196
+ })
197
+
198
+ try {
199
+ Validator.getInstance().execute(100)
200
+ } catch (error) {
201
+ // impede o envio do formulário
202
+ }
203
+
204
+ cancelarSubmit()
205
+ ```
206
+
207
+ `register(code, rules)` aceita tanto uma função única quanto um mapa de regras, e `unregister(code, rules)` remove o mesmo conjunto informado.
142
208
 
143
209
  ---
144
210
 
145
211
  ## `WorkflowViewPatcher` — Hooks no widget de processo
146
212
 
147
- Substitui métodos do widget nativo `ECM_WKFView` para interceptar o ciclo de envio do processo sem modificar o EGD BPM.
213
+ Substitui métodos do widget nativo `ECM_WKFView` para interceptar o ciclo de envio do fluxo sem modificar o formulário.
148
214
 
149
215
  ```typescript
150
216
  import { WorkflowViewPatcher } from 'jsegd-bpm'
@@ -159,8 +225,8 @@ WorkflowViewPatcher.patchAll()
159
225
  WorkflowViewPatcher.addBeforeValidate(async () => {
160
226
  // Executado antes da validação do widget.
161
227
  // Lançar exceção cancela o envio e reabilita os botões.
162
- const valor = document.querySelector<HTMLInputElement>('[name="campo_critico"]')?.value
163
- if (!valor) throw new Error('Campo crítico obrigatório')
228
+ const valor = document.querySelector<HTMLInputElement>('[name="campo_principal"]')?.value
229
+ if (!valor) throw new Error('Campo principal obrigatório')
164
230
  })
165
231
 
166
232
  WorkflowViewPatcher.addAfterValidate(async () => {
@@ -178,7 +244,7 @@ WorkflowViewPatcher.addOnMoveError(() => {
178
244
 
179
245
  WorkflowViewPatcher.addOnCompletionLinkAdd((message) => {
180
246
  // Adiciona links à tela de conclusão após a movimentação
181
- message.links.push({ description: 'Abrir tarefa seguinte', href: '/minha-tarefa' })
247
+ message.links.push({ description: 'Abrir próxima etapa', href: '/proxima-etapa' })
182
248
  })
183
249
 
184
250
  // Ao desmontar o formulário (SPAs): restaura os métodos originais
@@ -217,12 +283,12 @@ onde `{domínio}` é o identificador do **agregado de negócio** ao qual o campo
217
283
 
218
284
  | Campo no DOM | Domínio | Atributo no modelo |
219
285
  | ------------------- | ----------- | ------------------ |
220
- | `contrato_indice` | `contrato` | `indice` |
221
- | `imovel_cep` | `imovel` | `cep` |
222
- | `vigencia_prazo` | `vigencia` | `prazo` |
223
- | `fornecedor_cep` | `fornecedor`| `cep` |
286
+ | `departamento_indice` | `departamento` | `indice` |
287
+ | `area_cep` | `area` | `cep` |
288
+ | `vigencia_prazo` | `vigencia` | `prazo` |
289
+ | `cadastro_cep` | `cadastro` | `cep` |
224
290
 
225
- > **Importante:** o `{domínio}` é o prefixo persistido no banco pelo Fluig — é parte integrante do nome da coluna e **não deve ser omitido** no HTML. O `load` e o `save` gerenciam a conversão entre o nome DOM e o atributo do modelo de forma transparente.
291
+ > **Importante:** o `{domínio}` é o prefixo persistido no banco — é parte integrante do nome da coluna e **não deve ser omitido** no HTML. O `load` e o `save` gerenciam a conversão entre o nome DOM e o atributo do modelo de forma transparente.
226
292
 
227
293
  O `moduleId` do workflow (quem exibe o campo na tela) e o `stage` (em que fase do processo estamos) são **independentes** do domínio do campo — um mesmo módulo pode exibir campos de múltiplos domínios.
228
294
 
@@ -236,13 +302,13 @@ Lê e escreve diretamente nos elementos `input`, `select` e `textarea` do formul
236
302
  ```typescript
237
303
  import { BpmFormRepository } from 'jsegd-bpm'
238
304
 
239
- interface Contrato {
305
+ interface Departamento {
240
306
  indice: string
241
307
  primeiroPagamento: string
242
308
  reajuste: string
243
309
  }
244
310
 
245
- interface Imovel {
311
+ interface Area {
246
312
  cep: string
247
313
  logradouro: string
248
314
  municipio: string
@@ -255,22 +321,22 @@ interface ItemTabela {
255
321
 
256
322
  const repo = new BpmFormRepository()
257
323
 
258
- // Ler domínio 'contrato' — lê campos com name="contrato_*" do DOM
259
- // DOM: contrato_indice, contrato_primeiro_pagamento, contrato_reajuste
260
- const contrato = repo.load<Contrato>('contrato')
261
- console.log(contrato.indice) // valor de input[name="contrato_indice"]
262
- console.log(contrato.primeiroPagamento) // valor de input[name="contrato_primeiro_pagamento"]
324
+ // Ler domínio 'departamento' — lê campos com name="departamento_*" do DOM
325
+ // DOM: departamento_indice, departamento_primeiro_pagamento, departamento_reajuste
326
+ const departamento = repo.load<Departamento>('departamento')
327
+ console.log(departamento.indice) // valor de input[name="departamento_indice"]
328
+ console.log(departamento.primeiroPagamento) // valor de input[name="departamento_primeiro_pagamento"]
263
329
 
264
- // Ler domínio 'imovel' — desambigua de 'fornecedor_cep', 'contrato_cep', etc.
265
- const imovel = repo.load<Imovel>('imovel')
266
- console.log(imovel.cep) // valor de input[name="imovel_cep"]
330
+ // Ler domínio 'area' — desambigua de 'cadastro_cep', 'departamento_cep', etc.
331
+ const area = repo.load<Area>('area')
332
+ console.log(area.cep) // valor de input[name="area_cep"]
267
333
 
268
334
  // Ler tabela filha
269
335
  const itens = repo.loadTable<ItemTabela>('tabItens')
270
336
 
271
337
  // Persistir no DOM — save converte camelCase → prefixo+snake_case
272
- repo.save<Contrato>('contrato', { indice: 'IGPM', primeiroPagamento: '2026-02-01' })
273
- // escreve: input[name="contrato_indice"] e input[name="contrato_primeiro_pagamento"]
338
+ repo.save<Departamento>('departamento', { indice: 'IGPM', primeiroPagamento: '2026-02-01' })
339
+ // escreve: input[name="departamento_indice"] e input[name="departamento_primeiro_pagamento"]
274
340
 
275
341
  // Substituir linhas da tabela filha
276
342
  repo.saveTable<ItemTabela>('tabItens', [
@@ -314,18 +380,18 @@ Processos existentes cujos campos não seguem a convenção `{domínio}_{atribut
314
380
  ```typescript
315
381
  import { loadFields } from 'jsegd-bpm'
316
382
 
317
- interface Solicitante {
383
+ interface Requisitante {
318
384
  nome: string
319
385
  email: string
320
386
  }
321
387
 
322
- // Campo legado: sufixo em vez de prefixo — nome_solicitante, email_solicitante
323
- const dados = loadFields<Solicitante>({
324
- nome: 'nome_solicitante',
325
- email: 'email_solicitante',
388
+ // Campo legado: sufixo em vez de prefixo — nome_requisitante, email_requisitante
389
+ const dados = loadFields<Requisitante>({
390
+ nome: 'nome_requisitante',
391
+ email: 'email_requisitante',
326
392
  })
327
- // dados.nome === valor de input[name="nome_solicitante"]
328
- // dados.email === valor de input[name="email_solicitante"]
393
+ // dados.nome === valor de input[name="nome_requisitante"]
394
+ // dados.email === valor de input[name="email_requisitante"]
329
395
  ```
330
396
 
331
397
  > **Regra:** `loadFields` **não faz parte de `IFormRepository`** — é um utilitário de compatibilidade para processos legados. Novos processos devem usar `repository.load(section)` exclusivamente.
@@ -346,59 +412,59 @@ import { defineWorkflowConfig } from 'jsegd-bpm'
346
412
  export const workflowConfig = defineWorkflowConfig({
347
413
  modules: [
348
414
  {
349
- moduleId: 'solicitante',
415
+ moduleId: 'areaInicial',
350
416
  label: 'Dados Iniciais',
351
417
  icon: 'file-text',
352
418
  order: 1,
353
419
  showInNavigation: true,
354
420
  renderContent: true,
355
- contentIncludePath: 'solicitante.html',
421
+ contentIncludePath: 'area-inicial.html',
356
422
  },
357
423
  {
358
- moduleId: 'juridico',
359
- label: 'Jurídico',
424
+ moduleId: 'areaA',
425
+ label: 'Área A',
360
426
  icon: 'gavel',
361
427
  order: 2,
362
428
  showInNavigation: true,
363
429
  renderContent: true,
364
- contentIncludePath: 'juridico.html',
430
+ contentIncludePath: 'area-a.html',
365
431
  },
366
432
  {
367
- moduleId: 'financeiro',
368
- label: 'Financeiro',
433
+ moduleId: 'areaB',
434
+ label: 'Área B',
369
435
  icon: 'dollar-sign',
370
436
  order: 3,
371
437
  showInNavigation: true,
372
438
  renderContent: true,
373
- contentIncludePath: 'financeiro.html',
439
+ contentIncludePath: 'area-b.html',
374
440
  },
375
441
  ],
376
442
  activities: [
377
443
  {
378
444
  sequence: 9,
379
- description: 'Solicitação inicial',
445
+ description: 'Etapa inicial',
380
446
  kind: 'human',
381
- stage: 'solicitacao',
382
- modules: { visible: ['solicitante'], editable: ['solicitante'], active: 'solicitante' },
447
+ stage: 'inicio',
448
+ modules: { visible: ['areaInicial'], editable: ['areaInicial'], active: 'areaInicial' },
383
449
  },
384
450
  {
385
451
  sequence: 53,
386
- description: 'Aprovação jurídica',
452
+ description: 'Análise da área A',
387
453
  kind: 'human',
388
- stage: 'juridico',
389
- modules: { visible: ['solicitante', 'juridico'], editable: ['juridico'], active: 'juridico' },
454
+ stage: 'analiseA',
455
+ modules: { visible: ['areaInicial', 'areaA'], editable: ['areaA'], active: 'areaA' },
390
456
  },
391
457
  {
392
458
  sequence: 61,
393
- description: 'Análise financeira',
459
+ description: 'Análise da área B',
394
460
  kind: 'human',
395
- stage: 'financeiro',
396
- modules: { visible: ['solicitante', 'juridico', 'financeiro'], editable: ['financeiro'] },
461
+ stage: 'analiseB',
462
+ modules: { visible: ['areaInicial', 'areaA', 'areaB'], editable: ['areaB'] },
397
463
  },
398
464
  { sequence: 88, description: 'Roteamento interno', kind: 'routing' },
399
465
  ],
400
466
  } as const)
401
- // Tipo de ModuleId inferido: 'solicitante' | 'juridico' | 'financeiro'
467
+ // Tipo de ModuleId inferido: 'areaInicial' | 'areaA' | 'areaB'
402
468
  ```
403
469
 
404
470
  **`ActivityKind`** — controla o comportamento na barra de progresso:
@@ -425,10 +491,10 @@ const currentSequence: number = parent.ECM.workflowView.processDefinition.cardIn
425
491
  const historyType: string | null = parent.ECM.workflowView.processDefinition.historyType ?? null
426
492
 
427
493
  const completedStages = extractCompletedStages(rawHistory, workflowConfig.activities)
428
- // Ex: ['solicitacao', 'juridico']
494
+ // Ex: ['inicio', 'analiseA']
429
495
 
430
496
  const currentStage = extractCurrentStage(currentSequence, historyType, workflowConfig.activities)
431
- // Ex: { stage: 'financeiro', status: 'current' }
497
+ // Ex: { stage: 'analiseB', status: 'current' }
432
498
 
433
499
  const processHistory: ProcessHistory = { completedStages, currentStage }
434
500
  ```
@@ -445,9 +511,9 @@ import { resolveWorkflowScreen } from 'jsegd-bpm'
445
511
  const screen = resolveWorkflowScreen(workflowConfig, currentSequence, processHistory)
446
512
 
447
513
  // Visibilidade e editabilidade
448
- screen.isVisible('juridico') // true
449
- screen.isEditable('financeiro') // false
450
- screen.isActive('juridico') // true
514
+ screen.isVisible('areaA') // true
515
+ screen.isEditable('areaB') // false
516
+ screen.isActive('areaA') // true
451
517
 
452
518
  // Estado da atividade
453
519
  screen.isAwaitingSystem() // true quando kind === 'system' ou status === 'waiting'
@@ -456,9 +522,9 @@ screen.isInSupport() // true para kind === 'support'
456
522
  // Barra de progresso
457
523
  const stages = screen.getProgressBarStages()
458
524
  // [
459
- // { stage: 'solicitacao', status: 'done' },
460
- // { stage: 'juridico', status: 'done' },
461
- // { stage: 'financeiro', status: 'current' },
525
+ // { stage: 'inicio', status: 'done' },
526
+ // { stage: 'analiseA', status: 'done' },
527
+ // { stage: 'analiseB', status: 'current' },
462
528
  // ]
463
529
 
464
530
  // Módulos
@@ -518,7 +584,7 @@ customElements.define('attachments-table', AttachmentsTable)
518
584
 
519
585
  // Alpine stores
520
586
  const stores = registerStores(Alpine, {
521
- solicitante: { nome: '', departamento: '' },
587
+ departamento: { nome: '', area: '' },
522
588
  ui: { carregando: false },
523
589
  })
524
590
 
@@ -539,8 +605,8 @@ await WorkflowViewPatcher.init()
539
605
  WorkflowViewPatcher.patchAll()
540
606
  WorkflowViewPatcher.addBeforeValidate(async () => {
541
607
  const repo = new BpmFormRepository()
542
- const dados = repo.load<{ nome: string }>('solicitante')
543
- if (!dados.nome) throw new Error('Informe o nome do solicitante')
608
+ const dados = repo.load<{ nome: string }>('departamento')
609
+ if (!dados.nome) throw new Error('Informe o nome')
544
610
  })
545
611
 
546
612
  Alpine.start()
@@ -550,4 +616,4 @@ Alpine.start()
550
616
 
551
617
  ## Licença
552
618
 
553
- Proprietária — EGD Tecnologia. Uso restrito a projetos autorizados.
619
+ Proprietária — uso restrito a projetos autorizados.
@@ -1076,5 +1076,84 @@ type StoreProxy<T extends StoreMap> = {
1076
1076
  */
1077
1077
  declare function registerStores<T extends StoreMap>(alpine: Pick<Alpine, 'store'>, storeMap: T): StoreProxy<T>;
1078
1078
 
1079
- export { Attach, AttachButton, AttachmentsTable, BeforeSendValidate, BpmFormRepository, ConstraintsType, MockFormRepository, ScreenContext, WorkerManager, WorkflowViewPatcher, defineWorkflowConfig, extractCompletedStages, extractCurrentStage, loadFields, registerStores, resolveWorkflowScreen, sendRequestEvent };
1080
- export type { ActivityKind, ActivityModulePolicy, AttachButtonRegistration, AttachmentRecord, AttachmentSource, AttachmentsTableMode, AttachmentsTableOptions, BpmHistoryEntry, BpmHistoryMap, CacheOptions, CancelablePromise, DatasetError, DatasetResponse, DatasetRow, DragDropEntry, FieldError, IFormRepository, IWorkflowViewHooks, ProcessCompletionLink, ProcessCompletionMessage, ProcessHistory, ResolvedModule, SearchParams, StoreMap, StoreProxy, WorkerAbort, WorkerManagerOptions, WorkerRequest, WorkerResponse, WorkflowActivityDefinition, WorkflowConfig, WorkflowModuleDefinition };
1079
+ type ValidationFn = (...args: unknown[]) => boolean;
1080
+ type ValidationRules = Record<string, ValidationFn>;
1081
+ type ValidatorHandle = {
1082
+ validate(field?: string): boolean;
1083
+ hasError(): boolean;
1084
+ };
1085
+ /**
1086
+ * Validador tipado com padrão singleton.
1087
+ * Permite registrar, remover e executar funções de validação associadas a códigos numéricos.
1088
+ * @hideconstructor
1089
+ */
1090
+ declare class Validator {
1091
+ private static instance;
1092
+ private rules;
1093
+ private constructor();
1094
+ /**
1095
+ * Retorna a instância singleton de Validator.
1096
+ * @example
1097
+ * ```typescript
1098
+ * const validator = Validator.getInstance()
1099
+ * validator.register(100, () => someField !== '')
1100
+ * validator.execute(100)
1101
+ * ```
1102
+ */
1103
+ static getInstance(): Validator;
1104
+ /**
1105
+ * Cria um validador isolado para um conjunto de regras nomeadas.
1106
+ * Cada chamada retorna um handle independente, útil para instâncias locais de Alpine.data().
1107
+ * @example
1108
+ * const validadores = Validator.add({
1109
+ * taxa: () => this.possuiTaxa === '1' && !this.taxa,
1110
+ * campoExtra: () => this.possuiTaxa === '1' && this.campoExtra === 'invalido',
1111
+ * })
1112
+ */
1113
+ static add(rules: ValidationRules): ValidatorHandle;
1114
+ private addRule;
1115
+ private removeRule;
1116
+ private normalizeRules;
1117
+ private unregisterAll;
1118
+ /**
1119
+ * Registra uma validação associada a um código numérico.
1120
+ * Aceita uma única função ou um lote de regras nomeadas.
1121
+ * Retorna uma função para cancelar o registro do mesmo conjunto informado.
1122
+ * @example Validator.getInstance().register(100, () => value > 0)
1123
+ * @example Validator.getInstance().register(100, {
1124
+ * fieldA: () => valueA > 0,
1125
+ * fieldB: () => valueB !== '',
1126
+ * })
1127
+ */
1128
+ register(code: number, rules: ValidationFn): () => void;
1129
+ register(code: number, rules: ValidationRules): () => void;
1130
+ /**
1131
+ * Remove uma validação associada a um código numérico.
1132
+ * Aceita uma única função ou o mesmo lote de regras nomeadas usado no registro.
1133
+ * @example Validator.getInstance().unregister(100, myFn)
1134
+ * @example Validator.getInstance().unregister(100, {
1135
+ * fieldA: () => valueA > 0,
1136
+ * fieldB: () => valueB !== '',
1137
+ * })
1138
+ */
1139
+ unregister(code: number, rules: ValidationFn): void;
1140
+ unregister(code: number, rules: ValidationRules): void;
1141
+ /**
1142
+ * Executa todas as funções de validação registradas para o código informado.
1143
+ * Lança um erro se qualquer função retornar `false`.
1144
+ * Se não houver validações registradas para o código, retorna silenciosamente.
1145
+ * @example Validator.getInstance().execute(100)
1146
+ * @throws {Error} Se alguma validação falhar.
1147
+ */
1148
+ execute(code: number): void;
1149
+ /**
1150
+ * Remove todas as funções de validação de um código específico, ou limpa todos os registros se nenhum código for informado.
1151
+ * @example
1152
+ * Validator.getInstance().clear(100) // remove validações do código 100
1153
+ * Validator.getInstance().clear() // remove todos os registros
1154
+ */
1155
+ clear(code?: number): void;
1156
+ }
1157
+
1158
+ export { Attach, AttachButton, AttachmentsTable, BeforeSendValidate, BpmFormRepository, ConstraintsType, MockFormRepository, ScreenContext, Validator, WorkerManager, WorkflowViewPatcher, defineWorkflowConfig, extractCompletedStages, extractCurrentStage, loadFields, registerStores, resolveWorkflowScreen, sendRequestEvent };
1159
+ export type { ActivityKind, ActivityModulePolicy, AttachButtonRegistration, AttachmentRecord, AttachmentSource, AttachmentsTableMode, AttachmentsTableOptions, BpmHistoryEntry, BpmHistoryMap, CacheOptions, CancelablePromise, DatasetError, DatasetResponse, DatasetRow, DragDropEntry, FieldError, IFormRepository, IWorkflowViewHooks, ProcessCompletionLink, ProcessCompletionMessage, ProcessHistory, ResolvedModule, SearchParams, StoreMap, StoreProxy, ValidationFn, WorkerAbort, WorkerManagerOptions, WorkerRequest, WorkerResponse, WorkflowActivityDefinition, WorkflowConfig, WorkflowModuleDefinition };