@basementstudio/mitt-next-plugin 0.0.0-stage → 0.1.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.
@@ -0,0 +1,365 @@
1
+ import { createHmac } from 'node:crypto';
2
+ import MagicString, {} from 'magic-string';
3
+ import { parseSync, visitorKeys } from 'oxc-parser';
4
+ // Elements that never render a box (or whose content React manages outside the host markup), so
5
+ // a pin can't land on them. `html` and `body` are tagged: they are valid fallbacks for a pin.
6
+ const SKIPPED_TAGS = new Set([
7
+ 'head',
8
+ 'script',
9
+ 'style',
10
+ 'meta',
11
+ 'link',
12
+ 'title',
13
+ 'template',
14
+ 'noscript',
15
+ 'base',
16
+ ]);
17
+ // Only characters a git SHA (plus `-dirty`) or a CI ref can contain, so the value can sit inside a
18
+ // JSX string literal without escaping.
19
+ const SAFE_COMMIT = /^[\w.-]{1,80}$/;
20
+ // Library components whose default export spreads unknown props onto a single DOM element, keyed
21
+ // by module specifier, with that element's tag: the one the widget records as the anchor's `tag`.
22
+ // Checked in Next 16.4: `next/image` and `next/legacy/image` spread `...rest` onto their `<img>`,
23
+ // `next/link` onto its `<a>`. An explicit list on purpose: an arbitrary component may drop the
24
+ // prop, or let it override a `data-fb` its own root already carries.
25
+ const FORWARDING_COMPONENTS = new Map([
26
+ ['next/image', 'img'],
27
+ ['next/image.js', 'img'],
28
+ ['next/legacy/image', 'img'],
29
+ ['next/legacy/image.js', 'img'],
30
+ ['next/link', 'a'],
31
+ ['next/link.js', 'a'],
32
+ ]);
33
+ // Cheap pre-filter: a lowercase intrinsic always starts with `<` and a lowercase letter (JSX allows
34
+ // whitespace in between), and a forwarding component needs its import. Files with neither are
35
+ // returned before paying for a parse.
36
+ const MAYBE_TAGGED = /<\s*[a-z]|['"]next\/(?:legacy\/)?(?:image|link)(?:\.js)?['"]/;
37
+ const ID_LENGTH = 12;
38
+ export function createId(secret, relPath, line, column) {
39
+ return createHmac('sha256', secret)
40
+ .update(`${relPath}:${line}:${column}`)
41
+ .digest('hex')
42
+ .slice(0, ID_LENGTH);
43
+ }
44
+ function isNode(value) {
45
+ return typeof value === 'object' && value !== null && typeof value.type === 'string';
46
+ }
47
+ function identifierName(node) {
48
+ return isNode(node) && node.type === 'Identifier' && typeof node.name === 'string'
49
+ ? node.name
50
+ : null;
51
+ }
52
+ const FUNCTION_TYPES = new Set([
53
+ 'FunctionDeclaration',
54
+ 'FunctionExpression',
55
+ 'ArrowFunctionExpression',
56
+ ]);
57
+ // The name a reader would use for the function at `ancestors[index]`, or null if it has none.
58
+ // Handles `function Foo`, `const Foo = () =>`, `const Foo = memo(() =>)`, class methods and
59
+ // `export default function () {}`.
60
+ function functionName(ancestors, index) {
61
+ const fn = ancestors[index];
62
+ if (!fn)
63
+ return null;
64
+ const own = identifierName(fn.id);
65
+ if (own)
66
+ return own;
67
+ let parentIndex = index - 1;
68
+ let parent = ancestors[parentIndex];
69
+ // Wrappers like `memo(...)` / `forwardRef(...)`: climb to whatever the call is assigned to.
70
+ while (parent?.type === 'CallExpression') {
71
+ parentIndex -= 1;
72
+ parent = ancestors[parentIndex];
73
+ }
74
+ if (!parent)
75
+ return null;
76
+ if (parent.type === 'VariableDeclarator')
77
+ return identifierName(parent.id);
78
+ if (parent.type === 'ExportDefaultDeclaration')
79
+ return 'default';
80
+ if (parent.type === 'MethodDefinition') {
81
+ const method = identifierName(parent.key);
82
+ if (!method)
83
+ return null;
84
+ // MethodDefinition sits in ClassBody, inside the class itself.
85
+ const className = identifierName(ancestors[parentIndex - 2]?.id);
86
+ return className ? `${className}.${method}` : method;
87
+ }
88
+ return null;
89
+ }
90
+ function nearestComponent(ancestors) {
91
+ for (let index = ancestors.length - 1; index >= 0; index--) {
92
+ const node = ancestors[index];
93
+ if (node && FUNCTION_TYPES.has(node.type)) {
94
+ const name = functionName(ancestors, index);
95
+ if (name)
96
+ return name;
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+ function stringValue(node) {
102
+ if (!isNode(node))
103
+ return null;
104
+ if (node.type === 'Literal')
105
+ return typeof node.value === 'string' ? node.value : null;
106
+ return identifierName(node);
107
+ }
108
+ /** Local names bound to the default export of a FORWARDING_COMPONENTS module, with their tag. */
109
+ function forwardingImports(program) {
110
+ const found = new Map();
111
+ const body = Array.isArray(program.body) ? program.body : [];
112
+ for (const statement of body) {
113
+ if (!isNode(statement) || statement.type !== 'ImportDeclaration')
114
+ continue;
115
+ if (statement.importKind === 'type')
116
+ continue;
117
+ const tag = FORWARDING_COMPONENTS.get(stringValue(statement.source) ?? '');
118
+ if (!tag || !Array.isArray(statement.specifiers))
119
+ continue;
120
+ for (const specifier of statement.specifiers) {
121
+ if (!isNode(specifier) || specifier.importKind === 'type')
122
+ continue;
123
+ const isDefault = specifier.type === 'ImportDefaultSpecifier' ||
124
+ (specifier.type === 'ImportSpecifier' && stringValue(specifier.imported) === 'default');
125
+ const local = identifierName(specifier.local);
126
+ if (isDefault && local)
127
+ found.set(local, tag);
128
+ }
129
+ }
130
+ return found;
131
+ }
132
+ function patternNames(pattern, names) {
133
+ if (!isNode(pattern))
134
+ return;
135
+ switch (pattern.type) {
136
+ case 'Identifier':
137
+ if (typeof pattern.name === 'string')
138
+ names.add(pattern.name);
139
+ return;
140
+ case 'ObjectPattern':
141
+ if (Array.isArray(pattern.properties)) {
142
+ for (const property of pattern.properties) {
143
+ if (isNode(property))
144
+ patternNames(property.type === 'Property' ? property.value : property, names);
145
+ }
146
+ }
147
+ return;
148
+ case 'ArrayPattern':
149
+ if (Array.isArray(pattern.elements))
150
+ for (const element of pattern.elements)
151
+ patternNames(element, names);
152
+ return;
153
+ case 'AssignmentPattern':
154
+ patternNames(pattern.left, names);
155
+ return;
156
+ case 'RestElement':
157
+ patternNames(pattern.argument, names);
158
+ return;
159
+ case 'TSParameterProperty':
160
+ patternNames(pattern.parameter, names);
161
+ return;
162
+ }
163
+ }
164
+ /**
165
+ * Every value name declared in the file outside its imports. No scope analysis: a name declared
166
+ * anywhere at all counts, which can only make the transform tag less, never the wrong element.
167
+ */
168
+ function declaredNames(program) {
169
+ const names = new Set();
170
+ const walk = (node) => {
171
+ if (node.type === 'ImportDeclaration')
172
+ return;
173
+ switch (node.type) {
174
+ case 'VariableDeclarator':
175
+ patternNames(node.id, names);
176
+ break;
177
+ case 'FunctionDeclaration':
178
+ case 'FunctionExpression':
179
+ case 'ArrowFunctionExpression':
180
+ patternNames(node.id, names);
181
+ if (Array.isArray(node.params))
182
+ for (const param of node.params)
183
+ patternNames(param, names);
184
+ break;
185
+ case 'ClassDeclaration':
186
+ case 'ClassExpression':
187
+ case 'TSEnumDeclaration':
188
+ case 'TSImportEqualsDeclaration':
189
+ case 'TSModuleDeclaration':
190
+ patternNames(node.id, names);
191
+ break;
192
+ case 'CatchClause':
193
+ patternNames(node.param, names);
194
+ break;
195
+ }
196
+ const keys = visitorKeys[node.type];
197
+ if (!keys)
198
+ return;
199
+ for (const key of keys) {
200
+ const child = node[key];
201
+ if (Array.isArray(child)) {
202
+ for (const item of child)
203
+ if (isNode(item))
204
+ walk(item);
205
+ }
206
+ else if (isNode(child))
207
+ walk(child);
208
+ }
209
+ };
210
+ walk(program);
211
+ return names;
212
+ }
213
+ /** The DOM tag `opening` renders, or null when it isn't one the transform tags. */
214
+ function hostTag(opening, forwarding) {
215
+ const name = opening.name;
216
+ if (!isNode(name) || name.type !== 'JSXIdentifier' || typeof name.name !== 'string')
217
+ return null;
218
+ const tag = name.name;
219
+ // Lowercase first letter is React's own rule for host elements; `Foo`, `foo.bar` and `svg:rect`
220
+ // are components or namespaced names and never reach the DOM as-is.
221
+ const first = tag.charCodeAt(0);
222
+ if (first >= 97 && first <= 122)
223
+ return tag;
224
+ const forwarded = forwarding.get(tag);
225
+ if (!forwarded)
226
+ return null;
227
+ // `<Link legacyBehavior>` clones its child instead of rendering an `<a>`, and drops its own
228
+ // props; the child is tagged on its own.
229
+ return hasAttribute(opening, 'legacyBehavior') ? null : forwarded;
230
+ }
231
+ function hasAttribute(opening, attribute) {
232
+ const attributes = opening.attributes;
233
+ if (!Array.isArray(attributes))
234
+ return false;
235
+ return attributes.some((item) => isNode(item) &&
236
+ item.type === 'JSXAttribute' &&
237
+ isNode(item.name) &&
238
+ item.name.type === 'JSXIdentifier' &&
239
+ item.name.name === attribute);
240
+ }
241
+ function lineStarts(source) {
242
+ const starts = [0];
243
+ for (let index = source.indexOf('\n'); index !== -1; index = source.indexOf('\n', index + 1)) {
244
+ starts.push(index + 1);
245
+ }
246
+ return starts;
247
+ }
248
+ function locate(starts, offset) {
249
+ let low = 0;
250
+ let high = starts.length - 1;
251
+ while (low < high) {
252
+ const mid = (low + high + 1) >> 1;
253
+ if ((starts[mid] ?? 0) <= offset)
254
+ low = mid;
255
+ else
256
+ high = mid - 1;
257
+ }
258
+ return { line: low + 1, column: offset - (starts[low] ?? 0) };
259
+ }
260
+ function langFor(relPath) {
261
+ return /\.m?jsx?$/.test(relPath) ? 'jsx' : 'tsx';
262
+ }
263
+ function unchanged(source, warning) {
264
+ return warning === undefined
265
+ ? { code: source, map: null, entries: [] }
266
+ : { code: source, map: null, entries: [], warning };
267
+ }
268
+ /**
269
+ * Injects an opaque `data-fb` ID on every lowercase host JSX element, and on the library components
270
+ * of FORWARDING_COMPONENTS (recorded with the tag they render). Pure: the same source and
271
+ * options always give the same output, which is what lets the manifest be rebuilt from git
272
+ * instead of collected from a (cached) build.
273
+ */
274
+ export function transform(source, options) {
275
+ const { relPath, secret } = options;
276
+ let warning;
277
+ let commit = null;
278
+ if (options.commit) {
279
+ if (SAFE_COMMIT.test(options.commit))
280
+ commit = options.commit;
281
+ else
282
+ warning = `[mitt] ignored an unsafe commit value for ${relPath}`;
283
+ }
284
+ if (!MAYBE_TAGGED.test(source))
285
+ return unchanged(source, warning);
286
+ let program;
287
+ try {
288
+ const result = parseSync(relPath, source, {
289
+ lang: langFor(relPath),
290
+ sourceType: 'module',
291
+ preserveParens: false,
292
+ });
293
+ if (result.errors.length > 0) {
294
+ const first = result.errors[0]?.message ?? 'unknown error';
295
+ return unchanged(source, `[mitt] skipped ${relPath}: could not parse it (${first})`);
296
+ }
297
+ program = result.program;
298
+ }
299
+ catch (error) {
300
+ const message = error instanceof Error ? error.message : String(error);
301
+ return unchanged(source, `[mitt] skipped ${relPath}: could not parse it (${message})`);
302
+ }
303
+ const s = new MagicString(source);
304
+ const entries = [];
305
+ const starts = lineStarts(source);
306
+ const ancestors = [];
307
+ const forwarding = isNode(program) ? forwardingImports(program) : new Map();
308
+ if (forwarding.size > 0 && isNode(program)) {
309
+ // A local `Image` (a parameter, a nested component) may not be next/image at all.
310
+ for (const name of declaredNames(program))
311
+ forwarding.delete(name);
312
+ }
313
+ const visitOpening = (opening) => {
314
+ const tag = hostTag(opening, forwarding);
315
+ if (!tag || SKIPPED_TAGS.has(tag))
316
+ return;
317
+ // After `<Image<Props>` type arguments, which only a component can carry.
318
+ const nameEnd = isNode(opening.typeArguments)
319
+ ? opening.typeArguments.end
320
+ : opening.name.end;
321
+ let insert = '';
322
+ if (!hasAttribute(opening, 'data-fb')) {
323
+ const { line, column } = locate(starts, opening.start);
324
+ const id = createId(secret, relPath, line, column);
325
+ entries.push({ id, file: relPath, line, column, tag, component: nearestComponent(ancestors) });
326
+ insert += ` data-fb="${id}"`;
327
+ }
328
+ if (tag === 'html' && commit && !hasAttribute(opening, 'data-fb-commit')) {
329
+ insert += ` data-fb-commit="${commit}"`;
330
+ }
331
+ if (insert)
332
+ s.appendLeft(nameEnd, insert);
333
+ };
334
+ const walk = (node) => {
335
+ if (node.type === 'JSXOpeningElement')
336
+ visitOpening(node);
337
+ const keys = visitorKeys[node.type];
338
+ if (!keys)
339
+ return;
340
+ ancestors.push(node);
341
+ for (const key of keys) {
342
+ const child = node[key];
343
+ if (Array.isArray(child)) {
344
+ for (const item of child)
345
+ if (isNode(item))
346
+ walk(item);
347
+ }
348
+ else if (isNode(child))
349
+ walk(child);
350
+ }
351
+ ancestors.pop();
352
+ };
353
+ if (isNode(program))
354
+ walk(program);
355
+ if (!s.hasChanged())
356
+ return unchanged(source, warning);
357
+ const map = options.sourceMap === false
358
+ ? null
359
+ : s.generateMap({ hires: true, source: options.mapSource ?? relPath, includeContent: true });
360
+ const result = { code: s.toString(), map, entries };
361
+ if (warning !== undefined)
362
+ result.warning = warning;
363
+ return result;
364
+ }
365
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "@basementstudio/mitt-next-plugin",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Next.js plugin for Mitt: opaque data-fb IDs at build time (Turbopack and webpack), the private manifest rebuilt from git, and a dev-only setup page.",
5
+ "license": "UNLICENSED",
6
+ "keywords": [
7
+ "mitt",
8
+ "feedback",
9
+ "nextjs",
10
+ "next-plugin",
11
+ "turbopack"
12
+ ],
13
+ "homepage": "https://github.com/basementstudio/mitt#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/basementstudio/mitt/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/basementstudio/mitt.git",
20
+ "directory": "packages/next-plugin"
21
+ },
22
+ "type": "module",
23
+ "files": [
24
+ "dist",
25
+ "LICENSE"
26
+ ],
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "default": "./dist/index.js"
31
+ },
32
+ "./loader": {
33
+ "types": "./dist/loader.d.ts",
34
+ "default": "./dist/loader.js"
35
+ },
36
+ "./manifest": {
37
+ "types": "./dist/manifest.d.ts",
38
+ "default": "./dist/manifest.js"
39
+ },
40
+ "./node": {
41
+ "types": "./dist/node.d.ts",
42
+ "default": "./dist/node.js"
43
+ },
44
+ "./package.json": "./package.json"
45
+ },
46
+ "scripts": {
47
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
48
+ "lint": "biome check .",
49
+ "typecheck": "tsc --noEmit",
50
+ "test": "vitest run"
51
+ },
52
+ "dependencies": {
53
+ "@basementstudio/mitt-shared": "0.0.0",
54
+ "magic-string": "^1.4.3",
55
+ "oxc-parser": "^0.154.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^26.6.5",
59
+ "next": "^16.4.2",
60
+ "typescript": "7.0.2",
61
+ "vitest": "^5.0.5"
62
+ },
63
+ "peerDependencies": {
64
+ "next": ">=16"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ }
69
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.