zitejs 0.9.120 → 0.9.122

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.
Files changed (45) hide show
  1. package/dist/cjs/auth/config.d.ts +3 -0
  2. package/dist/cjs/auth/config.js +7 -0
  3. package/dist/cjs/auth/index.js +30 -4
  4. package/dist/cjs/auth/useAuth.test.js +5 -19
  5. package/dist/cjs/backend/index.d.ts +30 -3
  6. package/dist/cjs/backend/index.js +2 -2
  7. package/dist/cjs/bundle/index.d.ts +1 -1
  8. package/dist/cjs/bundle/index.js +6 -2
  9. package/dist/cjs/check/index.js +5 -13
  10. package/dist/cjs/cli.js +2 -2
  11. package/dist/cjs/dev/index.js +22 -29
  12. package/dist/cjs/sourceRoots.d.ts +19 -0
  13. package/dist/cjs/sourceRoots.js +33 -0
  14. package/dist/cjs/sync/lib.js +9 -7
  15. package/dist/cjs/sync/lib.test.js +5 -0
  16. package/dist/cjs/upload/index.js +19 -0
  17. package/dist/cjs/upload/index.test.js +30 -3
  18. package/dist/cjs/vite/domTagNames.d.ts +1 -0
  19. package/dist/cjs/vite/domTagNames.js +257 -0
  20. package/dist/cjs/vite/index.js +20 -11
  21. package/dist/cjs/vite/index.test.d.ts +1 -0
  22. package/dist/cjs/vite/index.test.js +53 -0
  23. package/dist/esm/auth/config.d.ts +3 -0
  24. package/dist/esm/auth/config.js +6 -0
  25. package/dist/esm/auth/index.js +28 -2
  26. package/dist/esm/auth/useAuth.test.js +5 -19
  27. package/dist/esm/backend/index.d.ts +30 -3
  28. package/dist/esm/backend/index.js +2 -2
  29. package/dist/esm/bundle/index.d.ts +1 -1
  30. package/dist/esm/bundle/index.js +6 -2
  31. package/dist/esm/check/index.js +6 -14
  32. package/dist/esm/cli.js +2 -2
  33. package/dist/esm/dev/index.js +22 -29
  34. package/dist/esm/sourceRoots.d.ts +19 -0
  35. package/dist/esm/sourceRoots.js +28 -0
  36. package/dist/esm/sync/lib.js +9 -7
  37. package/dist/esm/sync/lib.test.js +5 -0
  38. package/dist/esm/upload/index.js +19 -0
  39. package/dist/esm/upload/index.test.js +30 -3
  40. package/dist/esm/vite/domTagNames.d.ts +1 -0
  41. package/dist/esm/vite/domTagNames.js +254 -0
  42. package/dist/esm/vite/index.js +20 -11
  43. package/dist/esm/vite/index.test.d.ts +1 -0
  44. package/dist/esm/vite/index.test.js +48 -0
  45. package/package.json +1 -1
