@oddsquad/vite-plugin-lit 0.2.3 → 0.3.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.
Files changed (210) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/LICENSE +28 -0
  3. package/README.md +153 -0
  4. package/bin.mjs +154 -0
  5. package/client.d.ts +61 -0
  6. package/dist/client/assets/browser-agent-rpc-BXhoSh1z-BvWe4sTJ.js +69 -0
  7. package/dist/client/assets/browser-agent-rpc-BXhoSh1z-BvWe4sTJ.js.map +1 -0
  8. package/dist/client/assets/index-CFrVgNfS.js +9740 -0
  9. package/dist/client/assets/index-CFrVgNfS.js.map +1 -0
  10. package/{panel → dist/client}/index.html +1 -0
  11. package/index.d.ts.map +1 -1
  12. package/index.js +2 -2
  13. package/index.js.map +1 -1
  14. package/lib/color-scheme.d.ts.map +1 -1
  15. package/lib/color-scheme.js +17 -21
  16. package/lib/color-scheme.js.map +1 -1
  17. package/lib/devframe/definition.d.ts +45 -0
  18. package/lib/devframe/definition.d.ts.map +1 -0
  19. package/lib/devframe/definition.js +547 -0
  20. package/lib/devframe/definition.js.map +1 -0
  21. package/lib/devframe/icon.d.ts +8 -0
  22. package/lib/devframe/icon.d.ts.map +1 -0
  23. package/lib/devframe/icon.js +21 -0
  24. package/lib/devframe/icon.js.map +1 -0
  25. package/lib/devframe/paths.d.ts +12 -0
  26. package/lib/devframe/paths.d.ts.map +1 -0
  27. package/lib/devframe/paths.js +38 -0
  28. package/lib/devframe/paths.js.map +1 -0
  29. package/lib/devframe/protocol.d.ts +218 -0
  30. package/lib/devframe/protocol.d.ts.map +1 -0
  31. package/lib/devframe/protocol.js +76 -0
  32. package/lib/devframe/protocol.js.map +1 -0
  33. package/lib/devframe/source.d.ts +49 -0
  34. package/lib/devframe/source.d.ts.map +1 -0
  35. package/lib/devframe/source.js +23 -0
  36. package/lib/devframe/source.js.map +1 -0
  37. package/lib/devframe/vite.d.ts +116 -0
  38. package/lib/devframe/vite.d.ts.map +1 -0
  39. package/lib/devframe/vite.js +291 -0
  40. package/lib/devframe/vite.js.map +1 -0
  41. package/lib/http.d.ts +29 -0
  42. package/lib/http.d.ts.map +1 -0
  43. package/lib/http.js +35 -0
  44. package/lib/http.js.map +1 -0
  45. package/lib/icons.d.ts +2 -0
  46. package/lib/icons.d.ts.map +1 -1
  47. package/lib/icons.js +10 -4
  48. package/lib/icons.js.map +1 -1
  49. package/lib/plugin.d.ts +15 -4
  50. package/lib/plugin.d.ts.map +1 -1
  51. package/lib/plugin.js +640 -574
  52. package/lib/plugin.js.map +1 -1
  53. package/lib/runtime/css.d.ts +2 -2
  54. package/lib/runtime/css.d.ts.map +1 -1
  55. package/lib/runtime/css.js +34 -34
  56. package/lib/runtime/css.js.map +1 -1
  57. package/lib/runtime/edge-panel.d.ts.map +1 -1
  58. package/lib/runtime/edge-panel.js +82 -91
  59. package/lib/runtime/edge-panel.js.map +1 -1
  60. package/lib/runtime/fonts.d.ts.map +1 -1
  61. package/lib/runtime/fonts.js +1 -1
  62. package/lib/runtime/fonts.js.map +1 -1
  63. package/lib/runtime/indicator.d.ts.map +1 -1
  64. package/lib/runtime/indicator.js +71 -74
  65. package/lib/runtime/indicator.js.map +1 -1
  66. package/lib/runtime/inspector/collect.d.ts.map +1 -1
  67. package/lib/runtime/inspector/collect.js +83 -90
  68. package/lib/runtime/inspector/collect.js.map +1 -1
  69. package/lib/runtime/inspector/highlight.d.ts +16 -0
  70. package/lib/runtime/inspector/highlight.d.ts.map +1 -0
  71. package/lib/runtime/inspector/highlight.js +66 -0
  72. package/lib/runtime/inspector/highlight.js.map +1 -0
  73. package/lib/runtime/inspector/install.d.ts.map +1 -1
  74. package/lib/runtime/inspector/install.js +180 -205
  75. package/lib/runtime/inspector/install.js.map +1 -1
  76. package/lib/runtime/inspector/serialize.d.ts.map +1 -1
  77. package/lib/runtime/inspector/serialize.js +86 -107
  78. package/lib/runtime/inspector/serialize.js.map +1 -1
  79. package/lib/runtime/intern.d.ts.map +1 -1
  80. package/lib/runtime/intern.js +31 -29
  81. package/lib/runtime/intern.js.map +1 -1
  82. package/lib/runtime/overrides.d.ts.map +1 -1
  83. package/lib/runtime/overrides.js +14 -13
  84. package/lib/runtime/overrides.js.map +1 -1
  85. package/lib/runtime/patch.d.ts +8 -0
  86. package/lib/runtime/patch.d.ts.map +1 -1
  87. package/lib/runtime/patch.js +321 -282
  88. package/lib/runtime/patch.js.map +1 -1
  89. package/lib/runtime/source-meta.d.ts.map +1 -1
  90. package/lib/runtime/source-meta.js +1 -1
  91. package/lib/runtime/source-meta.js.map +1 -1
  92. package/lib/runtime/source-overlay/editors.d.ts.map +1 -1
  93. package/lib/runtime/source-overlay/editors.js +27 -27
  94. package/lib/runtime/source-overlay/editors.js.map +1 -1
  95. package/lib/runtime/source-overlay/mask-path.d.ts.map +1 -1
  96. package/lib/runtime/source-overlay/mask-path.js +15 -15
  97. package/lib/runtime/source-overlay/mask-path.js.map +1 -1
  98. package/lib/runtime/source-overlay/overlay-element.d.ts.map +1 -1
  99. package/lib/runtime/source-overlay/overlay-element.js +347 -356
  100. package/lib/runtime/source-overlay/overlay-element.js.map +1 -1
  101. package/lib/runtime/source-overlay/source-host.d.ts.map +1 -1
  102. package/lib/runtime/source-overlay/source-host.js +64 -71
  103. package/lib/runtime/source-overlay/source-host.js.map +1 -1
  104. package/lib/runtime/source-overlay/template.d.ts.map +1 -1
  105. package/lib/runtime/source-overlay/template.js +3 -3
  106. package/lib/runtime/source-overlay/template.js.map +1 -1
  107. package/lib/runtime/source-overlay.d.ts.map +1 -1
  108. package/lib/runtime/source-overlay.js +5 -2
  109. package/lib/runtime/source-overlay.js.map +1 -1
  110. package/lib/runtime/timeline/clock.d.ts.map +1 -1
  111. package/lib/runtime/timeline/clock.js +2 -2
  112. package/lib/runtime/timeline/clock.js.map +1 -1
  113. package/lib/runtime/timeline/flash.d.ts +39 -0
  114. package/lib/runtime/timeline/flash.d.ts.map +1 -0
  115. package/lib/runtime/timeline/flash.js +169 -0
  116. package/lib/runtime/timeline/flash.js.map +1 -0
  117. package/lib/runtime/timeline/identity.d.ts.map +1 -1
  118. package/lib/runtime/timeline/identity.js +27 -27
  119. package/lib/runtime/timeline/identity.js.map +1 -1
  120. package/lib/runtime/timeline/input.d.ts.map +1 -1
  121. package/lib/runtime/timeline/input.js +54 -67
  122. package/lib/runtime/timeline/input.js.map +1 -1
  123. package/lib/runtime/timeline/install.d.ts.map +1 -1
  124. package/lib/runtime/timeline/install.js +38 -29
  125. package/lib/runtime/timeline/install.js.map +1 -1
  126. package/lib/runtime/timeline/lifecycle.d.ts +8 -0
  127. package/lib/runtime/timeline/lifecycle.d.ts.map +1 -1
  128. package/lib/runtime/timeline/lifecycle.js +149 -133
  129. package/lib/runtime/timeline/lifecycle.js.map +1 -1
  130. package/lib/runtime/timeline/public-api.d.ts.map +1 -1
  131. package/lib/runtime/timeline/public-api.js +9 -9
  132. package/lib/runtime/timeline/public-api.js.map +1 -1
  133. package/lib/runtime/timeline/render.d.ts.map +1 -1
  134. package/lib/runtime/timeline/render.js +70 -75
  135. package/lib/runtime/timeline/render.js.map +1 -1
  136. package/lib/runtime/timeline/transport.d.ts.map +1 -1
  137. package/lib/runtime/timeline/transport.js +39 -43
  138. package/lib/runtime/timeline/transport.js.map +1 -1
  139. package/lib/segmented-tabs.d.ts +3 -1
  140. package/lib/segmented-tabs.d.ts.map +1 -1
  141. package/lib/segmented-tabs.js +136 -107
  142. package/lib/segmented-tabs.js.map +1 -1
  143. package/lib/snapshot.d.ts +28 -0
  144. package/lib/snapshot.d.ts.map +1 -0
  145. package/lib/snapshot.js +57 -0
  146. package/lib/snapshot.js.map +1 -0
  147. package/lib/source-meta.d.ts.map +1 -1
  148. package/lib/source-meta.js +176 -162
  149. package/lib/source-meta.js.map +1 -1
  150. package/lib/timeline/derive.d.ts +152 -0
  151. package/lib/timeline/derive.d.ts.map +1 -0
  152. package/lib/timeline/derive.js +242 -0
  153. package/lib/timeline/derive.js.map +1 -0
  154. package/lib/timeline-plugin.d.ts.map +1 -1
  155. package/lib/timeline-plugin.js +304 -321
  156. package/lib/timeline-plugin.js.map +1 -1
  157. package/lib/tokens.d.ts.map +1 -1
  158. package/lib/tokens.js +17 -18
  159. package/lib/tokens.js.map +1 -1
  160. package/lib/transform.d.ts.map +1 -1
  161. package/lib/transform.js +62 -57
  162. package/lib/transform.js.map +1 -1
  163. package/lib/types.d.ts.map +1 -1
  164. package/lib/types.js +1 -1
  165. package/lib/types.js.map +1 -1
  166. package/lib/wrap-table.d.ts.map +1 -1
  167. package/lib/wrap-table.js +19 -17
  168. package/lib/wrap-table.js.map +1 -1
  169. package/package.json +77 -13
  170. package/types/hmr-incompatibility.d.ts +59 -0
  171. package/types/hmr-incompatibility.d.ts.map +1 -0
  172. package/types/hmr-incompatibility.js +30 -0
  173. package/types/hmr-incompatibility.js.map +1 -0
  174. package/types/in-page.d.ts +49 -0
  175. package/types/in-page.d.ts.map +1 -0
  176. package/types/in-page.js +33 -0
  177. package/types/in-page.js.map +1 -0
  178. package/types/inspector.d.ts.map +1 -1
  179. package/types/inspector.js.map +1 -1
  180. package/types/snapshot.d.ts +44 -0
  181. package/types/snapshot.d.ts.map +1 -0
  182. package/types/snapshot.js +7 -0
  183. package/types/snapshot.js.map +1 -0
  184. package/types/timeline.d.ts +11 -0
  185. package/types/timeline.d.ts.map +1 -1
  186. package/types/timeline.js.map +1 -1
  187. package/panel/components-view.d.ts +0 -60
  188. package/panel/components-view.d.ts.map +0 -1
  189. package/panel/components-view.js +0 -587
  190. package/panel/components-view.js.map +0 -1
  191. package/panel/devtools-settings.d.ts +0 -41
  192. package/panel/devtools-settings.d.ts.map +0 -1
  193. package/panel/devtools-settings.js +0 -463
  194. package/panel/devtools-settings.js.map +0 -1
  195. package/panel/lit-devtools-panel.d.ts +0 -37
  196. package/panel/lit-devtools-panel.d.ts.map +0 -1
  197. package/panel/lit-devtools-panel.js +0 -185
  198. package/panel/lit-devtools-panel.js.map +0 -1
  199. package/panel/timeline-event-list.d.ts +0 -43
  200. package/panel/timeline-event-list.d.ts.map +0 -1
  201. package/panel/timeline-event-list.js +0 -416
  202. package/panel/timeline-event-list.js.map +0 -1
  203. package/panel/timeline-layers.d.ts +0 -25
  204. package/panel/timeline-layers.d.ts.map +0 -1
  205. package/panel/timeline-layers.js +0 -96
  206. package/panel/timeline-layers.js.map +0 -1
  207. package/panel/timeline-view.d.ts +0 -38
  208. package/panel/timeline-view.d.ts.map +0 -1
  209. package/panel/timeline-view.js +0 -234
  210. package/panel/timeline-view.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"timeline-plugin.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/timeline-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {existsSync} from 'node:fs';\nimport {readFile} from 'node:fs/promises';\nimport {join} from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {Plugin, ViteDevServer} from 'vite';\nimport {\n SETTINGS_OVERRIDE_CHANNEL,\n type FeatureSettings,\n type SettingsOverride,\n type TimelineEvent,\n type TimelineLayer,\n} from '../types/timeline.js';\nimport {\n INSPECT_CMD_CHANNEL,\n INSPECT_DATA_CHANNEL,\n INSPECT_OVERLAY_TOGGLE_CHANNEL,\n INSPECT_PATH,\n INSPECT_SSE_EVENT,\n type InspectorCommand,\n type InspectorMessage,\n} from '../types/inspector.js';\n\n// ---------------------------------------------------------------------------\n// Minimal type shims for the @vitejs/devtools-kit surface we use.\n// These are structurally compatible with the real types; we duck-type against\n// the context object passed by @vitejs/devtools' devtools.setup hook.\n// Install @vitejs/devtools-kit as a peer dep to get the real declarations.\n// ---------------------------------------------------------------------------\n\ninterface DockEntry {\n id: string;\n type: 'iframe';\n title: string;\n icon: string;\n url: string;\n category?: string;\n}\n\ninterface RpcFn {\n name: string;\n type?: string;\n handler?: (...args: unknown[]) => unknown;\n}\n\n/** Subset of @devframes/hub's command-input we register. */\ninterface CommandInput {\n id: string;\n title: string;\n description?: string;\n icon?: string;\n category?: string;\n keybindings?: Array<{key: string}>;\n handler?: (...args: unknown[]) => unknown;\n}\n\ninterface TimelineCtx {\n docks: {register: (entry: DockEntry) => unknown};\n commands?: {register: (command: CommandInput) => unknown};\n rpc: {\n register: (fn: RpcFn) => void;\n functions?: Record<string, (...args: unknown[]) => unknown>;\n };\n views: {hostStatic: (baseUrl: string, distDir: string) => void};\n viteServer?: {\n middlewares: {\n use: (\n path: string,\n handler: (\n req: {url?: string},\n res: {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n end: (body: string) => void;\n },\n next: () => void\n ) => void\n ) => void;\n };\n };\n viteConfig?: {root: string};\n}\n\n// Augment Vite's Plugin interface to accept the devtools hook without\n// requiring @vitejs/devtools-kit as a direct dep of this package.\ndeclare module 'vite' {\n interface Plugin {\n devtools?: {\n capabilities?: unknown;\n setup: (ctx: TimelineCtx) => void | Promise<void>;\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// SSE push channel — streams batches of TimelineEvents from the server to\n// the panel iframe. The panel subscribes to /__lit-devtools-events using the\n// native EventSource API; the browser runtime pushes events via Vite HMR.\n// ---------------------------------------------------------------------------\n\nconst PANEL_PATH = '/__lit-devtools';\nconst SSE_PATH = '/__lit-devtools-events';\nconst CONTROL_PATH = '/__lit-devtools-control';\n/** Read-only feature settings consumed by the panel's Settings tab. */\nconst SETTINGS_PATH = '/__lit-devtools-settings';\n\n// The official Lit logo mark (Iconify `logos:lit-icon`). Its native viewBox is\n// 256×320 — taller than wide — so when the DevTools dock sizes an icon to its\n// width it overflowed the square slot and looked bigger than the other icons.\n// We pad it to a square viewBox (-32 0 320 320, centering the 256-wide art) so\n// it renders at the same box size as the built-in phosphor icons. Inlined as a\n// data: URI rather than `logos:lit-icon` so it also works offline (no Iconify\n// API fetch).\nconst LIT_LOGO_SVG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-32 0 320 320\">' +\n '<path fill=\"#00e8ff\" d=\"m64 192l25.926-44.727l38.233-19.114l63.974 63.974l10.833 61.754L192 320l-64-64l-38.074-25.615z\"/>' +\n '<path fill=\"#283198\" d=\"M128 256V128l64-64v128zM0 256l64 64l9.202-60.602L64 192l-37.542 23.71z\"/>' +\n '<path fill=\"#324fff\" d=\"M64 192V64l64-64v128zm128 128V192l64-64v128zM0 256V128l64 64z\"/>' +\n '<path fill=\"#0ff\" d=\"M64 320V192l64 64z\"/></svg>';\nconst LIT_LOGO_ICON = `data:image/svg+xml,${encodeURIComponent(LIT_LOGO_SVG)}`;\n\ninterface PanelPaths {\n /** Directory that contains index.html. */\n htmlDir: string;\n /** Absolute path to the panel entry module (.ts in dev, .js in published). */\n appModule: string;\n}\n\n/**\n * Resolves the panel files, checking the compiled output first (`panel/`) then\n * the TypeScript source (`src/panel/`). In dev, the source `.ts` file is\n * served via Vite's /@fs/ handler so TypeScript is compiled on the fly.\n */\nconst resolvePanel = (): PanelPaths => {\n for (const [htmlRel, appRel] of [\n ['../panel/index.html', '../panel/lit-devtools-panel.js'],\n ['../src/panel/index.html', '../src/panel/lit-devtools-panel.ts'],\n ] as const) {\n const htmlUrl = new URL(htmlRel, import.meta.url);\n if (existsSync(htmlUrl)) {\n const htmlDir = fileURLToPath(new URL('.', htmlUrl));\n const appModule = fileURLToPath(new URL(appRel, import.meta.url));\n return {htmlDir, appModule};\n }\n }\n throw new Error('[lit-plugin:timeline] panel directory not found');\n};\n\n/** Subset of Node's readable-stream `on` used to collect a request body. */\ntype ReadableOn = (event: string, handler: (chunk: Buffer) => void) => void;\n\n/**\n * Reads and JSON-parses a request body, invoking `done` with the parsed object\n * (or `null` on a malformed/empty body). Used by the control + settings POST\n * endpoints.\n */\nconst readJsonBody = (\n req: {on?: ReadableOn},\n done: (body: Record<string, unknown> | null) => void\n): void => {\n const chunks: Buffer[] = [];\n req.on?.('data', (chunk) => chunks.push(chunk));\n req.on?.('end', () => {\n try {\n done(\n JSON.parse(Buffer.concat(chunks).toString()) as Record<string, unknown>\n );\n } catch {\n done(null);\n }\n });\n};\n\n/** True when the request carries no `Origin` or one whose host matches the\n * dev-server `Host`. These endpoints drive local dev tooling and (for SSE)\n * carry source paths and inspected element data, so we reject cross-origin\n * callers — a page the developer happens to visit — rather than opening them\n * up with wildcard CORS. */\nconst isSameOrigin = (headers: {origin?: string; host?: string}): boolean => {\n const {origin, host} = headers;\n if (origin === undefined || origin === 'null') return true;\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n};\n\n/** Minimal typing for Node's ServerResponse (already fully typed by `node:http`\n * but we want to avoid pulling in @types/node in a browser runtime module). */\ntype SseClient = {\n write: (chunk: string) => boolean;\n on: (event: string, listener: () => void) => void;\n socket?: {destroyed?: boolean} | null;\n};\n\nconst installSseMiddleware = (\n server: ViteDevServer,\n clients: Set<SseClient>,\n onConnect?: (client: SseClient) => void\n): void => {\n server.middlewares.use(\n SSE_PATH,\n (\n req: {method?: string; headers?: {origin?: string; host?: string}},\n res: SseClient & {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n flushHeaders?: () => void;\n end?: (body?: string) => void;\n },\n next: () => void\n ) => {\n if (req.method !== 'GET') {\n next();\n return;\n }\n if (!isSameOrigin(req.headers ?? {})) {\n res.statusCode = 403;\n res.end?.('forbidden');\n return;\n }\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders?.();\n res.write(':\\n\\n'); // keep-alive comment\n\n clients.add(res);\n res.on('close', () => clients.delete(res));\n // Replay a just-emitted overlay pick to a panel that connects right after\n // it (the cold-start case: picking an element opens the dock, but the\n // panel iframe subscribes here only after the `pick` was already\n // broadcast to zero clients). See `pendingPick` in `litTimelinePlugin`.\n onConnect?.(res);\n }\n );\n};\n\n/** How long a pending overlay pick stays replayable to a freshly-connected\n * panel. Long enough to cover the dock iframe mounting + subscribing, short\n * enough that an unrelated later reconnect won't resurrect a stale selection. */\nconst PICK_REPLAY_WINDOW_MS = 3000;\n\nexport const litTimelinePlugin = (\n getSettings?: () => FeatureSettings | undefined\n): Plugin => {\n const sseClients = new Set<SseClient>();\n // Captured in configureServer so the (server-side) DevTools command handler\n // can broadcast to the app runtime; it only runs after the server is up.\n let devServer: ViteDevServer | undefined;\n // The most recent overlay `pick`, framed as an SSE payload, kept briefly so a\n // panel that mounts in response to the pick (cold start) still receives it.\n let pendingPick: {payload: string; expires: number} | null = null;\n\n /** Write a pre-framed SSE payload to every client, pruning dead sockets. */\n const broadcast = (payload: string): void => {\n for (const client of sseClients) {\n try {\n client.write(payload);\n } catch {\n sseClients.delete(client);\n }\n }\n };\n\n /** Push a batch of events to all subscribed panel SSE clients. */\n const pushToPanel = (events: TimelineEvent[]): void => {\n if (sseClients.size === 0 || events.length === 0) return;\n broadcast(`data: ${JSON.stringify(events)}\\n\\n`);\n };\n\n /** Push a named SSE event (the panel listens via `addEventListener(name)`). */\n const pushEvent = (name: string, data: unknown): void => {\n if (sseClients.size === 0) return;\n broadcast(`event: ${name}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n };\n\n return {\n name: 'lit-devtools',\n apply: 'serve',\n\n configureServer(server) {\n devServer = server;\n // SSE endpoint: panel iframe subscribes here for event push. A client that\n // connects within the replay window gets the pending pick replayed.\n installSseMiddleware(server, sseClients, (client) => {\n if (pendingPick === null) return;\n if (Date.now() >= pendingPick.expires) {\n pendingPick = null;\n return;\n }\n // Replay to every client connecting within the window, not just the\n // first: the panel opens two SSE subscriptions (components-view and\n // timeline-view) and only components-view acts on `pick`. A one-shot\n // replay could land on timeline-view and be dropped. Replaying to all\n // is safe — timeline-view ignores the event, and components-view's\n // selection is idempotent. The pick clears on expiry, below.\n try {\n client.write(pendingPick.payload);\n } catch {\n // Socket already gone — nothing to replay to.\n }\n });\n\n // Settings endpoint. GET returns the resolved feature settings (the\n // baseline the panel renders). POST carries a SettingsOverride which we\n // rebroadcast to the app runtime via HMR so it takes effect live.\n server.middlewares.use(\n SETTINGS_PATH,\n (\n req: {\n method?: string;\n on?: ReadableOn;\n headers?: {origin?: string; host?: string};\n },\n res: {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n end: (body?: string) => void;\n },\n next: () => void\n ) => {\n if (!isSameOrigin(req.headers ?? {})) {\n res.statusCode = 403;\n res.end('forbidden');\n return;\n }\n if (req.method === 'GET') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json; charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache');\n res.end(JSON.stringify(getSettings?.() ?? null));\n return;\n }\n if (req.method === 'POST') {\n readJsonBody(req, (body) => {\n if (body !== null) {\n server.hot.send(\n SETTINGS_OVERRIDE_CHANNEL,\n body as SettingsOverride\n );\n }\n res.statusCode = 204;\n res.end();\n });\n return;\n }\n next();\n }\n );\n\n // Serve the panel HTML with the Lit SPA entry injected via /@fs/ so\n // Vite can transform the TypeScript source on the fly.\n let panel: PanelPaths | undefined;\n try {\n panel = resolvePanel();\n } catch (e) {\n console.warn(String(e));\n }\n\n if (panel !== undefined) {\n const {htmlDir, appModule} = panel;\n server.middlewares.use(\n PANEL_PATH,\n async (\n req: {url?: string},\n res: {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n end: (body: string) => void;\n },\n next: () => void\n ) => {\n const url = req.url ?? '/';\n if (url !== '/' && url !== '' && url !== '/index.html') {\n next();\n return;\n }\n let html: string;\n try {\n html = await readFile(join(htmlDir, 'index.html'), 'utf-8');\n } catch {\n next();\n return;\n }\n // Inject the panel entry as a /@fs/ module so Vite's transform\n // pipeline compiles TypeScript and resolves bare specifiers (lit, etc).\n const scriptTag = ` <script type=\"module\" src=\"/@fs${appModule}\"></script>\\n`;\n html = html.replace('</body>', scriptTag + '</body>');\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(html);\n }\n );\n }\n\n // Control endpoint: the panel POSTs recording/layer state changes here.\n // The server rebroadcasts the state to all connected app tabs via HMR.\n server.middlewares.use(CONTROL_PATH, (req, res, next) => {\n const method = (req as {method?: string}).method;\n if (method !== 'POST') {\n next();\n return;\n }\n const r403 = res as {statusCode: number; end: (body?: string) => void};\n if (\n !isSameOrigin(\n (req as {headers?: {origin?: string; host?: string}}).headers ?? {}\n )\n ) {\n r403.statusCode = 403;\n r403.end('forbidden');\n return;\n }\n readJsonBody(req as {on?: ReadableOn}, (body) => {\n if (body !== null) {\n if (typeof body.recording === 'boolean') {\n server.hot.send('lit:timeline:recording-changed', {\n recording: body.recording,\n });\n }\n const layerKeys = [\n 'litLifecycleEnabled',\n 'litRenderEnabled',\n 'mouseEventEnabled',\n 'keyboardEventEnabled',\n ] as const;\n const layersUpdate: Record<string, boolean> = {};\n for (const key of layerKeys) {\n if (typeof body[key] === 'boolean') {\n layersUpdate[key] = body[key] as boolean;\n }\n }\n if (Object.keys(layersUpdate).length > 0) {\n server.hot.send('lit:timeline:layers-changed', layersUpdate);\n }\n }\n const r = res as {statusCode: number; end: () => void};\n r.statusCode = 204;\n r.end();\n });\n });\n\n // Accept batches of events from the browser runtime via Vite HMR.\n server.hot.on(\n 'lit:timeline:push-event',\n (data: {events?: TimelineEvent[]}) => {\n pushToPanel(data.events ?? []);\n }\n );\n\n // Legacy: panel postMessage → devtools shell → server (keep for compat).\n server.hot.on(\n 'lit:timeline:set-recording',\n (data: {recording: boolean}) => {\n server.hot.send('lit:timeline:recording-changed', {\n recording: data.recording,\n });\n }\n );\n\n // Custom layer announced by app code via addTimelineLayer().\n // Forward to the panel as a named SSE event so it can add the layer.\n server.hot.on(\n 'lit:timeline:custom-layer',\n (data: {layer: TimelineLayer}) => {\n if (!data.layer?.id) return;\n pushEvent('layer', data.layer);\n }\n );\n\n // Components inspector. The panel POSTs an InspectorCommand here; we\n // forward it to the app runtime over HMR. The runtime answers over\n // INSPECT_DATA_CHANNEL, which we relay to the panel as a named SSE event.\n server.middlewares.use(INSPECT_PATH, (req, res, next) => {\n const method = (req as {method?: string}).method;\n if (method !== 'POST') {\n next();\n return;\n }\n const r403 = res as {statusCode: number; end: (body?: string) => void};\n if (\n !isSameOrigin(\n (req as {headers?: {origin?: string; host?: string}}).headers ?? {}\n )\n ) {\n r403.statusCode = 403;\n r403.end('forbidden');\n return;\n }\n readJsonBody(req as {on?: ReadableOn}, (body) => {\n if (body !== null) {\n // \"Pick\" starts the overlay's inspect picker (a server-side toggle),\n // not a runtime query, so it's routed to the overlay channel.\n if ((body as InspectorCommand).type === 'pick') {\n server.hot.send(INSPECT_OVERLAY_TOGGLE_CHANNEL);\n } else {\n server.hot.send(INSPECT_CMD_CHANNEL, body as InspectorCommand);\n }\n }\n const r = res as {statusCode: number; end: () => void};\n r.statusCode = 204;\n r.end();\n });\n });\n\n server.hot.on(INSPECT_DATA_CHANNEL, (data: InspectorMessage) => {\n // Remember overlay picks so a cold-started panel (opened by the pick\n // itself) can replay it on connect — see `pendingPick`.\n if (data.type === 'pick') {\n pendingPick = {\n payload: `event: ${INSPECT_SSE_EVENT}\\ndata: ${JSON.stringify(data)}\\n\\n`,\n expires: Date.now() + PICK_REPLAY_WINDOW_MS,\n };\n }\n pushEvent(INSPECT_SSE_EVENT, data);\n });\n },\n\n devtools: {\n setup(ctx: TimelineCtx) {\n // Register the dock entry. HTML is served by the configureServer\n // middleware above (with /@fs/ injection); hostStatic is not used.\n ctx.docks.register({\n id: 'lit-devtools',\n type: 'iframe',\n // This dock represents the whole Lit plugin (HMR, source overlay,\n // timeline), so it's branded \"Lit\" rather than the timeline panel\n // it currently opens.\n title: 'Lit',\n // Square, inlined Lit logo — see LIT_LOGO_ICON above. DevTools renders\n // a `data:` icon directly as an <img>, no Iconify API fetch.\n icon: LIT_LOGO_ICON,\n url: PANEL_PATH + '/',\n category: 'framework',\n });\n\n // Register the overlay toggle as a DevTools command so it shows in the\n // command palette and as a managed shortcut. The handler runs\n // server-side; it broadcasts to the app runtime, which toggles the\n // overlay. Only meaningful when the overlay is enabled.\n const so = getSettings?.()?.sourceOverlay;\n if (so?.enabled && ctx.commands?.register) {\n ctx.commands.register({\n id: 'lit:overlay:toggle',\n title: 'Pick Lit Element',\n description:\n 'Click to inspect in the Components panel, hold Meta/Ctrl and click to open in your editor',\n icon: 'ph:crosshair-duotone',\n category: 'Lit',\n keybindings: [{key: 'Meta+Shift+E'}],\n handler: () => devServer?.hot.send(INSPECT_OVERLAY_TOGGLE_CHANNEL),\n });\n }\n },\n },\n };\n};\n"]}
