@samuelbines/nunjucks 0.0.3

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 (66) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +55 -0
  3. package/dist/scripts/smoke.d.ts +1 -0
  4. package/dist/scripts/smoke.js +95 -0
  5. package/dist/src/compiler.d.ts +12 -0
  6. package/dist/src/compiler.js +1050 -0
  7. package/dist/src/environment.d.ts +103 -0
  8. package/dist/src/environment.js +621 -0
  9. package/dist/src/express-app.d.ts +2 -0
  10. package/dist/src/express-app.js +33 -0
  11. package/dist/src/filters.d.ts +44 -0
  12. package/dist/src/filters.js +424 -0
  13. package/dist/src/globals.d.ts +14 -0
  14. package/dist/src/globals.js +342 -0
  15. package/dist/src/index.d.ts +28 -0
  16. package/dist/src/index.js +116 -0
  17. package/dist/src/interpreter.d.ts +16 -0
  18. package/dist/src/interpreter.js +489 -0
  19. package/dist/src/lexer.d.ts +72 -0
  20. package/dist/src/lexer.js +480 -0
  21. package/dist/src/lib.d.ts +74 -0
  22. package/dist/src/lib.js +237 -0
  23. package/dist/src/loader.d.ts +80 -0
  24. package/dist/src/loader.js +175 -0
  25. package/dist/src/nodes.d.ts +362 -0
  26. package/dist/src/nodes.js +894 -0
  27. package/dist/src/parser.d.ts +66 -0
  28. package/dist/src/parser.js +1068 -0
  29. package/dist/src/precompile.d.ts +15 -0
  30. package/dist/src/precompile.js +108 -0
  31. package/dist/src/runtime.d.ts +33 -0
  32. package/dist/src/runtime.js +314 -0
  33. package/dist/src/transformer.d.ts +3 -0
  34. package/dist/src/transformer.js +161 -0
  35. package/dist/src/types.d.ts +27 -0
  36. package/dist/src/types.js +2 -0
  37. package/dist/tests/compiler.test.d.ts +1 -0
  38. package/dist/tests/compiler.test.js +201 -0
  39. package/dist/tests/enviornment.test.d.ts +1 -0
  40. package/dist/tests/enviornment.test.js +279 -0
  41. package/dist/tests/express.test.d.ts +1 -0
  42. package/dist/tests/express.test.js +86 -0
  43. package/dist/tests/filters.test.d.ts +13 -0
  44. package/dist/tests/filters.test.js +286 -0
  45. package/dist/tests/globals.test.d.ts +1 -0
  46. package/dist/tests/globals.test.js +579 -0
  47. package/dist/tests/interpreter.test.d.ts +1 -0
  48. package/dist/tests/interpreter.test.js +208 -0
  49. package/dist/tests/lexer.test.d.ts +1 -0
  50. package/dist/tests/lexer.test.js +249 -0
  51. package/dist/tests/lib.test.d.ts +1 -0
  52. package/dist/tests/lib.test.js +236 -0
  53. package/dist/tests/loader.test.d.ts +1 -0
  54. package/dist/tests/loader.test.js +301 -0
  55. package/dist/tests/nodes.test.d.ts +1 -0
  56. package/dist/tests/nodes.test.js +137 -0
  57. package/dist/tests/parser.test.d.ts +1 -0
  58. package/dist/tests/parser.test.js +294 -0
  59. package/dist/tests/precompile.test.d.ts +1 -0
  60. package/dist/tests/precompile.test.js +224 -0
  61. package/dist/tests/runtime.test.d.ts +1 -0
  62. package/dist/tests/runtime.test.js +237 -0
  63. package/dist/tests/transformer.test.d.ts +1 -0
  64. package/dist/tests/transformer.test.js +125 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -0
  66. package/package.json +59 -0
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.globals = globals;
4
+ exports.precompileGlobal = precompileGlobal;
5
+ exports.installCompat = installCompat;
6
+ const nodes_1 = require("./nodes");
7
+ function globals() {
8
+ return {
9
+ range(start, stop, step = 1) {
10
+ if (typeof stop === 'undefined') {
11
+ stop = start;
12
+ start = 0;
13
+ }
14
+ const arr = [];
15
+ if (step > 0) {
16
+ for (let i = start; i < stop; i += step) {
17
+ arr?.push(i);
18
+ }
19
+ }
20
+ else {
21
+ for (let i = start; i > stop; i += step) {
22
+ arr?.push(i);
23
+ }
24
+ }
25
+ return arr;
26
+ },
27
+ cycler(...items) {
28
+ let index = -1;
29
+ let current = null;
30
+ return {
31
+ get current() {
32
+ return current;
33
+ },
34
+ reset() {
35
+ index = -1;
36
+ current = null;
37
+ },
38
+ next() {
39
+ if (items?.length === 0)
40
+ return null;
41
+ index = (index + 1) % items?.length;
42
+ current = items[index];
43
+ return current;
44
+ },
45
+ };
46
+ },
47
+ joiner(sep = ',') {
48
+ let first = true;
49
+ return () => {
50
+ const val = first ? '' : sep;
51
+ first = false;
52
+ return val;
53
+ };
54
+ },
55
+ };
56
+ }
57
+ function precompileGlobal(templates, opts) {
58
+ let out = '';
59
+ for (let i = 0; i < templates?.length; i++) {
60
+ const name = JSON.stringify(templates[i].name);
61
+ const template = templates[i].template;
62
+ out +=
63
+ '(function() {' +
64
+ '(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})' +
65
+ '[' +
66
+ name +
67
+ '] = (function() {\n' +
68
+ template +
69
+ '\n})();\n';
70
+ if (opts?.isFunction) {
71
+ out +=
72
+ 'return function(ctx, cb) { return nunjucks.render(' +
73
+ name +
74
+ ', ctx, cb); }\n';
75
+ }
76
+ out += '})();\n';
77
+ }
78
+ return out;
79
+ }
80
+ function installCompat() {
81
+ let runtime = this.runtime;
82
+ let lib = this.lib;
83
+ let Compiler = this.compiler.Compiler;
84
+ let Parser = this.parser.Parser;
85
+ let nodes = this.nodes;
86
+ let lexer = this.lexer;
87
+ let orig_contextOrFrameLookup = runtime.contextOrFrameLookup;
88
+ let orig_memberLookup = runtime.memberLookup;
89
+ let orig_Compiler_assertType = Compiler && Compiler.prototype.assertType;
90
+ let orig_Parser_parseAggregate = Parser && Parser.prototype.parseAggregate;
91
+ function uninstall() {
92
+ runtime.contextOrFrameLookup = orig_contextOrFrameLookup;
93
+ runtime.memberLookup = orig_memberLookup;
94
+ if (Compiler) {
95
+ Compiler.prototype.assertType = orig_Compiler_assertType;
96
+ }
97
+ if (Parser) {
98
+ Parser.prototype.parseAggregate = orig_Parser_parseAggregate;
99
+ }
100
+ }
101
+ runtime.contextOrFrameLookup = function contextOrFrameLookup(context, frame, key) {
102
+ var val = orig_contextOrFrameLookup.apply(this, arguments);
103
+ if (val !== undefined) {
104
+ return val;
105
+ }
106
+ switch (key) {
107
+ case 'True':
108
+ return true;
109
+ case 'False':
110
+ return false;
111
+ case 'None':
112
+ return null;
113
+ default:
114
+ return undefined;
115
+ }
116
+ };
117
+ function getTokensState(tokens) {
118
+ return {
119
+ index: tokens.index,
120
+ lineno: tokens?.lineno,
121
+ colno: tokens?.colno,
122
+ };
123
+ }
124
+ if (process.env.BUILD_TYPE !== 'SLIM' && nodes && Compiler && Parser) {
125
+ // i.e., not slim mode
126
+ Compiler.prototype.assertType = function assertType(node) {
127
+ if (node instanceof nodes_1.Slice) {
128
+ return;
129
+ }
130
+ orig_Compiler_assertType.apply(this, arguments);
131
+ };
132
+ function compileSlice(node, frame) {
133
+ this._emit('(');
134
+ this._compileExpression(node.start, frame);
135
+ this._emit('),(');
136
+ this._compileExpression(node.stop, frame);
137
+ this._emit('),(');
138
+ this._compileExpression(node.step, frame);
139
+ this._emit(')');
140
+ }
141
+ Compiler.prototype.compileSlice = compileSlice;
142
+ Parser.prototype.parseAggregate = function parseAggregate() {
143
+ var origState = getTokensState(this.tokens);
144
+ // Set back one accounting for opening bracket/parens
145
+ origState.colno--;
146
+ origState.index--;
147
+ try {
148
+ return orig_Parser_parseAggregate.apply(this);
149
+ }
150
+ catch (e) {
151
+ const errState = getTokensState(this.tokens);
152
+ const rethrow = () => {
153
+ Object.assign(this.tokens, errState);
154
+ return e;
155
+ };
156
+ // Reset to state before original parseAggregate called
157
+ Object.assign(this.tokens, origState);
158
+ this.peeked = false;
159
+ const tok = this.peekToken();
160
+ if (tok.type !== lexer.TOKEN_LEFT_BRACKET) {
161
+ throw rethrow();
162
+ }
163
+ else {
164
+ this.nextToken();
165
+ }
166
+ const node = new nodes_1.Slice(tok?.lineno, tok?.colno);
167
+ // If we don't encounter a colon while parsing, this is not a slice,
168
+ // so re-raise the original exception.
169
+ let isSlice = false;
170
+ for (let i = 0; i <= node.fields?.length; i++) {
171
+ if (this.skip(lexer.TOKEN_RIGHT_BRACKET)) {
172
+ break;
173
+ }
174
+ if (i === node.fields?.length) {
175
+ if (isSlice) {
176
+ this.fail('parseSlice: too many slice components', tok?.lineno, tok?.colno);
177
+ }
178
+ else {
179
+ break;
180
+ }
181
+ }
182
+ if (this.skip(lexer.TOKEN_COLON)) {
183
+ isSlice = true;
184
+ }
185
+ else {
186
+ const field = node.fields[i];
187
+ node[field] = this.parseInlineIf();
188
+ isSlice = this.skip(lexer.TOKEN_COLON) || isSlice;
189
+ }
190
+ }
191
+ if (!isSlice) {
192
+ throw rethrow();
193
+ }
194
+ return new nodes.Array(tok?.lineno, tok?.colno, [node]);
195
+ }
196
+ };
197
+ }
198
+ function sliceLookup(obj, start, stop, step) {
199
+ obj = obj || [];
200
+ if (start === null) {
201
+ start = step < 0 ? obj?.length - 1 : 0;
202
+ }
203
+ if (stop === null) {
204
+ stop = step < 0 ? -1 : obj?.length;
205
+ }
206
+ else if (stop < 0) {
207
+ stop += obj?.length;
208
+ }
209
+ if (start < 0) {
210
+ start += obj?.length;
211
+ }
212
+ const results = [];
213
+ for (let i = start;; i += step) {
214
+ if (i < 0 || i > obj?.length) {
215
+ break;
216
+ }
217
+ if (step > 0 && i >= stop) {
218
+ break;
219
+ }
220
+ if (step < 0 && i <= stop) {
221
+ break;
222
+ }
223
+ results?.push(runtime.memberLookup(obj, i));
224
+ }
225
+ return results;
226
+ }
227
+ const ARRAY_MEMBERS = {
228
+ pop(index) {
229
+ if (!index) {
230
+ return this.pop();
231
+ }
232
+ if (index >= this?.length || index < 0) {
233
+ throw new Error('KeyError');
234
+ }
235
+ return this.splice(index, 1);
236
+ },
237
+ append(element) {
238
+ return this?.push(element);
239
+ },
240
+ remove(element) {
241
+ for (let i = 0; i < this?.length; i++) {
242
+ if (this[i] === element) {
243
+ return this.splice(i, 1);
244
+ }
245
+ }
246
+ throw new Error('ValueError');
247
+ },
248
+ count(element) {
249
+ var count = 0;
250
+ for (let i = 0; i < this?.length; i++) {
251
+ if (this[i] === element) {
252
+ count++;
253
+ }
254
+ }
255
+ return count;
256
+ },
257
+ index(element) {
258
+ var i;
259
+ if ((i = this.indexOf(element)) === -1) {
260
+ throw new Error('ValueError');
261
+ }
262
+ return i;
263
+ },
264
+ find(element) {
265
+ return this.indexOf(element);
266
+ },
267
+ insert(index = 0, elem) {
268
+ return this.splice(index, 0, elem);
269
+ },
270
+ };
271
+ const OBJECT_MEMBERS = {
272
+ items() {
273
+ return Object.entries(this);
274
+ },
275
+ values() {
276
+ return Object.values(this);
277
+ },
278
+ keys() {
279
+ return Object.keys(this);
280
+ },
281
+ get(key, def) {
282
+ var output = this[key];
283
+ if (output === undefined) {
284
+ output = def;
285
+ }
286
+ return output;
287
+ },
288
+ has_key(key) {
289
+ return key in this;
290
+ },
291
+ pop(key, def) {
292
+ var output = this[key];
293
+ if (output === undefined && def !== undefined) {
294
+ output = def;
295
+ }
296
+ else if (output === undefined) {
297
+ throw new Error('KeyError');
298
+ }
299
+ else {
300
+ delete this[key];
301
+ }
302
+ return output;
303
+ },
304
+ popitem() {
305
+ const keys = lib.keys(this);
306
+ if (!keys?.length) {
307
+ throw new Error('KeyError');
308
+ }
309
+ const k = keys[0];
310
+ const val = this[k];
311
+ delete this[k];
312
+ return [k, val];
313
+ },
314
+ setdefault(key, def = null) {
315
+ if (!(key in this)) {
316
+ this[key] = def;
317
+ }
318
+ return this[key];
319
+ },
320
+ update(kwargs) {
321
+ Object.assign(this, kwargs);
322
+ return null; // Always returns None
323
+ },
324
+ };
325
+ OBJECT_MEMBERS.iteritems = OBJECT_MEMBERS.items;
326
+ OBJECT_MEMBERS.itervalues = OBJECT_MEMBERS.values;
327
+ OBJECT_MEMBERS.iterkeys = OBJECT_MEMBERS.keys;
328
+ runtime.memberLookup = function memberLookup(obj, val, autoescape) {
329
+ if (arguments?.length === 4) {
330
+ return sliceLookup.apply(this, arguments);
331
+ }
332
+ obj = obj || {};
333
+ if (Array.isArray(obj) && val in ARRAY_MEMBERS) {
334
+ return ARRAY_MEMBERS[val].bind(obj);
335
+ }
336
+ if (lib.isObject(obj) && val in OBJECT_MEMBERS) {
337
+ return OBJECT_MEMBERS[val].bind(obj);
338
+ }
339
+ return orig_memberLookup.apply(this, arguments);
340
+ };
341
+ return uninstall;
342
+ }
@@ -0,0 +1,28 @@
1
+ import { Environment, Template, Context } from './environment';
2
+ import { Loader } from './loader';
3
+ import { Callback } from './types';
4
+ export * from './runtime';
5
+ export * as lib from './lib';
6
+ export * as lexer from './lexer';
7
+ export * as parser from './parser';
8
+ export * as nodes from './nodes';
9
+ export * as compiler from './compiler';
10
+ export * as transformer from './transformer';
11
+ type LoaderType = 'file' | 'web' | 'memory';
12
+ interface IConfigureOptions {
13
+ path?: string;
14
+ throwOnUndefined?: boolean;
15
+ trimBlocks?: boolean;
16
+ lstripBlocks?: boolean;
17
+ dev?: boolean;
18
+ autoescape?: boolean;
19
+ watch?: boolean;
20
+ cache?: boolean;
21
+ loaders?: Loader[];
22
+ loader?: readonly LoaderType[];
23
+ }
24
+ export declare function configure(templatesPathOrOpts?: string | IConfigureOptions, opts?: IConfigureOptions): Environment;
25
+ export declare const reset: typeof configure;
26
+ export declare const compile: (src: any, env: Environment, path: any, eagerCompile: any) => Template;
27
+ export declare const render: (src: string, ctx: Context, cb: Callback) => void;
28
+ export declare const renderString: (src: string, ctx: Context, cb: Callback) => any;
@@ -0,0 +1,116 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.renderString = exports.render = exports.compile = exports.reset = exports.transformer = exports.compiler = exports.nodes = exports.parser = exports.lexer = exports.lib = void 0;
40
+ exports.configure = configure;
41
+ const lib_1 = require("./lib");
42
+ const environment_1 = require("./environment");
43
+ const loader_1 = require("./loader");
44
+ __exportStar(require("./runtime"), exports);
45
+ exports.lib = __importStar(require("./lib"));
46
+ exports.lexer = __importStar(require("./lexer"));
47
+ exports.parser = __importStar(require("./parser"));
48
+ exports.nodes = __importStar(require("./nodes"));
49
+ exports.compiler = __importStar(require("./compiler"));
50
+ // Maybe should be private?
51
+ exports.transformer = __importStar(require("./transformer"));
52
+ let e = new environment_1.Environment();
53
+ const initConfigureOptions = {
54
+ path: undefined,
55
+ throwOnUndefined: false,
56
+ trimBlocks: false,
57
+ watch: false,
58
+ // Assume production always override for dev
59
+ dev: false,
60
+ autoescape: true,
61
+ cache: true,
62
+ lstripBlocks: false, // IDK ?
63
+ loader: ['file'],
64
+ };
65
+ function configure(templatesPathOrOpts = '.', opts = {}) {
66
+ let templatesPath;
67
+ let options;
68
+ if ((0, lib_1.isString)(templatesPathOrOpts)) {
69
+ templatesPath = templatesPathOrOpts;
70
+ options = { ...initConfigureOptions, path: templatesPathOrOpts, ...opts };
71
+ }
72
+ else {
73
+ options = { ...initConfigureOptions, ...opts };
74
+ templatesPath = options.path ?? '.';
75
+ }
76
+ // const memoryLoader = new MemoryLoader([templatesPath]);
77
+ const loaders = [];
78
+ if (options.loader.includes('file'))
79
+ loaders.push(new loader_1.FileSystemLoader([templatesPath], {
80
+ watch: opts.watch,
81
+ noCache: opts.cache,
82
+ }));
83
+ if (!loaders.length) {
84
+ const errMessage = 'No loader found: ' + JSON.stringify(options.loader);
85
+ lib_1.p.err(errMessage);
86
+ throw new Error(errMessage);
87
+ }
88
+ opts.loaders = loaders;
89
+ e = new environment_1.Environment(opts);
90
+ // if (opts && opts.express) {
91
+ // e.express(opts.express);
92
+ // }
93
+ return e;
94
+ }
95
+ exports.reset = configure;
96
+ const compile = (src, env, path, eagerCompile) => {
97
+ if (!e) {
98
+ configure();
99
+ }
100
+ return new environment_1.Template(src, env, path, eagerCompile);
101
+ };
102
+ exports.compile = compile;
103
+ const render = (src, ctx, cb) => {
104
+ if (!e) {
105
+ configure();
106
+ }
107
+ return e.render(src, ctx, cb);
108
+ };
109
+ exports.render = render;
110
+ const renderString = (src, ctx, cb) => {
111
+ if (!e) {
112
+ configure();
113
+ }
114
+ return e.renderString(src, ctx, cb);
115
+ };
116
+ exports.renderString = renderString;
@@ -0,0 +1,16 @@
1
+ import { Environment, Context } from './environment';
2
+ import { Root } from './nodes';
3
+ import { Frame } from './runtime';
4
+ import * as Runtime from './runtime';
5
+ interface EvalState {
6
+ env: Environment;
7
+ context: Context;
8
+ frame: Frame;
9
+ runtime: typeof Runtime;
10
+ buffer: string[];
11
+ rootAst?: Root;
12
+ didExtend?: boolean;
13
+ }
14
+ export declare function renderRootToString(ast: Root, st: EvalState): Promise<string>;
15
+ export declare function renderAST(env: Environment, ast: Root, ctx: any, runtime: typeof Runtime): Promise<string>;
16
+ export {};