@arikajs/view 0.0.4 → 0.0.5

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 (92) hide show
  1. package/README.md +92 -194
  2. package/dist/Compiler/AST.d.ts +34 -0
  3. package/dist/Compiler/AST.d.ts.map +1 -0
  4. package/dist/Compiler/AST.js +12 -0
  5. package/dist/Compiler/AST.js.map +1 -0
  6. package/dist/Compiler/CodeGenerator.d.ts +11 -0
  7. package/dist/Compiler/CodeGenerator.d.ts.map +1 -0
  8. package/dist/Compiler/CodeGenerator.js +53 -0
  9. package/dist/Compiler/CodeGenerator.js.map +1 -0
  10. package/dist/Compiler/DirectiveRegistry.d.ts +10 -0
  11. package/dist/Compiler/DirectiveRegistry.d.ts.map +1 -0
  12. package/dist/Compiler/DirectiveRegistry.js +206 -0
  13. package/dist/Compiler/DirectiveRegistry.js.map +1 -0
  14. package/dist/Compiler/Lexer.d.ts +28 -0
  15. package/dist/Compiler/Lexer.d.ts.map +1 -0
  16. package/dist/Compiler/Lexer.js +209 -0
  17. package/dist/Compiler/Lexer.js.map +1 -0
  18. package/dist/Compiler/Parser.d.ts +15 -0
  19. package/dist/Compiler/Parser.d.ts.map +1 -0
  20. package/dist/Compiler/Parser.js +188 -0
  21. package/dist/Compiler/Parser.js.map +1 -0
  22. package/dist/Compiler.d.ts +4 -3
  23. package/dist/Compiler.d.ts.map +1 -1
  24. package/dist/Compiler.js +13 -60
  25. package/dist/Compiler.js.map +1 -1
  26. package/dist/Engine.d.ts +47 -4
  27. package/dist/Engine.d.ts.map +1 -1
  28. package/dist/Engine.js +203 -39
  29. package/dist/Engine.js.map +1 -1
  30. package/dist/Template.js +1 -1
  31. package/dist/Template.js.map +1 -1
  32. package/dist/View.d.ts +19 -3
  33. package/dist/View.d.ts.map +1 -1
  34. package/dist/View.js +30 -2
  35. package/dist/View.js.map +1 -1
  36. package/dist/src/Compiler/AST.d.ts +34 -0
  37. package/dist/src/Compiler/AST.d.ts.map +1 -0
  38. package/dist/src/Compiler/AST.js +12 -0
  39. package/dist/src/Compiler/AST.js.map +1 -0
  40. package/dist/src/Compiler/CodeGenerator.d.ts +11 -0
  41. package/dist/src/Compiler/CodeGenerator.d.ts.map +1 -0
  42. package/dist/src/Compiler/CodeGenerator.js +53 -0
  43. package/dist/src/Compiler/CodeGenerator.js.map +1 -0
  44. package/dist/src/Compiler/DirectiveRegistry.d.ts +10 -0
  45. package/dist/src/Compiler/DirectiveRegistry.d.ts.map +1 -0
  46. package/dist/src/Compiler/DirectiveRegistry.js +206 -0
  47. package/dist/src/Compiler/DirectiveRegistry.js.map +1 -0
  48. package/dist/src/Compiler/Lexer.d.ts +28 -0
  49. package/dist/src/Compiler/Lexer.d.ts.map +1 -0
  50. package/dist/src/Compiler/Lexer.js +209 -0
  51. package/dist/src/Compiler/Lexer.js.map +1 -0
  52. package/dist/src/Compiler/Parser.d.ts +15 -0
  53. package/dist/src/Compiler/Parser.d.ts.map +1 -0
  54. package/dist/src/Compiler/Parser.js +188 -0
  55. package/dist/src/Compiler/Parser.js.map +1 -0
  56. package/dist/src/Compiler.d.ts +14 -0
  57. package/dist/src/Compiler.d.ts.map +1 -0
  58. package/dist/src/Compiler.js +31 -0
  59. package/dist/src/Compiler.js.map +1 -0
  60. package/dist/src/Engine.d.ts +76 -0
  61. package/dist/src/Engine.d.ts.map +1 -0
  62. package/dist/src/Engine.js +308 -0
  63. package/dist/src/Engine.js.map +1 -0
  64. package/dist/src/Template.d.ts +14 -0
  65. package/dist/src/Template.d.ts.map +1 -0
  66. package/dist/src/Template.js +63 -0
  67. package/dist/src/Template.js.map +1 -0
  68. package/dist/src/View.d.ts +30 -0
  69. package/dist/src/View.d.ts.map +1 -0
  70. package/dist/src/View.js +51 -0
  71. package/dist/src/View.js.map +1 -0
  72. package/dist/tests/View.test.d.ts +2 -0
  73. package/dist/tests/View.test.d.ts.map +1 -0
  74. package/dist/tests/View.test.js +190 -0
  75. package/dist/tests/View.test.js.map +1 -0
  76. package/package.json +45 -43
  77. package/dist/Directives/For.d.ts +0 -5
  78. package/dist/Directives/For.d.ts.map +0 -1
  79. package/dist/Directives/For.js +0 -18
  80. package/dist/Directives/For.js.map +0 -1
  81. package/dist/Directives/If.d.ts +0 -6
  82. package/dist/Directives/If.d.ts.map +0 -1
  83. package/dist/Directives/If.js +0 -26
  84. package/dist/Directives/If.js.map +0 -1
  85. package/dist/Directives/Include.d.ts +0 -5
  86. package/dist/Directives/Include.d.ts.map +0 -1
  87. package/dist/Directives/Include.js +0 -15
  88. package/dist/Directives/Include.js.map +0 -1
  89. package/dist/Directives/Section.d.ts +0 -5
  90. package/dist/Directives/Section.d.ts.map +0 -1
  91. package/dist/Directives/Section.js +0 -28
  92. package/dist/Directives/Section.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ import { ViewConfig } from './Engine';
