@dogsbay/minja 0.2.0-beta.100

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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +623 -0
  3. package/bin/minja.js +1225 -0
  4. package/dist/browser.d.ts +12 -0
  5. package/dist/browser.d.ts.map +1 -0
  6. package/dist/browser.js +11 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/cli.d.ts +5 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +98 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/context.d.ts +47 -0
  13. package/dist/context.d.ts.map +1 -0
  14. package/dist/context.js +112 -0
  15. package/dist/context.js.map +1 -0
  16. package/dist/evaluator.d.ts +20 -0
  17. package/dist/evaluator.d.ts.map +1 -0
  18. package/dist/evaluator.js +213 -0
  19. package/dist/evaluator.js.map +1 -0
  20. package/dist/index.d.ts +20 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +18 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/index.umd.js +1160 -0
  25. package/dist/index.umd.js.map +7 -0
  26. package/dist/index.umd.min.js +12 -0
  27. package/dist/index.umd.min.js.map +7 -0
  28. package/dist/loader-fetch.d.ts +8 -0
  29. package/dist/loader-fetch.d.ts.map +1 -0
  30. package/dist/loader-fetch.js +15 -0
  31. package/dist/loader-fetch.js.map +1 -0
  32. package/dist/loader-memory.d.ts +11 -0
  33. package/dist/loader-memory.d.ts.map +1 -0
  34. package/dist/loader-memory.js +36 -0
  35. package/dist/loader-memory.js.map +1 -0
  36. package/dist/loader.d.ts +73 -0
  37. package/dist/loader.d.ts.map +1 -0
  38. package/dist/loader.js +159 -0
  39. package/dist/loader.js.map +1 -0
  40. package/dist/parser.d.ts +7 -0
  41. package/dist/parser.d.ts.map +1 -0
  42. package/dist/parser.js +609 -0
  43. package/dist/parser.js.map +1 -0
  44. package/dist/renderer.d.ts +13 -0
  45. package/dist/renderer.d.ts.map +1 -0
  46. package/dist/renderer.js +494 -0
  47. package/dist/renderer.js.map +1 -0
  48. package/dist/scan.d.ts +46 -0
  49. package/dist/scan.d.ts.map +1 -0
  50. package/dist/scan.js +46 -0
  51. package/dist/scan.js.map +1 -0
  52. package/dist/types.d.ts +175 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +5 -0
  55. package/dist/types.js.map +1 -0
  56. package/package.json +72 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * File loaders for {% include %} statements
