@oddsquad/vite-plugin-lit 0.6.1 → 0.8.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.
- package/CHANGELOG.md +68 -0
- package/LICENSE +1 -1
- package/README.md +40 -17
- package/bin.mjs +89 -13
- package/client.d.ts +0 -6
- package/dist/client/assets/{browser-agent-rpc-BXhoSh1z-F2EfZsFX.js → browser-agent-rpc-BXhoSh1z-ybEeG-x9.js} +2 -2
- package/dist/client/assets/{browser-agent-rpc-BXhoSh1z-F2EfZsFX.js.map → browser-agent-rpc-BXhoSh1z-ybEeG-x9.js.map} +1 -1
- package/dist/client/assets/{index-B2HYO7lk.js → index-CgkhETVR.js} +22 -145
- package/dist/client/assets/index-CgkhETVR.js.map +1 -0
- package/dist/client/index.html +1 -1
- package/dist/standalone/lit-devtools.js +6717 -0
- package/index.d.ts +0 -5
- package/index.d.ts.map +1 -1
- package/index.js +1 -5
- package/index.js.map +1 -1
- package/lib/color-scheme.d.ts +0 -5
- package/lib/color-scheme.d.ts.map +1 -1
- package/lib/color-scheme.js +0 -5
- package/lib/color-scheme.js.map +1 -1
- package/lib/confine.d.ts +0 -5
- package/lib/confine.d.ts.map +1 -1
- package/lib/confine.js +0 -5
- package/lib/confine.js.map +1 -1
- package/lib/devframe/allowed-origins.d.ts +21 -0
- package/lib/devframe/allowed-origins.d.ts.map +1 -0
- package/lib/devframe/allowed-origins.js +58 -0
- package/lib/devframe/allowed-origins.js.map +1 -0
- package/lib/devframe/definition.d.ts +7 -3
- package/lib/devframe/definition.d.ts.map +1 -1
- package/lib/devframe/definition.js +1 -6
- package/lib/devframe/definition.js.map +1 -1
- package/lib/devframe/icon.d.ts +0 -5
- package/lib/devframe/icon.d.ts.map +1 -1
- package/lib/devframe/icon.js +0 -5
- package/lib/devframe/icon.js.map +1 -1
- package/lib/devframe/launch-editor.d.ts +0 -5
- package/lib/devframe/launch-editor.d.ts.map +1 -1
- package/lib/devframe/launch-editor.js +0 -5
- package/lib/devframe/launch-editor.js.map +1 -1
- package/lib/devframe/paths.d.ts +8 -3
- package/lib/devframe/paths.d.ts.map +1 -1
- package/lib/devframe/paths.js +0 -5
- package/lib/devframe/paths.js.map +1 -1
- package/lib/devframe/protocol.d.ts +6 -3
- package/lib/devframe/protocol.d.ts.map +1 -1
- package/lib/devframe/protocol.js +0 -5
- package/lib/devframe/protocol.js.map +1 -1
- package/lib/devframe/rpc-source.d.ts +15 -3
- package/lib/devframe/rpc-source.d.ts.map +1 -1
- package/lib/devframe/rpc-source.js +0 -5
- package/lib/devframe/rpc-source.js.map +1 -1
- package/lib/devframe/source.d.ts +0 -5
- package/lib/devframe/source.d.ts.map +1 -1
- package/lib/devframe/source.js +7 -3
- package/lib/devframe/source.js.map +1 -1
- package/lib/devframe/vite.d.ts +0 -5
- package/lib/devframe/vite.d.ts.map +1 -1
- package/lib/devframe/vite.js +16 -3
- package/lib/devframe/vite.js.map +1 -1
- package/lib/http.d.ts +0 -5
- package/lib/http.d.ts.map +1 -1
- package/lib/http.js +0 -5
- package/lib/http.js.map +1 -1
- package/lib/icons.d.ts +0 -5
- package/lib/icons.d.ts.map +1 -1
- package/lib/icons.js +0 -5
- package/lib/icons.js.map +1 -1
- package/lib/options.d.ts +26 -5
- package/lib/options.d.ts.map +1 -1
- package/lib/options.js +19 -5
- package/lib/options.js.map +1 -1
- package/lib/override-baselines.d.ts +0 -5
- package/lib/override-baselines.d.ts.map +1 -1
- package/lib/override-baselines.js +0 -5
- package/lib/override-baselines.js.map +1 -1
- package/lib/plugin.d.ts +0 -5
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +3 -5
- package/lib/plugin.js.map +1 -1
- package/lib/plugins/css-literals.d.ts +0 -5
- package/lib/plugins/css-literals.d.ts.map +1 -1
- package/lib/plugins/css-literals.js +0 -5
- package/lib/plugins/css-literals.js.map +1 -1
- package/lib/plugins/css-queries.d.ts +0 -5
- package/lib/plugins/css-queries.d.ts.map +1 -1
- package/lib/plugins/css-queries.js +0 -5
- package/lib/plugins/css-queries.js.map +1 -1
- package/lib/plugins/open-in-editor.d.ts +0 -5
- package/lib/plugins/open-in-editor.d.ts.map +1 -1
- package/lib/plugins/open-in-editor.js +0 -5
- package/lib/plugins/open-in-editor.js.map +1 -1
- package/lib/plugins/private-fields.d.ts +22 -0
- package/lib/plugins/private-fields.d.ts.map +1 -0
- package/lib/plugins/private-fields.js +254 -0
- package/lib/plugins/private-fields.js.map +1 -0
- package/lib/plugins/shared.d.ts +0 -5
- package/lib/plugins/shared.d.ts.map +1 -1
- package/lib/plugins/shared.js +0 -5
- package/lib/plugins/shared.js.map +1 -1
- package/lib/plugins/timeline-virtual.d.ts +0 -5
- package/lib/plugins/timeline-virtual.d.ts.map +1 -1
- package/lib/plugins/timeline-virtual.js +0 -5
- package/lib/plugins/timeline-virtual.js.map +1 -1
- package/lib/runtime/child-state.d.ts +95 -0
- package/lib/runtime/child-state.d.ts.map +1 -0
- package/lib/runtime/child-state.js +461 -0
- package/lib/runtime/child-state.js.map +1 -0
- package/lib/runtime/css.d.ts +14 -3
- package/lib/runtime/css.d.ts.map +1 -1
- package/lib/runtime/css.js +3 -5
- package/lib/runtime/css.js.map +1 -1
- package/lib/runtime/edge-panel.d.ts +8 -3
- package/lib/runtime/edge-panel.d.ts.map +1 -1
- package/lib/runtime/edge-panel.js +0 -5
- package/lib/runtime/edge-panel.js.map +1 -1
- package/lib/runtime/fonts.d.ts +0 -5
- package/lib/runtime/fonts.d.ts.map +1 -1
- package/lib/runtime/fonts.js +0 -5
- package/lib/runtime/fonts.js.map +1 -1
- package/lib/runtime/indicator.d.ts +3 -3
- package/lib/runtime/indicator.js +0 -5
- package/lib/runtime/indicator.js.map +1 -1
- package/lib/runtime/inspector/collect.d.ts +3 -3
- package/lib/runtime/inspector/collect.d.ts.map +1 -1
- package/lib/runtime/inspector/collect.js +0 -5
- package/lib/runtime/inspector/collect.js.map +1 -1
- package/lib/runtime/inspector/highlight.d.ts +10 -3
- package/lib/runtime/inspector/highlight.d.ts.map +1 -1
- package/lib/runtime/inspector/highlight.js +0 -5
- package/lib/runtime/inspector/highlight.js.map +1 -1
- package/lib/runtime/inspector/install.d.ts +6 -3
- package/lib/runtime/inspector/install.d.ts.map +1 -1
- package/lib/runtime/inspector/install.js +4 -6
- package/lib/runtime/inspector/install.js.map +1 -1
- package/lib/runtime/inspector/serialize.d.ts +4 -3
- package/lib/runtime/inspector/serialize.d.ts.map +1 -1
- package/lib/runtime/inspector/serialize.js +0 -5
- package/lib/runtime/inspector/serialize.js.map +1 -1
- package/lib/runtime/intern.d.ts +11 -3
- package/lib/runtime/intern.d.ts.map +1 -1
- package/lib/runtime/intern.js +11 -3
- package/lib/runtime/intern.js.map +1 -1
- package/lib/runtime/overrides.d.ts +3 -3
- package/lib/runtime/overrides.d.ts.map +1 -1
- package/lib/runtime/overrides.js +0 -5
- package/lib/runtime/overrides.js.map +1 -1
- package/lib/runtime/page-channel.d.ts +0 -5
- package/lib/runtime/page-channel.d.ts.map +1 -1
- package/lib/runtime/page-channel.js +13 -3
- package/lib/runtime/page-channel.js.map +1 -1
- package/lib/runtime/patch.d.ts +22 -3
- package/lib/runtime/patch.d.ts.map +1 -1
- package/lib/runtime/patch.js +22 -6
- package/lib/runtime/patch.js.map +1 -1
- package/lib/runtime/rpc-transport.d.ts +21 -3
- package/lib/runtime/rpc-transport.d.ts.map +1 -1
- package/lib/runtime/rpc-transport.js +4 -5
- package/lib/runtime/rpc-transport.js.map +1 -1
- package/lib/runtime/source-meta.d.ts +0 -5
- package/lib/runtime/source-meta.d.ts.map +1 -1
- package/lib/runtime/source-meta.js +0 -5
- package/lib/runtime/source-meta.js.map +1 -1
- package/lib/runtime/source-overlay/editors.d.ts +0 -5
- package/lib/runtime/source-overlay/editors.d.ts.map +1 -1
- package/lib/runtime/source-overlay/editors.js +9 -9
- package/lib/runtime/source-overlay/editors.js.map +1 -1
- package/lib/runtime/source-overlay/mask-path.d.ts +0 -5
- package/lib/runtime/source-overlay/mask-path.d.ts.map +1 -1
- package/lib/runtime/source-overlay/mask-path.js +0 -5
- package/lib/runtime/source-overlay/mask-path.js.map +1 -1
- package/lib/runtime/source-overlay/overlay-element.d.ts +0 -5
- package/lib/runtime/source-overlay/overlay-element.d.ts.map +1 -1
- package/lib/runtime/source-overlay/overlay-element.js +0 -5
- package/lib/runtime/source-overlay/overlay-element.js.map +1 -1
- package/lib/runtime/source-overlay/source-host.d.ts +0 -5
- package/lib/runtime/source-overlay/source-host.d.ts.map +1 -1
- package/lib/runtime/source-overlay/source-host.js +0 -5
- package/lib/runtime/source-overlay/source-host.js.map +1 -1
- package/lib/runtime/source-overlay/template.d.ts +0 -5
- package/lib/runtime/source-overlay/template.d.ts.map +1 -1
- package/lib/runtime/source-overlay/template.js +0 -5
- package/lib/runtime/source-overlay/template.js.map +1 -1
- package/lib/runtime/source-overlay.d.ts +0 -5
- package/lib/runtime/source-overlay.d.ts.map +1 -1
- package/lib/runtime/source-overlay.js +0 -5
- package/lib/runtime/source-overlay.js.map +1 -1
- package/lib/runtime/standalone.d.ts +22 -0
- package/lib/runtime/standalone.d.ts.map +1 -0
- package/lib/runtime/standalone.js +45 -0
- package/lib/runtime/standalone.js.map +1 -0
- package/lib/runtime/timeline/chrome-tracks.d.ts +0 -5
- package/lib/runtime/timeline/chrome-tracks.d.ts.map +1 -1
- package/lib/runtime/timeline/chrome-tracks.js +5 -3
- package/lib/runtime/timeline/chrome-tracks.js.map +1 -1
- package/lib/runtime/timeline/clock.d.ts +7 -3
- package/lib/runtime/timeline/clock.d.ts.map +1 -1
- package/lib/runtime/timeline/clock.js +0 -5
- package/lib/runtime/timeline/clock.js.map +1 -1
- package/lib/runtime/timeline/flash.d.ts +0 -5
- package/lib/runtime/timeline/flash.d.ts.map +1 -1
- package/lib/runtime/timeline/flash.js +15 -3
- package/lib/runtime/timeline/flash.js.map +1 -1
- package/lib/runtime/timeline/identity.d.ts +0 -5
- package/lib/runtime/timeline/identity.d.ts.map +1 -1
- package/lib/runtime/timeline/identity.js +9 -3
- package/lib/runtime/timeline/identity.js.map +1 -1
- package/lib/runtime/timeline/input.d.ts +0 -5
- package/lib/runtime/timeline/input.d.ts.map +1 -1
- package/lib/runtime/timeline/input.js +2 -3
- package/lib/runtime/timeline/input.js.map +1 -1
- package/lib/runtime/timeline/install.d.ts +11 -3
- package/lib/runtime/timeline/install.d.ts.map +1 -1
- package/lib/runtime/timeline/install.js +4 -7
- package/lib/runtime/timeline/install.js.map +1 -1
- package/lib/runtime/timeline/lifecycle.d.ts +13 -3
- package/lib/runtime/timeline/lifecycle.d.ts.map +1 -1
- package/lib/runtime/timeline/lifecycle.js +5 -6
- package/lib/runtime/timeline/lifecycle.js.map +1 -1
- package/lib/runtime/timeline/public-api.d.ts +6 -3
- package/lib/runtime/timeline/public-api.d.ts.map +1 -1
- package/lib/runtime/timeline/public-api.js +0 -5
- package/lib/runtime/timeline/public-api.js.map +1 -1
- package/lib/runtime/timeline/render.d.ts +0 -5
- package/lib/runtime/timeline/render.d.ts.map +1 -1
- package/lib/runtime/timeline/render.js +21 -3
- package/lib/runtime/timeline/render.js.map +1 -1
- package/lib/runtime/timeline/transport.d.ts +0 -5
- package/lib/runtime/timeline/transport.d.ts.map +1 -1
- package/lib/runtime/timeline/transport.js +10 -3
- package/lib/runtime/timeline/transport.js.map +1 -1
- package/lib/segmented-tabs.d.ts +0 -5
- package/lib/segmented-tabs.d.ts.map +1 -1
- package/lib/segmented-tabs.js +0 -5
- package/lib/segmented-tabs.js.map +1 -1
- package/lib/snapshot.d.ts +11 -3
- package/lib/snapshot.d.ts.map +1 -1
- package/lib/snapshot.js +0 -5
- package/lib/snapshot.js.map +1 -1
- package/lib/source-meta.d.ts +0 -5
- package/lib/source-meta.d.ts.map +1 -1
- package/lib/source-meta.js +0 -5
- package/lib/source-meta.js.map +1 -1
- package/lib/timeline/derive.d.ts +0 -5
- package/lib/timeline/derive.d.ts.map +1 -1
- package/lib/timeline/derive.js +22 -3
- package/lib/timeline/derive.js.map +1 -1
- package/lib/timeline/filter.d.ts +0 -5
- package/lib/timeline/filter.d.ts.map +1 -1
- package/lib/timeline/filter.js +6 -3
- package/lib/timeline/filter.js.map +1 -1
- package/lib/timeline/tracks.d.ts +0 -5
- package/lib/timeline/tracks.d.ts.map +1 -1
- package/lib/timeline/tracks.js +12 -3
- package/lib/timeline/tracks.js.map +1 -1
- package/lib/tokens.d.ts +0 -5
- package/lib/tokens.d.ts.map +1 -1
- package/lib/tokens.js +0 -5
- package/lib/tokens.js.map +1 -1
- package/lib/transform.d.ts +0 -5
- package/lib/transform.d.ts.map +1 -1
- package/lib/transform.js +0 -5
- package/lib/transform.js.map +1 -1
- package/lib/types.d.ts +10 -5
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +0 -5
- package/lib/types.js.map +1 -1
- package/lib/wrap-table.d.ts +0 -5
- package/lib/wrap-table.d.ts.map +1 -1
- package/lib/wrap-table.js +12 -3
- package/lib/wrap-table.js.map +1 -1
- package/package.json +14 -10
- package/types/hmr-incompatibility.d.ts +0 -5
- package/types/hmr-incompatibility.d.ts.map +1 -1
- package/types/hmr-incompatibility.js +13 -3
- package/types/hmr-incompatibility.js.map +1 -1
- package/types/in-page.d.ts +0 -5
- package/types/in-page.d.ts.map +1 -1
- package/types/in-page.js +0 -5
- package/types/in-page.js.map +1 -1
- package/types/inspector.d.ts +0 -5
- package/types/inspector.d.ts.map +1 -1
- package/types/inspector.js +13 -3
- package/types/inspector.js.map +1 -1
- package/types/snapshot.d.ts +0 -5
- package/types/snapshot.d.ts.map +1 -1
- package/types/snapshot.js +12 -3
- package/types/snapshot.js.map +1 -1
- package/types/timeline.d.ts +4 -6
- package/types/timeline.d.ts.map +1 -1
- package/types/timeline.js +0 -5
- package/types/timeline.js.map +1 -1
- package/dist/client/assets/index-B2HYO7lk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-in-editor.js","sourceRoot":"","sources":["../../src/lib/plugins/open-in-editor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"open-in-editor.js","sourceRoot":"","sources":["../../src/lib/plugins/open-in-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import {resolve as resolvePath} from 'node:path';\nimport {confineToRoots} from '../confine.js';\nimport {toLaunchEditor} from '../devframe/launch-editor.js';\nimport {isTrustedRequest, type TrustHeaders} from '../http.js';\n\nexport const OPEN_IN_EDITOR_PATH = '/__lit-open-in-editor';\n\nexport const createOpenInEditorMiddleware = (\n allowedRoots: readonly string[]\n) => {\n // First entry is the primary root: relative `file` params resolve against\n // it. Every entry grants open access to files beneath it.\n const roots = allowedRoots.map((r) => resolvePath(r));\n return (\n req: {url?: string; method?: string; headers?: TrustHeaders},\n res: {statusCode: number; end: (msg: string) => void},\n next: (err?: unknown) => void\n ) => {\n if (req.url === undefined) {\n next();\n return;\n }\n if (req.method !== undefined && req.method !== 'GET') {\n res.statusCode = 405;\n res.end('method not allowed');\n return;\n }\n if (!isTrustedRequest(req.headers ?? {})) {\n res.statusCode = 403;\n res.end('forbidden');\n return;\n }\n const query = req.url.includes('?')\n ? req.url.slice(req.url.indexOf('?') + 1)\n : '';\n const params = new URLSearchParams(query);\n const file = params.get('file');\n if (file === null) {\n res.statusCode = 400;\n res.end('missing file parameter');\n return;\n }\n // Confine the open to the allowed roots: `launch-editor` spawns the\n // user's editor on this path, so an unvalidated `file` is a\n // local-file-open / arg-injection vector.\n const confined = confineToRoots(roots, file);\n if ('failure' in confined) {\n const outside = confined.failure === 'outside';\n res.statusCode = outside ? 403 : 404;\n res.end(outside ? 'file outside allowed roots' : 'file not found');\n return;\n }\n const resolved = confined.path;\n // Coerce to integers so a crafted `line`/`column` can't smuggle extra\n // shell-visible content through the `file:line:column` ref.\n const line = String(\n Math.max(1, Number.parseInt(params.get('line') ?? '1', 10) || 1)\n );\n const column = String(\n Math.max(1, Number.parseInt(params.get('column') ?? '1', 10) || 1)\n );\n // The overlay names the editor it is using (the panel's override, else the\n // configured one). Only keys `toLaunchEditor` knows become a command;\n // anything else, or nothing, leaves `launch-editor` to auto-detect.\n const editor = toLaunchEditor(params.get('editor') ?? undefined);\n const fileRef = `${resolved}:${line}:${column}`;\n import('launch-editor')\n .then(\n (mod: {\n default?: (\n file: string,\n editor: string | undefined,\n cb: (fileName: string, errorMessage: string | null) => void\n ) => void;\n }) => {\n const launch = (mod.default ?? mod) as (\n file: string,\n editor: string | undefined,\n cb: (fileName: string, errorMessage: string | null) => void\n ) => void;\n // `launch-editor` invokes the callback only on failure — synchronously\n // when it can't guess an editor, later if the spawn errors. Reply `ok`\n // right after launching; the guard keeps a sync failure's 500 first\n // and drops a late async failure (the response is long gone).\n let finished = false;\n const finish = (statusCode: number, msg: string) => {\n if (finished) return;\n finished = true;\n res.statusCode = statusCode;\n res.end(msg);\n };\n launch(\n fileRef,\n editor,\n (_fileName: string, errorMessage: string | null) => {\n if (errorMessage !== null) {\n finish(500, errorMessage);\n }\n }\n );\n finish(200, 'ok');\n }\n )\n .catch(next);\n };\n};\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
import MagicString from 'magic-string';
|
|
3
|
+
/**
|
|
4
|
+
* Rewrites native `#private` class members into computed keys backed by
|
|
5
|
+
* `Symbol.for(...)`. The key is stable across re-evaluations of the module,
|
|
6
|
+
* so instances built by an earlier evaluation of a class and methods copied
|
|
7
|
+
* from a later one agree on where private state lives. That is what lets HMR
|
|
8
|
+
* patch a class in place. Returns `null` when there is nothing to rewrite or
|
|
9
|
+
* the module can't be handled safely.
|
|
10
|
+
*/
|
|
11
|
+
export declare const rewritePrivateNames: (code: string, id: string) => {
|
|
12
|
+
code: string;
|
|
13
|
+
map: ReturnType<MagicString['generateMap']>;
|
|
14
|
+
} | null;
|
|
15
|
+
/**
|
|
16
|
+
* Dev-only transform that swaps native `#private` class members for stable
|
|
17
|
+
* symbol keys so HMR's in-place class patching keeps working. See
|
|
18
|
+
* {@link rewritePrivateNames}. `enabled` is read lazily because options are
|
|
19
|
+
* re-resolved against the loaded env after the plugin array is built.
|
|
20
|
+
*/
|
|
21
|
+
export declare const litPrivateFields: (enabled: () => boolean) => Plugin;
|
|
22
|
+
//# sourceMappingURL=private-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-fields.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/private-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,MAAM,CAAC;AAEjC,OAAO,WAAW,MAAM,cAAc,CAAC;AAwCvC;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,SACxB,MAAM,MACR,MAAM,KACT;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAA;CAAC,GAAG,IA4NhE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAAa,MAAM,OAAO,KAAG,MAgBxD,CAAC"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import {parseAst} from 'vite';
|
|
2
|
+
import MagicString from 'magic-string';
|
|
3
|
+
import {JS_FILE_RE} from './shared.js';
|
|
4
|
+
const PRIVATE_KEY_HOLDERS = new Set([
|
|
5
|
+
'PropertyDefinition',
|
|
6
|
+
'MethodDefinition',
|
|
7
|
+
'AccessorProperty',
|
|
8
|
+
]);
|
|
9
|
+
const isNode = (v) =>
|
|
10
|
+
v !== null && typeof v === 'object' && typeof v.type === 'string';
|
|
11
|
+
/** Private names declared directly in a class body. */
|
|
12
|
+
const declaredNames = (cls) => {
|
|
13
|
+
const body = cls.body;
|
|
14
|
+
const out = [];
|
|
15
|
+
for (const member of body?.body ?? []) {
|
|
16
|
+
if (
|
|
17
|
+
PRIVATE_KEY_HOLDERS.has(member.type) &&
|
|
18
|
+
isNode(member.key) &&
|
|
19
|
+
member.key.type === 'PrivateIdentifier'
|
|
20
|
+
) {
|
|
21
|
+
out.push(member);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Rewrites native `#private` class members into computed keys backed by
|
|
28
|
+
* `Symbol.for(...)`. The key is stable across re-evaluations of the module,
|
|
29
|
+
* so instances built by an earlier evaluation of a class and methods copied
|
|
30
|
+
* from a later one agree on where private state lives. That is what lets HMR
|
|
31
|
+
* patch a class in place. Returns `null` when there is nothing to rewrite or
|
|
32
|
+
* the module can't be handled safely.
|
|
33
|
+
*/
|
|
34
|
+
export const rewritePrivateNames = (code, id) => {
|
|
35
|
+
if (!code.includes('#')) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const [file] = id.split('?', 1);
|
|
39
|
+
let ast;
|
|
40
|
+
try {
|
|
41
|
+
ast = parseAst(code, {sourceType: 'module'}, file);
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
let prefix = '__litPriv';
|
|
46
|
+
while (code.includes(prefix)) {
|
|
47
|
+
prefix += '_';
|
|
48
|
+
}
|
|
49
|
+
const magic = new MagicString(code);
|
|
50
|
+
const decls = [];
|
|
51
|
+
const classKeyCounts = new Map();
|
|
52
|
+
let symbolCount = 0;
|
|
53
|
+
let failed = false;
|
|
54
|
+
const symbolFor = (scope, name) => scope.names.get(name);
|
|
55
|
+
const resolve = (stack, name) => {
|
|
56
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
57
|
+
const sym = symbolFor(stack[i], name);
|
|
58
|
+
if (sym !== undefined) {
|
|
59
|
+
return sym;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
failed = true;
|
|
63
|
+
return '';
|
|
64
|
+
};
|
|
65
|
+
const classKeyOf = (cls, hint) => {
|
|
66
|
+
const cid = cls.id;
|
|
67
|
+
const base = cid?.name ?? hint ?? 'anonymous';
|
|
68
|
+
const n = classKeyCounts.get(base) ?? 0;
|
|
69
|
+
classKeyCounts.set(base, n + 1);
|
|
70
|
+
return n === 0 ? base : `${base}~${n}`;
|
|
71
|
+
};
|
|
72
|
+
const rewriteMemberAccess = (node, sym) => {
|
|
73
|
+
const prop = node.property;
|
|
74
|
+
// Find the `.` / `?.` token before the property; the object's own end
|
|
75
|
+
// can't be used because a parenthesised object ends before its `)`.
|
|
76
|
+
let i = prop.start - 1;
|
|
77
|
+
while (i >= 0 && /\s/.test(code[i])) {
|
|
78
|
+
i--;
|
|
79
|
+
}
|
|
80
|
+
if (code[i] !== '.') {
|
|
81
|
+
failed = true;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const optional = code[i - 1] === '?';
|
|
85
|
+
const from = optional ? i - 1 : i;
|
|
86
|
+
magic.overwrite(from, prop.end, `${optional ? '?.' : ''}[${sym}]`);
|
|
87
|
+
};
|
|
88
|
+
const visit = (node, stack, hint) => {
|
|
89
|
+
if (failed || node === null || typeof node !== 'object') {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(node)) {
|
|
93
|
+
for (const item of node) {
|
|
94
|
+
visit(item, stack, hint);
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (!isNode(node)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') {
|
|
102
|
+
const members = declaredNames(node);
|
|
103
|
+
const heritage = node.superClass;
|
|
104
|
+
// Decorators are outside the class body's private-name scope.
|
|
105
|
+
visit(node.decorators, stack, undefined);
|
|
106
|
+
visit(heritage, stack, undefined);
|
|
107
|
+
if (members.length === 0) {
|
|
108
|
+
visit(node.body, stack, undefined);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const classKey = classKeyOf(node, hint);
|
|
112
|
+
const scope = {names: new Map()};
|
|
113
|
+
for (const member of members) {
|
|
114
|
+
const name = member.key.name;
|
|
115
|
+
if (!scope.names.has(name)) {
|
|
116
|
+
const ident = `${prefix}${symbolCount++}`;
|
|
117
|
+
scope.names.set(name, ident);
|
|
118
|
+
decls.push(
|
|
119
|
+
`const ${ident} = Symbol.for(${JSON.stringify(`@oddsquad/vite-plugin-lit#private:${file}:${classKey}#${name}`)});`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
if (member.decorators?.length) {
|
|
123
|
+
// A decorator directly before a computed key would parse as an
|
|
124
|
+
// index access on the decorator expression.
|
|
125
|
+
failed = true;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const key = member.key;
|
|
129
|
+
const sym = scope.names.get(name);
|
|
130
|
+
// A computed key at the start of a member can continue the previous
|
|
131
|
+
// member's initializer when that one relied on ASI (`a = 1` + newline
|
|
132
|
+
// + `#b`), so lead with an explicit terminator.
|
|
133
|
+
let lead = '';
|
|
134
|
+
if (member.start === key.start) {
|
|
135
|
+
let j = key.start - 1;
|
|
136
|
+
while (j >= 0 && /\s/.test(code[j])) {
|
|
137
|
+
j--;
|
|
138
|
+
}
|
|
139
|
+
if (code[j] !== '{' && code[j] !== ';') {
|
|
140
|
+
lead = ';';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
magic.overwrite(key.start, key.end, `${lead}[${sym}]`);
|
|
144
|
+
}
|
|
145
|
+
// Members: keys of non-private members and all values live in scope.
|
|
146
|
+
const inner = [...stack, scope];
|
|
147
|
+
const body = node.body;
|
|
148
|
+
for (const member of body.body ?? []) {
|
|
149
|
+
for (const k in member) {
|
|
150
|
+
if (k === 'parent' || (k === 'key' && isPrivateKey(member))) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
visit(member[k], inner, undefined);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (node.type === 'MemberExpression' && isNode(node.property)) {
|
|
159
|
+
if (node.property.type === 'PrivateIdentifier') {
|
|
160
|
+
const sym = resolve(stack, node.property.name);
|
|
161
|
+
if (failed) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
rewriteMemberAccess(node, sym);
|
|
165
|
+
visit(node.object, stack, undefined);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (
|
|
170
|
+
node.type === 'BinaryExpression' &&
|
|
171
|
+
isNode(node.left) &&
|
|
172
|
+
node.left.type === 'PrivateIdentifier'
|
|
173
|
+
) {
|
|
174
|
+
const sym = resolve(stack, node.left.name);
|
|
175
|
+
if (failed) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
magic.overwrite(node.left.start, node.left.end, sym);
|
|
179
|
+
visit(node.right, stack, undefined);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
let childHint;
|
|
183
|
+
for (const key in node) {
|
|
184
|
+
if (key === 'parent') {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
switch (node.type) {
|
|
188
|
+
case 'VariableDeclarator':
|
|
189
|
+
childHint =
|
|
190
|
+
key === 'init' && isNode(node.id) && node.id.type === 'Identifier'
|
|
191
|
+
? node.id.name
|
|
192
|
+
: undefined;
|
|
193
|
+
break;
|
|
194
|
+
case 'AssignmentExpression':
|
|
195
|
+
childHint =
|
|
196
|
+
key === 'right' &&
|
|
197
|
+
isNode(node.left) &&
|
|
198
|
+
node.left.type === 'Identifier'
|
|
199
|
+
? node.left.name
|
|
200
|
+
: undefined;
|
|
201
|
+
break;
|
|
202
|
+
case 'ExportDefaultDeclaration':
|
|
203
|
+
childHint = 'default';
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
childHint = undefined;
|
|
207
|
+
}
|
|
208
|
+
visit(node[key], stack, childHint);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
const isPrivateKey = (member) =>
|
|
212
|
+
PRIVATE_KEY_HOLDERS.has(member.type) &&
|
|
213
|
+
isNode(member.key) &&
|
|
214
|
+
member.key.type === 'PrivateIdentifier';
|
|
215
|
+
visit(ast, [], undefined);
|
|
216
|
+
if (failed || decls.length === 0) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const header = `${decls.join('')}\n`;
|
|
220
|
+
if (code.startsWith('#!')) {
|
|
221
|
+
const nl = code.indexOf('\n');
|
|
222
|
+
if (nl === -1) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
magic.appendLeft(nl + 1, header);
|
|
226
|
+
} else {
|
|
227
|
+
magic.prepend(header);
|
|
228
|
+
}
|
|
229
|
+
return {code: magic.toString(), map: magic.generateMap({hires: 'boundary'})};
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* Dev-only transform that swaps native `#private` class members for stable
|
|
233
|
+
* symbol keys so HMR's in-place class patching keeps working. See
|
|
234
|
+
* {@link rewritePrivateNames}. `enabled` is read lazily because options are
|
|
235
|
+
* re-resolved against the loaded env after the plugin array is built.
|
|
236
|
+
*/
|
|
237
|
+
export const litPrivateFields = (enabled) => ({
|
|
238
|
+
name: 'lit-private-fields',
|
|
239
|
+
apply: 'serve',
|
|
240
|
+
transform(code, id, options) {
|
|
241
|
+
if (options?.ssr || !enabled()) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
if (id.startsWith('\0') || id.includes('/node_modules/')) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
const [file, query] = id.split('?', 2);
|
|
248
|
+
if (!JS_FILE_RE.test(file) && !query?.includes('html-proxy')) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
return rewritePrivateNames(code, id);
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
//# sourceMappingURL=private-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-fields.js","sourceRoot":"","sources":["../../src/lib/plugins/private-fields.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Plugin} from 'vite';\nimport {parseAst} from 'vite';\nimport MagicString from 'magic-string';\nimport {JS_FILE_RE} from './shared.js';\n\ntype Node = Record<string, unknown> & {\n type: string;\n start: number;\n end: number;\n};\n\n/** One class body that declares at least one private name. */\ninterface ClassScope {\n /** Private name (without `#`) to the identifier of its symbol constant. */\n names: Map<string, string>;\n}\n\nconst PRIVATE_KEY_HOLDERS = new Set([\n 'PropertyDefinition',\n 'MethodDefinition',\n 'AccessorProperty',\n]);\n\nconst isNode = (v: unknown): v is Node =>\n v !== null && typeof v === 'object' && typeof (v as Node).type === 'string';\n\n/** Private names declared directly in a class body. */\nconst declaredNames = (cls: Node): Node[] => {\n const body = cls.body as {body?: Node[]} | undefined;\n const out: Node[] = [];\n for (const member of body?.body ?? []) {\n if (\n PRIVATE_KEY_HOLDERS.has(member.type) &&\n isNode(member.key) &&\n member.key.type === 'PrivateIdentifier'\n ) {\n out.push(member);\n }\n }\n return out;\n};\n\n/**\n * Rewrites native `#private` class members into computed keys backed by\n * `Symbol.for(...)`. The key is stable across re-evaluations of the module,\n * so instances built by an earlier evaluation of a class and methods copied\n * from a later one agree on where private state lives. That is what lets HMR\n * patch a class in place. Returns `null` when there is nothing to rewrite or\n * the module can't be handled safely.\n */\nexport const rewritePrivateNames = (\n code: string,\n id: string\n): {code: string; map: ReturnType<MagicString['generateMap']>} | null => {\n if (!code.includes('#')) {\n return null;\n }\n const [file] = id.split('?', 1);\n let ast: Node;\n try {\n ast = parseAst(code, {sourceType: 'module'}, file) as unknown as Node;\n } catch {\n return null;\n }\n\n let prefix = '__litPriv';\n while (code.includes(prefix)) {\n prefix += '_';\n }\n\n const magic = new MagicString(code);\n const decls: string[] = [];\n const classKeyCounts = new Map<string, number>();\n let symbolCount = 0;\n let failed = false;\n\n const symbolFor = (scope: ClassScope, name: string): string | undefined =>\n scope.names.get(name);\n\n const resolve = (stack: ClassScope[], name: string): string => {\n for (let i = stack.length - 1; i >= 0; i--) {\n const sym = symbolFor(stack[i], name);\n if (sym !== undefined) {\n return sym;\n }\n }\n failed = true;\n return '';\n };\n\n const classKeyOf = (cls: Node, hint: string | undefined): string => {\n const cid = cls.id as {name?: string} | null | undefined;\n const base = cid?.name ?? hint ?? 'anonymous';\n const n = classKeyCounts.get(base) ?? 0;\n classKeyCounts.set(base, n + 1);\n return n === 0 ? base : `${base}~${n}`;\n };\n\n const rewriteMemberAccess = (node: Node, sym: string): void => {\n const prop = node.property as Node;\n // Find the `.` / `?.` token before the property; the object's own end\n // can't be used because a parenthesised object ends before its `)`.\n let i = prop.start - 1;\n while (i >= 0 && /\\s/.test(code[i])) {\n i--;\n }\n if (code[i] !== '.') {\n failed = true;\n return;\n }\n const optional = code[i - 1] === '?';\n const from = optional ? i - 1 : i;\n magic.overwrite(from, prop.end, `${optional ? '?.' : ''}[${sym}]`);\n };\n\n const visit = (\n node: unknown,\n stack: ClassScope[],\n hint: string | undefined\n ): void => {\n if (failed || node === null || typeof node !== 'object') {\n return;\n }\n if (Array.isArray(node)) {\n for (const item of node) {\n visit(item, stack, hint);\n }\n return;\n }\n if (!isNode(node)) {\n return;\n }\n\n if (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') {\n const members = declaredNames(node);\n const heritage = node.superClass;\n // Decorators are outside the class body's private-name scope.\n visit(node.decorators, stack, undefined);\n visit(heritage, stack, undefined);\n if (members.length === 0) {\n visit(node.body, stack, undefined);\n return;\n }\n const classKey = classKeyOf(node, hint);\n const scope: ClassScope = {names: new Map()};\n for (const member of members) {\n const name = (member.key as unknown as {name: string}).name;\n if (!scope.names.has(name)) {\n const ident = `${prefix}${symbolCount++}`;\n scope.names.set(name, ident);\n decls.push(\n `const ${ident} = Symbol.for(${JSON.stringify(\n `@oddsquad/vite-plugin-lit#private:${file}:${classKey}#${name}`\n )});`\n );\n }\n if ((member.decorators as unknown[] | undefined)?.length) {\n // A decorator directly before a computed key would parse as an\n // index access on the decorator expression.\n failed = true;\n return;\n }\n const key = member.key as Node;\n const sym = scope.names.get(name)!;\n // A computed key at the start of a member can continue the previous\n // member's initializer when that one relied on ASI (`a = 1` + newline\n // + `#b`), so lead with an explicit terminator.\n let lead = '';\n if (member.start === key.start) {\n let j = key.start - 1;\n while (j >= 0 && /\\s/.test(code[j])) {\n j--;\n }\n if (code[j] !== '{' && code[j] !== ';') {\n lead = ';';\n }\n }\n magic.overwrite(key.start, key.end, `${lead}[${sym}]`);\n }\n // Members: keys of non-private members and all values live in scope.\n const inner = [...stack, scope];\n const body = node.body as Node;\n for (const member of (body.body as Node[]) ?? []) {\n for (const k in member) {\n if (k === 'parent' || (k === 'key' && isPrivateKey(member))) {\n continue;\n }\n visit(member[k], inner, undefined);\n }\n }\n return;\n }\n\n if (node.type === 'MemberExpression' && isNode(node.property)) {\n if (node.property.type === 'PrivateIdentifier') {\n const sym = resolve(\n stack,\n (node.property as unknown as {name: string}).name\n );\n if (failed) {\n return;\n }\n rewriteMemberAccess(node, sym);\n visit(node.object, stack, undefined);\n return;\n }\n }\n\n if (\n node.type === 'BinaryExpression' &&\n isNode(node.left) &&\n node.left.type === 'PrivateIdentifier'\n ) {\n const sym = resolve(stack, (node.left as unknown as {name: string}).name);\n if (failed) {\n return;\n }\n magic.overwrite(node.left.start, node.left.end, sym);\n visit(node.right, stack, undefined);\n return;\n }\n\n let childHint: string | undefined;\n for (const key in node) {\n if (key === 'parent') {\n continue;\n }\n switch (node.type) {\n case 'VariableDeclarator':\n childHint =\n key === 'init' && isNode(node.id) && node.id.type === 'Identifier'\n ? (node.id as unknown as {name: string}).name\n : undefined;\n break;\n case 'AssignmentExpression':\n childHint =\n key === 'right' &&\n isNode(node.left) &&\n node.left.type === 'Identifier'\n ? (node.left as unknown as {name: string}).name\n : undefined;\n break;\n case 'ExportDefaultDeclaration':\n childHint = 'default';\n break;\n default:\n childHint = undefined;\n }\n visit(node[key], stack, childHint);\n }\n };\n\n const isPrivateKey = (member: Node): boolean =>\n PRIVATE_KEY_HOLDERS.has(member.type) &&\n isNode(member.key) &&\n member.key.type === 'PrivateIdentifier';\n\n visit(ast, [], undefined);\n if (failed || decls.length === 0) {\n return null;\n }\n\n const header = `${decls.join('')}\\n`;\n if (code.startsWith('#!')) {\n const nl = code.indexOf('\\n');\n if (nl === -1) {\n return null;\n }\n magic.appendLeft(nl + 1, header);\n } else {\n magic.prepend(header);\n }\n return {code: magic.toString(), map: magic.generateMap({hires: 'boundary'})};\n};\n\n/**\n * Dev-only transform that swaps native `#private` class members for stable\n * symbol keys so HMR's in-place class patching keeps working. See\n * {@link rewritePrivateNames}. `enabled` is read lazily because options are\n * re-resolved against the loaded env after the plugin array is built.\n */\nexport const litPrivateFields = (enabled: () => boolean): Plugin => ({\n name: 'lit-private-fields',\n apply: 'serve',\n transform(code, id, options) {\n if (options?.ssr || !enabled()) {\n return null;\n }\n if (id.startsWith('\\0') || id.includes('/node_modules/')) {\n return null;\n }\n const [file, query] = id.split('?', 2);\n if (!JS_FILE_RE.test(file) && !query?.includes('html-proxy')) {\n return null;\n }\n return rewritePrivateNames(code, id);\n },\n});\n"]}
|
package/lib/plugins/shared.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/shared.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,SAAU,MAAM,KAAG,MAQnD,CAAC;AAEF,eAAO,MAAM,UAAU,QAAoB,CAAC"}
|
package/lib/plugins/shared.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/lib/plugins/shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/lib/plugins/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,SAAS,CAAC;AACnC,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAU,EAAE;IAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAU,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["import {existsSync} from 'node:fs';\nimport {fileURLToPath} from 'node:url';\n\n/**\n * Resolves a runtime module to an absolute fs path (served via `/@fs/`), so\n * the plugin works from any served root. Falls back from the built `.js` to\n * the `.ts` source when running un-built (e.g. under vitest).\n */\nexport const resolveRuntimeModule = (name: string): string => {\n for (const ext of ['js', 'ts'] as const) {\n const url = new URL(`../runtime/${name}.${ext}`, import.meta.url);\n if (existsSync(url)) {\n return fileURLToPath(url).replace(/\\\\/g, '/');\n }\n }\n throw new Error(`[lit-plugin] runtime module not found: ${name}`);\n};\n\nexport const JS_FILE_RE = /\\.[cm]?[jt]sx?$/;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline-virtual.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/timeline-virtual.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"timeline-virtual.d.ts","sourceRoot":"","sources":["../../src/lib/plugins/timeline-virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,MAAM,CAAC;AASjC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,iBAChB,MAAM,OAAO,KACzB,MA6BF,CAAC"}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2026 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
-
*/
|
|
6
1
|
import {resolveRuntimeModule} from './shared.js';
|
|
7
2
|
const TIMELINE_VIRTUAL_ID = 'virtual:lit-plugin/timeline';
|
|
8
3
|
const TIMELINE_RESOLVED_ID = '\0virtual:lit-plugin/timeline';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline-virtual.js","sourceRoot":"","sources":["../../src/lib/plugins/timeline-virtual.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"timeline-virtual.js","sourceRoot":"","sources":["../../src/lib/plugins/timeline-virtual.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEjD,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAC1D,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAC7D,MAAM,aAAa,GACjB,6CAA6C;IAC7C,6CAA6C,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,WAAW,GAAkB,GAAG,EAAE,CAAC,KAAK,EAChC,EAAE;IACV,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,cAAc,CAAC,MAAM;YACnB,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC;QACvC,CAAC;QACD,SAAS,CAAC,EAAE;YACV,OAAO,EAAE,KAAK,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,KAAK,oBAAoB,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,qEAAqE;YACrE,uEAAuE;YACvE,uEAAuE;YACvE,mEAAmE;YACnE,iBAAiB;YACjB,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC9B,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAC,CAAC;YACjD,CAAC;YACD,MAAM,OAAO,GAAG,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;YAC5D,OAAO;gBACL,IAAI,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK;gBACnD,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type {Plugin} from 'vite';\nimport {resolveRuntimeModule} from './shared.js';\n\nconst TIMELINE_VIRTUAL_ID = 'virtual:lit-plugin/timeline';\nconst TIMELINE_RESOLVED_ID = '\\0virtual:lit-plugin/timeline';\nconst TIMELINE_STUB =\n 'export const addTimelineEvent = () => {};\\n' +\n 'export const addTimelineLayer = () => {};\\n';\n\n/**\n * The public timeline API virtual module, served in dev and build alike:\n * app code importing it must keep building under `vite build`, where the HMR\n * plugin doesn't apply. While these hooks lived on that serve-only plugin,\n * nothing claimed the specifier during a build and the bundler failed to\n * resolve it.\n *\n * `getTimeline` is a getter, not a value: `litPlugin()` re-resolves its\n * options against the loaded env in a `config` hook, which runs after the\n * plugin array is built.\n */\nexport const litTimelineVirtual = (\n getTimeline: () => boolean = () => false\n): Plugin => {\n let isBuild = false;\n return {\n name: 'lit-timeline-virtual',\n configResolved(config) {\n isBuild = config.command === 'build';\n },\n resolveId(id) {\n return id === TIMELINE_VIRTUAL_ID ? TIMELINE_RESOLVED_ID : null;\n },\n load(id) {\n if (id !== TIMELINE_RESOLVED_ID) {\n return null;\n }\n // Under build the stub is unconditional, even with `timeline: true`.\n // The runtime delivers only over `import.meta.hot`, so in a production\n // bundle it is a queue that never drains; the stub keeps the transport\n // out of the bundle and makes the documented \"no-op in production\"\n // behavior true.\n if (isBuild || !getTimeline()) {\n return {code: TIMELINE_STUB, moduleType: 'js'};\n }\n const apiPath = resolveRuntimeModule('timeline/public-api');\n return {\n code: `export * from ${JSON.stringify(apiPath)};\\n`,\n moduleType: 'js',\n };\n },\n };\n};\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carries child element state across a template re-instantiation.
|
|
3
|
+
*
|
|
4
|
+
* When a hot patch changes a template's text, lit-html sees a new template,
|
|
5
|
+
* clones fresh DOM and swaps it in: every custom element inside the edited
|
|
6
|
+
* template is re-created and starts from its defaults. For a short window
|
|
7
|
+
* after a hot patch this module pairs each element dropped from a root with
|
|
8
|
+
* the next freshly created element of the same tag connected in that root
|
|
9
|
+
* (FIFO, i.e. document order), then either copies the old element's state
|
|
10
|
+
* onto the new one (`'transfer'`) or, where the new element carries no
|
|
11
|
+
* bindings, puts the old element back in its place (`'reuse'`).
|
|
12
|
+
*
|
|
13
|
+
* Dependency-free and duck-typed like `patch.ts`. The lit-html internals it
|
|
14
|
+
* reads (`_$litPart$`, `_$committedValue`, `_$template`, `_$parts`,
|
|
15
|
+
* `_$startNode`, `_$endNode`) are looked up by their development names first
|
|
16
|
+
* and then by the stable minified names lit's prod build gives them
|
|
17
|
+
* (`_$AH`, `_$AD`, `_$AV`, `_$AA`, `_$AB`). Every access is guarded; when the
|
|
18
|
+
* part tree can't be read, transfer skips only attribute-driven keys and
|
|
19
|
+
* reuse falls back to transfer.
|
|
20
|
+
*/
|
|
21
|
+
export type ChildStateMode = 'reset' | 'transfer' | 'reuse';
|
|
22
|
+
/** `Symbol.for` description prefix of the dev-only `#private` rewrite. */
|
|
23
|
+
export declare const PRIVATE_KEY_PREFIX = "@oddsquad/vite-plugin-lit#private:";
|
|
24
|
+
/** Hard cap on how long a transfer window stays open. */
|
|
25
|
+
export declare const WINDOW_CAP_MS = 1000;
|
|
26
|
+
/** Duck-typed lit-html part. */
|
|
27
|
+
export interface PartLike {
|
|
28
|
+
type: number;
|
|
29
|
+
element?: unknown;
|
|
30
|
+
name?: unknown;
|
|
31
|
+
}
|
|
32
|
+
/** Duck-typed element the window works with. */
|
|
33
|
+
export type ElementLike = HTMLElement & {
|
|
34
|
+
renderRoot?: unknown;
|
|
35
|
+
hasUpdated?: boolean;
|
|
36
|
+
updateComplete?: unknown;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Every lit-html part rendered into the tree `el` lives in: the parts of each
|
|
40
|
+
* render container (`_$litPart$`) among `el`'s ancestors up to its root.
|
|
41
|
+
* `undefined` when `el` isn't in a tree or the walk hits a surprise.
|
|
42
|
+
*/
|
|
43
|
+
export declare const partsAround: (el: Node) => PartLike[] | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Reactive property keys the new element already got from its template:
|
|
46
|
+
* keys whose attribute is present on it (static attributes), plus, when the
|
|
47
|
+
* part tree could be read, keys bound by a property, boolean or attribute
|
|
48
|
+
* part targeting it.
|
|
49
|
+
*/
|
|
50
|
+
export declare const templateDrivenKeys: (el: ElementLike, parts: readonly PartLike[] | undefined) => Set<PropertyKey>;
|
|
51
|
+
/** Own symbol keys of `el` minted by the dev-only `#private` rewrite. */
|
|
52
|
+
export declare const privateKeys: (el: object) => symbol[];
|
|
53
|
+
/**
|
|
54
|
+
* Copies `from`'s state onto `to`: reactive properties not driven by `to`'s
|
|
55
|
+
* template, and the `#private` members the dev rewrite turned into
|
|
56
|
+
* `Symbol.for` keys. Nothing else — Lit's own bookkeeping lives in string
|
|
57
|
+
* keys and must stay per-instance.
|
|
58
|
+
*/
|
|
59
|
+
export declare const transferState: (from: ElementLike, to: ElementLike, parts: readonly PartLike[] | undefined) => void;
|
|
60
|
+
/**
|
|
61
|
+
* Whether `el` (and its light DOM) carries no bindings, so another element
|
|
62
|
+
* can take its place without lit-html noticing: no part targets it or an
|
|
63
|
+
* element inside it, no child part's markers or parent lie inside it, and
|
|
64
|
+
* nothing rendered into it as a container. `false` when `parts` is unknown.
|
|
65
|
+
*/
|
|
66
|
+
export declare const isReuseSafe: (el: ElementLike, parts: readonly PartLike[] | undefined) => boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Puts `old` back where `fresh` is: `old` takes `fresh`'s attributes and
|
|
69
|
+
* light-DOM children, then replaces it. `old` keeps its identity, state,
|
|
70
|
+
* shadow DOM and controllers, and reconnects.
|
|
71
|
+
*/
|
|
72
|
+
export declare const swapBack: (old: ElementLike, fresh: ElementLike) => void;
|
|
73
|
+
export interface ChildStateOptions {
|
|
74
|
+
/** Read at every `open()`. */
|
|
75
|
+
mode: () => ChildStateMode;
|
|
76
|
+
/** Hard cap on a window's lifetime. Defaults to {@link WINDOW_CAP_MS}. */
|
|
77
|
+
capMs?: number;
|
|
78
|
+
}
|
|
79
|
+
export interface ChildState {
|
|
80
|
+
/**
|
|
81
|
+
* From the instrumented `connectedCallback`, before the original runs.
|
|
82
|
+
* `fresh` is whether the element has never been connected before.
|
|
83
|
+
*/
|
|
84
|
+
connected(el: ElementLike, fresh: boolean): void;
|
|
85
|
+
/** From the instrumented `disconnectedCallback`. */
|
|
86
|
+
disconnected(el: ElementLike): void;
|
|
87
|
+
/** A hot patch is about to re-render instances: open (or extend) a window. */
|
|
88
|
+
open(): void;
|
|
89
|
+
/** Keep the window open until these instances' updates complete. */
|
|
90
|
+
watch(els: Iterable<ElementLike>): void;
|
|
91
|
+
/** Whether a window is currently open. */
|
|
92
|
+
readonly active: boolean;
|
|
93
|
+
}
|
|
94
|
+
export declare const createChildState: (options: ChildStateOptions) => ChildState;
|
|
95
|
+
//# sourceMappingURL=child-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-state.d.ts","sourceRoot":"","sources":["../../src/lib/runtime/child-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAE5D,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,uCAAuC,CAAC;AAEvE,yDAAyD;AACzD,eAAO,MAAM,aAAa,OAAO,CAAC;AAelC,gCAAgC;AAChC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAuDF;;;;GAIG;AACH,eAAO,MAAM,WAAW,OAAQ,IAAI,KAAG,QAAQ,EAAE,GAAG,SAkBnD,CAAC;AAiCF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,OACzB,WAAW,SACR,SAAS,QAAQ,EAAE,GAAG,SAAS,KACrC,GAAG,CAAC,WAAW,CAyBjB,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,WAAW,OAAQ,MAAM,KAAG,MAAM,EAG5C,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa,SAClB,WAAW,MACb,WAAW,SACR,SAAS,QAAQ,EAAE,GAAG,SAAS,KACrC,IA6BF,CAAC;AAQF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,OAClB,WAAW,SACR,SAAS,QAAQ,EAAE,GAAG,SAAS,KACrC,OA6BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,QAAS,WAAW,SAAS,WAAW,KAAG,IAa/D,CAAC;AAwBF,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,cAAc,CAAC;IAC3B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACjD,oDAAoD;IACpD,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,8EAA8E;IAC9E,IAAI,IAAI,IAAI,CAAC;IACb,oEAAoE;IACpE,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IACxC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,YAAa,iBAAiB,KAAG,UA6M7D,CAAC"}
|