feedback-collector 0.1.0 → 0.2.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.
@@ -3,42 +3,38 @@ name: feedback-collector-setup
3
3
  description: >
4
4
  Instala, configura ou remove o feedback-collector (picker visual ALT+clique →
5
5
  backlog markdown com arquivo:linha) em um projeto front-end. Use quando o
6
- usuário pedir para "instalar o feedback-collector", "adicionar o picker de
7
- feedback", "configurar source mapping do feedback", "remover/desativar o
8
- feedback-collector", ou equivalentes em inglês (install/remove feedback
9
- collector, visual feedback picker). Cobre Next.js (webpack), Vite e sites sem
10
- build; inclui o caveat de React 19 e o gate para uso em produção.
6
+ usuário pedir para instalar, adicionar, configurar, controlar ou remover o
7
+ feedback-collector. Cobre Next.js (webpack), Vite e sites sem build; inclui
8
+ ciclo de vida v0.2, migração local, caveat de React 19 e gate de produção.
11
9
  ---
12
10
 
13
11
  # feedback-collector: instalar e remover
14
12
 
15
- O package `feedback-collector` é um script client-side puro (IIFE, sem backend):
16
- segurando ALT o usuário clica em elementos, anota instruções e exporta um
17
- backlog markdown com `arquivo:linha` para colar em um agente de código. A
18
- instalação tem DUAS partes independentes:
13
+ O package `feedback-collector` é client-side, vanilla, sem backend e sem
14
+ dependências de runtime. A instalação tem duas partes independentes:
19
15
 
20
- 1. **O script** (picker/painel) — trivial, funciona em qualquer stack.
21
- 2. **O source mapping** (`arquivo:linha`) — exige um plugin de build que injeta
22
- `data-inspector-{relative-path,line,column}` no JSX. É a parte com decisões.
16
+ 1. **Runtime:** picker, painel, fila local e export.
17
+ 2. **Source mapping:** plugin de build que injeta `data-inspector-*` no JSX.
23
18
 
24
- Antes de começar, detecte: framework (Next/Vite/CRA/sem build), bundler do dev
25
- (Next: webpack ou `--turbopack` no script `dev`?), versão do React, e se o
26
- projeto tem auth (define o gate de produção).
19
+ Antes de editar, detecte framework, bundler, versão do React, package manager,
20
+ se o app usa SSR e se o usuário quer uso apenas em dev ou também em produção.
21
+ No Next, confirme se `dev` usa webpack ou `--turbopack`.
27
22
 
28
- ## Parte 1 — o script
23
+ ## Parte 1 — runtime
29
24
 
30
25
  ```bash
31
- npm i -D feedback-collector # ou pnpm add -D
26
+ npm i -D feedback-collector
32
27
  ```
33
28
 
34
- Carregue via componente client montado condicionalmente (React):
29
+ ### Modo compatível: auto-mount
30
+
31
+ O import raiz injeta o picker como side effect, como na v0.1:
35
32
 
36
33
  ```tsx
37
- // components/feedback-collector-loader.tsx
38
- "use client"; // (Next App Router)
34
+ "use client";
39
35
  import { useEffect } from "react";
40
36
 
41
- export function FeedbackCollector() {
37
+ export function FeedbackCollectorLoader() {
42
38
  useEffect(() => {
43
39
  void import("feedback-collector");
44
40
  }, []);
@@ -46,39 +42,79 @@ export function FeedbackCollector() {
46
42
  }
47
43
  ```
48
44
 
49
- **Onde renderizar — decisão de gate (pergunte ao usuário se ambíguo):**
45
+ ### Modo controlado: mount/destroy
46
+
47
+ Use o entry sem auto-inicialização quando o app precisa ativar/desativar o
48
+ collector durante sua vida útil:
49
+
50
+ ```tsx
51
+ "use client";
52
+ import { useEffect } from "react";
53
+
54
+ export function FeedbackCollectorLoader() {
55
+ useEffect(() => {
56
+ let dispose: (() => void) | undefined;
57
+ void import("feedback-collector/api").then(({ mount, destroy }) => {
58
+ mount();
59
+ dispose = destroy;
60
+ });
61
+ return () => dispose?.();
62
+ }, []);
63
+ return null;
64
+ }
65
+ ```
50
66
 
