@lithent/lithent-template-vite 0.1.0 → 0.1.1
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/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +1 -2
- package/dist/plugin.d.cts +9 -0
- package/package.json +4 -5
- package/src/index.ts +1 -1
- package/src/tests/fixtures/regressions.ltsx +9 -0
- package/src/tests/plugin.test.ts +33 -2
- package/dist/index.umd.js +0 -2
- package/dist/index.umd.js.map +0 -1
package/dist/index.d.cts
ADDED
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export type { LithentTemplateViteOptions } from './plugin';
|
|
1
|
+
export { default } from './plugin.js';
|
|
2
|
+
export type { LithentTemplateViteOptions } from './plugin.js';
|
package/dist/index.mjs
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PluginOption } from 'vite';
|
|
2
|
+
type LoaderValue = 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'css';
|
|
3
|
+
export interface LithentTemplateViteOptions {
|
|
4
|
+
include?: RegExp | RegExp[];
|
|
5
|
+
extensions?: string[];
|
|
6
|
+
extensionLoaders?: Record<string, LoaderValue>;
|
|
7
|
+
}
|
|
8
|
+
export declare function lithentTemplateVite(options?: LithentTemplateViteOptions): PluginOption;
|
|
9
|
+
export default lithentTemplateVite;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@lithent/lithent-template-vite",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.1",
|
|
5
5
|
"description": "Vite plugin that compiles Lithent’s JSX-like template syntax into h() calls.",
|
|
6
6
|
"main": "./dist/index.mjs",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -9,15 +9,14 @@
|
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.mjs"
|
|
13
|
-
"require": "./dist/index.umd.js"
|
|
12
|
+
"import": "./dist/index.mjs"
|
|
14
13
|
}
|
|
15
14
|
},
|
|
16
15
|
"dependencies": {
|
|
17
|
-
"@lithent/lithent-template-parser": "0.1.
|
|
16
|
+
"@lithent/lithent-template-parser": "0.1.1"
|
|
18
17
|
},
|
|
19
18
|
"devDependencies": {
|
|
20
|
-
"lithent": "1.
|
|
19
|
+
"lithent": "1.25.0"
|
|
21
20
|
},
|
|
22
21
|
"keywords": [
|
|
23
22
|
"lithent",
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { default } from './plugin';
|
|
2
2
|
export type { LithentTemplateViteOptions } from './plugin';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function View(name, items, ok) {
|
|
2
|
+
const pattern = /<img \/>/;
|
|
3
|
+
return <main data-id="regression" aria-label="Status" title={String(pattern.test('<img />'))}>
|
|
4
|
+
<p>Hello {name}!</p>
|
|
5
|
+
<p>https://example.com</p>
|
|
6
|
+
<ul><li l-for={(item, index) in items} l-if={item.visible}>{index}: {item.label}</li></ul>
|
|
7
|
+
<span l-if={ok}>yes</span><!-- between branches --><span l-else>no</span>
|
|
8
|
+
</main>;
|
|
9
|
+
}
|
package/src/tests/plugin.test.ts
CHANGED
|
@@ -5,6 +5,8 @@ import { beforeEach, describe, expect, it } from 'vitest';
|
|
|
5
5
|
import { resolveConfig } from 'vite';
|
|
6
6
|
import type { ConfigEnv, Plugin, PluginOption, ResolvedConfig } from 'vite';
|
|
7
7
|
import { lithentTemplateVite } from '../plugin';
|
|
8
|
+
import { h } from 'lithent';
|
|
9
|
+
import { renderToString } from 'lithent/ssr';
|
|
8
10
|
|
|
9
11
|
interface TransformResult {
|
|
10
12
|
code: string;
|
|
@@ -214,8 +216,37 @@ describe('lithentTemplateVite plugin', () => {
|
|
|
214
216
|
const result = await runTransforms(plugins, code, filePath);
|
|
215
217
|
|
|
216
218
|
expect(result.code).toContain('todos.map((todo, index) =>');
|
|
217
|
-
|
|
218
|
-
|
|
219
|
+
const View = new Function(
|
|
220
|
+
'h',
|
|
221
|
+
`${result.code.replace('export ', '')}; return View;`
|
|
222
|
+
)(h);
|
|
223
|
+
expect(
|
|
224
|
+
renderToString(h('ul', {}, View([{ text: 'todo', done: false }])))
|
|
225
|
+
).toBe(
|
|
226
|
+
'<ul><li class="todo-item"><span class="todo-index">1.</span><span class="todo-text">todo</span><strong class="todo-status pending">Pending</strong></li></ul>'
|
|
227
|
+
);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('loads and executes a document with bare return, regex, directives and meaningful spaces', async () => {
|
|
231
|
+
const filePath = path.resolve(__dirname, './fixtures/regressions.ltsx');
|
|
232
|
+
const code = await readFile(filePath, 'utf-8');
|
|
233
|
+
const result = await runTransforms(plugins, code, filePath);
|
|
234
|
+
const View = new Function(
|
|
235
|
+
'h',
|
|
236
|
+
`${result.code.replace('export ', '')}; return View;`
|
|
237
|
+
)(h);
|
|
238
|
+
const html = renderToString(
|
|
239
|
+
View(
|
|
240
|
+
'Ada',
|
|
241
|
+
[
|
|
242
|
+
{ visible: true, label: 'first' },
|
|
243
|
+
{ visible: false, label: 'hidden' },
|
|
244
|
+
],
|
|
245
|
+
true
|
|
246
|
+
)
|
|
247
|
+
);
|
|
248
|
+
expect(html).toBe(
|
|
249
|
+
'<main data-id="regression" aria-label="Status" title="true"><p>Hello Ada!</p><p>https://example.com</p><ul><li>0: first</li></ul><span>yes</span></main>'
|
|
219
250
|
);
|
|
220
251
|
});
|
|
221
252
|
|
package/dist/index.umd.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
(function(l,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("node:fs/promises"),require("node:path"),require("vite"),require("@lithent/lithent-template-parser")):typeof define=="function"&&define.amd?define(["exports","node:fs/promises","node:path","vite","@lithent/lithent-template-parser"],p):(l=typeof globalThis<"u"?globalThis:l||self,p(l.lithentTemplateVite={},l.promises,l.path,l.vite,l.lithentTemplateParser))})(this,function(l,p,f,x,z){"use strict";const T=[".ljsx",".ltsx"],W=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),A=e=>e.startsWith(".")?e:`.${e}`,R=e=>{const r=(e&&e.length>0?e:Array.from(T)).map(A);return Array.from(new Set(r))},P=e=>e.endsWith("tsx")||e.endsWith("ts")?"ts":(e.endsWith("jsx"),"js"),g=(e,s)=>e?Array.isArray(e)?e:[e]:s,j=(e,s)=>e.some(r=>r.test(s)),D=(e,s)=>{const[r,m]=e.split("?",2);if(m){const o=new URLSearchParams(m).get(E);if(o)return x.normalizePath(o)}return r&&w(r,s)?x.normalizePath(r):null},w=(e,s)=>s.find(r=>e.endsWith(r))??null,b=(e,s)=>{const r=new Set(e??[]);for(const m of s)r.add(m);return Array.from(r)},L=(e,s)=>({...e??{},...s}),E="lithent:original";function $(e={}){const s=R(e.extensions),r=s.reduce((t,n)=>{var c;const a=((c=e.extensionLoaders)==null?void 0:c[n])??P(n);return t[n]=a,t},{}),m=s.map(t=>new RegExp(`${W(t)}$`)),v=g(e.include,m);let o;const O=t=>{const n=new URLSearchParams({[E]:t});return`${t}?${n.toString()}`};return[{name:"lithent:template-vite",enforce:"pre",config(t){var n,a,c,d,i,u,y;return{resolve:{extensions:b((n=t.resolve)==null?void 0:n.extensions,s)},optimizeDeps:{extensions:b((a=t.optimizeDeps)==null?void 0:a.extensions,s),esbuildOptions:{...((c=t.optimizeDeps)==null?void 0:c.esbuildOptions)??{},loader:L(typeof((i=(d=t.optimizeDeps)==null?void 0:d.esbuildOptions)==null?void 0:i.loader)=="object"?(y=(u=t.optimizeDeps)==null?void 0:u.esbuildOptions)==null?void 0:y.loader:void 0,r)}}}},configResolved(t){o=t},async resolveId(t,n,a){if(!w(t,s))return null;const d=(o==null?void 0:o.root)??process.cwd();let i;if(typeof this.resolve=="function"){const u=await this.resolve(t,n,{skipSelf:!0,...a});u!=null&&u.id&&(i=u.id)}return i||(f.isAbsolute(t)?i=t:t.startsWith("/")?i=f.join(d,t.slice(1)):n&&(t.startsWith("./")||t.startsWith("../"))?i=f.resolve(f.dirname(n),t):i=f.resolve(d,t)),i=x.normalizePath(i),j(v,i)?O(i):null},async load(t){const n=D(t,s);if(!n)return null;const a=w(n,s);if(!a)return null;this.addWatchFile(n);const c=await p.readFile(n,"utf-8"),d=z.transformDocument(c,{source:n,generateSourceMap:(o==null?void 0:o.command)==="build"}),i=this.warn?this.warn.bind(this):console.warn;if(d.errors.length>0)for(const{error:h}of d.errors){const q=h.line||h.column?` (line ${h.line}, column ${h.column})`:"";i(`[@lithent/lithent-template-vite] Failed to compile template in ${n}${q}: ${h.message}`)}const u=r[a]??P(a),y=d.transformed?d.code:c,S=await x.transformWithEsbuild(y,n,{loader:u,sourcemap:(o==null?void 0:o.command)==="build",sourcefile:n});return{code:S.code,map:S.map??null}}}]}l.default=$,l.lithentTemplateVite=$,Object.defineProperties(l,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
2
|
-
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/plugin.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Plugin, PluginOption, ResolvedConfig, UserConfig } from 'vite';\nimport { normalizePath, transformWithEsbuild } from 'vite';\nimport { transformDocument } from '@lithent/lithent-template-parser';\n\ntype LoaderValue = 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'css';\ntype LoaderMap = Record<string, LoaderValue>;\n\nexport interface LithentTemplateViteOptions {\n include?: RegExp | RegExp[];\n extensions?: string[];\n extensionLoaders?: Record<string, LoaderValue>;\n}\n\nconst DEFAULT_EXTENSIONS = ['.ljsx', '.ltsx'] as const;\n\nconst escapeRegExp = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizeExtension = (ext: string): string =>\n ext.startsWith('.') ? ext : `.${ext}`;\n\nconst resolveExtensions = (extensions?: string[]): string[] => {\n const base =\n extensions && extensions.length > 0\n ? extensions\n : Array.from(DEFAULT_EXTENSIONS);\n const normalized = base.map(normalizeExtension);\n return Array.from(new Set(normalized));\n};\n\nconst inferLoader = (ext: string): LoaderValue => {\n if (ext.endsWith('tsx') || ext.endsWith('ts')) {\n return 'ts';\n }\n if (ext.endsWith('jsx')) {\n return 'js';\n }\n return 'js';\n};\n\nconst toRegExpArray = (\n value: RegExp | RegExp[] | undefined,\n fallback: RegExp[]\n): RegExp[] => {\n if (!value) {\n return fallback;\n }\n return Array.isArray(value) ? value : [value];\n};\n\nconst shouldProcess = (patterns: RegExp[], filePath: string): boolean => {\n return patterns.some(pattern => pattern.test(filePath));\n};\n\nconst extractOriginalPath = (\n id: string,\n extensions: string[]\n): string | null => {\n const [filepath, query] = id.split('?', 2);\n if (query) {\n const params = new URLSearchParams(query);\n const original = params.get(VIRTUAL_QUERY);\n if (original) {\n return normalizePath(original);\n }\n }\n if (filepath && matchExtension(filepath, extensions)) {\n return normalizePath(filepath);\n }\n return null;\n};\n\nconst matchExtension = (\n filePath: string,\n extensions: string[]\n): string | null => {\n return extensions.find(ext => filePath.endsWith(ext)) ?? null;\n};\n\nconst mergeExtensions = (\n original: string[] | undefined,\n additions: readonly string[]\n): string[] => {\n const set = new Set(original ?? []);\n for (const ext of additions) {\n set.add(ext);\n }\n return Array.from(set);\n};\n\nconst mergeLoaderMap = (\n original: LoaderMap | undefined,\n additions: LoaderMap\n): LoaderMap => {\n return {\n ...(original ?? {}),\n ...additions,\n };\n};\n\nconst VIRTUAL_QUERY = 'lithent:original';\n\nexport function lithentTemplateVite(\n options: LithentTemplateViteOptions = {}\n): PluginOption {\n const extensions = resolveExtensions(options.extensions);\n const extensionLoaders: LoaderMap = extensions.reduce((acc, ext) => {\n const loader = options.extensionLoaders?.[ext] ?? inferLoader(ext);\n acc[ext] = loader;\n return acc;\n }, {} as LoaderMap);\n const defaultInclude = extensions.map(\n ext => new RegExp(`${escapeRegExp(ext)}$`)\n );\n const includePatterns = toRegExpArray(options.include, defaultInclude);\n let config: ResolvedConfig | undefined;\n\n const createVirtualId = (originalPath: string): string => {\n const query = new URLSearchParams({\n [VIRTUAL_QUERY]: originalPath,\n });\n return `${originalPath}?${query.toString()}`;\n };\n\n const templatePlugin: Plugin = {\n name: 'lithent:template-vite',\n enforce: 'pre',\n config(userConfig: UserConfig) {\n return {\n resolve: {\n extensions: mergeExtensions(\n userConfig.resolve?.extensions,\n extensions\n ),\n },\n optimizeDeps: {\n extensions: mergeExtensions(\n userConfig.optimizeDeps?.extensions,\n extensions\n ),\n esbuildOptions: {\n ...(userConfig.optimizeDeps?.esbuildOptions ?? {}),\n loader: mergeLoaderMap(\n typeof userConfig.optimizeDeps?.esbuildOptions?.loader ===\n 'object'\n ? (userConfig.optimizeDeps?.esbuildOptions?.loader as LoaderMap)\n : undefined,\n extensionLoaders\n ),\n },\n },\n };\n },\n configResolved(resolved) {\n config = resolved;\n },\n async resolveId(source, importer, options) {\n const ext = matchExtension(source, extensions);\n if (!ext) {\n return null;\n }\n\n const rootDir = config?.root ?? process.cwd();\n let resolvedPath: string | undefined;\n\n if (typeof this.resolve === 'function') {\n const resolved = await this.resolve(source, importer, {\n skipSelf: true,\n ...options,\n });\n if (resolved?.id) {\n resolvedPath = resolved.id;\n }\n }\n\n if (!resolvedPath) {\n if (path.isAbsolute(source)) {\n resolvedPath = source;\n } else if (source.startsWith('/')) {\n resolvedPath = path.join(rootDir, source.slice(1));\n } else if (\n importer &&\n (source.startsWith('./') || source.startsWith('../'))\n ) {\n resolvedPath = path.resolve(path.dirname(importer), source);\n } else {\n resolvedPath = path.resolve(rootDir, source);\n }\n }\n\n resolvedPath = normalizePath(resolvedPath);\n\n if (!shouldProcess(includePatterns, resolvedPath)) {\n return null;\n }\n\n return createVirtualId(resolvedPath);\n },\n async load(id) {\n const originalPath = extractOriginalPath(id, extensions);\n if (!originalPath) {\n return null;\n }\n\n const ext = matchExtension(originalPath, extensions);\n if (!ext) {\n return null;\n }\n\n this.addWatchFile(originalPath);\n\n const raw = await readFile(originalPath, 'utf-8');\n const result = transformDocument(raw, {\n source: originalPath,\n generateSourceMap: config?.command === 'build',\n });\n\n const warn = this.warn ? this.warn.bind(this) : console.warn;\n if (result.errors.length > 0) {\n for (const { error } of result.errors) {\n const location =\n error.line || error.column\n ? ` (line ${error.line}, column ${error.column})`\n : '';\n warn(\n `[@lithent/lithent-template-vite] Failed to compile template in ${originalPath}${location}: ${error.message}`\n );\n }\n }\n\n const loader = extensionLoaders[ext] ?? inferLoader(ext);\n const transformedCode = result.transformed ? result.code : raw;\n const esbuildResult = await transformWithEsbuild(\n transformedCode,\n originalPath,\n {\n loader,\n sourcemap: config?.command === 'build',\n sourcefile: originalPath,\n }\n );\n\n return {\n code: esbuildResult.code,\n map: esbuildResult.map ?? null,\n };\n },\n };\n\n return [templatePlugin];\n}\n\nexport default lithentTemplateVite;\n"],"names":["DEFAULT_EXTENSIONS","escapeRegExp","value","normalizeExtension","ext","resolveExtensions","extensions","normalized","inferLoader","toRegExpArray","fallback","shouldProcess","patterns","filePath","pattern","extractOriginalPath","id","filepath","query","original","VIRTUAL_QUERY","normalizePath","matchExtension","mergeExtensions","additions","set","mergeLoaderMap","lithentTemplateVite","options","extensionLoaders","acc","loader","_a","defaultInclude","includePatterns","config","createVirtualId","originalPath","userConfig","_b","_c","_e","_d","_g","_f","resolved","source","importer","rootDir","resolvedPath","path","raw","readFile","result","transformDocument","warn","error","location","transformedCode","esbuildResult","transformWithEsbuild"],"mappings":"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"}
|