@lithent/lithent-template-vite 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export { default } from './plugin.cjs';
2
+ export type { LithentTemplateViteOptions } from './plugin.cjs';
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { lithentTemplateVite as default, lithentTemplateVite } from './plugin';
2
- export type { LithentTemplateViteOptions } from './plugin';
1
+ export { default } from './plugin.js';
2
+ export type { LithentTemplateViteOptions } from './plugin.js';
package/dist/index.mjs CHANGED
@@ -117,7 +117,6 @@ function M(e = {}) {
117
117
  }];
118
118
  }
119
119
  export {
120
- M as default,
121
- M as lithentTemplateVite
120
+ M as default
122
121
  };
123
122
  //# sourceMappingURL=index.mjs.map
@@ -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.0",
4
+ "version": "0.1.2",
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",
@@ -10,14 +10,14 @@
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.mjs",
13
- "require": "./dist/index.umd.js"
13
+ "default": "./dist/index.mjs"
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "@lithent/lithent-template-parser": "0.1.0"
17
+ "@lithent/lithent-template-parser": "0.1.2"
18
18
  },
19
19
  "devDependencies": {
20
- "lithent": "1.20.1"
20
+ "lithent": "1.25.6"
21
21
  },
22
22
  "keywords": [
23
23
  "lithent",
@@ -38,9 +38,6 @@
38
38
  "dist",
39
39
  "src"
40
40
  ],
41
- "volta": {
42
- "node": "20.3.0"
43
- },
44
41
  "scripts": {
45
42
  "dev": "vite --config vite.config.plugin.ts",
46
43
  "dev:lib": "vite",
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { lithentTemplateVite as default, lithentTemplateVite } from './plugin';
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
+ }
@@ -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
- expect(result.code).toMatch(
218
- /h\("strong", { class: "todo-status pending" }, "Pending\\n\s*"\)/
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
@@ -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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"}