@esportsplus/template 0.31.0 → 0.31.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/README.md CHANGED
@@ -43,31 +43,6 @@ templatePlugin({
43
43
  })
44
44
  ```
45
45
 
46
- ### ESBuild
47
-
48
- ```typescript
49
- // esbuild.config.ts
50
- import * as esbuild from 'esbuild';
51
- import templatePlugin from '@esportsplus/template/plugins/esbuild';
52
-
53
- await esbuild.build({
54
- entryPoints: ['src/index.ts'],
55
- bundle: true,
56
- outfile: 'dist/bundle.js',
57
- plugins: [
58
- templatePlugin()
59
- ]
60
- });
61
- ```
62
-
63
- **Options:**
64
-
65
- ```typescript
66
- templatePlugin({
67
- root: string // Optional: project root (defaults to process.cwd())
68
- })
69
- ```
70
-
71
46
  ### TypeScript Compiler (tsc)
72
47
 
73
48
  For direct `tsc` compilation, use the transformer factory:
@@ -4,15 +4,16 @@ import { findHtmlTemplates, findReactiveCalls } from './ts-parser.js';
4
4
  import { ts } from '@esportsplus/typescript';
5
5
  const PATTERNS = ['html`', 'html.reactive'];
6
6
  function createTransformer(program) {
7
- let typeChecker = program.getTypeChecker();
7
+ let printer = ts.createPrinter(), typeChecker = program.getTypeChecker();
8
8
  return (_context) => {
9
9
  return (sourceFile) => {
10
- let code = sourceFile.getFullText();
10
+ let code = printer.printFile(sourceFile);
11
11
  if (!mightNeedTransform(code, { patterns: PATTERNS })) {
12
12
  return sourceFile;
13
13
  }
14
+ let reparsed = ts.createSourceFile(sourceFile.fileName, code, sourceFile.languageVersion, true);
14
15
  setTypeChecker(typeChecker);
15
- let result = transformCode(code, sourceFile);
16
+ let result = transformCode(code, reparsed);
16
17
  if (!result.changed) {
17
18
  return sourceFile;
18
19
  }
@@ -45,18 +46,18 @@ function transformCode(code, sourceFile) {
45
46
  return { changed, code: result, sourceFile };
46
47
  }
47
48
  const transform = (sourceFile, program) => {
48
- let code = sourceFile.getFullText();
49
+ let printer = ts.createPrinter(), code = printer.printFile(sourceFile);
49
50
  if (!mightNeedTransform(code, { patterns: PATTERNS })) {
50
51
  return { changed: false, code, sourceFile };
51
52
  }
53
+ let reparsed = ts.createSourceFile(sourceFile.fileName, code, sourceFile.languageVersion, true);
52
54
  let programSourceFile = program.getSourceFile(sourceFile.fileName);
53
55
  if (programSourceFile) {
54
56
  setTypeChecker(program.getTypeChecker());
55
- sourceFile = programSourceFile;
56
57
  }
57
58
  else {
58
59
  setTypeChecker(undefined);
59
60
  }
60
- return transformCode(code, sourceFile);
61
+ return transformCode(code, reparsed);
61
62
  };
62
63
  export { createTransformer, mightNeedTransform, PATTERNS, transform };
@@ -1,4 +1,4 @@
1
- import { mightNeedTransform, PATTERNS, transform } from '../index.js';
1
+ import { createTransformer, mightNeedTransform, PATTERNS } from '../index.js';
2
2
  import { program, TRANSFORM_PATTERN } from '@esportsplus/typescript/transformer';
3
3
  import { ts } from '@esportsplus/typescript';
4
4
  export default (options) => {
@@ -17,11 +17,14 @@ export default (options) => {
17
17
  return null;
18
18
  }
19
19
  try {
20
- let sourceFile = ts.createSourceFile(id, code, ts.ScriptTarget.Latest, true), result = transform(sourceFile, program.get(root));
21
- if (!result.changed) {
20
+ let p = program.get(root), printer = ts.createPrinter(), sourceFile = ts.createSourceFile(id, code, ts.ScriptTarget.Latest, true), transformer = createTransformer(p), result = ts.transform(sourceFile, [transformer]), transformed = result.transformed[0];
21
+ if (transformed === sourceFile) {
22
+ result.dispose();
22
23
  return null;
23
24
  }
24
- return { code: result.code, map: null };
25
+ let output = printer.printFile(transformed);
26
+ result.dispose();
27
+ return { code: output, map: null };
25
28
  }
26
29
  catch (error) {
27
30
  console.error(`@esportsplus/template: Error transforming ${id}:`, error);
package/package.json CHANGED
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "type": "module",
42
42
  "types": "./build/index.d.ts",
43
- "version": "0.31.0",
43
+ "version": "0.31.1",
44
44
  "scripts": {
45
45
  "build": "tsc",
46
46
  "build:test": "vite build --config test/vite.config.ts",
@@ -15,19 +15,24 @@ const PATTERNS = ['html`', 'html.reactive'];
15
15
 
16
16
 
17
17
  function createTransformer(program: ts.Program): ts.TransformerFactory<ts.SourceFile> {
18
- let typeChecker = program.getTypeChecker();
18
+ let printer = ts.createPrinter(),
19
+ typeChecker = program.getTypeChecker();
19
20
 
20
21
  return (_context: ts.TransformationContext) => {
21
22
  return (sourceFile: ts.SourceFile): ts.SourceFile => {
22
- let code = sourceFile.getFullText();
23
+ // Use printer to get current text representation (handles chained transformers)
24
+ let code = printer.printFile(sourceFile);
23
25
 
24
26
  if (!mightNeedTransform(code, { patterns: PATTERNS })) {
25
27
  return sourceFile;
26
28
  }
27
29
 
30
+ // Re-parse the printed code to get accurate positions
31
+ let reparsed = ts.createSourceFile(sourceFile.fileName, code, sourceFile.languageVersion, true);
32
+
28
33
  setTypeChecker(typeChecker);
29
34
 
30
- let result = transformCode(code, sourceFile);
35
+ let result = transformCode(code, reparsed);
31
36
 
32
37
  if (!result.changed) {
33
38
  return sourceFile;
@@ -74,23 +79,27 @@ function transformCode(code: string, sourceFile: ts.SourceFile): TransformResult
74
79
 
75
80
 
76
81
  const transform = (sourceFile: ts.SourceFile, program: ts.Program): TransformResult => {
77
- let code = sourceFile.getFullText();
82
+ // Use printer to get current text representation (handles chained transformers)
83
+ let printer = ts.createPrinter(),
84
+ code = printer.printFile(sourceFile);
78
85
 
79
86
  if (!mightNeedTransform(code, { patterns: PATTERNS })) {
80
87
  return { changed: false, code, sourceFile };
81
88
  }
82
89
 
90
+ // Re-parse the printed code to get accurate positions
91
+ let reparsed = ts.createSourceFile(sourceFile.fileName, code, sourceFile.languageVersion, true);
92
+
83
93
  let programSourceFile = program.getSourceFile(sourceFile.fileName);
84
94
 
85
95
  if (programSourceFile) {
86
96
  setTypeChecker(program.getTypeChecker());
87
- sourceFile = programSourceFile;
88
97
  }
89
98
  else {
90
99
  setTypeChecker(undefined);
91
100
  }
92
101
 
93
- return transformCode(code, sourceFile);
102
+ return transformCode(code, reparsed);
94
103
  };
95
104
 
96
105
 
@@ -1,4 +1,4 @@
1
- import { mightNeedTransform, PATTERNS, transform } from '../index';
1
+ import { createTransformer, mightNeedTransform, PATTERNS } from '../index';
2
2
  import { program, TRANSFORM_PATTERN } from '@esportsplus/typescript/transformer';
3
3
  import type { Plugin, ResolvedConfig } from 'vite';
4
4
  import { ts } from '@esportsplus/typescript';
@@ -25,14 +25,23 @@ export default (options?: { root?: string }): Plugin => {
25
25
  }
26
26
 
27
27
  try {
28
- let sourceFile = ts.createSourceFile(id, code, ts.ScriptTarget.Latest, true),
29
- result = transform(sourceFile, program.get(root));
30
-
31
- if (!result.changed) {
28
+ let p = program.get(root),
29
+ printer = ts.createPrinter(),
30
+ sourceFile = ts.createSourceFile(id, code, ts.ScriptTarget.Latest, true),
31
+ transformer = createTransformer(p),
32
+ result = ts.transform(sourceFile, [transformer]),
33
+ transformed = result.transformed[0];
34
+
35
+ if (transformed === sourceFile) {
36
+ result.dispose();
32
37
  return null;
33
38
  }
34
39
 
35
- return { code: result.code, map: null };
40
+ let output = printer.printFile(transformed);
41
+
42
+ result.dispose();
43
+
44
+ return { code: output, map: null };
36
45
  }
37
46
  catch (error) {
38
47
  console.error(`@esportsplus/template: Error transforming ${id}:`, error);