1
+ {"version":3,"file":"timeline-plugin.js","sourceRoot":"","sources":["../src/lib/timeline-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {existsSync} from 'node:fs';\nimport {readFile} from 'node:fs/promises';\nimport {join} from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {Plugin, ViteDevServer} from 'vite';\nimport {isTrustedRequest, type TrustHeaders} from './http.js';\nimport {\n SETTINGS_OVERRIDE_CHANNEL,\n type FeatureSettings,\n type SettingsOverride,\n type TimelineEvent,\n type TimelineLayer,\n} from '../types/timeline.js';\nimport {\n INSPECT_CMD_CHANNEL,\n INSPECT_DATA_CHANNEL,\n INSPECT_OVERLAY_TOGGLE_CHANNEL,\n INSPECT_PATH,\n INSPECT_SSE_EVENT,\n type InspectorCommand,\n type InspectorMessage,\n} from '../types/inspector.js';\n\n// ---------------------------------------------------------------------------\n// Minimal type shims for the @vitejs/devtools-kit surface we use.\n// These are structurally compatible with the real types; we duck-type against\n// the context object passed by @vitejs/devtools' devtools.setup hook.\n// Install @vitejs/devtools-kit as a peer dep to get the real declarations.\n// ---------------------------------------------------------------------------\n\ninterface DockEntry {\n id: string;\n type: 'iframe';\n title: string;\n icon: string;\n url: string;\n category?: string;\n}\n\ninterface RpcFn {\n name: string;\n type?: string;\n handler?: (...args: unknown[]) => unknown;\n}\n\n/** Subset of @devframes/hub's command-input we register. */\ninterface CommandInput {\n id: string;\n title: string;\n description?: string;\n icon?: string;\n category?: string;\n keybindings?: Array<{key: string}>;\n handler?: (...args: unknown[]) => unknown;\n}\n\ninterface TimelineCtx {\n docks: {register: (entry: DockEntry) => unknown};\n commands?: {register: (command: CommandInput) => unknown};\n rpc: {\n register: (fn: RpcFn) => void;\n functions?: Record<string, (...args: unknown[]) => unknown>;\n };\n views: {hostStatic: (baseUrl: string, distDir: string) => void};\n viteServer?: {\n middlewares: {\n use: (\n path: string,\n handler: (\n req: {url?: string},\n res: {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n end: (body: string) => void;\n },\n next: () => void\n ) => void\n ) => void;\n };\n };\n viteConfig?: {root: string};\n}\n\n// Augment Vite's Plugin interface to accept the devtools hook without\n// requiring @vitejs/devtools-kit as a direct dep of this package.\ndeclare module 'vite' {\n interface Plugin {\n devtools?: {\n capabilities?: unknown;\n setup: (ctx: TimelineCtx) => void | Promise<void>;\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// SSE push channel — streams batches of TimelineEvents from the server to\n// the panel iframe. The panel subscribes to /__lit-devtools-events using the\n// native EventSource API; the browser runtime pushes events via Vite HMR.\n// ---------------------------------------------------------------------------\n\nconst PANEL_PATH = '/__lit-devtools';\nconst SSE_PATH = '/__lit-devtools-events';\nconst CONTROL_PATH = '/__lit-devtools-control';\n/** Read-only feature settings consumed by the panel's Settings tab. */\nconst SETTINGS_PATH = '/__lit-devtools-settings';\n\n// The official Lit logo mark (Iconify `logos:lit-icon`). Its native viewBox is\n// 256×320 — taller than wide — so when the DevTools dock sizes an icon to its\n// width it overflowed the square slot and looked bigger than the other icons.\n// We pad it to a square viewBox (-32 0 320 320, centering the 256-wide art) so\n// it renders at the same box size as the built-in phosphor icons. Inlined as a\n// data: URI rather than `logos:lit-icon` so it also works offline (no Iconify\n// API fetch).\nconst LIT_LOGO_SVG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-32 0 320 320\">' +\n '<path fill=\"#00e8ff\" d=\"m64 192l25.926-44.727l38.233-19.114l63.974 63.974l10.833 61.754L192 320l-64-64l-38.074-25.615z\"/>' +\n '<path fill=\"#283198\" d=\"M128 256V128l64-64v128zM0 256l64 64l9.202-60.602L64 192l-37.542 23.71z\"/>' +\n '<path fill=\"#324fff\" d=\"M64 192V64l64-64v128zm128 128V192l64-64v128zM0 256V128l64 64z\"/>' +\n '<path fill=\"#0ff\" d=\"M64 320V192l64 64z\"/></svg>';\nconst LIT_LOGO_ICON = `data:image/svg+xml,${encodeURIComponent(LIT_LOGO_SVG)}`;\n\ninterface PanelPaths {\n /** Directory that contains index.html. */\n htmlDir: string;\n /** Absolute path to the panel entry module (.ts in dev, .js in published). */\n appModule: string;\n}\n\n/**\n * Resolves the panel files, checking the compiled output first (`panel/`) then\n * the TypeScript source (`src/panel/`). In dev, the source `.ts` file is\n * served via Vite's /@fs/ handler so TypeScript is compiled on the fly.\n */\nconst resolvePanel = (): PanelPaths => {\n for (const [htmlRel, appRel] of [\n ['../panel/index.html', '../panel/lit-devtools-panel.js'],\n ['../src/panel/index.html', '../src/panel/lit-devtools-panel.ts'],\n ] as const) {\n const htmlUrl = new URL(htmlRel, import.meta.url);\n if (existsSync(htmlUrl)) {\n const htmlDir = fileURLToPath(new URL('.', htmlUrl));\n const appModule = fileURLToPath(new URL(appRel, import.meta.url));\n return {htmlDir, appModule};\n }\n }\n throw new Error('[lit-plugin:timeline] panel directory not found');\n};\n\n/** Subset of Node's readable-stream `on` used to collect a request body. */\ntype ReadableOn = (event: string, handler: (chunk: Buffer) => void) => void;\n\n/**\n * Reads and JSON-parses a request body, invoking `done` with the parsed object\n * (or `null` on a malformed/empty body). Used by the control + settings POST\n * endpoints.\n */\nconst readJsonBody = (\n req: {on?: ReadableOn},\n done: (body: Record<string, unknown> | null) => void\n): void => {\n const chunks: Buffer[] = [];\n req.on?.('data', (chunk) => chunks.push(chunk));\n req.on?.('end', () => {\n try {\n done(\n JSON.parse(Buffer.concat(chunks).toString()) as Record<string, unknown>\n );\n } catch {\n done(null);\n }\n });\n};\n\n/** Minimal typing for Node's ServerResponse (already fully typed by `node:http`\n * but we want to avoid pulling in @types/node in a browser runtime module). */\ntype SseClient = {\n write: (chunk: string) => boolean;\n on: (event: string, listener: () => void) => void;\n socket?: {destroyed?: boolean} | null;\n};\n\nconst installSseMiddleware = (\n server: ViteDevServer,\n clients: Set<SseClient>,\n onConnect?: (client: SseClient) => void\n): void => {\n server.middlewares.use(\n SSE_PATH,\n (\n req: {method?: string; headers?: TrustHeaders},\n res: SseClient & {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n flushHeaders?: () => void;\n end?: (body?: string) => void;\n },\n next: () => void\n ) => {\n if (req.method !== 'GET') {\n next();\n return;\n }\n if (!isTrustedRequest(req.headers ?? {})) {\n res.statusCode = 403;\n res.end?.('forbidden');\n return;\n }\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders?.();\n res.write(':\\n\\n'); // keep-alive comment\n\n clients.add(res);\n res.on('close', () => clients.delete(res));\n // Replay a just-emitted overlay pick to a panel that connects right after\n // it (the cold-start case: picking an element opens the dock, but the\n // panel iframe subscribes here only after the `pick` was already\n // broadcast to zero clients). See `pendingPick` in `litTimelinePlugin`.\n onConnect?.(res);\n }\n );\n};\n\n/** How long a pending overlay pick stays replayable to a freshly-connected\n * panel. Long enough to cover the dock iframe mounting + subscribing, short\n * enough that an unrelated later reconnect won't resurrect a stale selection. */\nconst PICK_REPLAY_WINDOW_MS = 3000;\n\nexport const litTimelinePlugin = (\n getSettings?: () => FeatureSettings | undefined\n): Plugin => {\n const sseClients = new Set<SseClient>();\n // Captured in configureServer so the (server-side) DevTools command handler\n // can broadcast to the app runtime; it only runs after the server is up.\n let devServer: ViteDevServer | undefined;\n // The most recent overlay `pick`, framed as an SSE payload, kept briefly so a\n // panel that mounts in response to the pick (cold start) still receives it.\n let pendingPick: {payload: string; expires: number} | null = null;\n\n /** Write a pre-framed SSE payload to every client, pruning dead sockets. */\n const broadcast = (payload: string): void => {\n for (const client of sseClients) {\n try {\n client.write(payload);\n } catch {\n sseClients.delete(client);\n }\n }\n };\n\n /** Push a batch of events to all subscribed panel SSE clients. */\n const pushToPanel = (events: TimelineEvent[]): void => {\n if (sseClients.size === 0 || events.length === 0) return;\n broadcast(`data: ${JSON.stringify(events)}\\n\\n`);\n };\n\n /** Push a named SSE event (the panel listens via `addEventListener(name)`). */\n const pushEvent = (name: string, data: unknown): void => {\n if (sseClients.size === 0) return;\n broadcast(`event: ${name}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n };\n\n return {\n name: 'lit-devtools',\n apply: 'serve',\n\n configureServer(server) {\n devServer = server;\n // SSE endpoint: panel iframe subscribes here for event push. A client that\n // connects within the replay window gets the pending pick replayed.\n installSseMiddleware(server, sseClients, (client) => {\n if (pendingPick === null) return;\n if (Date.now() >= pendingPick.expires) {\n pendingPick = null;\n return;\n }\n // Replay to every client connecting within the window, not just the\n // first: the panel opens two SSE subscriptions (components-view and\n // timeline-view) and only components-view acts on `pick`. A one-shot\n // replay could land on timeline-view and be dropped. Replaying to all\n // is safe — timeline-view ignores the event, and components-view's\n // selection is idempotent. The pick clears on expiry, below.\n try {\n client.write(pendingPick.payload);\n } catch {\n // Socket already gone — nothing to replay to.\n }\n });\n\n // Settings endpoint. GET returns the resolved feature settings (the\n // baseline the panel renders). POST carries a SettingsOverride which we\n // rebroadcast to the app runtime via HMR so it takes effect live.\n server.middlewares.use(\n SETTINGS_PATH,\n (\n req: {\n method?: string;\n on?: ReadableOn;\n headers?: TrustHeaders;\n },\n res: {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n end: (body?: string) => void;\n },\n next: () => void\n ) => {\n if (!isTrustedRequest(req.headers ?? {})) {\n res.statusCode = 403;\n res.end('forbidden');\n return;\n }\n if (req.method === 'GET') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json; charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache');\n res.end(JSON.stringify(getSettings?.() ?? null));\n return;\n }\n if (req.method === 'POST') {\n readJsonBody(req, (body) => {\n if (body !== null) {\n server.hot.send(\n SETTINGS_OVERRIDE_CHANNEL,\n body as SettingsOverride\n );\n }\n res.statusCode = 204;\n res.end();\n });\n return;\n }\n next();\n }\n );\n\n // Serve the panel HTML with the Lit SPA entry injected via /@fs/ so\n // Vite can transform the TypeScript source on the fly.\n let panel: PanelPaths | undefined;\n try {\n panel = resolvePanel();\n } catch (e) {\n console.warn(String(e));\n }\n\n if (panel !== undefined) {\n const {htmlDir, appModule} = panel;\n server.middlewares.use(\n PANEL_PATH,\n async (\n req: {url?: string},\n res: {\n statusCode: number;\n setHeader: (k: string, v: string) => void;\n end: (body: string) => void;\n },\n next: () => void\n ) => {\n const url = req.url ?? '/';\n if (url !== '/' && url !== '' && url !== '/index.html') {\n next();\n return;\n }\n let html: string;\n try {\n html = await readFile(join(htmlDir, 'index.html'), 'utf-8');\n } catch {\n next();\n return;\n }\n // Inject the panel entry as a /@fs/ module so Vite's transform\n // pipeline compiles TypeScript and resolves bare specifiers (lit, etc).\n const scriptTag = ` <script type=\"module\" src=\"/@fs${appModule}\"></script>\\n`;\n html = html.replace('</body>', scriptTag + '</body>');\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(html);\n }\n );\n }\n\n // Control endpoint: the panel POSTs recording/layer state changes here.\n // The server rebroadcasts the state to all connected app tabs via HMR.\n server.middlewares.use(CONTROL_PATH, (req, res, next) => {\n const method = (req as {method?: string}).method;\n if (method !== 'POST') {\n next();\n return;\n }\n const r403 = res as {statusCode: number; end: (body?: string) => void};\n if (\n !isTrustedRequest((req as {headers?: TrustHeaders}).headers ?? {})\n ) {\n r403.statusCode = 403;\n r403.end('forbidden');\n return;\n }\n readJsonBody(req as {on?: ReadableOn}, (body) => {\n if (body !== null) {\n if (typeof body.recording === 'boolean') {\n server.hot.send('lit:timeline:recording-changed', {\n recording: body.recording,\n });\n }\n const layerKeys = [\n 'litLifecycleEnabled',\n 'litRenderEnabled',\n 'mouseEventEnabled',\n 'keyboardEventEnabled',\n ] as const;\n const layersUpdate: Record<string, boolean> = {};\n for (const key of layerKeys) {\n if (typeof body[key] === 'boolean') {\n layersUpdate[key] = body[key] as boolean;\n }\n }\n if (Object.keys(layersUpdate).length > 0) {\n server.hot.send('lit:timeline:layers-changed', layersUpdate);\n }\n }\n const r = res as {statusCode: number; end: () => void};\n r.statusCode = 204;\n r.end();\n });\n });\n\n // Accept batches of events from the browser runtime via Vite HMR.\n server.hot.on(\n 'lit:timeline:push-event',\n (data: {events?: TimelineEvent[]}) => {\n pushToPanel(data.events ?? []);\n }\n );\n\n // Legacy: panel postMessage → devtools shell → server (keep for compat).\n server.hot.on(\n 'lit:timeline:set-recording',\n (data: {recording: boolean}) => {\n server.hot.send('lit:timeline:recording-changed', {\n recording: data.recording,\n });\n }\n );\n\n // Custom layer announced by app code via addTimelineLayer().\n // Forward to the panel as a named SSE event so it can add the layer.\n server.hot.on(\n 'lit:timeline:custom-layer',\n (data: {layer: TimelineLayer}) => {\n if (!data.layer?.id) return;\n pushEvent('layer', data.layer);\n }\n );\n\n // Components inspector. The panel POSTs an InspectorCommand here; we\n // forward it to the app runtime over HMR. The runtime answers over\n // INSPECT_DATA_CHANNEL, which we relay to the panel as a named SSE event.\n server.middlewares.use(INSPECT_PATH, (req, res, next) => {\n const method = (req as {method?: string}).method;\n if (method !== 'POST') {\n next();\n return;\n }\n const r403 = res as {statusCode: number; end: (body?: string) => void};\n if (\n !isTrustedRequest((req as {headers?: TrustHeaders}).headers ?? {})\n ) {\n r403.statusCode = 403;\n r403.end('forbidden');\n return;\n }\n readJsonBody(req as {on?: ReadableOn}, (body) => {\n if (body !== null) {\n // \"Pick\" starts the overlay's inspect picker (a server-side toggle),\n // not a runtime query, so it's routed to the overlay channel.\n if ((body as InspectorCommand).type === 'pick') {\n server.hot.send(INSPECT_OVERLAY_TOGGLE_CHANNEL);\n } else {\n server.hot.send(INSPECT_CMD_CHANNEL, body as InspectorCommand);\n }\n }\n const r = res as {statusCode: number; end: () => void};\n r.statusCode = 204;\n r.end();\n });\n });\n\n server.hot.on(INSPECT_DATA_CHANNEL, (data: InspectorMessage) => {\n // Remember overlay picks so a cold-started panel (opened by the pick\n // itself) can replay it on connect — see `pendingPick`.\n if (data.type === 'pick') {\n pendingPick = {\n payload: `event: ${INSPECT_SSE_EVENT}\\ndata: ${JSON.stringify(data)}\\n\\n`,\n expires: Date.now() + PICK_REPLAY_WINDOW_MS,\n };\n }\n pushEvent(INSPECT_SSE_EVENT, data);\n });\n },\n\n devtools: {\n setup(ctx: TimelineCtx) {\n // Register the dock entry. HTML is served by the configureServer\n // middleware above (with /@fs/ injection); hostStatic is not used.\n ctx.docks.register({\n id: 'lit-devtools',\n type: 'iframe',\n // This dock represents the whole Lit plugin (HMR, source overlay,\n // timeline), so it's branded \"Lit\" rather than the timeline panel\n // it currently opens.\n title: 'Lit',\n // Square, inlined Lit logo — see LIT_LOGO_ICON above. DevTools renders\n // a `data:` icon directly as an <img>, no Iconify API fetch.\n icon: LIT_LOGO_ICON,\n url: PANEL_PATH + '/',\n category: 'framework',\n });\n\n // Register the overlay toggle as a DevTools command so it shows in the\n // command palette and as a managed shortcut. The handler runs\n // server-side; it broadcasts to the app runtime, which toggles the\n // overlay. Only meaningful when the overlay is enabled.\n const so = getSettings?.()?.sourceOverlay;\n if (so?.enabled && ctx.commands?.register) {\n ctx.commands.register({\n id: 'lit:overlay:toggle',\n title: 'Pick Lit Element',\n description:\n 'Click to inspect in the Components panel, hold Meta/Ctrl and click to open in your editor',\n icon: 'ph:crosshair-duotone',\n category: 'Lit',\n keybindings: [{key: 'Meta+Shift+E'}],\n handler: () => devServer?.hot.send(INSPECT_OVERLAY_TOGGLE_CHANNEL),\n });\n }\n },\n },\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2MH;;;;GAIG;AACH,eAAO,MAAM,QAAQ,stKAAqC,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM,yBAIlB,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GAAI,mBAE5B,mBAAwB,KAAG,MAwB7B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,mBAAmB,KAAG,IAO5D,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/lib/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2MH;;;;GAIG;AACH,eAAO,MAAM,QAAQ,stKAAqC,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM,yBAIlB,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,sBAExB,mBAAmB,KAAQ,MAwB7B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,aAAc,mBAAmB,KAAG,IAO5D,CAAC"}
package/lib/tokens.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * Copyright 2026 Google LLC
4
4
  * SPDX-License-Identifier: BSD-3-Clause
5
5
  */
6
- import { css, unsafeCSS } from 'lit';
6
+ import {css, unsafeCSS} from 'lit';
7
7
  /**
8
8
  * Design token CSS custom properties for the Lit DevTools.
9
9
  *
@@ -217,7 +217,7 @@ export const tokenCSS = `${baseTokenCSS}\n${darkThemeCSS}`;
217
217
  * by {@link injectTokens}. The panel iframe calls `injectTokens()` from
218
218
  * \`lit-devtools-panel.ts\` so all components inherit the same dark/light theme.
219
219
  */
220
- export const tokens = css `
220
+ export const tokens = css`
221
221
  :host {
222
222
  ${unsafeCSS(baseTokenCSS)}
223
223
  }
@@ -231,14 +231,14 @@ let _injected = false;
231
231
  * the owning document's UA surfaces (canvas, form controls, scrollbars)
232
232
  * follow the devtools theme.
233
233
  */
234
- export const tokenStyleText = ({ colorScheme = false, } = {}) => {
235
- const dark = colorScheme
236
- ? `${darkThemeCSS}\n ${darkSchemeCSS}`
237
- : darkThemeCSS;
238
- const light = colorScheme
239
- ? `${lightThemeCSS}\n ${lightSchemeCSS}`
240
- : lightThemeCSS;
241
- return `
234
+ export const tokenStyleText = ({colorScheme = false} = {}) => {
235
+ const dark = colorScheme
236
+ ? `${darkThemeCSS}\n ${darkSchemeCSS}`
237
+ : darkThemeCSS;
238
+ const light = colorScheme
239
+ ? `${lightThemeCSS}\n ${lightSchemeCSS}`
240
+ : lightThemeCSS;
241
+ return `
242
242
  :root {
243
243
  ${baseTokenCSS}
244
244
  ${dark}
@@ -269,12 +269,11 @@ export const tokenStyleText = ({ colorScheme = false, } = {}) => {
269
269
  * {@link InjectTokensOptions.colorScheme} for its own document.
270
270
  */
271
271
  export const injectTokens = (options) => {
272
- if (_injected)
273
- return;
274
- _injected = true;
275
- const style = document.createElement('style');
276
- style.setAttribute('data-lit-devtools-tokens', '');
277
- style.textContent = tokenStyleText(options);
278
- document.head.prepend(style);
272
+ if (_injected) return;
273
+ _injected = true;
274
+ const style = document.createElement('style');
275
+ style.setAttribute('data-lit-devtools-tokens', '');
276
+ style.textContent = tokenStyleText(options);
277
+ document.head.prepend(style);
279
278
  };
280
- //# sourceMappingURL=tokens.js.map
279
+ //# sourceMappingURL=tokens.js.map
package/lib/tokens.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,GAAG,EAAE,SAAS,EAAC,MAAM,KAAK,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFpB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCpB,CAAC;AAEF,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCrB,CAAC;AAEF,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,YAAY,EAAE,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;MAEnB,SAAS,CAAC,YAAY,CAAC;;CAE5B,CAAC;AAEF,IAAI,SAAS,GAAG,KAAK,CAAC;AAgBtB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,WAAW,GAAG,KAAK,MACI,EAAE,EAAU,EAAE;IACrC,MAAM,IAAI,GAAG,WAAW;QACtB,CAAC,CAAC,GAAG,YAAY,OAAO,aAAa,EAAE;QACvC,CAAC,CAAC,YAAY,CAAC;IACjB,MAAM,KAAK,GAAG,WAAW;QACvB,CAAC,CAAC,GAAG,aAAa,OAAO,cAAc,EAAE;QACzC,CAAC,CAAC,aAAa,CAAC;IAClB,OAAO;;QAED,YAAY;QACZ,IAAI;;;;UAIF,KAAK;;;;QAIP,KAAK;;;QAGL,IAAI;;GAET,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAA6B,EAAQ,EAAE;IAClE,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,YAAY,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {css, unsafeCSS} from 'lit';\n\n/**\n * Design token CSS custom properties for the Lit DevTools.\n *\n * Two entry points:\n * - **`tokens`** — Lit `css` template that defines the theme-agnostic base\n * tokens on `:host`. Semantic color aliases (`--lit-devtools-bg`, `--lit-devtools-surface`, `--lit-devtools-text`,\n * etc.) are inherited from `:root`, where {@link injectTokens} installs them.\n * Use as `static styles = [tokens, css`…`]`.\n * - **`injectTokens()`** — injects `:root { … }` into the page `<head>` once.\n * This makes semantic aliases available to every devtools surface, both\n * runtime elements (indicator, source-overlay) that build their shadow DOM\n * via `innerHTML` and Lit panel components that inherit from `:root`.\n * The injected stylesheet reacts to `prefers-color-scheme` and to\n * `.color-scheme-light` / `.color-scheme-dark` classes on `:root`.\n *\n * Sourced from the lit-design skill (`tokens/colors.css`). Defaults to the\n * dark DevTools theme; the light lit.dev website palette is applied when the\n * OS/browser requests a light color scheme or when `:root` has the matching\n * theme class.\n *\n * Fonts are system stacks (no webfonts). For the branded Manrope + Roboto Mono\n * see the lit-design skill's `fonts/` directory.\n */\n\nconst baseTokenCSS = `\n /* ---- Brand · the Lit flame ---- */\n --lit-devtools-lit-blue: #324fff;\n --lit-devtools-lit-blue-bright: #4d63ff;\n --lit-devtools-lit-indigo: #2a2c9d;\n --lit-devtools-lit-dark-blue: #283198;\n --lit-devtools-lit-cyan: #00ffff;\n --lit-devtools-lit-dark-cyan: #00e8ff;\n\n /* ---- Neutral ink scale (0 = near-black, 13 = white) ---- */\n --lit-devtools-ink-0: hsl(0 0% 1%);\n --lit-devtools-ink-1: hsl(0 0% 5%);\n --lit-devtools-ink-2: hsl(0 0% 7%);\n --lit-devtools-ink-3: hsl(0 0% 11%);\n --lit-devtools-ink-4: hsl(0 0% 13%);\n --lit-devtools-ink-5: hsl(0 0% 16%);\n --lit-devtools-ink-6: hsl(0 0% 21%);\n --lit-devtools-ink-7: hsl(0 0% 28%);\n --lit-devtools-ink-8: hsl(0 0% 38%);\n --lit-devtools-ink-9: hsl(0 0% 57%);\n --lit-devtools-ink-10: hsl(0 0% 63%);\n --lit-devtools-ink-11: hsl(0 0% 78%);\n --lit-devtools-ink-12: hsl(0 0% 89%);\n --lit-devtools-ink-13: hsl(0 0% 100%);\n\n /* ---- Typography ---- */\n --lit-devtools-font-sans: system-ui, -apple-system, 'Segoe UI', sans-serif;\n --lit-devtools-font-mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;\n\n --lit-devtools-weight-regular: 400;\n --lit-devtools-weight-medium: 500;\n --lit-devtools-weight-semibold: 600;\n --lit-devtools-weight-bold: 700;\n --lit-devtools-weight-extrabold: 800;\n\n --lit-devtools-text-2xs: 11px;\n --lit-devtools-text-xs: 12px;\n --lit-devtools-text-sm: 13px;\n --lit-devtools-text-md: 14px;\n --lit-devtools-text-base:16px;\n\n --lit-devtools-leading-tight: 1.15;\n --lit-devtools-leading-snug: 1.3;\n --lit-devtools-leading-normal: 1.5;\n\n --lit-devtools-tracking-tight: -0.02em;\n --lit-devtools-tracking-snug: -0.01em;\n --lit-devtools-tracking-normal: 0;\n --lit-devtools-tracking-wide: 0.02em;\n --lit-devtools-tracking-caps: 0.06em;\n\n /* ---- Spacing (4px base) ---- */\n --lit-devtools-space-0: 0;\n --lit-devtools-space-1: 2px;\n --lit-devtools-space-2: 4px;\n --lit-devtools-space-3: 6px;\n --lit-devtools-space-4: 8px;\n --lit-devtools-space-5: 12px;\n --lit-devtools-space-6: 16px;\n --lit-devtools-space-7: 20px;\n --lit-devtools-space-8: 24px;\n --lit-devtools-space-9: 32px;\n\n /* ---- Radius ---- */\n --lit-devtools-radius-xs: 3px;\n --lit-devtools-radius-sm: 5px;\n --lit-devtools-radius-md: 8px;\n --lit-devtools-radius-lg: 12px;\n --lit-devtools-radius-xl: 16px;\n --lit-devtools-radius-pill: 999px;\n\n /* ---- Elevation ---- */\n --lit-devtools-shadow-xs: 0 1px 2px hsl(0 0% 0% / 0.30);\n --lit-devtools-shadow-sm: 0 1px 5px hsl(0 0% 0% / 0.35);\n --lit-devtools-shadow-md: 0 4px 14px hsl(0 0% 0% / 0.40);\n --lit-devtools-shadow-lg: 0 12px 32px hsl(0 0% 0% / 0.50);\n --lit-devtools-shadow-xl: 0 24px 64px hsl(0 0% 0% / 0.55);\n --lit-devtools-shadow-window: 0 24px 80px hsl(0 0% 0% / 0.6),\n 0 0 0 1px hsl(0 0% 100% / 0.06);\n --lit-devtools-ring: 0 0 0 2px var(--lit-devtools-accent-ring);\n\n /* ---- Motion ---- */\n --lit-devtools-ease-standard: cubic-bezier(0.2, 0, 0, 1);\n --lit-devtools-dur-fast: 140ms;\n --lit-devtools-dur-normal: 220ms;\n`;\n\nconst darkThemeCSS = `\n /* ---- DARK · DevTools theme ---- */\n --lit-devtools-accent: var(--lit-devtools-lit-blue-bright);\n --lit-devtools-accent-hover: #6478ff;\n --lit-devtools-accent-pressed: #3d54f0;\n --lit-devtools-accent-soft: hsla(232 100% 65% / 0.16);\n --lit-devtools-accent-ring: hsla(232 100% 65% / 0.45);\n --lit-devtools-on-accent: #ffffff;\n --lit-devtools-accent-cyan: var(--lit-devtools-lit-dark-cyan);\n\n --lit-devtools-bg: var(--lit-devtools-ink-0);\n --lit-devtools-surface: var(--lit-devtools-ink-2);\n --lit-devtools-surface-low: var(--lit-devtools-ink-1);\n --lit-devtools-surface-container: var(--lit-devtools-ink-4);\n --lit-devtools-surface-container-high: var(--lit-devtools-ink-5);\n --lit-devtools-surface-elevated: var(--lit-devtools-ink-6);\n --lit-devtools-surface-hover: hsl(0 0% 100% / 0.04);\n --lit-devtools-surface-active: hsl(0 0% 100% / 0.07);\n\n --lit-devtools-text: var(--lit-devtools-ink-12);\n --lit-devtools-text-strong: var(--lit-devtools-ink-13);\n --lit-devtools-text-secondary: var(--lit-devtools-ink-10);\n --lit-devtools-text-muted: var(--lit-devtools-ink-8);\n --lit-devtools-text-link: var(--lit-devtools-lit-blue-bright);\n\n --lit-devtools-border: var(--lit-devtools-ink-6);\n --lit-devtools-border-strong: var(--lit-devtools-ink-7);\n --lit-devtools-border-subtle: hsl(0 0% 100% / 0.06);\n\n --lit-devtools-success: hsl(158 74% 53%);\n --lit-devtools-success-soft: hsl(158 74% 53% / 0.15);\n --lit-devtools-warning: #f4bf4f;\n --lit-devtools-warning-soft: hsl(43 88% 63% / 0.15);\n --lit-devtools-error: #ff6b6b;\n --lit-devtools-error-soft: hsl(0 100% 71% / 0.15);\n --lit-devtools-info: var(--lit-devtools-lit-dark-cyan);\n --lit-devtools-info-soft: hsl(187 100% 47% / 0.15);\n\n --lit-devtools-selection-bg: var(--lit-devtools-accent);\n --lit-devtools-on-selection: #ffffff;\n`;\n\nconst darkSchemeCSS = `color-scheme: dark;`;\n\nconst lightThemeCSS = `\n /* ---- LIGHT · lit.dev website theme ---- */\n --lit-devtools-accent: var(--lit-devtools-lit-blue);\n --lit-devtools-accent-hover: #1f3bff;\n --lit-devtools-accent-pressed: #2a2c9d;\n --lit-devtools-accent-soft: hsla(232 100% 60% / 0.12);\n --lit-devtools-accent-ring: hsla(232 100% 60% / 0.40);\n --lit-devtools-on-accent: #ffffff;\n --lit-devtools-accent-cyan: var(--lit-devtools-lit-dark-cyan);\n\n --lit-devtools-bg: #f4f4f4;\n --lit-devtools-surface: #ffffff;\n --lit-devtools-surface-low: #f3f3f3;\n --lit-devtools-surface-container: #ffffff;\n --lit-devtools-surface-container-high: #e8e8e8;\n --lit-devtools-surface-elevated: #ffffff;\n --lit-devtools-surface-hover: hsl(0 0% 0% / 0.04);\n --lit-devtools-surface-active: hsl(0 0% 0% / 0.07);\n\n --lit-devtools-text: #242424;\n --lit-devtools-text-strong: #000000;\n --lit-devtools-text-secondary: #6e6e6e;\n --lit-devtools-text-muted: #949494;\n --lit-devtools-text-link: #005dc7;\n\n --lit-devtools-border: #e2e2e2;\n --lit-devtools-border-strong: #c6c6c6;\n --lit-devtools-border-subtle: hsl(0 0% 0% / 0.07);\n\n --lit-devtools-success: #00865b;\n --lit-devtools-success-soft: hsl(158 100% 26% / 0.10);\n --lit-devtools-warning: #b26a00;\n --lit-devtools-warning-soft: hsl(40 100% 35% / 0.10);\n --lit-devtools-error: #ba1a1a;\n --lit-devtools-error-soft: hsl(0 75% 42% / 0.10);\n --lit-devtools-info: #005dc7;\n --lit-devtools-info-soft: hsl(210 100% 39% / 0.10);\n\n --lit-devtools-selection-bg: var(--lit-devtools-accent);\n --lit-devtools-on-selection: #ffffff;\n`;\n\nconst lightSchemeCSS = `color-scheme: light;`;\n\n/**\n * Default dark theme tokens as a flat string, primarily for use by\n * {@link injectTokens}. Prefer importing `tokens` for Lit components so the\n * semantic aliases are inherited from `:root`.\n */\nexport const tokenCSS = `${baseTokenCSS}\\n${darkThemeCSS}`;\n\n/**\n * Lit `css` template for use in panel component shadow roots.\n *\n * ```ts\n * import {tokens} from '../lib/tokens.js';\n * // ...\n * static override styles = [tokens, css`…`];\n * ```\n *\n * This installs the theme-agnostic base tokens on `:host`. Semantic aliases\n * (`--lit-devtools-bg`, `--lit-devtools-text`, etc.) are inherited from `:root`, where they are installed\n * by {@link injectTokens}. The panel iframe calls `injectTokens()` from\n * \\`lit-devtools-panel.ts\\` so all components inherit the same dark/light theme.\n */\nexport const tokens = css`\n :host {\n ${unsafeCSS(baseTokenCSS)}\n }\n`;\n\nlet _injected = false;\n\n/**\n * Options for {@link injectTokens} / {@link tokenStyleText}.\n */\nexport interface InjectTokensOptions {\n /**\n * Also declare `color-scheme` on `:root`. Only safe when the devtools OWN\n * the target document (the panel iframe / standalone panel page). Never set\n * this when injecting into the host page: `color-scheme` on the embedder's\n * `:root` makes the UA repaint the canvas dark for apps that don't declare\n * an opaque background. Defaults to `false`.\n */\n colorScheme?: boolean;\n}\n\n/**\n * Builds the token stylesheet text injected by {@link injectTokens}.\n *\n * By default the sheet defines custom properties only — inert for the host\n * page. With `colorScheme: true` it additionally declares `color-scheme` so\n * the owning document's UA surfaces (canvas, form controls, scrollbars)\n * follow the devtools theme.\n */\nexport const tokenStyleText = ({\n colorScheme = false,\n}: InjectTokensOptions = {}): string => {\n const dark = colorScheme\n ? `${darkThemeCSS}\\n ${darkSchemeCSS}`\n : darkThemeCSS;\n const light = colorScheme\n ? `${lightThemeCSS}\\n ${lightSchemeCSS}`\n : lightThemeCSS;\n return `\n :root {\n ${baseTokenCSS}\n ${dark}\n }\n @media (prefers-color-scheme: light) {\n :root {\n ${light}\n }\n }\n :root.color-scheme-light {\n ${light}\n }\n :root.color-scheme-dark {\n ${dark}\n }\n `;\n};\n\n/**\n * Injects `:root { … }` into the page `<head>` once.\n *\n * CSS custom properties defined on `:root` cascade through shadow DOM\n * boundaries, so this makes every `var(--lit-devtools-accent)` etc. resolve inside both\n * runtime elements (indicator, source-overlay) and Lit panel components.\n *\n * The injected stylesheet reacts to `prefers-color-scheme` and to\n * `.color-scheme-light` / `.color-scheme-dark` classes on the document root.\n * It never sets `color-scheme` on the host page; the panel opts in via\n * {@link InjectTokensOptions.colorScheme} for its own document.\n */\nexport const injectTokens = (options?: InjectTokensOptions): void => {\n if (_injected) return;\n _injected = true;\n const style = document.createElement('style');\n style.setAttribute('data-lit-devtools-tokens', '');\n style.textContent = tokenStyleText(options);\n document.head.prepend(style);\n};\n"]}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/lib/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,GAAG,EAAE,SAAS,EAAC,MAAM,KAAK,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFpB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCpB,CAAC;AAEF,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCrB,CAAC;AAEF,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,YAAY,EAAE,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;MAEnB,SAAS,CAAC,YAAY,CAAC;;CAE5B,CAAC;AAEF,IAAI,SAAS,GAAG,KAAK,CAAC;AAgBtB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,WAAW,GAAG,KAAK,GACpB,GAAwB,EAAE,EAAU,EAAE;IACrC,MAAM,IAAI,GAAG,WAAW;QACtB,CAAC,CAAC,GAAG,YAAY,OAAO,aAAa,EAAE;QACvC,CAAC,CAAC,YAAY,CAAC;IACjB,MAAM,KAAK,GAAG,WAAW;QACvB,CAAC,CAAC,GAAG,aAAa,OAAO,cAAc,EAAE;QACzC,CAAC,CAAC,aAAa,CAAC;IAClB,OAAO;;QAED,YAAY;QACZ,IAAI;;;;UAIF,KAAK;;;;QAIP,KAAK;;;QAGL,IAAI;;GAET,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAA6B,EAAQ,EAAE;IAClE,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,YAAY,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {css, unsafeCSS} from 'lit';\n\n/**\n * Design token CSS custom properties for the Lit DevTools.\n *\n * Two entry points:\n * - **`tokens`** — Lit `css` template that defines the theme-agnostic base\n * tokens on `:host`. Semantic color aliases (`--lit-devtools-bg`, `--lit-devtools-surface`, `--lit-devtools-text`,\n * etc.) are inherited from `:root`, where {@link injectTokens} installs them.\n * Use as `static styles = [tokens, css`…`]`.\n * - **`injectTokens()`** — injects `:root { … }` into the page `<head>` once.\n * This makes semantic aliases available to every devtools surface, both\n * runtime elements (indicator, source-overlay) that build their shadow DOM\n * via `innerHTML` and Lit panel components that inherit from `:root`.\n * The injected stylesheet reacts to `prefers-color-scheme` and to\n * `.color-scheme-light` / `.color-scheme-dark` classes on `:root`.\n *\n * Sourced from the lit-design skill (`tokens/colors.css`). Defaults to the\n * dark DevTools theme; the light lit.dev website palette is applied when the\n * OS/browser requests a light color scheme or when `:root` has the matching\n * theme class.\n *\n * Fonts are system stacks (no webfonts). For the branded Manrope + Roboto Mono\n * see the lit-design skill's `fonts/` directory.\n */\n\nconst baseTokenCSS = `\n /* ---- Brand · the Lit flame ---- */\n --lit-devtools-lit-blue: #324fff;\n --lit-devtools-lit-blue-bright: #4d63ff;\n --lit-devtools-lit-indigo: #2a2c9d;\n --lit-devtools-lit-dark-blue: #283198;\n --lit-devtools-lit-cyan: #00ffff;\n --lit-devtools-lit-dark-cyan: #00e8ff;\n\n /* ---- Neutral ink scale (0 = near-black, 13 = white) ---- */\n --lit-devtools-ink-0: hsl(0 0% 1%);\n --lit-devtools-ink-1: hsl(0 0% 5%);\n --lit-devtools-ink-2: hsl(0 0% 7%);\n --lit-devtools-ink-3: hsl(0 0% 11%);\n --lit-devtools-ink-4: hsl(0 0% 13%);\n --lit-devtools-ink-5: hsl(0 0% 16%);\n --lit-devtools-ink-6: hsl(0 0% 21%);\n --lit-devtools-ink-7: hsl(0 0% 28%);\n --lit-devtools-ink-8: hsl(0 0% 38%);\n --lit-devtools-ink-9: hsl(0 0% 57%);\n --lit-devtools-ink-10: hsl(0 0% 63%);\n --lit-devtools-ink-11: hsl(0 0% 78%);\n --lit-devtools-ink-12: hsl(0 0% 89%);\n --lit-devtools-ink-13: hsl(0 0% 100%);\n\n /* ---- Typography ---- */\n --lit-devtools-font-sans: system-ui, -apple-system, 'Segoe UI', sans-serif;\n --lit-devtools-font-mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;\n\n --lit-devtools-weight-regular: 400;\n --lit-devtools-weight-medium: 500;\n --lit-devtools-weight-semibold: 600;\n --lit-devtools-weight-bold: 700;\n --lit-devtools-weight-extrabold: 800;\n\n --lit-devtools-text-2xs: 11px;\n --lit-devtools-text-xs: 12px;\n --lit-devtools-text-sm: 13px;\n --lit-devtools-text-md: 14px;\n --lit-devtools-text-base:16px;\n\n --lit-devtools-leading-tight: 1.15;\n --lit-devtools-leading-snug: 1.3;\n --lit-devtools-leading-normal: 1.5;\n\n --lit-devtools-tracking-tight: -0.02em;\n --lit-devtools-tracking-snug: -0.01em;\n --lit-devtools-tracking-normal: 0;\n --lit-devtools-tracking-wide: 0.02em;\n --lit-devtools-tracking-caps: 0.06em;\n\n /* ---- Spacing (4px base) ---- */\n --lit-devtools-space-0: 0;\n --lit-devtools-space-1: 2px;\n --lit-devtools-space-2: 4px;\n --lit-devtools-space-3: 6px;\n --lit-devtools-space-4: 8px;\n --lit-devtools-space-5: 12px;\n --lit-devtools-space-6: 16px;\n --lit-devtools-space-7: 20px;\n --lit-devtools-space-8: 24px;\n --lit-devtools-space-9: 32px;\n\n /* ---- Radius ---- */\n --lit-devtools-radius-xs: 3px;\n --lit-devtools-radius-sm: 5px;\n --lit-devtools-radius-md: 8px;\n --lit-devtools-radius-lg: 12px;\n --lit-devtools-radius-xl: 16px;\n --lit-devtools-radius-pill: 999px;\n\n /* ---- Elevation ---- */\n --lit-devtools-shadow-xs: 0 1px 2px hsl(0 0% 0% / 0.30);\n --lit-devtools-shadow-sm: 0 1px 5px hsl(0 0% 0% / 0.35);\n --lit-devtools-shadow-md: 0 4px 14px hsl(0 0% 0% / 0.40);\n --lit-devtools-shadow-lg: 0 12px 32px hsl(0 0% 0% / 0.50);\n --lit-devtools-shadow-xl: 0 24px 64px hsl(0 0% 0% / 0.55);\n --lit-devtools-shadow-window: 0 24px 80px hsl(0 0% 0% / 0.6),\n 0 0 0 1px hsl(0 0% 100% / 0.06);\n --lit-devtools-ring: 0 0 0 2px var(--lit-devtools-accent-ring);\n\n /* ---- Motion ---- */\n --lit-devtools-ease-standard: cubic-bezier(0.2, 0, 0, 1);\n --lit-devtools-dur-fast: 140ms;\n --lit-devtools-dur-normal: 220ms;\n`;\n\nconst darkThemeCSS = `\n /* ---- DARK · DevTools theme ---- */\n --lit-devtools-accent: var(--lit-devtools-lit-blue-bright);\n --lit-devtools-accent-hover: #6478ff;\n --lit-devtools-accent-pressed: #3d54f0;\n --lit-devtools-accent-soft: hsla(232 100% 65% / 0.16);\n --lit-devtools-accent-ring: hsla(232 100% 65% / 0.45);\n --lit-devtools-on-accent: #ffffff;\n --lit-devtools-accent-cyan: var(--lit-devtools-lit-dark-cyan);\n\n --lit-devtools-bg: var(--lit-devtools-ink-0);\n --lit-devtools-surface: var(--lit-devtools-ink-2);\n --lit-devtools-surface-low: var(--lit-devtools-ink-1);\n --lit-devtools-surface-container: var(--lit-devtools-ink-4);\n --lit-devtools-surface-container-high: var(--lit-devtools-ink-5);\n --lit-devtools-surface-elevated: var(--lit-devtools-ink-6);\n --lit-devtools-surface-hover: hsl(0 0% 100% / 0.04);\n --lit-devtools-surface-active: hsl(0 0% 100% / 0.07);\n\n --lit-devtools-text: var(--lit-devtools-ink-12);\n --lit-devtools-text-strong: var(--lit-devtools-ink-13);\n --lit-devtools-text-secondary: var(--lit-devtools-ink-10);\n --lit-devtools-text-muted: var(--lit-devtools-ink-8);\n --lit-devtools-text-link: var(--lit-devtools-lit-blue-bright);\n\n --lit-devtools-border: var(--lit-devtools-ink-6);\n --lit-devtools-border-strong: var(--lit-devtools-ink-7);\n --lit-devtools-border-subtle: hsl(0 0% 100% / 0.06);\n\n --lit-devtools-success: hsl(158 74% 53%);\n --lit-devtools-success-soft: hsl(158 74% 53% / 0.15);\n --lit-devtools-warning: #f4bf4f;\n --lit-devtools-warning-soft: hsl(43 88% 63% / 0.15);\n --lit-devtools-error: #ff6b6b;\n --lit-devtools-error-soft: hsl(0 100% 71% / 0.15);\n --lit-devtools-info: var(--lit-devtools-lit-dark-cyan);\n --lit-devtools-info-soft: hsl(187 100% 47% / 0.15);\n\n --lit-devtools-selection-bg: var(--lit-devtools-accent);\n --lit-devtools-on-selection: #ffffff;\n`;\n\nconst darkSchemeCSS = `color-scheme: dark;`;\n\nconst lightThemeCSS = `\n /* ---- LIGHT · lit.dev website theme ---- */\n --lit-devtools-accent: var(--lit-devtools-lit-blue);\n --lit-devtools-accent-hover: #1f3bff;\n --lit-devtools-accent-pressed: #2a2c9d;\n --lit-devtools-accent-soft: hsla(232 100% 60% / 0.12);\n --lit-devtools-accent-ring: hsla(232 100% 60% / 0.40);\n --lit-devtools-on-accent: #ffffff;\n --lit-devtools-accent-cyan: var(--lit-devtools-lit-dark-cyan);\n\n --lit-devtools-bg: #f4f4f4;\n --lit-devtools-surface: #ffffff;\n --lit-devtools-surface-low: #f3f3f3;\n --lit-devtools-surface-container: #ffffff;\n --lit-devtools-surface-container-high: #e8e8e8;\n --lit-devtools-surface-elevated: #ffffff;\n --lit-devtools-surface-hover: hsl(0 0% 0% / 0.04);\n --lit-devtools-surface-active: hsl(0 0% 0% / 0.07);\n\n --lit-devtools-text: #242424;\n --lit-devtools-text-strong: #000000;\n --lit-devtools-text-secondary: #6e6e6e;\n --lit-devtools-text-muted: #949494;\n --lit-devtools-text-link: #005dc7;\n\n --lit-devtools-border: #e2e2e2;\n --lit-devtools-border-strong: #c6c6c6;\n --lit-devtools-border-subtle: hsl(0 0% 0% / 0.07);\n\n --lit-devtools-success: #00865b;\n --lit-devtools-success-soft: hsl(158 100% 26% / 0.10);\n --lit-devtools-warning: #b26a00;\n --lit-devtools-warning-soft: hsl(40 100% 35% / 0.10);\n --lit-devtools-error: #ba1a1a;\n --lit-devtools-error-soft: hsl(0 75% 42% / 0.10);\n --lit-devtools-info: #005dc7;\n --lit-devtools-info-soft: hsl(210 100% 39% / 0.10);\n\n --lit-devtools-selection-bg: var(--lit-devtools-accent);\n --lit-devtools-on-selection: #ffffff;\n`;\n\nconst lightSchemeCSS = `color-scheme: light;`;\n\n/**\n * Default dark theme tokens as a flat string, primarily for use by\n * {@link injectTokens}. Prefer importing `tokens` for Lit components so the\n * semantic aliases are inherited from `:root`.\n */\nexport const tokenCSS = `${baseTokenCSS}\\n${darkThemeCSS}`;\n\n/**\n * Lit `css` template for use in panel component shadow roots.\n *\n * ```ts\n * import {tokens} from '../lib/tokens.js';\n * // ...\n * static override styles = [tokens, css`…`];\n * ```\n *\n * This installs the theme-agnostic base tokens on `:host`. Semantic aliases\n * (`--lit-devtools-bg`, `--lit-devtools-text`, etc.) are inherited from `:root`, where they are installed\n * by {@link injectTokens}. The panel iframe calls `injectTokens()` from\n * \\`lit-devtools-panel.ts\\` so all components inherit the same dark/light theme.\n */\nexport const tokens = css`\n :host {\n ${unsafeCSS(baseTokenCSS)}\n }\n`;\n\nlet _injected = false;\n\n/**\n * Options for {@link injectTokens} / {@link tokenStyleText}.\n */\nexport interface InjectTokensOptions {\n /**\n * Also declare `color-scheme` on `:root`. Only safe when the devtools OWN\n * the target document (the panel iframe / standalone panel page). Never set\n * this when injecting into the host page: `color-scheme` on the embedder's\n * `:root` makes the UA repaint the canvas dark for apps that don't declare\n * an opaque background. Defaults to `false`.\n */\n colorScheme?: boolean;\n}\n\n/**\n * Builds the token stylesheet text injected by {@link injectTokens}.\n *\n * By default the sheet defines custom properties only — inert for the host\n * page. With `colorScheme: true` it additionally declares `color-scheme` so\n * the owning document's UA surfaces (canvas, form controls, scrollbars)\n * follow the devtools theme.\n */\nexport const tokenStyleText = ({\n colorScheme = false,\n}: InjectTokensOptions = {}): string => {\n const dark = colorScheme\n ? `${darkThemeCSS}\\n ${darkSchemeCSS}`\n : darkThemeCSS;\n const light = colorScheme\n ? `${lightThemeCSS}\\n ${lightSchemeCSS}`\n : lightThemeCSS;\n return `\n :root {\n ${baseTokenCSS}\n ${dark}\n }\n @media (prefers-color-scheme: light) {\n :root {\n ${light}\n }\n }\n :root.color-scheme-light {\n ${light}\n }\n :root.color-scheme-dark {\n ${dark}\n }\n `;\n};\n\n/**\n * Injects `:root { … }` into the page `<head>` once.\n *\n * CSS custom properties defined on `:root` cascade through shadow DOM\n * boundaries, so this makes every `var(--lit-devtools-accent)` etc. resolve inside both\n * runtime elements (indicator, source-overlay) and Lit panel components.\n *\n * The injected stylesheet reacts to `prefers-color-scheme` and to\n * `.color-scheme-light` / `.color-scheme-dark` classes on the document root.\n * It never sets `color-scheme` on the host page; the panel opts in via\n * {@link InjectTokensOptions.colorScheme} for its own document.\n */\nexport const injectTokens = (options?: InjectTokensOptions): void => {\n if (_injected) return;\n _injected = true;\n const style = document.createElement('style');\n style.setAttribute('data-lit-devtools-tokens', '');\n style.textContent = tokenStyleText(options);\n document.head.prepend(style);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/transform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,WAAW,MAAM,cAAc,CAAC;AAGvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,2DAA2D;AAC3D,eAAO,MAAM,UAAU,yBAA6B,CAAC;AASrD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,oBAAoB,OAAO,KAC1B,OAIwD,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,KACX,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAqDzC,CAAC"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/lib/transform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,WAAW,MAAM,cAAc,CAAC;AAGvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,2DAA2D;AAC3D,eAAO,MAAM,UAAU,yBAA6B,CAAC;AASrD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,SACtB,MAAM,sBACQ,OAAO,KAC1B,OAIwD,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,SACvB,MAAM,KACX,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAwDzC,CAAC"}
package/lib/transform.js CHANGED
@@ -3,9 +3,9 @@
3
3
  * Copyright 2026 Google LLC
4
4
  * SPDX-License-Identifier: BSD-3-Clause
5
5
  */
6
- import { init, parse } from 'es-module-lexer';
6
+ import {init, parse} from 'es-module-lexer';
7
7
  import MagicString from 'magic-string';
8
- import { WRAP_TABLE } from './wrap-table.js';
8
+ import {WRAP_TABLE} from './wrap-table.js';
9
9
  /**
10
10
  * Prefix for this plugin's virtual module ids. Rewritten specifiers carry
11
11
  * the `\0` convention directly in the transformed source; Vite's
@@ -17,16 +17,20 @@ export const VIRTUAL_PREFIX = '\0lit-plugin:';
17
17
  export const INSTALL_ID = `${VIRTUAL_PREFIX}install`;
18
18
  const LIT_FAMILY_PACKAGES = ['lit', 'lit-html', 'lit-element'];
19
19
  const LIT_FAMILY_SCOPES = ['@lit/', '@lit-labs/'];
20
- const isLitFamilySpecifier = (spec) => LIT_FAMILY_PACKAGES.some((p) => spec === p || spec.startsWith(`${p}/`)) ||
21
- LIT_FAMILY_SCOPES.some((s) => spec.startsWith(s));
20
+ const isLitFamilySpecifier = (spec) =>
21
+ LIT_FAMILY_PACKAGES.some((p) => spec === p || spec.startsWith(`${p}/`)) ||
22
+ LIT_FAMILY_SCOPES.some((s) => spec.startsWith(s));
22
23
  /**
23
24
  * A module needs the define interceptor + self-accept if it registers
24
25
  * custom elements: a textual `customElements.define(` call, or — only when
25
26
  * a lit-family import is present — a `customElement(` decorator call (the
26
27
  * decorator runtime call stays textually present after TS transpilation).
27
28
  */
28
- export const isComponentModule = (code, hasLitFamilyImport) => /(?<![.\w$])(?:(?:window|globalThis|self)\.)?customElements\.define\s*\(/.test(code) ||
29
- (hasLitFamilyImport && /\bcustomElement\s*\(/.test(code));
29
+ export const isComponentModule = (code, hasLitFamilyImport) =>
30
+ /(?<![.\w$])(?:(?:window|globalThis|self)\.)?customElements\.define\s*\(/.test(
31
+ code
32
+ ) ||
33
+ (hasLitFamilyImport && /\bcustomElement\s*\(/.test(code));
30
34
  /**
31
35
  * The whole dev transform, as a pure function of the module source:
32
36
  *
@@ -41,59 +45,60 @@ export const isComponentModule = (code, hasLitFamilyImport) => /(?<![.\w$])(?:(?
41
45
  * Returns `null` when the module needs no changes.
42
46
  */
43
47
  export const transformLitModule = async (code) => {
44
- // Cheap pre-filter before parsing.
45
- if (!code.includes('lit') && !code.includes('customElements')) {
46
- return null;
48
+ // Cheap pre-filter before parsing.
49
+ if (!code.includes('lit') && !code.includes('customElements')) {
50
+ return null;
51
+ }
52
+ // Idempotency: never re-instrument our own output.
53
+ if (code.includes(VIRTUAL_PREFIX)) {
54
+ return null;
55
+ }
56
+ await init();
57
+ let imports;
58
+ try {
59
+ [imports] = parse(code);
60
+ } catch {
61
+ // Not parseable as a module; leave it to Vite to error.
62
+ return null;
63
+ }
64
+ const ms = new MagicString(code);
65
+ let changed = false;
66
+ let hasLitFamilyImport = false;
67
+ for (const imp of imports) {
68
+ // `import.meta` reports a null specifier; a dynamic import reports
69
+ // undefined when its argument is not statically analyzable, and a glob
70
+ // (template literal) specifier is a pattern rather than a real id.
71
+ const spec = imp.specifier;
72
+ if (spec == null || (imp.type === 'dynamic' && imp.glob)) {
73
+ continue;
47
74
  }
48
- // Idempotency: never re-instrument our own output.
49
- if (code.includes(VIRTUAL_PREFIX)) {
50
- return null;
75
+ if (isLitFamilySpecifier(spec)) {
76
+ hasLitFamilyImport = true;
51
77
  }
52
- await init;
53
- let imports;
54
- try {
55
- [imports] = parse(code);
78
+ if (!WRAP_TABLE.has(spec)) {
79
+ continue;
56
80
  }
57
- catch {
58
- // Not parseable as a module; leave it to Vite to error.
59
- return null;
81
+ if (imp.type === 'dynamic') {
82
+ // Dynamic import: [start, end) includes the quotes (or backticks) —
83
+ // narrow them to plain quotes around the rewritten specifier.
84
+ ms.overwrite(imp.start, imp.end, `'${VIRTUAL_PREFIX}${spec}'`);
85
+ } else {
86
+ // Static import / export-from: [start, end) is the bare specifier text.
87
+ ms.overwrite(imp.start, imp.end, `${VIRTUAL_PREFIX}${spec}`);
60
88
  }
61
- const ms = new MagicString(code);
62
- let changed = false;
63
- let hasLitFamilyImport = false;
64
- for (const imp of imports) {
65
- const spec = imp.n;
66
- if (spec === undefined) {
67
- continue;
68
- }
69
- if (isLitFamilySpecifier(spec)) {
70
- hasLitFamilyImport = true;
71
- }
72
- if (!WRAP_TABLE.has(spec)) {
73
- continue;
74
- }
75
- if (imp.d > -1) {
76
- // Dynamic import: [s, e) includes the quotes (or backticks) — narrow
77
- // them to plain quotes around the rewritten specifier.
78
- ms.overwrite(imp.s, imp.e, `'${VIRTUAL_PREFIX}${spec}'`);
79
- }
80
- else {
81
- // Static import / export-from: [s, e) is the bare specifier text.
82
- ms.overwrite(imp.s, imp.e, `${VIRTUAL_PREFIX}${spec}`);
83
- }
84
- changed = true;
85
- }
86
- if (isComponentModule(code, hasLitFamilyImport)) {
87
- ms.prepend(`import '${INSTALL_ID}';\n`);
88
- ms.append(`\nimport.meta.hot?.accept();\n`);
89
- changed = true;
90
- }
91
- if (!changed) {
92
- return null;
93
- }
94
- return {
95
- code: ms.toString(),
96
- map: ms.generateMap({ hires: 'boundary' }),
97
- };
89
+ changed = true;
90
+ }
91
+ if (isComponentModule(code, hasLitFamilyImport)) {
92
+ ms.prepend(`import '${INSTALL_ID}';\n`);
93
+ ms.append(`\nimport.meta.hot?.accept();\n`);
94
+ changed = true;
95
+ }
96
+ if (!changed) {
97
+ return null;
98
+ }
99
+ return {
100
+ code: ms.toString(),
101
+ map: ms.generateMap({hires: 'boundary'}),
102
+ };
98
103
  };
99
- //# sourceMappingURL=transform.js.map
104
+ //# sourceMappingURL=transform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {init, parse} from 'es-module-lexer';\nimport MagicString from 'magic-string';\nimport {WRAP_TABLE} from './wrap-table.js';\n\n/**\n * Prefix for this plugin's virtual module ids. Rewritten specifiers carry\n * the `\\0` convention directly in the transformed source; Vite's\n * import-analysis resolves them through our `resolveId` and encodes the\n * `\\0` for the browser, so it never reaches the network.\n */\nexport const VIRTUAL_PREFIX = '\\0lit-plugin:';\n\n/** Virtual module that installs the define interceptor. */\nexport const INSTALL_ID = `${VIRTUAL_PREFIX}install`;\n\nconst LIT_FAMILY_PACKAGES = ['lit', 'lit-html', 'lit-element'];\nconst LIT_FAMILY_SCOPES = ['@lit/', '@lit-labs/'];\n\nconst isLitFamilySpecifier = (spec: string): boolean =>\n LIT_FAMILY_PACKAGES.some((p) => spec === p || spec.startsWith(`${p}/`)) ||\n LIT_FAMILY_SCOPES.some((s) => spec.startsWith(s));\n\n/**\n * A module needs the define interceptor + self-accept if it registers\n * custom elements: a textual `customElements.define(` call, or — only when\n * a lit-family import is present — a `customElement(` decorator call (the\n * decorator runtime call stays textually present after TS transpilation).\n */\nexport const isComponentModule = (\n code: string,\n hasLitFamilyImport: boolean\n): boolean =>\n /(?<![.\\w$])(?:(?:window|globalThis|self)\\.)?customElements\\.define\\s*\\(/.test(\n code\n ) ||\n (hasLitFamilyImport && /\\bcustomElement\\s*\\(/.test(code));\n\nexport interface LitPluginTransformResult {\n code: string;\n map: ReturnType<MagicString['generateMap']>;\n}\n\n/**\n * The whole dev transform, as a pure function of the module source:\n *\n * - Pass 1 (all user modules — shared template-partial modules must intern\n * too): rewrite import/export-from/dynamic-import specifiers found in the\n * wrap table to their `\\0lit-plugin:` wrapper module.\n * - Pass 2 (component modules): prepend the interceptor install import\n * (static imports hoist, so the interceptor is installed before this\n * module's defines) and append a self-accept (re-execution alone triggers\n * the define interceptor — no hotUpdate hook needed).\n *\n * Returns `null` when the module needs no changes.\n */\nexport const transformLitModule = async (\n code: string\n): Promise<LitPluginTransformResult | null> => {\n // Cheap pre-filter before parsing.\n if (!code.includes('lit') && !code.includes('customElements')) {\n return null;\n }\n // Idempotency: never re-instrument our own output.\n if (code.includes(VIRTUAL_PREFIX)) {\n return null;\n }\n await init;\n let imports;\n try {\n [imports] = parse(code);\n } catch {\n // Not parseable as a module; leave it to Vite to error.\n return null;\n }\n const ms = new MagicString(code);\n let changed = false;\n let hasLitFamilyImport = false;\n for (const imp of imports) {\n const spec = imp.n;\n if (spec === undefined) {\n continue;\n }\n if (isLitFamilySpecifier(spec)) {\n hasLitFamilyImport = true;\n }\n if (!WRAP_TABLE.has(spec)) {\n continue;\n }\n if (imp.d > -1) {\n // Dynamic import: [s, e) includes the quotes (or backticks) — narrow\n // them to plain quotes around the rewritten specifier.\n ms.overwrite(imp.s, imp.e, `'${VIRTUAL_PREFIX}${spec}'`);\n } else {\n // Static import / export-from: [s, e) is the bare specifier text.\n ms.overwrite(imp.s, imp.e, `${VIRTUAL_PREFIX}${spec}`);\n }\n changed = true;\n }\n if (isComponentModule(code, hasLitFamilyImport)) {\n ms.prepend(`import '${INSTALL_ID}';\\n`);\n ms.append(`\\nimport.meta.hot?.accept();\\n`);\n changed = true;\n }\n if (!changed) {\n return null;\n }\n return {\n code: ms.toString(),\n map: ms.generateMap({hires: 'boundary'}),\n };\n};\n"]}
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/lib/transform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAE9C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,cAAc,SAAS,CAAC;AAErD,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAC/D,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAElD,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAW,EAAE,CACrD,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAY,EACZ,kBAA2B,EAClB,EAAE,CACX,yEAAyE,CAAC,IAAI,CAC5E,IAAI,CACL;IACD,CAAC,kBAAkB,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAO5D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,IAAY,EAC8B,EAAE;IAC5C,mCAAmC;IACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,mDAAmD;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,mEAAmE;QACnE,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;QAC3B,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,SAAS;QACX,CAAC;QACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,kBAAkB,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,oEAAoE;YACpE,8DAA8D;YAC9D,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,wEAAwE;YACxE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAChD,EAAE,CAAC,OAAO,CAAC,WAAW,UAAU,MAAM,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC5C,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE;QACnB,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,EAAC,KAAK,EAAE,UAAU,EAAC,CAAC;KACzC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {init, parse} from 'es-module-lexer';\nimport MagicString from 'magic-string';\nimport {WRAP_TABLE} from './wrap-table.js';\n\n/**\n * Prefix for this plugin's virtual module ids. Rewritten specifiers carry\n * the `\\0` convention directly in the transformed source; Vite's\n * import-analysis resolves them through our `resolveId` and encodes the\n * `\\0` for the browser, so it never reaches the network.\n */\nexport const VIRTUAL_PREFIX = '\\0lit-plugin:';\n\n/** Virtual module that installs the define interceptor. */\nexport const INSTALL_ID = `${VIRTUAL_PREFIX}install`;\n\nconst LIT_FAMILY_PACKAGES = ['lit', 'lit-html', 'lit-element'];\nconst LIT_FAMILY_SCOPES = ['@lit/', '@lit-labs/'];\n\nconst isLitFamilySpecifier = (spec: string): boolean =>\n LIT_FAMILY_PACKAGES.some((p) => spec === p || spec.startsWith(`${p}/`)) ||\n LIT_FAMILY_SCOPES.some((s) => spec.startsWith(s));\n\n/**\n * A module needs the define interceptor + self-accept if it registers\n * custom elements: a textual `customElements.define(` call, or — only when\n * a lit-family import is present — a `customElement(` decorator call (the\n * decorator runtime call stays textually present after TS transpilation).\n */\nexport const isComponentModule = (\n code: string,\n hasLitFamilyImport: boolean\n): boolean =>\n /(?<![.\\w$])(?:(?:window|globalThis|self)\\.)?customElements\\.define\\s*\\(/.test(\n code\n ) ||\n (hasLitFamilyImport && /\\bcustomElement\\s*\\(/.test(code));\n\nexport interface LitPluginTransformResult {\n code: string;\n map: ReturnType<MagicString['generateMap']>;\n}\n\n/**\n * The whole dev transform, as a pure function of the module source:\n *\n * - Pass 1 (all user modules — shared template-partial modules must intern\n * too): rewrite import/export-from/dynamic-import specifiers found in the\n * wrap table to their `\\0lit-plugin:` wrapper module.\n * - Pass 2 (component modules): prepend the interceptor install import\n * (static imports hoist, so the interceptor is installed before this\n * module's defines) and append a self-accept (re-execution alone triggers\n * the define interceptor — no hotUpdate hook needed).\n *\n * Returns `null` when the module needs no changes.\n */\nexport const transformLitModule = async (\n code: string\n): Promise<LitPluginTransformResult | null> => {\n // Cheap pre-filter before parsing.\n if (!code.includes('lit') && !code.includes('customElements')) {\n return null;\n }\n // Idempotency: never re-instrument our own output.\n if (code.includes(VIRTUAL_PREFIX)) {\n return null;\n }\n await init();\n let imports;\n try {\n [imports] = parse(code);\n } catch {\n // Not parseable as a module; leave it to Vite to error.\n return null;\n }\n const ms = new MagicString(code);\n let changed = false;\n let hasLitFamilyImport = false;\n for (const imp of imports) {\n // `import.meta` reports a null specifier; a dynamic import reports\n // undefined when its argument is not statically analyzable, and a glob\n // (template literal) specifier is a pattern rather than a real id.\n const spec = imp.specifier;\n if (spec == null || (imp.type === 'dynamic' && imp.glob)) {\n continue;\n }\n if (isLitFamilySpecifier(spec)) {\n hasLitFamilyImport = true;\n }\n if (!WRAP_TABLE.has(spec)) {\n continue;\n }\n if (imp.type === 'dynamic') {\n // Dynamic import: [start, end) includes the quotes (or backticks) —\n // narrow them to plain quotes around the rewritten specifier.\n ms.overwrite(imp.start, imp.end, `'${VIRTUAL_PREFIX}${spec}'`);\n } else {\n // Static import / export-from: [start, end) is the bare specifier text.\n ms.overwrite(imp.start, imp.end, `${VIRTUAL_PREFIX}${spec}`);\n }\n changed = true;\n }\n if (isComponentModule(code, hasLitFamilyImport)) {\n ms.prepend(`import '${INSTALL_ID}';\\n`);\n ms.append(`\\nimport.meta.hot?.accept();\\n`);\n changed = true;\n }\n if (!changed) {\n return null;\n }\n return {\n code: ms.toString(),\n map: ms.generateMap({hires: 'boundary'}),\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,2EAA2E;IAC3E,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAE/B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC;IAEnC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CACxC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,2EAA2E;IAC3E,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAE/B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC;IAEnC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CACxC"}
package/lib/types.js CHANGED
@@ -4,4 +4,4 @@
4
4
  * SPDX-License-Identifier: BSD-3-Clause
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=types.js.map
7
+ //# sourceMappingURL=types.js.map
package/lib/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nexport interface ElementInfo {\n tagName: string;\n componentName?: string;\n source: {\n filePath: string;\n lineNumber: number;\n };\n}\n\nexport interface EditorConfig {\n name: string;\n url: (path: string, line: number) => string;\n}\n\nexport interface SourceOverlayOptions {\n /**\n * Hotkey letter with Ctrl+Shift (default `s` -> Ctrl+Shift+S).\n */\n key?: string;\n\n /** Built-in editor key or custom `{ name, url }`. Defaults to `vscode`. */\n editor?: EditorConfig | string;\n\n /** Optional workspace root prefix for absolute file paths. */\n workspaceRoot?: string;\n\n /** Mouse move throttle in ms (default 50). */\n throttleMs?: number;\n\n /** Filter elements to skip during inspection. */\n exclude?: (el: Element) => boolean;\n\n /** Callback fired when the user clicks a component. */\n onSelect?: (info: ElementInfo) => void;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nexport interface ElementInfo {\n tagName: string;\n componentName?: string;\n source: {\n filePath: string;\n lineNumber: number;\n };\n}\n\nexport interface EditorConfig {\n name: string;\n url: (path: string, line: number) => string;\n}\n\nexport interface SourceOverlayOptions {\n /**\n * Hotkey letter with Ctrl+Shift (default `s` -> Ctrl+Shift+S).\n */\n key?: string;\n\n /** Built-in editor key or custom `{ name, url }`. Defaults to `vscode`. */\n editor?: EditorConfig | string;\n\n /** Optional workspace root prefix for absolute file paths. */\n workspaceRoot?: string;\n\n /** Mouse move throttle in ms (default 50). */\n throttleMs?: number;\n\n /** Filter elements to skip during inspection. */\n exclude?: (el: Element) => boolean;\n\n /** Callback fired when the user clicks a component. */\n onSelect?: (info: ElementInfo) => void;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"wrap-table.d.ts","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/wrap-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAQD,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAehE,CAAC"}
1
+ {"version":3,"file":"wrap-table.d.ts","sourceRoot":"","sources":["../src/lib/wrap-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAQD,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAehE,CAAC"}
package/lib/wrap-table.js CHANGED
@@ -3,22 +3,24 @@
3
3
  * Copyright 2026 Google LLC
4
4
  * SPDX-License-Identifier: BSD-3-Clause
5
5
  */
6
- const tags = (...names) => names.map((exportName) => ({ exportName, ns: exportName }));
7
- const staticTags = (...names) => names.map((exportName) => ({ exportName, ns: `static-${exportName}` }));
6
+ const tags = (...names) =>
7
+ names.map((exportName) => ({exportName, ns: exportName}));
8
+ const staticTags = (...names) =>
9
+ names.map((exportName) => ({exportName, ns: `static-${exportName}`}));
8
10
  export const WRAP_TABLE = new Map([
9
- ['lit', tags('html', 'svg', 'mathml', 'css')],
10
- ['lit/html.js', tags('html', 'svg', 'mathml')],
11
- ['lit/static-html.js', staticTags('html', 'svg', 'mathml')],
12
- ['lit-html', tags('html', 'svg', 'mathml')],
13
- ['lit-html/static.js', staticTags('html', 'svg', 'mathml')],
14
- ['lit-element', tags('html', 'svg', 'mathml', 'css')],
15
- ['lit-element/lit-element.js', tags('html', 'svg', 'mathml', 'css')],
16
- ['@lit/reactive-element', tags('css')],
17
- ['@lit/reactive-element/css-tag.js', tags('css')],
18
- // The signals tags wrap the user's values but pass the strings array
19
- // straight through to lit-html's core tags, so they intern in the same
20
- // namespaces as plain html/svg (content-equal templates share a cache
21
- // entry either way).
22
- ['@lit-labs/signals', tags('html', 'svg')],
11
+ ['lit', tags('html', 'svg', 'mathml', 'css')],
12
+ ['lit/html.js', tags('html', 'svg', 'mathml')],
13
+ ['lit/static-html.js', staticTags('html', 'svg', 'mathml')],
14
+ ['lit-html', tags('html', 'svg', 'mathml')],
15
+ ['lit-html/static.js', staticTags('html', 'svg', 'mathml')],
16
+ ['lit-element', tags('html', 'svg', 'mathml', 'css')],
17
+ ['lit-element/lit-element.js', tags('html', 'svg', 'mathml', 'css')],
18
+ ['@lit/reactive-element', tags('css')],
19
+ ['@lit/reactive-element/css-tag.js', tags('css')],
20
+ // The signals tags wrap the user's values but pass the strings array
21
+ // straight through to lit-html's core tags, so they intern in the same
22
+ // namespaces as plain html/svg (content-equal templates share a cache
23
+ // entry either way).
24
+ ['@lit-labs/signals', tags('html', 'svg')],
23
25
  ]);
24
- //# sourceMappingURL=wrap-table.js.map
26
+ //# sourceMappingURL=wrap-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrap-table.js","sourceRoot":"","sources":["../../../packages/labs/vite-plugin-lit/src/lib/wrap-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,MAAM,IAAI,GAAG,CAAC,GAAG,KAAsC,EAAgB,EAAE,CACvE,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAC,UAAU,EAAE,EAAE,EAAE,UAAU,EAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,UAAU,GAAG,CAAC,GAAG,KAAsC,EAAgB,EAAE,CAC7E,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAC,UAAU,EAAE,EAAE,EAAE,UAAU,UAAU,EAAE,EAAC,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,UAAU,GAA+C,IAAI,GAAG,CAAC;IAC5E,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,oBAAoB,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,oBAAoB,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,4BAA4B,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,kCAAkC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,qBAAqB;IACrB,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC3C,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * The exact wrap surface: which template-tag exports of which lit-family\n * module specifiers get interned, and in which namespace.\n *\n * Namespaces are per tag *type*, not per module — `html` from `'lit'` and\n * from `'lit-html'` feed the same lit-html template cache, so they must\n * share canonical arrays. But content-equal `html` and `svg` templates must\n * never share one (a shared Template would parse SVG as HTML), and the\n * static-html tags pass zero-statics calls straight through to lit-html, so\n * they get their own namespaces too.\n *\n * Specifiers must be valid export-map subpaths (e.g. `lit/index.js` and\n * `lit-html/lit-html.js` are not, and are deliberately absent).\n */\n\nexport interface WrappedTag {\n readonly exportName: 'html' | 'svg' | 'mathml' | 'css';\n readonly ns: string;\n}\n\nconst tags = (...names: Array<WrappedTag['exportName']>): WrappedTag[] =>\n names.map((exportName) => ({exportName, ns: exportName}));\n\nconst staticTags = (...names: Array<WrappedTag['exportName']>): WrappedTag[] =>\n names.map((exportName) => ({exportName, ns: `static-${exportName}`}));\n\nexport const WRAP_TABLE: ReadonlyMap<string, readonly WrappedTag[]> = new Map([\n ['lit', tags('html', 'svg', 'mathml', 'css')],\n ['lit/html.js', tags('html', 'svg', 'mathml')],\n ['lit/static-html.js', staticTags('html', 'svg', 'mathml')],\n ['lit-html', tags('html', 'svg', 'mathml')],\n ['lit-html/static.js', staticTags('html', 'svg', 'mathml')],\n ['lit-element', tags('html', 'svg', 'mathml', 'css')],\n ['lit-element/lit-element.js', tags('html', 'svg', 'mathml', 'css')],\n ['@lit/reactive-element', tags('css')],\n ['@lit/reactive-element/css-tag.js', tags('css')],\n // The signals tags wrap the user's values but pass the strings array\n // straight through to lit-html's core tags, so they intern in the same\n // namespaces as plain html/svg (content-equal templates share a cache\n // entry either way).\n ['@lit-labs/signals', tags('html', 'svg')],\n]);\n"]}
1
+ {"version":3,"file":"wrap-table.js","sourceRoot":"","sources":["../src/lib/wrap-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,MAAM,IAAI,GAAG,CAAC,GAAG,KAAsC,EAAgB,EAAE,CACvE,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAC,UAAU,EAAE,EAAE,EAAE,UAAU,EAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,UAAU,GAAG,CAAC,GAAG,KAAsC,EAAgB,EAAE,CAC7E,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAC,UAAU,EAAE,EAAE,EAAE,UAAU,UAAU,EAAE,EAAC,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,UAAU,GAA+C,IAAI,GAAG,CAAC;IAC5E,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,oBAAoB,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,oBAAoB,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,4BAA4B,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,kCAAkC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,qBAAqB;IACrB,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC3C,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * The exact wrap surface: which template-tag exports of which lit-family\n * module specifiers get interned, and in which namespace.\n *\n * Namespaces are per tag *type*, not per module — `html` from `'lit'` and\n * from `'lit-html'` feed the same lit-html template cache, so they must\n * share canonical arrays. But content-equal `html` and `svg` templates must\n * never share one (a shared Template would parse SVG as HTML), and the\n * static-html tags pass zero-statics calls straight through to lit-html, so\n * they get their own namespaces too.\n *\n * Specifiers must be valid export-map subpaths (e.g. `lit/index.js` and\n * `lit-html/lit-html.js` are not, and are deliberately absent).\n */\n\nexport interface WrappedTag {\n readonly exportName: 'html' | 'svg' | 'mathml' | 'css';\n readonly ns: string;\n}\n\nconst tags = (...names: Array<WrappedTag['exportName']>): WrappedTag[] =>\n names.map((exportName) => ({exportName, ns: exportName}));\n\nconst staticTags = (...names: Array<WrappedTag['exportName']>): WrappedTag[] =>\n names.map((exportName) => ({exportName, ns: `static-${exportName}`}));\n\nexport const WRAP_TABLE: ReadonlyMap<string, readonly WrappedTag[]> = new Map([\n ['lit', tags('html', 'svg', 'mathml', 'css')],\n ['lit/html.js', tags('html', 'svg', 'mathml')],\n ['lit/static-html.js', staticTags('html', 'svg', 'mathml')],\n ['lit-html', tags('html', 'svg', 'mathml')],\n ['lit-html/static.js', staticTags('html', 'svg', 'mathml')],\n ['lit-element', tags('html', 'svg', 'mathml', 'css')],\n ['lit-element/lit-element.js', tags('html', 'svg', 'mathml', 'css')],\n ['@lit/reactive-element', tags('css')],\n ['@lit/reactive-element/css-tag.js', tags('css')],\n // The signals tags wrap the user's values but pass the strings array\n // straight through to lit-html's core tags, so they intern in the same\n // namespaces as plain html/svg (content-equal templates share a cache\n // entry either way).\n ['@lit-labs/signals', tags('html', 'svg')],\n]);\n"]}