3
+ * Pluggable interface supporting different environments
4
+ */
5
+ import type { Loader } from './types.js';
6
+ /**
7
+ * Fetch-based loader for browsers and service workers
8
+ * Uses the Fetch API to load files
9
+ */
10
+ export declare class FetchLoader implements Loader {
11
+ /**
12
+ * Load a file using fetch
13
+ * @param path - Path to load (relative or absolute URL)
14
+ * @param basePath - Base URL to resolve relative paths
15
+ * @returns File contents
16
+ */
17
+ load(path: string, basePath?: string): Promise<string>;
18
+ }
19
+ /**
20
+ * Options for {@link FileSystemLoader}.
21
+ */
22
+ export interface FileSystemLoaderOptions {
23
+ /**
24
+ * Containment root for include targets. When set, every include is
25
+ * resolved with `realpath` (following symlinks) and must land INSIDE
26
+ * this directory — `{% include %}` otherwise reads any file the build
27
+ * process can, and a crafted include in an untrusted corpus publishes
28
+ * it into the site output (issue #027, same class as the VitePress
29
+ * `<<<` symlink escape). Relative `..` and absolute paths that stay
30
+ * inside the root remain legal. Unset = no containment (trusted
31
+ * input, backward compatible).
32
+ */
33
+ root?: string;
34
+ }
35
+ /**
36
+ * Filesystem loader for Node.js
37
+ * Uses fs.readFile to load files
38
+ */
39
+ export declare class FileSystemLoader implements Loader {
40
+ private basePath;
41
+ private root?;
42
+ private realRoot?;
43
+ /**
44
+ * Create a filesystem loader
45
+ * @param basePath - Base directory for resolving relative paths
46
+ * @param options - See {@link FileSystemLoaderOptions}
47
+ */
48
+ constructor(basePath?: string, options?: FileSystemLoaderOptions);
49
+ /**
50
+ * Load a file from the filesystem
51
+ * @param path - Path to load (relative or absolute)
52
+ * @param basePath - Base path to resolve relative paths (overrides constructor basePath)
53
+ * @returns File contents
54
+ */
55
+ load(path: string, basePath?: string): Promise<string>;
56
+ }
57
+ /**
58
+ * Memory-based loader for testing
59
+ * Stores files in a Map
60
+ */
61
+ export declare class MemoryLoader implements Loader {
62
+ private files;
63
+ constructor(files?: Record<string, string>);
64
+ /**
65
+ * Add a file to the memory loader
66
+ */
67
+ addFile(path: string, content: string): void;
68
+ /**
69
+ * Load a file from memory
70
+ */
71
+ load(path: string, basePath?: string): Promise<string>;
72
+ }
73
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC;;;GAGG;AACH,qBAAa,WAAY,YAAW,MAAM;IACxC;;;;;OAKG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAc7D;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,IAAI,CAAC,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IAEzB;;;;OAIG;gBACS,QAAQ,GAAE,MAAsB,EAAE,OAAO,GAAE,uBAA4B;IAKnF;;;;;OAKG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiF7D;AAED;;;GAGG;AACH,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,KAAK,CAAqB;gBAEtB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAI9C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5C;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAc7D"}
package/dist/loader.js ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * File loaders for {% include %} statements
3
+ * Pluggable interface supporting different environments
4
+ */
5
+ /**
6
+ * Fetch-based loader for browsers and service workers
7
+ * Uses the Fetch API to load files
8
+ */
9
+ export class FetchLoader {
10
+ /**
11
+ * Load a file using fetch
12
+ * @param path - Path to load (relative or absolute URL)
13
+ * @param basePath - Base URL to resolve relative paths
14
+ * @returns File contents
15
+ */
16
+ async load(path, basePath) {
17
+ const url = basePath ? new URL(path, basePath).href : path;
18
+ // Add cache busting parameter
19
+ const fetchUrl = `${url}?preventCache=${Date.now()}`;
20
+ const response = await fetch(fetchUrl);
21
+ if (!response.ok) {
22
+ throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`);
23
+ }
24
+ return await response.text();
25
+ }
26
+ }
27
+ /**
28
+ * Filesystem loader for Node.js
29
+ * Uses fs.readFile to load files
30
+ */
31
+ export class FileSystemLoader {
32
+ /**
33
+ * Create a filesystem loader
34
+ * @param basePath - Base directory for resolving relative paths
35
+ * @param options - See {@link FileSystemLoaderOptions}
36
+ */
37
+ constructor(basePath = process.cwd(), options = {}) {
38
+ this.basePath = basePath;
39
+ this.root = options.root;
40
+ }
41
+ /**
42
+ * Load a file from the filesystem
43
+ * @param path - Path to load (relative or absolute)
44
+ * @param basePath - Base path to resolve relative paths (overrides constructor basePath)
45
+ * @returns File contents
46
+ */
47
+ async load(path, basePath) {
48
+ // Dynamic import to avoid bundling fs in browser builds
49
+ const fs = await import('fs/promises');
50
+ const pathModule = await import('path');
51
+ const resolvedBasePath = basePath || this.basePath;
52
+ const resolvedPath = pathModule.isAbsolute(path)
53
+ ? path
54
+ : pathModule.resolve(resolvedBasePath, path);
55
+ if (this.root !== undefined) {
56
+ // Containment check runs BEFORE the read, on the realpath of both
57
+ // sides, so neither `..` traversal nor a symlink inside the root
58
+ // pointing outside it can smuggle a foreign file into the render.
59
+ const refuse = (detail) => {
60
+ // Named error so the renderer can tell a SECURITY refusal from an
61
+ // ordinary missing-include: soft handling (preserve-the-directive,
62
+ // `<!-- Include error -->`) must not apply — the render fails hard.
63
+ const err = new Error(`Refusing include outside the include root: ${detail}`);
64
+ err.name = 'IncludeContainmentError';
65
+ throw err;
66
+ };
67
+ if (this.realRoot === undefined) {
68
+ try {
69
+ // Cached: containment is pinned to the root's topology at first
70
+ // load. A root re-pointed mid-render would leave the previously
71
+ // authorized set stale, but everything in it was legitimately
72
+ // authorized once — and a target now escaping the OLD realpath
73
+ // still refuses (fail-closed).
74
+ this.realRoot = await fs.realpath(this.root);
75
+ }
76
+ catch (error) {
77
+ // A root that doesn't resolve is a MISCONFIGURATION, not a
78
+ // missing include — soft handling would gut every include while
79
+ // the run "succeeds" with exit 0 (review finding). Fail hard.
80
+ const message = error instanceof Error ? error.message : String(error);
81
+ refuse(`include root ${this.root} does not resolve (${message})`);
82
+ }
83
+ }
84
+ // Lexical pre-check: a path that is outside the root BEFORE any
85
+ // symlink resolution is refused even when its target does not
86
+ // exist — otherwise `{% include "../not-yet-there" %}` degrades to
87
+ // a soft missing-include and the directive survives into output a
88
+ // later uncontained pass might resolve (review finding). Lexical
89
+ // containment can only REFUSE early, never allow: the realpath
90
+ // check below still runs for everything lexically inside.
91
+ const lexical = pathModule.resolve(resolvedPath);
92
+ if (lexical !== this.realRoot && !lexical.startsWith(this.realRoot + pathModule.sep) &&
93
+ lexical !== this.root && !lexical.startsWith(pathModule.resolve(this.root) + pathModule.sep)) {
94
+ refuse(`"${path}" resolves to ${lexical}, which is not inside ${this.realRoot}`);
95
+ }
96
+ let realTarget;
97
+ try {
98
+ realTarget = await fs.realpath(resolvedPath);
99
+ }
100
+ catch (error) {
101
+ // Target doesn't resolve — surface as an ordinary load failure;
102
+ // there is nothing to disclose (lexically it is inside the root).
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ throw new Error(`Failed to load ${resolvedPath}: ${message}`);
105
+ }
106
+ if (realTarget !== this.realRoot && !realTarget.startsWith(this.realRoot + pathModule.sep)) {
107
+ refuse(`"${path}" resolves to ${realTarget}, which is not inside ${this.realRoot}`);
108
+ }
109
+ // Read the VETTED realpath, not the original: narrows the
110
+ // realpath→read race so a final-component symlink swap between the
111
+ // check and the read cannot redirect the read outside the root
112
+ // (parent-directory races remain, as in any realpath design).
113
+ try {
114
+ return await fs.readFile(realTarget, 'utf-8');
115
+ }
116
+ catch (error) {
117
+ const message = error instanceof Error ? error.message : String(error);
118
+ throw new Error(`Failed to load ${resolvedPath}: ${message}`);
119
+ }
120
+ }
121
+ try {
122
+ return await fs.readFile(resolvedPath, 'utf-8');
123
+ }
124
+ catch (error) {
125
+ const message = error instanceof Error ? error.message : String(error);
126
+ throw new Error(`Failed to load ${resolvedPath}: ${message}`);
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Memory-based loader for testing
132
+ * Stores files in a Map
133
+ */
134
+ export class MemoryLoader {
135
+ constructor(files = {}) {
136
+ this.files = new Map(Object.entries(files));
137
+ }
138
+ /**
139
+ * Add a file to the memory loader
140
+ */
141
+ addFile(path, content) {
142
+ this.files.set(path, content);
143
+ }
144
+ /**
145
+ * Load a file from memory
146
+ */
147
+ async load(path, basePath) {
148
+ // Simple path resolution for memory loader
149
+ const resolvedPath = basePath && !path.startsWith('/')
150
+ ? `${basePath}/${path}`.replace(/\/+/g, '/')
151
+ : path;
152
+ const content = this.files.get(resolvedPath);
153
+ if (content === undefined) {
154
+ throw new Error(`File not found: ${resolvedPath}`);
155
+ }
156
+ return content;
157
+ }
158
+ }
159
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Template parser
3
+ * Converts template strings into AST (Abstract Syntax Tree)
4
+ */
5
+ import type { ParseResult } from './types.js';
6
+ export declare function parse(template: string): ParseResult;
7
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAW,WAAW,EAAc,MAAM,YAAY,CAAA;AAsDlE,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAgmBnD"}