• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nightlycommit / twing-loader / 21

17 Mar 2024 07:01PM UTC coverage: 100.0%. Remained the same
21

push

gitlab-ci

Eric MORAND
Merge branch 'issue-44' into 'milestone/5.0.0'

Resolve issue #44 - Embedded templates that extends a parent are not handled

Closes #44

See merge request nightlycommit/twing-loader!44

34 of 34 branches covered (100.0%)

Branch coverage included in aggregate %.

70 of 70 relevant lines covered (100.0%)

66.23 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

100.0
/src/lib/loader.ts
1
import {type LoaderContext} from 'webpack';
2
import {
1✔
3
    createSource,
4
    type TwingEnvironment,
5
} from 'twing';
6
import {visit} from "./visitor";
1✔
7
import {existsSync} from "fs";
1✔
8
import {relative} from "path";
1✔
9

10
export type TwingLoaderOptions = {
11
    environment: TwingEnvironment;
12
};
13
export default function (this: LoaderContext<TwingLoaderOptions>, code: string) {
1✔
14
    const callback = this.async();
27✔
15

16
    const {environment} = this.getOptions();
27✔
17
    const {resourcePath} = this;
27✔
18

19
    const key = relative('.', resourcePath);
27✔
20
    const source = createSource(key, code);
27✔
21
    const tokenStream = environment.tokenize(source);
27✔
22
    const ast = environment.parse(tokenStream);
27✔
23

24
    visit(ast, environment, resourcePath).then((encounteredTemplates) => {
27✔
25
        let index = 0;
27✔
26

27
        const dependencies = encounteredTemplates
27✔
28
            .filter(([, resolvedName]) => existsSync(resolvedName))
16✔
29
            .map(([templateName, resolvedName]) => {
30
                return `import template${index} from "${resolvedName}";
16✔
31
templates.set('${templateName}', template${index++});`
32
            })
33
            .join('');
34

35
        const generatedCode = `import {createTemplate} from "twing";
27✔
36

37
const templates = new Map();
38

39
${dependencies}
40

41
const template = createTemplate(${JSON.stringify(ast)});
42
const baseLoadTemplate = template.loadTemplate;
43

44
template.loadTemplate = (executionContext, identifier) => {
45
    return templates.has(identifier) ? Promise.resolve(templates.get(identifier)) : baseLoadTemplate(executionContext, identifier);
46
};
47

48
for (const [, embeddedTemplate] of template.embeddedTemplates) {
49
    embeddedTemplate.loadTemplate = template.loadTemplate;
50
}
51

52
export default template;`;
53

54
        callback(null, generatedCode);
27✔
55
    });
56
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc