@jsweb/ui 1.3.0 → 1.3.2

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/CHANGELOG.md ADDED
@@ -0,0 +1,155 @@
1
+ # Changelog
2
+
3
+ Todas as alterações notáveis neste projeto serão documentadas neste arquivo.
4
+
5
+ O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/) e este projeto adere ao [Semantic Versioning](https://semver.org/).
6
+
7
+ ---
8
+
9
+ ## [Unreleased]
10
+
11
+ ---
12
+
13
+ ## [1.3.2] - 2026-09-25
14
+
15
+ ### Fixed
16
+
17
+ - **Alvo de Publicação no NPM**: Correção do fluxo de publicação para empacotar e publicar exclusivamente o conteúdo da pasta `dist/` (`npm publish ./dist`), evitando a inclusão indevida de código-fonte (`src/`), configurações internas e arquivos desnecessários no pacote publicado.
18
+ - **Entry Points no `package.json`**: Correção dos campos `main`, `module` e `exports` na raiz do projeto para apontar para `dist/index.umd.js` e `dist/index.es.js` (substituindo antigas referências a `ui.*`), preservando a compatibilidade em desenvolvimento local.
19
+
20
+ ### Changed
21
+
22
+ - **Scripts de Publicação e Automação**:
23
+ - Adicionado script `npm run dist` (`npm run build && npm publish ./dist`) para build e publicação direta da pasta `dist/`.
24
+ - Atualizado `npm run push` para executar `git push && git push --tags && npm run dist`.
25
+ - Migrado hook de ciclo de vida de `preversion` para `version` no `package.json`, garantindo que o build e o script `publish.js` executem após o incremento da versão, sincronizando o número correto em `dist/package.json`.
26
+ - **Salvaguarda contra Publicação na Raiz**: Adicionado script `prepublishOnly` no `package.json` da raiz para abortar execuções acidentais de `npm publish` fora da pasta `dist/`.
27
+ - **Declarações de Tipos Limpas no Build**: Configurado `include: ['src']` no plugin `vite-plugin-dts` em `vite.config.ts`, impedindo que arquivos como `vite.config.d.ts` vazassem para a pasta de distribuição.
28
+
29
+ ---
30
+
31
+ ## [1.3.1] - 2026-09-24
32
+
33
+ ### Added
34
+
35
+ - **Tipagem Contextual `ThisType<T & ScopeContext>`**: Inclusão de `ThisType` na assinatura de `reactive` e `createScope`, fornecendo autocomplete e tipagem estrita de `this` em métodos e _getters_ de objetos literais, com acesso direto a `$refs`, `$emit` e `$el` como propriedades não-opcionais.
36
+ - **Classe Base `Scope` e Interface `ScopeContext`**: Exportação da classe utilitária `Scope` e da interface `ScopeContext` para suporte nativo e tipado a arquiteturas orientadas a objetos (`class MyScope extends Scope`). Na classe `Scope`, `$el` e `$refs` são propriedades somente leitura (com `$refs` mantendo sua instância original de Map viva) e `$emit` como método `protected` com disparo nativo em `$el`, permitindo sobrescrita (`override`) nas subclasses.
37
+ - **Tipagem Genérica em `watch<T>`**: Aprimoramento da assinatura de `watch` para inferência de tipos em `newValue` e `oldValue`.
38
+ - **Skill Aberta para Agentes de IA (`SKILL.md`)**: Arquivo [`SKILL.md`](./SKILL.md) na raiz do projeto para integração direta com agentes de IA via `npx skills add @jsweb/ui`.
39
+ - **Skill de Workspace (`update-documentation`)**: Skill em [`.agents/skills/update-documentation/SKILL.md`](./.agents/skills/update-documentation/SKILL.md) para auditoria e sincronização contínua de documentação.
40
+ - **Histórico Semântico de Versões (`CHANGELOG.md`)**: Arquivo [`CHANGELOG.md`](./CHANGELOG.md) baseado no padrão Keep a Changelog.
41
+ - **Automação de Build e Metadados**: Atualização do script [`publish.js`](./publish.js) para sincronizar `SKILL.md` e `CHANGELOG.md` na pasta `dist/` durante o build do pacote NPM.
42
+ - **Script de Publicação**: Adicionado script `npm run push` no `package.json` para automatizar o envio de tags git e publicação no NPM.
43
+
44
+ ---
45
+
46
+ ## [1.3.0] - 2026-09-18
47
+
48
+ ### Added
49
+
50
+ - **Diretiva `:ref` / `ui:ref`**: Indexação reativa de elementos DOM no helper contextual `$refs` (`Map`).
51
+ - **Refs Aninhadas em Listas**: Em loops `:for` com `:key`, `$refs.get(name)` retorna um `Map` aninhado indexado pela chave do item (`$key`).
52
+ - **Cleanup Automático de Refs**: Remoção de referências do `$refs` quando nós são destruídos por `:if` ou `:for`.
53
+ - **Modificador de Evento `.outside`**: Captura cliques e eventos fora do elemento (ideal para modais e dropdowns) com remoção automática do listener no `document` ao desconectar o nó.
54
+ - **Reconciliação e Reciclagem de Nós DOM em Listas**: Rastreamento de nós pelo `:key` em `:for`, reaproveitando instâncias existentes e evitando reflows desnecessários.
55
+
56
+ ---
57
+
58
+ ## [1.2.8] - 2026-05-20
59
+
60
+ ### Refactored
61
+
62
+ - Limpeza de imports e remoção de código não utilizado no parser e no core.
63
+
64
+ ---
65
+
66
+ ## [1.2.7] - 2026-05-20
67
+
68
+ ### Added
69
+
70
+ - Suporte aprimorado à função `watch` com observação profunda (_deep traverse_) e suporte a `{ immediate: true }`.
71
+
72
+ ---
73
+
74
+ ## [1.2.6] - 2026-05-20
75
+
76
+ ### Added
77
+
78
+ - **Diretiva `:class` / `ui:class`**: Bind reativo de classes CSS via objeto booleano, array ou string, preservando classes estáticas.
79
+ - **Diretiva `:style` / `ui:style`**: Bind reativo para estilos inline com limpeza automática de propriedades removidas.
80
+
81
+ ---
82
+
83
+ ## [1.2.5] - 2026-05-18
84
+
85
+ ### Fixed
86
+
87
+ - Tratamento de erros nas funções de avaliação (`evaluate` e `evaluateEvent`).
88
+ - Ajuste no contexto `this` para getters em propriedades computadas.
89
+
90
+ ---
91
+
92
+ ## [1.2.4] - 2026-05-18
93
+
94
+ ### Added
95
+
96
+ - Suporte automático a propriedades computadas via _getters_ nativos (`get prop() { ... }`) em objetos envolvidos por `reactive()`.
97
+
98
+ ---
99
+
100
+ ## [1.2.3] - 2026-05-18
101
+
102
+ ### Added
103
+
104
+ - Script de automação `preversion` no `package.json` para executar o build antes de gerar versões.
105
+
106
+ ### Refactored
107
+
108
+ - Remoção da função legada `hasDirective`.
109
+
110
+ ---
111
+
112
+ ## [1.2.2] - 2026-05-18
113
+
114
+ ### Refactored
115
+
116
+ - Simplificação do logging de avisos no motor de avaliação.
117
+
118
+ ---
119
+
120
+ ## [1.2.1] - 2026-05-17
121
+
122
+ ### Added
123
+
124
+ - Script `publish.js` para geração de pacote mínimo em `dist/` e automação de publicação NPM.
125
+
126
+ ---
127
+
128
+ ## [1.2.0] - 2026-05-09
129
+
130
+ ### Added
131
+
132
+ - Exportação da API `watch(source, callback, options?)` para observação de estados reativos.
133
+ - Reorganização dos exports principais (`createScope`, `reactive`, `watch`).
134
+
135
+ ---
136
+
137
+ ## [1.1.0] - 2026-05-09
138
+
139
+ ### Added
140
+
141
+ - Injeção do helper contextual `$emit(eventName, detail?)` para disparo de `CustomEvent` nativos (`bubbles: true`, `composed: true`).
142
+ - Padronização do nome do método de montagem para `createScope`.
143
+
144
+ ---
145
+
146
+ ## [1.0.0] - 2026-05-07
147
+
148
+ ### Added
149
+
150
+ - Primeiro lançamento estável do `@jsweb/ui`.
151
+ - Motor de reatividade de grão fino baseado em `Proxy` e `ReactiveEffect` (sem Virtual DOM).
152
+ - Avaliador de expressões dinâmicas em sandbox.
153
+ - Diretivas fundamentais: `ui:scope`, `ui:text`, `ui:bind`, `ui:if`, `ui:for`, `ui:[attr]` e `ui@[event]`.
154
+ - Modificadores de evento `.prevent`, `.stop` e `.self`.
155
+ - Distribuição dual: ESM para bundlers e UMD/Standalone para uso direto via CDN.
package/README.md CHANGED
@@ -174,6 +174,10 @@ O atributo `ui:ref` ou `:ref` indexa o elemento diretamente em um objeto `Map` a
174
174
 
175
175
  ### TypeScript / ESM
176
176
 
177
+ #### Abordagem com Objeto Literal (`ThisType`)
178
+
179
+ Graças ao utilitário `ThisType<T & ScopeContext>`, dentro dos métodos e _getters_ do objeto literal você tem autocomplete e tipagem estrita de `this`, incluindo as propriedades do objeto e os helpers `$refs` e `$emit`:
180
+
177
181
  ```typescript
178
182
  import { createScope, reactive, watch } from '@jsweb/ui'
179
183
 
@@ -181,15 +185,22 @@ const scope = reactive({
181
185
  count: 0,
182
186
  inc: 'Incremento',
183
187
  dec: 'Decremento',
188
+
189
+ get double() {
190
+ return this.count * 2
191
+ },
192
+
184
193
  increment() {
185
194
  this.count++
195
+ this.$emit('changed', this.count)
196
+ this.$refs.get('meuInput')?.focus()
186
197
  },
187
198
  decrement() {
188
199
  this.count--
189
200
  },
190
201
  })
191
202
 
192
- // Observa mudanças com suporte a oldValue/newValue e disparo imediato opcional
203
+ // Observa mudanças com suporte a tipagem genérica, oldValue/newValue e disparo imediato
193
204
  const unwatch = watch(
194
205
  () => scope.count,
195
206
  (newVal, oldVal) => {
@@ -201,27 +212,81 @@ const unwatch = watch(
201
212
  createScope('#container', { scope })
202
213
  ```
203
214
 
215
+ #### Abordagem Orientada a Objetos com a Classe `Scope`
216
+
217
+ Você também pode utilizar classes TypeScript estendendo a classe base `Scope` fornecida pelo framework:
218
+
219
+ ```typescript
220
+ import { createScope, reactive, Scope } from '@jsweb/ui'
221
+
222
+ class ContadorScope extends Scope {
223
+ count = 0
224
+ inc = 'Incremento'
225
+ dec = 'Decremento'
226
+
227
+ get double() {
228
+ return this.count * 2
229
+ }
230
+
231
+ increment() {
232
+ this.count++
233
+ this.$emit('changed', this.count)
234
+ this.$refs.get('meuInput')?.focus()
235
+ }
236
+
237
+ decrement() {
238
+ this.count--
239
+ }
240
+
241
+ // É possível sobrescrever o método $emit se desejar lógica customizada:
242
+ protected override $emit(event: string, detail?: any) {
243
+ console.log(`[Contador] Evento disparado: ${event}`, detail)
244
+ super.$emit(event, detail)
245
+ }
246
+ }
247
+
248
+ const scope = reactive(new ContadorScope())
249
+ createScope('#container', { scope })
250
+ ```
251
+
204
252
  ## API JavaScript / TypeScript
205
253
 
206
- ### `createScope(selectorOrElement, context?)`
254
+ ### `createScope<T>(selectorOrElement, context?)`
207
255
 
208
256
  Inicializa e amarra a reatividade ao elemento DOM ou seletor especificado.
209
257
 
210
258
  - **`selectorOrElement`**: Seletor CSS (ex: `'#app'`, `'body'`) ou instância de `HTMLElement`.
211
- - **`context`**: Objeto inicial de contexto/estado compartilhado (opcional). Injeta automaticamente o helper `$emit` no escopo.
259
+ - **`context`**: Objeto inicial de contexto/estado compartilhado (opcional), tipado contextualmente com `ThisType<T & ScopeContext>`. Injeta automaticamente os helpers `$emit` e `$refs`.
212
260
 
213
261
  ### `reactive(target)`
214
262
 
215
263
  Envolve um objeto ou array em um `Proxy` de reatividade de grão fino (_fine-grained_).
216
264
 
217
- - Suporta reatividade profunda (_deep reactivity_).
218
- - Intercepta mutações em arrays (`push`, `pop`, `splice`, etc.) e mutações de propriedades em objetos.
265
+ - **Objeto Literal**: Tipado com `ThisType<T & ScopeContext>` para inferência e autocomplete de `this` (incluindo computeds via _getters_ e helpers contextuais `$refs`, `$emit` e `$el` prontos para uso sem necessidade de `?.`).
266
+ - **Instâncias de Classes**: Suporta instâncias que estendem `Scope` ou classes POJO personalizadas.
267
+ - **Arrays**: Intercepta métodos de mutação (`push`, `pop`, `splice`, etc.) e gerencia dependências de tamanho (`length`).
268
+ - **Suporta reatividade profunda** (_deep reactivity_).
269
+
270
+ ### `Scope`
271
+
272
+ Classe base utilitária para definição de escopos orientados a objetos em TypeScript. Já possui `$el` e `$refs` implementados como somente leitura e `$emit` com implementação padrão como método `protected`, permitindo sobrescrita (`override`) nas subclasses.
273
+
274
+ ```typescript
275
+ export class Scope {
276
+ readonly $el: HTMLElement
277
+ protected readonly $refs: Map<string, any>
278
+ protected $emit(event: string, detail?: any): void
279
+ declare $index?: number
280
+ declare $key?: any
281
+ constructor(init?: Record<string, any>)
282
+ }
283
+ ```
219
284
 
220
- ### `watch(source, callback, options?)`
285
+ ### `watch<T>(source, callback, options?)`
221
286
 
222
287
  Observa alterações reativas e executa uma função de callback quando o valor mudar.
223
288
 
224
289
  - **`source`**: Objeto reativo completo ou função getter que retorna o valor a ser observado (ex: `() => state.count`).
225
- - **`callback`**: `(newValue: any, oldValue: any) => void`.
290
+ - **`callback`**: `(newValue: T, oldValue: T | undefined) => void`.
226
291
  - **`options`**: `{ immediate?: boolean }` para acionar a callback imediatamente na primeira execução.
227
292
  - **Retorno**: Função de cancelamento `stop()` que encerra a observação e limpa dependências.