51
- - **Só em dev (padrão seguro):** no layout raiz,
52
- `{process.env.NODE_ENV === "development" && <FeedbackCollector />}`.
53
- - **Em produção, gated por usuário:** se o app tem auth e o usuário quer usar o
54
- picker contra dados reais de prod, renderize num layout autenticado
55
- condicionado ao papel do usuário (ex.: `{isOwner && <FeedbackCollector />}`).
56
- O script só lê o DOM que o próprio usuário já vê (não é vetor de vazamento),
57
- mas usuários comuns NÃO devem ver o painel. O gate server-side também evita
58
- que o chunk seja baixado por quem não usa.
67
+ `mount()` é idempotente e devolve o controller ativo. `destroy()` remove DOM e
68
+ listeners, mas mantém a fila no storage. O entry raiz também exporta os métodos,
69
+ porém auto-monta; para controle explícito prefira `feedback-collector/api`.
59
70
 
60
- Sites sem build: `<script src="node_modules/feedback-collector/src/feedback-collector.js">`
61
- (ou copie o arquivo). O entry `feedback-collector/script` aponta pro IIFE cru.
71
+ ### Gate de ambiente/usuário
62
72
 
63
- ## Parte 2 — source mapping (arquivo:linha)
73
+ - **Só dev (padrão seguro):** renderize o loader apenas quando
74
+ `NODE_ENV === "development"`.
75
+ - **Produção com dados reais:** renderize server-side apenas para papel
76
+ autorizado (owner/admin). Usuários comuns não devem baixar o chunk nem ver o
77
+ painel. O gate do runtime não protege os paths injetados pelo plugin: esses
78
+ podem ficar em chunks públicos.
64
79
 
65
- **Caveat central: React 19 removeu `_debugSource` do fiber.** O fallback interno
66
- do script não funciona em React 19 — sem plugin de build, os itens saem SEM
67
- arquivo:linha (o resto funciona: seletor, styles, HTML). Em React ≤18 o fallback
68
- existe, mas o plugin ainda é mais confiável.
80
+ ### Site sem build
69
81
 
70
- ### Next.js (webpack) — receita validada (Next 15, React 19)
82
+ Copie `node_modules/feedback-collector/dist/feedback-collector.js` para os
83
+ assets e carregue como `<script>`. O export `feedback-collector/script` aponta
84
+ para esse IIFE e a API fica em `window.FeedbackCollector`.
85
+
86
+ `node_modules/feedback-collector/src/feedback-collector.js` continua publicado
87
+ temporariamente para instalações v0.1 que acessavam o arquivo direto, mas não
88
+ deve ser usado em novas integrações.
89
+
90
+ ## Persistência v0.2
91
+
92
+ A fila atual usa `__fbc_state_v2` (`{ version: 2, items: [...] }`). Na primeira
93
+ montagem, o runtime migra o array `__fbc_items_v1` sem alterar os itens e sem
94
+ apagar a chave antiga. Não crie scripts de migração no projeto consumidor e não
95
+ limpe essas chaves durante upgrade ou remoção, salvo pedido explícito do usuário.
96
+
97
+ ## Parte 2 — source mapping
98
+
99
+ **React 19 removeu `_debugSource` do fiber.** Sem plugin, os itens não terão
100
+ arquivo:linha; seletor, styles, HTML e export continuam funcionando. Em React
101
+ 18 ou anterior há fallback legado, mas os atributos ainda são mais confiáveis.
102
+
103
+ O runtime lê `data-inspector-relative-path`, `data-inspector-line`,
104
+ `data-inspector-column` e a alternativa `data-source="arquivo:linha:coluna"`.
105
+
106
+ ### Next.js com webpack (validado em Next 15 + React 19)
71
107
 
72
108
  ```bash
73
109
  npm i -D @react-dev-inspector/babel-plugin babel-loader @babel/core @babel/preset-typescript @babel/plugin-syntax-jsx
74
110
  ```
75
111
 
76
- NÃO crie `.babelrc` (desligaria o SWC do projeto inteiro). Em vez disso, um
77
- pre-pass só do loader no `next.config.ts`:
112
+ Não crie `.babelrc`: isso desliga o SWC do projeto inteiro. Adicione apenas um
113
+ pre-pass no `next.config.ts`:
78
114
 