2
+ export declare class Template {
3
+ private config;
4
+ constructor(config: ViewConfig);
5
+ /**
6
+ * Resolve and read template content.
7
+ */
8
+ read(template: string): string;
9
+ /**
10
+ * Resolve template name to file path.
11
+ */
12
+ private resolvePath;
13
+ }
14
+ //# sourceMappingURL=Template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../src/Template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,qBAAa,QAAQ;IACL,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEtC;;OAEG;IACI,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQrC;;OAEG;IACH,OAAO,CAAC,WAAW;CAKtB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Template = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ class Template {
40
+ constructor(config) {
41
+ this.config = config;
42
+ }
43
+ /**
44
+ * Resolve and read template content.
45
+ */
46
+ read(template) {
47
+ const filePath = this.resolvePath(template);
48
+ if (!fs.existsSync(filePath)) {
49
+ throw new Error(`View template not found: ${filePath}`);
50
+ }
51
+ return fs.readFileSync(filePath, 'utf8');
52
+ }
53
+ /**
54
+ * Resolve template name to file path.
55
+ */
56
+ resolvePath(template) {
57
+ const ext = this.config.extension || '.ark.html';
58
+ const fileName = template.replace(/\./g, path.sep) + ext;
59
+ return path.join(this.config.viewsPath, fileName);
60
+ }
61
+ }
62
+ exports.Template = Template;
63
+ //# sourceMappingURL=Template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Template.js","sourceRoot":"","sources":["../../src/Template.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,gDAAkC;AAGlC,MAAa,QAAQ;IACjB,YAAoB,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAI,CAAC;IAE3C;;OAEG;IACI,IAAI,CAAC,QAAgB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,QAAgB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,WAAW,CAAC;QACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACzD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;CACJ;AAtBD,4BAsBC"}
@@ -0,0 +1,30 @@
1
+ import { ViewConfig, ViewComposer, ViewHelper } from './Engine';
2
+ export declare class View {
3
+ private engine;
4
+ constructor(config: ViewConfig);
5
+ /**
6
+ * Add a custom directive to the template compiler.
7
+ */
8
+ directive(name: string, handler: (expression: string | null, children?: string) => string): this;
9
+ /**
10
+ * Add a view composer.
11
+ */
12
+ composer(template: string, callback: ViewComposer): this;
13
+ /**
14
+ * Add a global helper.
15
+ */
16
+ helper(name: string, callback: ViewHelper): this;
17
+ /**
18
+ * Share data explicitly across all templates rendered by this view instance.
19
+ */
20
+ share(key: string, value: any): this;
21
+ /**
22
+ * Render a template with data.
23
+ */
24
+ render<T = Record<string, any>>(template: string, data?: T): Promise<string>;
25
+ /**
26
+ * Render a fragment of a template.
27
+ */
28
+ renderFragment(template: string, fragment: string, data?: any): Promise<string>;
29
+ }
30
+ //# sourceMappingURL=View.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.d.ts","sourceRoot":"","sources":["../../src/View.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAExE,qBAAa,IAAI;IACb,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,UAAU;IAI9B;;OAEG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;IAKvG;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAK/D;;OAEG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI;IAKvD;;OAEG;IACI,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAK3C;;OAEG;IACU,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,CAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlG;;OAEG;IACU,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;CAGnG"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.View = void 0;
4
+ const Engine_1 = require("./Engine");
5
+ class View {
6
+ constructor(config) {
7
+ this.engine = new Engine_1.Engine(config);
8
+ }
9
+ /**
10
+ * Add a custom directive to the template compiler.
11
+ */
12
+ directive(name, handler) {
13
+ this.engine.directive(name, handler);
14
+ return this;
15
+ }
16
+ /**
17
+ * Add a view composer.
18
+ */
19
+ composer(template, callback) {
20
+ this.engine.composer(template, callback);
21
+ return this;
22
+ }
23
+ /**
24
+ * Add a global helper.
25
+ */
26
+ helper(name, callback) {
27
+ this.engine.helper(name, callback);
28
+ return this;
29
+ }
30
+ /**
31
+ * Share data explicitly across all templates rendered by this view instance.
32
+ */
33
+ share(key, value) {
34
+ this.engine.share(key, value);
35
+ return this;
36
+ }
37
+ /**
38
+ * Render a template with data.
39
+ */
40
+ async render(template, data = {}) {
41
+ return this.engine.render(template, data);
42
+ }
43
+ /**
44
+ * Render a fragment of a template.
45
+ */
46
+ async renderFragment(template, fragment, data = {}) {
47
+ return this.engine.renderFragment(template, fragment, data);
48
+ }
49
+ }
50
+ exports.View = View;
51
+ //# sourceMappingURL=View.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.js","sourceRoot":"","sources":["../../src/View.ts"],"names":[],"mappings":";;;AAAA,qCAAwE;AAExE,MAAa,IAAI;IAGb,YAAY,MAAkB;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,IAAY,EAAE,OAAiE;QAC5F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,QAAgB,EAAE,QAAsB;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,IAAY,EAAE,QAAoB;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,GAAW,EAAE,KAAU;QAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,MAAM,CAA0B,QAAgB,EAAE,OAAU,EAAO;QAC5E,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAAY,EAAE;QAC1E,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;CACJ;AApDD,oBAoDC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=View.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.test.d.ts","sourceRoot":"","sources":["../../tests/View.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const View_1 = require("../src/View");
40
+ const fs = __importStar(require("node:fs"));
41
+ const path = __importStar(require("node:path"));
42
+ const os = __importStar(require("node:os"));
43
+ const node_assert_1 = __importDefault(require("node:assert"));
44
+ const node_test_1 = require("node:test");
45
+ const tempDir = path.join(os.tmpdir(), 'arika-view-tests');
46
+ (0, node_test_1.before)(() => {
47
+ if (!fs.existsSync(tempDir)) {
48
+ fs.mkdirSync(tempDir, { recursive: true });
49
+ }
50
+ });
51
+ (0, node_test_1.after)(() => {
52
+ fs.rmSync(tempDir, { recursive: true, force: true });
53
+ });
54
+ (0, node_test_1.test)('View renders variables and escapes output', async () => {
55
+ const viewsPath = path.join(tempDir, 'variables');
56
+ fs.mkdirSync(viewsPath, { recursive: true });
57
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '<h1>{{ title }}</h1><p>{!! raw !!}</p>');
58
+ const view = new View_1.View({ viewsPath });
59
+ const html = await view.render('test', {
60
+ title: '<b>Hello</b>',
61
+ raw: '<span>Safe</span>'
62
+ });
63
+ node_assert_1.default.strictEqual(html.trim(), '<h1>&lt;b&gt;Hello&lt;/b&gt;</h1><p><span>Safe</span></p>');
64
+ });
65
+ (0, node_test_1.test)('View handles conditionals', async () => {
66
+ const viewsPath = path.join(tempDir, 'conditionals');
67
+ fs.mkdirSync(viewsPath, { recursive: true });
68
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '@if (show) Yes @else No @endif');
69
+ const view = new View_1.View({ viewsPath });
70
+ node_assert_1.default.strictEqual((await view.render('test', { show: true })).trim(), 'Yes');
71
+ node_assert_1.default.strictEqual((await view.render('test', { show: false })).trim(), 'No');
72
+ });
73
+ (0, node_test_1.test)('View handles loops', async () => {
74
+ const viewsPath = path.join(tempDir, 'loops');
75
+ fs.mkdirSync(viewsPath, { recursive: true });
76
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '<ul>@for (item of items)<li>{{ item }}</li>@endfor</ul>');
77
+ const view = new View_1.View({ viewsPath });
78
+ const html = await view.render('test', { items: ['A', 'B'] });
79
+ node_assert_1.default.strictEqual(html.trim(), '<ul><li>A</li><li>B</li></ul>');
80
+ });
81
+ (0, node_test_1.test)('View handles layouts and sections', async () => {
82
+ const viewsPath = path.join(tempDir, 'layouts');
83
+ fs.mkdirSync(viewsPath, { recursive: true });
84
+ fs.writeFileSync(path.join(viewsPath, 'layout.ark.html'), '<html><body>@yield("content")</body></html>');
85
+ fs.writeFileSync(path.join(viewsPath, 'page.ark.html'), '@extends("layout") @section("content") <h1>Hello</h1> @endsection');
86
+ const view = new View_1.View({ viewsPath });
87
+ const html = await view.render('page');
88
+ node_assert_1.default.ok(html.includes('<html><body>'));
89
+ node_assert_1.default.ok(html.includes('<h1>Hello</h1>'));
90
+ node_assert_1.default.ok(html.includes('</body></html>'));
91
+ });
92
+ (0, node_test_1.test)('View handles includes', async () => {
93
+ const viewsPath = path.join(tempDir, 'includes');
94
+ fs.mkdirSync(viewsPath, { recursive: true });
95
+ fs.writeFileSync(path.join(viewsPath, 'header.ark.html'), '<header>{{ title }}</header>');
96
+ fs.writeFileSync(path.join(viewsPath, 'page.ark.html'), '@include("header") content');
97
+ const view = new View_1.View({ viewsPath });
98
+ const html = await view.render('page', { title: 'Welcome' });
99
+ node_assert_1.default.strictEqual(html.trim(), '<header>Welcome</header> content');
100
+ });
101
+ (0, node_test_1.test)('View uses cache for improved performance', async () => {
102
+ const viewsPath = path.join(tempDir, 'cache');
103
+ fs.mkdirSync(viewsPath, { recursive: true });
104
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), 'Cache Me');
105
+ const view = new View_1.View({ viewsPath, cache: true });
106
+ // First render - compiles
107
+ await view.render('test');
108
+ // Modify file on disk
109
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), 'New Content');
110
+ // Second render - should still return old content from cache
111
+ const html = await view.render('test');
112
+ node_assert_1.default.strictEqual(html.trim(), 'Cache Me');
113
+ });
114
+ (0, node_test_1.test)('View loads persistent disk cache', async () => {
115
+ const viewsPath = path.join(tempDir, 'disk-cache-views');
116
+ const cachePath = path.join(tempDir, 'disk-cache-bin');
117
+ fs.mkdirSync(viewsPath, { recursive: true });
118
+ fs.mkdirSync(cachePath, { recursive: true });
119
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), 'Original Content');
120
+ // 1. First engine - populates disk cache
121
+ const view1 = new View_1.View({ viewsPath, cachePath, cache: true });
122
+ await view1.render('test');
123
+ // 2. Second engine - should read from disk cache even if memory is empty
124
+ const view2 = new View_1.View({ viewsPath, cachePath, cache: true });
125
+ // Modify original file to prove it's NOT reading from source
126
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), 'Modified Content');
127
+ const html = await view2.render('test');
128
+ node_assert_1.default.strictEqual(html.trim(), 'Original Content');
129
+ });
130
+ (0, node_test_1.test)('View handles static ${} and backticks safely', async () => {
131
+ const viewsPath = path.join(tempDir, 'escaping-js');
132
+ fs.mkdirSync(viewsPath, { recursive: true });
133
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '<div>${price}</div> `backticks`');
134
+ const view = new View_1.View({ viewsPath });
135
+ const html = await view.render('test');
136
+ node_assert_1.default.strictEqual(html.trim(), '<div>${price}</div> `backticks`');
137
+ });
138
+ (0, node_test_1.test)('View supports custom directives', async () => {
139
+ const viewsPath = path.join(tempDir, 'custom-directives');
140
+ fs.mkdirSync(viewsPath, { recursive: true });
141
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '@hello(World)');
142
+ const view = new View_1.View({ viewsPath });
143
+ view.directive('hello', (expression) => {
144
+ const name = expression || 'Guest';
145
+ return `_output += "Hello, ${name}!";\n`;
146
+ });
147
+ const html = await view.render('test');
148
+ node_assert_1.default.strictEqual(html.trim(), 'Hello, World!');
149
+ });
150
+ (0, node_test_1.test)('View supports global shared data', async () => {
151
+ const viewsPath = path.join(tempDir, 'shared-data');
152
+ fs.mkdirSync(viewsPath, { recursive: true });
153
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '{{ globalVal }} - {{ localVal }}');
154
+ const view = new View_1.View({ viewsPath });
155
+ view.share('globalVal', 'Global');
156
+ node_assert_1.default.strictEqual((await view.render('test', { localVal: 'Local1' })).trim(), 'Global - Local1');
157
+ node_assert_1.default.strictEqual((await view.render('test', { localVal: 'Local2' })).trim(), 'Global - Local2');
158
+ });
159
+ (0, node_test_1.test)('View supports push and stack directives', async () => {
160
+ const viewsPath = path.join(tempDir, 'push-stack');
161
+ fs.mkdirSync(viewsPath, { recursive: true });
162
+ fs.writeFileSync(path.join(viewsPath, 'test.ark.html'), '@push("scripts")<script>1</script>@endpush @push("scripts")<script>2</script>@endpush Scripts: @stack("scripts")');
163
+ const view = new View_1.View({ viewsPath });
164
+ const html = await view.render('test');
165
+ node_assert_1.default.ok(html.includes('<script>1</script>'));
166
+ node_assert_1.default.ok(html.includes('<script>2</script>'));
167
+ });
168
+ (0, node_test_1.test)('View supports unless and empty directives', async () => {
169
+ const viewsPath = path.join(tempDir, 'unless-empty');
170
+ fs.mkdirSync(viewsPath, { recursive: true });
171
+ fs.writeFileSync(path.join(viewsPath, 'unless.ark.html'), '@unless(show) Hidden @endunless');
172
+ fs.writeFileSync(path.join(viewsPath, 'empty.ark.html'), '@empty(items) EmptyArray @endempty @empty(str) EmptyString @endempty');
173
+ const view = new View_1.View({ viewsPath });
174
+ node_assert_1.default.strictEqual((await view.render('unless', { show: false })).trim(), 'Hidden');
175
+ node_assert_1.default.strictEqual((await view.render('unless', { show: true })).trim(), '');
176
+ node_assert_1.default.strictEqual((await view.render('empty', { items: [], str: '' })).replace(/\s+/g, ' ').trim(), 'EmptyArray EmptyString');
177
+ node_assert_1.default.strictEqual((await view.render('empty', { items: [1], str: 'A' })).trim(), '');
178
+ });
179
+ (0, node_test_1.test)('View supports components and slots', async () => {
180
+ const viewsPath = path.join(tempDir, 'components');
181
+ fs.mkdirSync(viewsPath, { recursive: true });
182
+ fs.writeFileSync(path.join(viewsPath, 'alert.ark.html'), '<div class="alert {{ type }}"><h1>{!! title !!}</h1><p>{!! slot !!}</p></div>');
183
+ fs.writeFileSync(path.join(viewsPath, 'page.ark.html'), '@component("alert", { type: "danger" }) @slot("title") Error @endslot Something went wrong. @endcomponent');
184
+ const view = new View_1.View({ viewsPath });
185
+ const html = await view.render('page');
186
+ node_assert_1.default.ok(html.includes('<div class="alert danger">'));
187
+ node_assert_1.default.ok(html.includes('Error'));
188
+ node_assert_1.default.ok(html.includes('Something went wrong.'));
189
+ });
190
+ //# sourceMappingURL=View.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.test.js","sourceRoot":"","sources":["../../tests/View.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,45 +1,47 @@
1
1
  {
2
- "name": "@arikajs/view",
3
- "version": "0.0.4",
4
- "description": "Server-side rendering and template engine for the ArikaJS framework.",
5
- "license": "MIT",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "scripts": {
9
- "build": "tsc -p tsconfig.json",
10
- "build:tests": "tsc -p tsconfig.test.json",
11
- "clean": "rm -rf dist",
12
- "prepare": "echo skip",
13
- "test": "npm run build && npm run build:tests && node scripts/fix-test-imports.js && node --test 'dist/tests/**/*.test.js'",
14
- "test:watch": "npm run build && npm run build:tests && node --test --watch 'dist/tests/**/*.test.js'"
15
- },
16
- "files": [
17
- "dist"
18
- ],
19
- "keywords": [
20
- "arika",
21
- "arika-js",
22
- "framework",
23
- "view",
24
- "template",
25
- "ssr",
26
- "renderer"
27
- ],
28
- "engines": {
29
- "node": ">=20.0.0"
30
- },
31
- "repository": {
32
- "type": "git",
33
- "url": "git+https://github.com/arikajs/view.git"
34
- },
35
- "bugs": {
36
- "url": "https://github.com/arikajs/view/issues"
37
- },
38
- "homepage": "https://github.com/arikajs/view#readme",
39
- "dependencies": {},
40
- "devDependencies": {
41
- "@types/node": "^20.11.24",
42
- "typescript": "^5.3.3"
43
- },
44
- "author": "Prakash Tank"
2
+ "name": "@arikajs/view",
3
+ "version": "0.0.5",
4
+ "description": "Server-side rendering and template engine for the ArikaJS framework.",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc -p tsconfig.json",
10
+ "build:tests": "tsc -p tsconfig.test.json",
11
+ "clean": "rm -rf dist",
12
+ "prepare": "echo skip",
13
+ "test": "npm run build && npm run build:tests && node scripts/fix-test-imports.js && node --test 'dist/tests/**/*.test.js'",
14
+ "test:watch": "npm run build && npm run build:tests && node --test --watch 'dist/tests/**/*.test.js'",
15
+ "dev": "tsc -p tsconfig.json --watch"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "keywords": [
21
+ "arika",
22
+ "arika-js",
23
+ "framework",
24
+ "view",
25
+ "template",
26
+ "ssr",
27
+ "renderer"
28
+ ],
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/ArikaJs/arikajs.git",
35
+ "directory": "packages/view"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/ArikaJs/arikajs/issues"
39
+ },
40
+ "homepage": "https://github.com/ArikaJs/arikajs/tree/main/packages/view#readme",
41
+ "dependencies": {},
42
+ "devDependencies": {
43
+ "@types/node": "^20.11.24",
44
+ "typescript": "^5.3.3"
45
+ },
46
+ "author": "Prakash Tank"
45
47
  }
