binja 0.2.1 → 0.3.0
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 +26 -0
- package/dist/cli.js +18 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +164 -9
- package/dist/parser/index.d.ts +1 -0
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/nodes.d.ts +7 -2
- package/dist/parser/nodes.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +5 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/tests/index.d.ts.map +1 -1
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -290,6 +290,28 @@ app.get('/user/:id', ({ params }) => templates.user({ id: params.id }))
|
|
|
290
290
|
| `timesince` | `{{ past\|timesince }}` | `2 days ago` |
|
|
291
291
|
| `timeuntil` | `{{ future\|timeuntil }}` | `in 3 hours` |
|
|
292
292
|
|
|
293
|
+
#### Timezone Support
|
|
294
|
+
|
|
295
|
+
All date/time operations respect the `timezone` option in Environment:
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
const env = new Environment({
|
|
299
|
+
timezone: 'Europe/Rome' // All dates will be displayed in Rome timezone
|
|
300
|
+
})
|
|
301
|
+
|
|
302
|
+
// 2024-06-15 12:00 UTC = 2024-06-15 14:00 Rome (UTC+2)
|
|
303
|
+
await env.renderString('{{ date|date:"Y-m-d H:i" }}', {
|
|
304
|
+
date: new Date('2024-06-15T12:00:00Z')
|
|
305
|
+
})
|
|
306
|
+
// Output: 2024-06-15 14:00
|
|
307
|
+
|
|
308
|
+
// {% now %} tag also uses the configured timezone
|
|
309
|
+
await env.renderString('{% now "Y-m-d H:i" %}')
|
|
310
|
+
// Output: current date/time in Rome timezone
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Common timezone values: `UTC`, `Europe/London`, `Europe/Rome`, `Europe/Paris`, `America/New_York`, `America/Los_Angeles`, `Asia/Tokyo`, `Asia/Shanghai`, `Australia/Sydney`
|
|
314
|
+
|
|
293
315
|
### Safety & Encoding
|
|
294
316
|
|
|
295
317
|
| Filter | Example | Description |
|
|
@@ -378,6 +400,10 @@ const env = new Environment({
|
|
|
378
400
|
// Auto-escape HTML (default: true)
|
|
379
401
|
autoescape: true,
|
|
380
402
|
|
|
403
|
+
// Timezone for date/time operations
|
|
404
|
+
// All date filters and {% now %} tag will use this timezone
|
|
405
|
+
timezone: 'Europe/Rome', // or 'UTC', 'America/New_York', etc.
|
|
406
|
+
|
|
381
407
|
// Custom filters
|
|
382
408
|
filters: {
|
|
383
409
|
currency: (value: number) => `$${value.toFixed(2)}`,
|
package/dist/cli.js
CHANGED
|
@@ -499,6 +499,8 @@ class Parser {
|
|
|
499
499
|
return this.parseUrl(start);
|
|
500
500
|
case "static":
|
|
501
501
|
return this.parseStatic(start);
|
|
502
|
+
case "now":
|
|
503
|
+
return this.parseNow(start);
|
|
502
504
|
case "comment":
|
|
503
505
|
return this.parseComment(start);
|
|
504
506
|
case "spaceless":
|
|
@@ -792,6 +794,22 @@ class Parser {
|
|
|
792
794
|
column: start.column
|
|
793
795
|
};
|
|
794
796
|
}
|
|
797
|
+
parseNow(start) {
|
|
798
|
+
const format = this.parseExpression();
|
|
799
|
+
let asVar = null;
|
|
800
|
+
if (this.check("NAME" /* NAME */) && this.peek().value === "as") {
|
|
801
|
+
this.advance();
|
|
802
|
+
asVar = this.expect("NAME" /* NAME */).value;
|
|
803
|
+
}
|
|
804
|
+
this.expect("BLOCK_END" /* BLOCK_END */);
|
|
805
|
+
return {
|
|
806
|
+
type: "Now",
|
|
807
|
+
format,
|
|
808
|
+
asVar,
|
|
809
|
+
line: start.line,
|
|
810
|
+
column: start.column
|
|
811
|
+
};
|
|
812
|
+
}
|
|
795
813
|
parseComment(start) {
|
|
796
814
|
this.expect("BLOCK_END" /* BLOCK_END */);
|
|
797
815
|
while (!this.isAtEnd()) {
|
package/dist/index.d.ts
CHANGED
|
@@ -44,6 +44,8 @@ export interface EnvironmentOptions {
|
|
|
44
44
|
debug?: boolean;
|
|
45
45
|
/** Debug panel options */
|
|
46
46
|
debugOptions?: PanelOptions;
|
|
47
|
+
/** Timezone for date/time operations (e.g., 'Europe/Rome', 'UTC', 'America/New_York') */
|
|
48
|
+
timezone?: string;
|
|
47
49
|
}
|
|
48
50
|
export declare class Environment {
|
|
49
51
|
private options;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAU,YAAY,EAAE,MAAM,UAAU,CAAA;AAE/C,OAAO,EAAkB,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAsC,cAAc,EAAE,MAAM,YAAY,CAAA;AAG/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAM3C,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACxC,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,qCAAqC;IACrC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAA;IAChF,gDAAgD;IAChD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACzC,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,0BAA0B;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -535,6 +535,8 @@ class Parser {
|
|
|
535
535
|
return this.parseUrl(start);
|
|
536
536
|
case "static":
|
|
537
537
|
return this.parseStatic(start);
|
|
538
|
+
case "now":
|
|
539
|
+
return this.parseNow(start);
|
|
538
540
|
case "comment":
|
|
539
541
|
return this.parseComment(start);
|
|
540
542
|
case "spaceless":
|
|
@@ -828,6 +830,22 @@ class Parser {
|
|
|
828
830
|
column: start.column
|
|
829
831
|
};
|
|
830
832
|
}
|
|
833
|
+
parseNow(start) {
|
|
834
|
+
const format = this.parseExpression();
|
|
835
|
+
let asVar = null;
|
|
836
|
+
if (this.check("NAME" /* NAME */) && this.peek().value === "as") {
|
|
837
|
+
this.advance();
|
|
838
|
+
asVar = this.expect("NAME" /* NAME */).value;
|
|
839
|
+
}
|
|
840
|
+
this.expect("BLOCK_END" /* BLOCK_END */);
|
|
841
|
+
return {
|
|
842
|
+
type: "Now",
|
|
843
|
+
format,
|
|
844
|
+
asVar,
|
|
845
|
+
line: start.line,
|
|
846
|
+
column: start.column
|
|
847
|
+
};
|
|
848
|
+
}
|
|
831
849
|
parseComment(start) {
|
|
832
850
|
this.expect("BLOCK_END" /* BLOCK_END */);
|
|
833
851
|
while (!this.isAtEnd()) {
|
|
@@ -2251,6 +2269,7 @@ var builtinTests = {
|
|
|
2251
2269
|
defined,
|
|
2252
2270
|
undefined: undefined2,
|
|
2253
2271
|
none,
|
|
2272
|
+
None: none,
|
|
2254
2273
|
boolean,
|
|
2255
2274
|
string: string2,
|
|
2256
2275
|
mapping,
|
|
@@ -2288,9 +2307,22 @@ class Runtime {
|
|
|
2288
2307
|
staticResolver: options.staticResolver ?? ((path) => `/static/${path}`),
|
|
2289
2308
|
templateLoader: options.templateLoader ?? (async () => {
|
|
2290
2309
|
throw new Error("Template loader not configured");
|
|
2291
|
-
})
|
|
2310
|
+
}),
|
|
2311
|
+
timezone: options.timezone ?? undefined
|
|
2292
2312
|
};
|
|
2293
2313
|
this.filters = { ...builtinFilters, ...this.options.filters };
|
|
2314
|
+
if (this.options.timezone) {
|
|
2315
|
+
const tz = this.options.timezone;
|
|
2316
|
+
this.filters.date = (value, format2 = "N j, Y") => {
|
|
2317
|
+
const d = value instanceof Date ? value : new Date(value);
|
|
2318
|
+
if (isNaN(d.getTime()))
|
|
2319
|
+
return "";
|
|
2320
|
+
return this.formatDate(d, format2);
|
|
2321
|
+
};
|
|
2322
|
+
this.filters.time = (value, format2 = "H:i") => {
|
|
2323
|
+
return this.filters.date(value, format2);
|
|
2324
|
+
};
|
|
2325
|
+
}
|
|
2294
2326
|
this.tests = { ...builtinTests, ...this.options.tests };
|
|
2295
2327
|
}
|
|
2296
2328
|
async render(ast, context = {}) {
|
|
@@ -2411,6 +2443,8 @@ class Runtime {
|
|
|
2411
2443
|
return this.renderUrlSync(node, ctx);
|
|
2412
2444
|
case "Static":
|
|
2413
2445
|
return this.renderStaticSync(node, ctx);
|
|
2446
|
+
case "Now":
|
|
2447
|
+
return this.renderNowSync(node, ctx);
|
|
2414
2448
|
case "Load":
|
|
2415
2449
|
case "Extends":
|
|
2416
2450
|
return null;
|
|
@@ -2469,9 +2503,10 @@ class Runtime {
|
|
|
2469
2503
|
renderBlockSync(node, ctx) {
|
|
2470
2504
|
const blockToRender = this.blocks.get(node.name) || node;
|
|
2471
2505
|
ctx.push();
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2506
|
+
const parentContent = this.renderNodesSync(node.body, ctx);
|
|
2507
|
+
const safeContent = new String(parentContent);
|
|
2508
|
+
safeContent.__safe__ = true;
|
|
2509
|
+
ctx.set("block", { super: safeContent });
|
|
2475
2510
|
const result = this.renderNodesSync(blockToRender.body, ctx);
|
|
2476
2511
|
ctx.pop();
|
|
2477
2512
|
return result;
|
|
@@ -2505,6 +2540,122 @@ class Runtime {
|
|
|
2505
2540
|
}
|
|
2506
2541
|
return url;
|
|
2507
2542
|
}
|
|
2543
|
+
renderNowSync(node, ctx) {
|
|
2544
|
+
const format2 = String(this.eval(node.format, ctx));
|
|
2545
|
+
const result = this.formatDate(new Date, format2);
|
|
2546
|
+
if (node.asVar) {
|
|
2547
|
+
ctx.set(node.asVar, result);
|
|
2548
|
+
return "";
|
|
2549
|
+
}
|
|
2550
|
+
return result;
|
|
2551
|
+
}
|
|
2552
|
+
getDateInTimezone(d, tz) {
|
|
2553
|
+
if (!tz) {
|
|
2554
|
+
return {
|
|
2555
|
+
year: d.getFullYear(),
|
|
2556
|
+
month: d.getMonth(),
|
|
2557
|
+
day: d.getDate(),
|
|
2558
|
+
weekday: d.getDay(),
|
|
2559
|
+
hours: d.getHours(),
|
|
2560
|
+
minutes: d.getMinutes(),
|
|
2561
|
+
seconds: d.getSeconds()
|
|
2562
|
+
};
|
|
2563
|
+
}
|
|
2564
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
2565
|
+
timeZone: tz,
|
|
2566
|
+
year: "numeric",
|
|
2567
|
+
month: "2-digit",
|
|
2568
|
+
day: "2-digit",
|
|
2569
|
+
weekday: "short",
|
|
2570
|
+
hour: "2-digit",
|
|
2571
|
+
minute: "2-digit",
|
|
2572
|
+
second: "2-digit",
|
|
2573
|
+
hour12: false
|
|
2574
|
+
});
|
|
2575
|
+
const parts = formatter.formatToParts(d);
|
|
2576
|
+
const get = (type) => parts.find((p) => p.type === type)?.value || "";
|
|
2577
|
+
const weekdayMap = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };
|
|
2578
|
+
return {
|
|
2579
|
+
year: parseInt(get("year"), 10),
|
|
2580
|
+
month: parseInt(get("month"), 10) - 1,
|
|
2581
|
+
day: parseInt(get("day"), 10),
|
|
2582
|
+
weekday: weekdayMap[get("weekday")] ?? 0,
|
|
2583
|
+
hours: parseInt(get("hour"), 10),
|
|
2584
|
+
minutes: parseInt(get("minute"), 10),
|
|
2585
|
+
seconds: parseInt(get("second"), 10)
|
|
2586
|
+
};
|
|
2587
|
+
}
|
|
2588
|
+
formatDate(d, format2) {
|
|
2589
|
+
const DAY_NAMES_SHORT2 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
2590
|
+
const DAY_NAMES_LONG2 = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
2591
|
+
const MONTH_NAMES_SHORT2 = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
2592
|
+
const MONTH_NAMES_LONG2 = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
2593
|
+
const tz = this.options.timezone;
|
|
2594
|
+
const { year, month, day, weekday, hours, minutes, seconds } = this.getDateInTimezone(d, tz);
|
|
2595
|
+
let result = "";
|
|
2596
|
+
for (let i = 0;i < format2.length; i++) {
|
|
2597
|
+
const char = format2[i];
|
|
2598
|
+
switch (char) {
|
|
2599
|
+
case "d":
|
|
2600
|
+
result += String(day).padStart(2, "0");
|
|
2601
|
+
break;
|
|
2602
|
+
case "j":
|
|
2603
|
+
result += String(day);
|
|
2604
|
+
break;
|
|
2605
|
+
case "D":
|
|
2606
|
+
result += DAY_NAMES_SHORT2[weekday];
|
|
2607
|
+
break;
|
|
2608
|
+
case "l":
|
|
2609
|
+
result += DAY_NAMES_LONG2[weekday];
|
|
2610
|
+
break;
|
|
2611
|
+
case "m":
|
|
2612
|
+
result += String(month + 1).padStart(2, "0");
|
|
2613
|
+
break;
|
|
2614
|
+
case "n":
|
|
2615
|
+
result += String(month + 1);
|
|
2616
|
+
break;
|
|
2617
|
+
case "M":
|
|
2618
|
+
result += MONTH_NAMES_SHORT2[month];
|
|
2619
|
+
break;
|
|
2620
|
+
case "F":
|
|
2621
|
+
result += MONTH_NAMES_LONG2[month];
|
|
2622
|
+
break;
|
|
2623
|
+
case "y":
|
|
2624
|
+
result += String(year).slice(-2);
|
|
2625
|
+
break;
|
|
2626
|
+
case "Y":
|
|
2627
|
+
result += String(year);
|
|
2628
|
+
break;
|
|
2629
|
+
case "H":
|
|
2630
|
+
result += String(hours).padStart(2, "0");
|
|
2631
|
+
break;
|
|
2632
|
+
case "G":
|
|
2633
|
+
result += String(hours);
|
|
2634
|
+
break;
|
|
2635
|
+
case "i":
|
|
2636
|
+
result += String(minutes).padStart(2, "0");
|
|
2637
|
+
break;
|
|
2638
|
+
case "s":
|
|
2639
|
+
result += String(seconds).padStart(2, "0");
|
|
2640
|
+
break;
|
|
2641
|
+
case "a":
|
|
2642
|
+
result += hours < 12 ? "a.m." : "p.m.";
|
|
2643
|
+
break;
|
|
2644
|
+
case "A":
|
|
2645
|
+
result += hours < 12 ? "AM" : "PM";
|
|
2646
|
+
break;
|
|
2647
|
+
case "g":
|
|
2648
|
+
result += String(hours % 12 || 12);
|
|
2649
|
+
break;
|
|
2650
|
+
case "h":
|
|
2651
|
+
result += String(hours % 12 || 12).padStart(2, "0");
|
|
2652
|
+
break;
|
|
2653
|
+
default:
|
|
2654
|
+
result += char;
|
|
2655
|
+
}
|
|
2656
|
+
}
|
|
2657
|
+
return result;
|
|
2658
|
+
}
|
|
2508
2659
|
renderNodesSync(nodes2, ctx) {
|
|
2509
2660
|
const parts = [];
|
|
2510
2661
|
for (const node of nodes2) {
|
|
@@ -2749,6 +2900,8 @@ class Runtime {
|
|
|
2749
2900
|
return this.renderUrlSync(node, ctx);
|
|
2750
2901
|
case "Static":
|
|
2751
2902
|
return this.renderStaticSync(node, ctx);
|
|
2903
|
+
case "Now":
|
|
2904
|
+
return this.renderNowSync(node, ctx);
|
|
2752
2905
|
default:
|
|
2753
2906
|
return null;
|
|
2754
2907
|
}
|
|
@@ -2805,9 +2958,9 @@ class Runtime {
|
|
|
2805
2958
|
const blockToRender = this.blocks.get(node.name) || node;
|
|
2806
2959
|
ctx.push();
|
|
2807
2960
|
const parentContent = await this.renderNodesAsync(node.body, ctx);
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
});
|
|
2961
|
+
const safeContent = new String(parentContent);
|
|
2962
|
+
safeContent.__safe__ = true;
|
|
2963
|
+
ctx.set("block", { super: safeContent });
|
|
2811
2964
|
const result = await this.renderNodesAsync(blockToRender.body, ctx);
|
|
2812
2965
|
ctx.pop();
|
|
2813
2966
|
return result;
|
|
@@ -4344,7 +4497,8 @@ class Environment {
|
|
|
4344
4497
|
cache: options.cache ?? true,
|
|
4345
4498
|
extensions: options.extensions ?? [".html", ".jinja", ".jinja2", ""],
|
|
4346
4499
|
debug: options.debug ?? false,
|
|
4347
|
-
debugOptions: options.debugOptions ?? {}
|
|
4500
|
+
debugOptions: options.debugOptions ?? {},
|
|
4501
|
+
timezone: options.timezone ?? undefined
|
|
4348
4502
|
};
|
|
4349
4503
|
this.runtime = new Runtime({
|
|
4350
4504
|
autoescape: this.options.autoescape,
|
|
@@ -4352,7 +4506,8 @@ class Environment {
|
|
|
4352
4506
|
globals: this.options.globals,
|
|
4353
4507
|
urlResolver: this.options.urlResolver,
|
|
4354
4508
|
staticResolver: this.options.staticResolver,
|
|
4355
|
-
templateLoader: this.loadTemplate.bind(this)
|
|
4509
|
+
templateLoader: this.loadTemplate.bind(this),
|
|
4510
|
+
timezone: this.options.timezone
|
|
4356
4511
|
});
|
|
4357
4512
|
}
|
|
4358
4513
|
async render(templateName, context = {}) {
|
package/dist/parser/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,KAAK,EAEV,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,KAAK,EAEV,YAAY,EA4Bb,MAAM,SAAS,CAAA;AAEhB,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAY;gBAEf,MAAM,EAAE,KAAK,EAAE;IAI3B,KAAK,IAAI,YAAY;IAgBrB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;IA0ClB,OAAO,CAAC,OAAO;IA+Df,OAAO,CAAC,QAAQ;IAuEhB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;IA8CpB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,SAAS;IAiCjB,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,QAAQ;IAqChB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,OAAO;IAmBf,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,YAAY;IAgFpB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,YAAY;IAiEpB,OAAO,CAAC,YAAY;IAkFpB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,KAAK;CAId;AAED,cAAc,SAAS,CAAA"}
|
package/dist/parser/nodes.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AST Node definitions for Jinja2/DTL templates
|
|
3
3
|
*/
|
|
4
|
-
export type NodeType = 'Template' | 'Text' | 'Output' | 'If' | 'For' | 'Block' | 'Extends' | 'Include' | 'Set' | 'With' | 'Macro' | 'Call' | 'Filter' | 'Comment' | 'Load' | 'Url' | 'Static' | 'Cache' | 'Name' | 'Literal' | 'Array' | 'Object' | 'BinaryOp' | 'UnaryOp' | 'Compare' | 'GetAttr' | 'GetItem' | 'FilterExpr' | 'TestExpr' | 'Conditional' | 'FunctionCall';
|
|
4
|
+
export type NodeType = 'Template' | 'Text' | 'Output' | 'If' | 'For' | 'Block' | 'Extends' | 'Include' | 'Set' | 'With' | 'Macro' | 'Call' | 'Filter' | 'Comment' | 'Load' | 'Url' | 'Static' | 'Cache' | 'Now' | 'Name' | 'Literal' | 'Array' | 'Object' | 'BinaryOp' | 'UnaryOp' | 'Compare' | 'GetAttr' | 'GetItem' | 'FilterExpr' | 'TestExpr' | 'Conditional' | 'FunctionCall';
|
|
5
5
|
export interface BaseNode {
|
|
6
6
|
type: NodeType;
|
|
7
7
|
line: number;
|
|
@@ -90,6 +90,11 @@ export interface CacheNode extends BaseNode {
|
|
|
90
90
|
varyOn: ExpressionNode[];
|
|
91
91
|
body: ASTNode[];
|
|
92
92
|
}
|
|
93
|
+
export interface NowNode extends BaseNode {
|
|
94
|
+
type: 'Now';
|
|
95
|
+
format: ExpressionNode;
|
|
96
|
+
asVar: string | null;
|
|
97
|
+
}
|
|
93
98
|
export interface NameNode extends BaseNode {
|
|
94
99
|
type: 'Name';
|
|
95
100
|
name: string;
|
|
@@ -188,6 +193,6 @@ export interface FilterNode extends BaseNode {
|
|
|
188
193
|
body: ASTNode[];
|
|
189
194
|
}
|
|
190
195
|
export type ExpressionNode = NameNode | LiteralNode | ArrayNode | ObjectNode | BinaryOpNode | UnaryOpNode | CompareNode | GetAttrNode | GetItemNode | FilterExprNode | TestExprNode | ConditionalNode | FunctionCallNode;
|
|
191
|
-
export type StatementNode = TextNode | OutputNode | IfNode | ForNode | BlockNode | ExtendsNode | IncludeNode | SetNode | WithNode | LoadNode | UrlNode | StaticNode | CacheNode | CommentNode | MacroNode | CallNode | FilterNode;
|
|
196
|
+
export type StatementNode = TextNode | OutputNode | IfNode | ForNode | BlockNode | ExtendsNode | IncludeNode | SetNode | WithNode | LoadNode | UrlNode | StaticNode | CacheNode | NowNode | CommentNode | MacroNode | CallNode | FilterNode;
|
|
192
197
|
export type ASTNode = StatementNode | ExpressionNode | TemplateNode;
|
|
193
198
|
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/parser/nodes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,MAAM,GACN,QAAQ,GACR,IAAI,GACJ,KAAK,GACL,OAAO,GACP,SAAS,GACT,SAAS,GACT,KAAK,GACL,MAAM,GACN,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,MAAM,GACN,KAAK,GACL,QAAQ,GACR,OAAO,
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/parser/nodes.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface RuntimeOptions {
|
|
|
17
17
|
urlResolver?: (name: string, args: any[], kwargs: Record<string, any>) => string;
|
|
18
18
|
staticResolver?: (path: string) => string;
|
|
19
19
|
templateLoader?: (name: string) => Promise<TemplateNode>;
|
|
20
|
+
/** Timezone for date/time operations (e.g., 'Europe/Rome', 'UTC') */
|
|
21
|
+
timezone?: string;
|
|
20
22
|
}
|
|
21
23
|
export declare class Runtime {
|
|
22
24
|
private options;
|
|
@@ -37,6 +39,9 @@ export declare class Runtime {
|
|
|
37
39
|
private renderWithSync;
|
|
38
40
|
private renderUrlSync;
|
|
39
41
|
private renderStaticSync;
|
|
42
|
+
private renderNowSync;
|
|
43
|
+
private getDateInTimezone;
|
|
44
|
+
private formatDate;
|
|
40
45
|
private renderNodesSync;
|
|
41
46
|
private eval;
|
|
42
47
|
private evalGetAttr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAgB,YAAY,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,KAAK,EAEV,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAA;AAIlE,eAAO,MAAM,WAAW,EAAE,YAKzB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,YAGlB,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,YAGjB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,YAEpB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,YAErB,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAEnB,CAAA;AAGD,eAAO,MAAM,EAAE,EAAE,YAA8D,CAAA;AAC/E,eAAO,MAAM,EAAE,EAAE,YAA+D,CAAA;AAChF,eAAO,MAAM,EAAE,EAAE,YAA8D,CAAA;AAC/E,eAAO,MAAM,EAAE,EAAE,YAA+D,CAAA;AAChF,eAAO,MAAM,WAAW,cAAK,CAAA;AAC7B,eAAO,MAAM,QAAQ,cAAK,CAAA;AAI1B,eAAO,MAAM,OAAO,EAAE,YAErB,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,YAEvB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,YAElB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,YAErB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,YAEpB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,YAOrB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,YAGtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,YAEtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,YAEtB,CAAA;AAID,eAAO,MAAM,KAAK,EAAE,YAGnB,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAGnB,CAAA;AAID,eAAO,MAAM,KAAK,EAAE,YASnB,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,YAKjB,CAAA;AAID,eAAO,MAAM,EAAE,EAAE,YAAgD,CAAA;AACjE,eAAO,MAAM,EAAE,EAAE,YAAgD,CAAA;AACjE,eAAO,MAAM,MAAM,EAAE,YAAgD,CAAA;AACrE,eAAO,MAAM,OAAO,cAAK,CAAA;AAIzB,eAAO,MAAM,MAAM,EAAE,YAYpB,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAAwC,CAAA;AAG5D,eAAO,MAAM,KAAK,EAAE,YAAwC,CAAA;AAC5D,eAAO,MAAM,MAAM,EAAE,YAAyC,CAAA;AAI9D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAA;AAIlE,eAAO,MAAM,WAAW,EAAE,YAKzB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,YAGlB,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,YAGjB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,YAEpB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,YAErB,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAEnB,CAAA;AAGD,eAAO,MAAM,EAAE,EAAE,YAA8D,CAAA;AAC/E,eAAO,MAAM,EAAE,EAAE,YAA+D,CAAA;AAChF,eAAO,MAAM,EAAE,EAAE,YAA8D,CAAA;AAC/E,eAAO,MAAM,EAAE,EAAE,YAA+D,CAAA;AAChF,eAAO,MAAM,WAAW,cAAK,CAAA;AAC7B,eAAO,MAAM,QAAQ,cAAK,CAAA;AAI1B,eAAO,MAAM,OAAO,EAAE,YAErB,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,YAEvB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,YAElB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,YAErB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,YAEpB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,YAOrB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,YAGtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,YAEtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,YAEtB,CAAA;AAID,eAAO,MAAM,KAAK,EAAE,YAGnB,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAGnB,CAAA;AAID,eAAO,MAAM,KAAK,EAAE,YASnB,CAAA;AAED,eAAO,MAAM,GAAG,EAAE,YAKjB,CAAA;AAID,eAAO,MAAM,EAAE,EAAE,YAAgD,CAAA;AACjE,eAAO,MAAM,EAAE,EAAE,YAAgD,CAAA;AACjE,eAAO,MAAM,MAAM,EAAE,YAAgD,CAAA;AACrE,eAAO,MAAM,OAAO,cAAK,CAAA;AAIzB,eAAO,MAAM,MAAM,EAAE,YAYpB,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,YAAwC,CAAA;AAG5D,eAAO,MAAM,KAAK,EAAE,YAAwC,CAAA;AAC5D,eAAO,MAAM,MAAM,EAAE,YAAyC,CAAA;AAI9D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA8CrD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "binja",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "High-performance Jinja2/Django template engine for Bun",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -64,8 +64,7 @@
|
|
|
64
64
|
"license": "BSD-3-Clause",
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@types/bun": "latest",
|
|
67
|
-
"
|
|
68
|
-
"typescript": "^5.0.0"
|
|
67
|
+
"typescript": "latest"
|
|
69
68
|
},
|
|
70
69
|
"engines": {
|
|
71
70
|
"bun": ">=1.0.0"
|