79
115
  ```ts
80
116
  webpack: (config, { dev }) => {
81
- if (dev) { // ver "Em produção?" abaixo antes de remover este gate
117
+ if (dev) {
82
118
  config.module.rules.unshift({
83
119
  test: /\.(jsx|tsx)$/,
84
120
  exclude: /node_modules/,
@@ -86,10 +122,14 @@ webpack: (config, { dev }) => {
86
122
  use: [{
87
123
  loader: "babel-loader",
88
124
  options: {
89
- babelrc: false, configFile: false, sourceMaps: false,
125
+ babelrc: false,
126
+ configFile: false,
127
+ sourceMaps: false,
90
128
  presets: ["@babel/preset-typescript"],
91
- // syntax-jsx só PARSEIA (SWC segue fazendo JSX→JS depois)
92
- plugins: ["@babel/plugin-syntax-jsx", "@react-dev-inspector/babel-plugin"],
129
+ plugins: [
130
+ "@babel/plugin-syntax-jsx",
131
+ "@react-dev-inspector/babel-plugin",
132
+ ],
93
133
  },
94
134
  }],
95
135
  });
@@ -98,66 +138,69 @@ webpack: (config, { dev }) => {
98
138
  },
99
139
  ```
100
140
 
101
- Armadilhas conhecidas (Babel 8): `isTSX`/`allExtensions` foram REMOVIDOS do
102
- preset-typescript — não os passe; use `@babel/plugin-syntax-jsx` pra habilitar
103
- JSX. Aplique o loader a server E client (só client causa hydration mismatch).
141
+ Não passe `isTSX`/`allExtensions`: foram removidos no Babel 8. O loader deve
142
+ rodar em server e client para evitar hydration mismatch. Se o script `dev` usa
143
+ `--turbopack`, o hook `webpack()` não roda; remova a flag ou pare e discuta uma
144
+ alternativa com o usuário.
145
+
146
+ ### Next em produção
104
147
 
105
- Se o `dev` script usa `--turbopack`: o hook `webpack()` não roda. Opções:
106
- remover a flag em dev, ou usar `experimental.swcPlugins` (abaixo).
148
+ Remover `if (dev)` é decisão explícita do usuário:
107
149
 
108
- ### Next.js — em produção?
150
+ - paths de `src/` entram nos chunks JS públicos;
151
+ - o pre-pass Babel também roda no build e aumenta seu tempo.
109
152
 
110
- Trade-offs de tirar o `if (dev)` (decisão do usuário, nunca automática):
111
- - Os paths de `src/` ficam embutidos nos chunks JS **públicos** (servidos sem
112
- auth) — vazamento de estrutura, severidade baixa mas permanente.
113
- - O build de produção passa a rodar o pre-pass Babel (mais lento).
114
- Validado em produção real (Next 15): funciona; documente o trade-off num
115
- comentário no config.
153
+ Se aprovado, documente esse trade-off ao lado do config. O gate por papel do
154
+ loader não remove os atributos dos chunks públicos.
116
155
 
117
- ### Vite (React)
156
+ ### Vite + React
118
157
 
119
158
  ```bash
120
159
  npm i -D vite-plugin-react-dev-inspector
121
160
  ```
122
- Registre o plugin no `vite.config.ts` ANTES do plugin react (ver docs do
123
- pacote). Alternativa: `@react-dev-inspector/babel-plugin` via option `babel`
124
- do `@vitejs/plugin-react`.
125
161
 
126
- ### Alternativa SWC (sem Babel)
162
+ Registre o plugin antes de `@vitejs/plugin-react`. Como alternativa, configure
163
+ `@react-dev-inspector/babel-plugin` na opção `babel` do plugin React.
164
+
165
+ ### Alternativa SWC atual
127
166
 