@@ -1,5 +0,0 @@
1
- export declare const ForDirective: {
2
- name: string;
3
- handle(content: string): string;
4
- };
5
- //# sourceMappingURL=For.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"For.d.ts","sourceRoot":"","sources":["../../src/Directives/For.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;oBAEL,MAAM,GAAG,MAAM;CAWlC,CAAC"}
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ForDirective = void 0;
4
- exports.ForDirective = {
5
- name: 'for',
6
- handle(content) {
7
- if (content.startsWith('@for')) {
8
- const match = content.match(/@for\s*\((.*)\)/);
9
- const loop = match && match[1] ? match[1] : '';
10
- return `for (let ${loop}) {\n`;
11
- }
12
- if (content === '@endfor') {
13
- return `}\n`;
14
- }
15
- return '';
16
- }
17
- };
18
- //# sourceMappingURL=For.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"For.js","sourceRoot":"","sources":["../../src/Directives/For.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG;IACxB,IAAI,EAAE,KAAK;IACX,MAAM,CAAC,OAAe;QAClB,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO,YAAY,IAAI,OAAO,CAAC;QACnC,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ,CAAC"}
@@ -1,6 +0,0 @@
1
- export interface Directive {
2
- name: string;
3
- handle(content: string): string;
4
- }
5
- export declare const IfDirective: Directive;
6
- //# sourceMappingURL=If.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"If.d.ts","sourceRoot":"","sources":["../../src/Directives/If.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,WAAW,EAAE,SAqBzB,CAAC"}
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IfDirective = void 0;
4
- exports.IfDirective = {
5
- name: 'if',
6
- handle(content) {
7
- if (content.startsWith('@if')) {
8
- const match = content.match(/@if\s*\((.*)\)/);
9
- const condition = match && match[1] ? match[1] : 'true';
10
- return `if (${condition}) {\n`;
11
- }
12
- if (content === '@else') {
13
- return `} else {\n`;
14
- }
15
- if (content.startsWith('@elseif')) {
16
- const match = content.match(/@elseif\s*\((.*)\)/);
17
- const condition = match && match[1] ? match[1] : 'true';
18
- return `} else if (${condition}) {\n`;
19
- }
20
- if (content === '@endif') {
21
- return `}\n`;
22
- }
23
- return '';
24
- }
25
- };
26
- //# sourceMappingURL=If.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"If.js","sourceRoot":"","sources":["../../src/Directives/If.ts"],"names":[],"mappings":";;;AAKa,QAAA,WAAW,GAAc;IAClC,IAAI,EAAE,IAAI;IACV,MAAM,CAAC,OAAe;QAClB,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACxD,OAAO,OAAO,SAAS,OAAO,CAAC;QACnC,CAAC;QACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,YAAY,CAAC;QACxB,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACxD,OAAO,cAAc,SAAS,OAAO,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare const IncludeDirective: {
2
- name: string;
3
- handle(content: string): string;
4
- };
5
- //# sourceMappingURL=Include.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Include.d.ts","sourceRoot":"","sources":["../../src/Directives/Include.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;oBAET,MAAM,GAAG,MAAM;CAQlC,CAAC"}
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IncludeDirective = void 0;
4
- exports.IncludeDirective = {
5
- name: 'include',
6
- handle(content) {
7
- if (!content.startsWith('@include')) {
8
- return '';
9
- }
10
- const match = content.match(/@include\s*\((.*)\)/);
11
- const template = match && match[1] ? match[1] : '""';
12
- return `_output += await _engine.render(${template}, _data);\n`;
13
- }
14
- };
15
- //# sourceMappingURL=Include.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Include.js","sourceRoot":"","sources":["../../src/Directives/Include.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG;IAC5B,IAAI,EAAE,SAAS;IACf,MAAM,CAAC,OAAe;QAClB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,OAAO,mCAAmC,QAAQ,aAAa,CAAC;IACpE,CAAC;CACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare const SectionDirective: {
2
- name: string;
3
- handle(content: string): string;
4
- };
5
- //# sourceMappingURL=Section.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Section.d.ts","sourceRoot":"","sources":["../../src/Directives/Section.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;oBAET,MAAM,GAAG,MAAM;CAqBlC,CAAC"}
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SectionDirective = void 0;
4
- exports.SectionDirective = {
5
- name: 'section',
6
- handle(content) {
7
- if (content.startsWith('@section')) {
8
- const match = content.match(/@section\s*\(([^)]*)\)/);
9
- const name = match && match[1] ? match[1].replace(/['"]/g, '') : '';
10
- return `_engine.startSection("${name}", _output);\n_output = "";\n`;
11
- }
12
- if (content === '@endsection') {
13
- return `_output = _engine.popSection(_output);\n`;
14
- }
15
- if (content.startsWith('@yield')) {
16
- const match = content.match(/@yield\s*\(([^)]*)\)/);
17
- const name = match && match[1] ? match[1] : '""';
18
- return `_output += _engine.yield(${name});\n`;
19
- }
20
- if (content.startsWith('@extends')) {
21
- const match = content.match(/@extends\s*\((.*)\)/);
22
- const parent = match && match[1] ? match[1] : '""';
23
- return `_engine.extend(${parent});\n`;
24
- }
25
- return '';
26
- }
27
- };
28
- //# sourceMappingURL=Section.js.map