@@ -0,0 +1,254 @@
1
+ export const domTagNames = new Set([
2
+ "a",
3
+ "abbr",
4
+ "acronym",
5
+ "address",
6
+ "altGlyph",
7
+ "altGlyphDef",
8
+ "altGlyphItem",
9
+ "animate",
10
+ "animateColor",
11
+ "animateMotion",
12
+ "animateTransform",
13
+ "annotation",
14
+ "annotation-xml",
15
+ "applet",
16
+ "area",
17
+ "article",
18
+ "aside",
19
+ "audio",
20
+ "b",
21
+ "base",
22
+ "basefont",
23
+ "bdi",
24
+ "bdo",
25
+ "bgsound",
26
+ "big",
27
+ "blink",
28
+ "blockquote",
29
+ "body",
30
+ "br",
31
+ "button",
32
+ "canvas",
33
+ "caption",
34
+ "center",
35
+ "circle",
36
+ "cite",
37
+ "clipPath",
38
+ "code",
39
+ "col",
40
+ "colgroup",
41
+ "color-profile",
42
+ "command",
43
+ "content",
44
+ "cursor",
45
+ "data",
46
+ "datalist",
47
+ "dd",
48
+ "defs",
49
+ "del",
50
+ "desc",
51
+ "details",
52
+ "dfn",
53
+ "dialog",
54
+ "dir",
55
+ "discard",
56
+ "div",
57
+ "dl",
58
+ "dt",
59
+ "ellipse",
60
+ "em",
61
+ "embed",
62
+ "feBlend",
63
+ "feColorMatrix",
64
+ "feComponentTransfer",
65
+ "feComposite",
66
+ "feConvolveMatrix",
67
+ "feDiffuseLighting",
68
+ "feDisplacementMap",
69
+ "feDistantLight",
70
+ "feDropShadow",
71
+ "feFlood",
72
+ "feFuncA",
73
+ "feFuncB",
74
+ "feFuncG",
75
+ "feFuncR",
76
+ "feGaussianBlur",
77
+ "feImage",
78
+ "feMerge",
79
+ "feMergeNode",
80
+ "feMorphology",
81
+ "feOffset",
82
+ "fePointLight",
83
+ "feSpecularLighting",
84
+ "feSpotLight",
85
+ "feTile",
86
+ "feTurbulence",
87
+ "fieldset",
88
+ "figcaption",
89
+ "figure",
90
+ "filter",
91
+ "font",
92
+ "font-face",
93
+ "font-face-format",
94
+ "font-face-name",
95
+ "font-face-src",
96
+ "font-face-uri",
97
+ "footer",
98
+ "foreignObject",
99
+ "form",
100
+ "frame",
101
+ "frameset",
102
+ "g",
103
+ "glyph",
104
+ "glyphRef",
105
+ "h1",
106
+ "h2",
107
+ "h3",
108
+ "h4",
109
+ "h5",
110
+ "h6",
111
+ "head",
112
+ "header",
113
+ "hgroup",
114
+ "hkern",
115
+ "hr",
116
+ "html",
117
+ "i",
118
+ "iframe",
119
+ "image",
120
+ "img",
121
+ "input",
122
+ "ins",
123
+ "isindex",
124
+ "kbd",
125
+ "keygen",
126
+ "label",
127
+ "legend",
128
+ "li",
129
+ "line",
130
+ "linearGradient",
131
+ "link",
132
+ "listing",
133
+ "maction",
134
+ "main",
135
+ "map",
136
+ "mark",
137
+ "marker",
138
+ "marquee",
139
+ "mask",
140
+ "math",
141
+ "menu",
142
+ "menuitem",
143
+ "merror",
144
+ "meta",
145
+ "metadata",
146
+ "meter",
147
+ "mfrac",
148
+ "mi",
149
+ "missing-glyph",
150
+ "mmultiscripts",
151
+ "mn",
152
+ "mo",
153
+ "mover",
154
+ "mpadded",
155
+ "mpath",
156
+ "mphantom",
157
+ "mprescripts",
158
+ "mroot",
159
+ "mrow",
160
+ "ms",
161
+ "mspace",
162
+ "msqrt",
163
+ "mstyle",
164
+ "msub",
165
+ "msubsup",
166
+ "msup",
167
+ "mtable",
168
+ "mtd",
169
+ "mtext",
170
+ "mtr",
171
+ "multicol",
172
+ "munder",
173
+ "munderover",
174
+ "nav",
175
+ "nextid",
176
+ "nobr",
177
+ "noembed",
178
+ "noframes",
179
+ "noscript",
180
+ "object",
181
+ "ol",
182
+ "optgroup",
183
+ "option",
184
+ "output",
185
+ "p",
186
+ "param",
187
+ "path",
188
+ "pattern",
189
+ "picture",
190
+ "plaintext",
191
+ "polygon",
192
+ "polyline",
193
+ "pre",
194
+ "progress",
195
+ "q",
196
+ "radialGradient",
197
+ "rb",
198
+ "rbc",
199
+ "rect",
200
+ "rp",
201
+ "rt",
202
+ "rtc",
203
+ "ruby",
204
+ "s",
205
+ "samp",
206
+ "script",
207
+ "search",
208
+ "section",
209
+ "select",
210
+ "semantics",
211
+ "set",
212
+ "shadow",
213
+ "slot",
214
+ "small",
215
+ "source",
216
+ "spacer",
217
+ "span",
218
+ "stop",
219
+ "strike",
220
+ "strong",
221
+ "style",
222
+ "sub",
223
+ "summary",
224
+ "sup",
225
+ "svg",
226
+ "switch",
227
+ "symbol",
228
+ "table",
229
+ "tbody",
230
+ "td",
231
+ "template",
232
+ "text",
233
+ "textPath",
234
+ "textarea",
235
+ "tfoot",
236
+ "th",
237
+ "thead",
238
+ "time",
239
+ "title",
240
+ "tr",
241
+ "track",
242
+ "tref",
243
+ "tspan",
244
+ "tt",
245
+ "u",
246
+ "ul",
247
+ "use",
248
+ "var",
249
+ "video",
250
+ "view",
251
+ "vkern",
252
+ "wbr",
253
+ "xmp",
254
+ ]);
@@ -2,7 +2,9 @@ import { parse } from "@babel/parser";
2
2
  import MagicString from "magic-string";
3
3
  import path from "path";
4
4
  import { walk } from "estree-walker";
5
+ import { domTagNames } from "./domTagNames.js";
5
6
  const validExtensions = new Set([".jsx", ".tsx"]);
