@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 +155 -0
- package/README.md +72 -7
- package/SKILL.md +609 -0
- package/index.es.js +2 -0
- package/index.es.js.map +1 -0
- package/index.umd.js +2 -0
- package/index.umd.js.map +1 -0
- package/package.json +10 -23
- package/src/index.d.ts +4 -0
- package/{dist/src → src}/parser.d.ts +2 -1
- package/src/reactivity.d.ts +48 -0
- package/.github/workflows/npm-publish.yml +0 -19
- package/.prettierignore +0 -3
- package/.prettierrc +0 -7
- package/PROJECT.md +0 -106
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -227
- package/dist/index.es.js +0 -2
- package/dist/index.es.js.map +0 -1
- package/dist/index.umd.js +0 -2
- package/dist/index.umd.js.map +0 -1
- package/dist/package.json +0 -34
- package/dist/src/index.d.ts +0 -3
- package/dist/src/reactivity.d.ts +0 -24
- package/dist/vite.config.d.ts +0 -2
- package/index.html +0 -196
- package/publish.js +0 -34
- package/src/evaluator.ts +0 -29
- package/src/index.ts +0 -10
- package/src/parser.ts +0 -480
- package/src/reactivity.ts +0 -185
- package/tsconfig.json +0 -23
- package/vite.config.ts +0 -16
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/src → src}/evaluator.d.ts +0 -0
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
|
|
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)
|
|
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
|
-
-
|
|
218
|
-
-
|
|
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:
|
|
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.
|