128
- `experimental.swcPlugins` no Next + `swc-plugin-react-source-string` injeta
129
- `data-source="arquivo:linha"`. Mantém o SWC (build rápido), MAS: experimental
130
- desde Next 12.2 (2022, verificado ainda experimental em 2026) e plugins Wasm
131
- quebram entre versões do `swc_core` do Next. Exige adaptar `getSourceInfo()` no
132
- script pra ler `data-source` além de `data-inspector-*` (~5 linhas). Só sugira
133
- se o custo do build Babel for dor explícita.
167
+ `experimental.swcPlugins` + `swc-plugin-react-source-string` injeta
168
+ `data-source`. Continua experimental e sensível à versão de `swc_core`; só use
169
+ se o custo do Babel for uma dor explícita e após aprovação do usuário.
134
170
 
135
171
  ### Vue / Svelte
136
172
 
137
- `vue-inspector` / inspector do Svelte injetam atributos análogos; hoje exige
138
- adaptar `getSourceInfo()` no script (não suportado out-of-the-box).
173
+ O runtime é agnóstico, mas uma integração de compiler validada ainda não faz
174
+ parte do package. Não adicione adapters novos automaticamente nesta etapa.
139
175
 
140
- ## Verificação (sempre faça)
176
+ ## Verificação obrigatória
141
177
 
142
- 1. `typecheck`/`lint`/`build` do projeto passam.
143
- 2. Suba o dev server, faça request numa rota e confirme no HTML SSR/DOM:
144
- `grep -o 'data-inspector-relative-path="[^"]*"' | sort -u` deve listar
145
- paths reais do projeto. Zero ocorrências = plugin não está rodando.
146
- 3. Se ligou em prod: rode o build e confirme `grep -rl data-inspector .next/static`.
147
- 4. No browser: console mostra `[feedback-collector] ativo`; ALT+hover mostra
148
- tooltip com o arquivo.
178
+ 1. Rode typecheck, lint e build do projeto consumidor.
179
+ 2. Confirme no HTML/DOM que existem paths reais:
180
+ `grep -o 'data-inspector-relative-path="[^"]*"' | sort -u`.
181
+ 3. Se habilitou em produção, procure `data-inspector` nos chunks gerados.
182
+ 4. No navegador, confirme o log `[feedback-collector] ativo`, ALT+hover com
183
+ source, ALT+clique, edição e “Copiar backlog”.
184
+ 5. Se atualizou da v0.1 com itens, confirme que o painel restaurou a fila e que
185
+ `__fbc_state_v2` foi criado; não apague `__fbc_items_v1`.
149
186
 
150
187
  ## Remoção
151
188
 
152
- Três níveis — pergunte qual o usuário quer:
189
+ Alinhe o nível antes de agir:
190
+
191
+ 1. **Desmontar em runtime:** chame `destroy()` ou remova o loader.
192
+ 2. **Desligar o painel:** remova o loader; o plugin pode continuar injetando
193
+ atributos.
194
+ 3. **Limpar o build:** reponha o gate `if (dev)` ou remova o pre-pass/plugin.
195
+ 4. **Remoção total:** remova loader, config e dependências relacionadas.
196
+
197
+ Não apague `__fbc_state_v2` nem `__fbc_items_v1` durante remoção sem autorização
198
+ explícita. Não há banco, backend ou serviço externo a limpar.
153
199
 
154
- 1. **Desligar o painel:** remova o `<FeedbackCollector />` do layout. O babel
155
- pre-pass continua (atributos ainda no bundle).
156
- 2. **Limpar o build:** re-gate o pre-pass com `if (dev)` (ou remova o bloco
157
- `webpack`) — prod volta a SWC puro, sem paths nos chunks.
158
- 3. **Remoção total:** (1) + (2) + deletar o componente loader +
159
- `npm rm feedback-collector @react-dev-inspector/babel-plugin babel-loader @babel/core @babel/preset-typescript @babel/plugin-syntax-jsx`
160
- + rebuild. Nada toca banco/auth — é tudo client-side + config de build.
200
+ ## Integração própria futura
161
201
 
162
- Os itens capturados vivem em `localStorage` (chave por origem); remover o
163
- script não apaga nada sensível.
202
+ Não implemente plugin próprio de Next/Vite durante setup de consumidor. O
203
+ desenho futuro deve preservar atributos existentes, ser opt-in, ter builds dev
204
+ e prod explícitos e provar compatibilidade/métricas antes de substituir as
205
+ receitas atuais. A proposta vive em `docs/integracao-compiler-futura.md` no repo
206
+ do package.