7
+ const fragmentNames = new Set(["Fragment", "React.Fragment"]);
6
8
  function getComponentName(elementName) {
7
9
  if (elementName.type === "JSXIdentifier") {
8
10
  return elementName.name;
@@ -14,8 +16,17 @@ function getComponentName(elementName) {
14
16
  }
15
17
  return null;
16
18
  }
17
- function isNativeElement(name) {
18
- return /^[a-z]/.test(name) && !name.includes(".");
19
+ function classifyElement(name) {
20
+ if (fragmentNames.has(name)) {
21
+ return null;
22
+ }
23
+ if (!/^[a-z]/.test(name) || name.includes(".")) {
24
+ return "component";
25
+ }
26
+ if (domTagNames.has(name) || name.includes("-")) {
27
+ return "dom";
28
+ }
29
+ return null;
19
30
  }
20
31
  export function ziteId() {
21
32
  const cwd = process.cwd();
@@ -40,21 +51,19 @@ export function ziteId() {
40
51
  if (node.type === "JSXElement") {
41
52
  const openingElement = node.openingElement;
42
53
  const children = node.children;
43
- const elementName = openingElement.name;
44
- const isFragment = (elementName.type === "JSXMemberExpression" &&
45
- elementName.object.name === "React" &&
46
- elementName.property.name === "Fragment") ||
47
- (elementName.type === "JSXIdentifier" &&
48
- elementName.name === "Fragment");
49
- if (isFragment) {
54
+ const componentName = getComponentName(openingElement.name);
55
+ if (!componentName) {
56
+ return;
57
+ }
58
+ const kind = classifyElement(componentName);
59
+ if (!kind) {
50
60
  return;
51
61
  }
52
62
  const line = openingElement.loc?.start?.line ?? 0;
53
63
  const col = openingElement.loc?.start?.column ?? 0;
54
64
  const dataComponentId = `${relativePath}|${line}|${col}`;
55
65
  let attributes = ` data-zite-id="${dataComponentId}"`;
56
- const componentName = getComponentName(openingElement.name);
57
- if (componentName && !isNativeElement(componentName)) {
66
+ if (kind === "component") {
58
67
  attributes += ` data-zite-component="${componentName}"`;
59
68
  }
60
69
  if (children.length === 1 &&
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import path from 'path';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { ziteId } from './index.js';
4
+ async function transform(code) {
5
+ const plugin = ziteId();
6
+ const handler = plugin.transform;
7
+ const result = await handler(code, path.join(process.cwd(), 'src/App.tsx'));
8
+ if (!result) {
9
+ throw new Error('transform returned null');
10
+ }
11
+ return result.code;
12
+ }
13
+ describe('ziteId', () => {
14
+ it('tags html and svg elements without a component name', async () => {
15
+ const code = await transform('const a = <div><svg><path d="M0" /></svg><p>Hello</p></div>;');
16
+ expect(code).toContain('<div data-zite-id="src/App.tsx|1|10">');
17
+ expect(code).toContain('<svg data-zite-id="src/App.tsx|1|15">');
18
+ expect(code).toContain('<path data-zite-id="src/App.tsx|1|20" d="M0" />');
19
+ expect(code).toContain('<p data-zite-id="src/App.tsx|1|41" data-zite-editable="true">');
20
+ expect(code).not.toContain('data-zite-component');
21
+ });
22
+ it('tags components with their name', async () => {
23
+ const code = await transform('const a = <><Card /><motion.div /><_Private /></>;');
24
+ expect(code).toContain('<Card data-zite-id="src/App.tsx|1|12" data-zite-component="Card" />');
25
+ expect(code).toContain('<motion.div data-zite-id="src/App.tsx|1|20" data-zite-component="motion.div" />');
26
+ expect(code).toContain('<_Private data-zite-id="src/App.tsx|1|34" data-zite-component="_Private" />');
27
+ });
28
+ it('tags MathML elements', async () => {
29
+ const code = await transform('const a = <math><mi>x</mi></math>;');
30
+ expect(code).toBe('const a = <math data-zite-id="src/App.tsx|1|10"><mi data-zite-id="src/App.tsx|1|16" data-zite-editable="true">x</mi></math>;');
31
+ });
32
+ it('tags custom elements', async () => {
33
+ const code = await transform('const a = <my-widget />;');
34
+ expect(code).toBe('const a = <my-widget data-zite-id="src/App.tsx|1|10" />;');
35
+ });
36
+ it('leaves non-DOM intrinsic elements untouched', async () => {
37
+ const source = 'const a = <group><mesh position-x={1} /><ambientLight intensity={0.5} /></group>;';
38
+ expect(await transform(source)).toBe(source);
39
+ });
40
+ it('tags DOM elements nested inside non-DOM intrinsics', async () => {
41
+ const code = await transform('const a = <group><Html><div /></Html></group>;');
42
+ expect(code).toBe('const a = <group><Html data-zite-id="src/App.tsx|1|17" data-zite-component="Html"><div data-zite-id="src/App.tsx|1|23" /></Html></group>;');
43
+ });
44
+ it('leaves fragments untouched', async () => {
45
+ const source = 'const a = <Fragment><React.Fragment key="a" /></Fragment>;';
46
+ expect(await transform(source)).toBe(source);
47
+ });
48
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zitejs",
3
- "version": "0.9.120",
3
+ "version": "0.9.122",
4
4
  "description": "The Zite framework — build apps on Zite Database",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",