@memberjunction/templates 6.2.0-edge.3 → 6.2.0-edge.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 (42) hide show
  1. package/README.md +85 -1
  2. package/dist/InheritedMemberNames.d.ts +12 -0
  3. package/dist/InheritedMemberNames.d.ts.map +1 -0
  4. package/dist/InheritedMemberNames.js +19 -0
  5. package/dist/InheritedMemberNames.js.map +1 -0
  6. package/dist/NunjucksCompileGuard.d.ts +17 -0
  7. package/dist/NunjucksCompileGuard.d.ts.map +1 -0
  8. package/dist/NunjucksCompileGuard.js +273 -0
  9. package/dist/NunjucksCompileGuard.js.map +1 -0
  10. package/dist/NunjucksSandbox.d.ts +26 -0
  11. package/dist/NunjucksSandbox.d.ts.map +1 -0
  12. package/dist/NunjucksSandbox.js +317 -0
  13. package/dist/NunjucksSandbox.js.map +1 -0
  14. package/dist/TemplateEngine.d.ts +41 -9
  15. package/dist/TemplateEngine.d.ts.map +1 -1
  16. package/dist/TemplateEngine.js +123 -23
  17. package/dist/TemplateEngine.js.map +1 -1
  18. package/dist/TemplateSandboxError.d.ts +9 -0
  19. package/dist/TemplateSandboxError.d.ts.map +1 -0
  20. package/dist/TemplateSandboxError.js +12 -0
  21. package/dist/TemplateSandboxError.js.map +1 -0
  22. package/dist/TemplateVariableAnalysis.d.ts +27 -0
  23. package/dist/TemplateVariableAnalysis.d.ts.map +1 -0
  24. package/dist/TemplateVariableAnalysis.js +140 -0
  25. package/dist/TemplateVariableAnalysis.js.map +1 -0
  26. package/dist/extensions/TemplateEmbed.extension.d.ts +13 -1
  27. package/dist/extensions/TemplateEmbed.extension.d.ts.map +1 -1
  28. package/dist/extensions/TemplateEmbed.extension.js +16 -8
  29. package/dist/extensions/TemplateEmbed.extension.js.map +1 -1
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +5 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/operations/TemplateRunAuthorization.d.ts +20 -0
  35. package/dist/operations/TemplateRunAuthorization.d.ts.map +1 -0
  36. package/dist/operations/TemplateRunAuthorization.js +37 -0
  37. package/dist/operations/TemplateRunAuthorization.js.map +1 -0
  38. package/dist/operations/TemplateRunOperation.d.ts +6 -0
  39. package/dist/operations/TemplateRunOperation.d.ts.map +1 -1
  40. package/dist/operations/TemplateRunOperation.js +10 -1
  41. package/dist/operations/TemplateRunOperation.js.map +1 -1
  42. package/package.json +9 -9
@@ -2,7 +2,12 @@ import { LogError } from "@memberjunction/core";
2
2
  import nunjucks from 'nunjucks';
3
3
  import { BaseSingleton, MJGlobal, UUIDsEqual } from "@memberjunction/global";
4
4
  import { TemplateExtensionBase } from "./extensions/TemplateExtensionBase.js";
5
+ import { HardenNunjucksRuntime } from "./NunjucksSandbox.js";
6
+ import { CollectReferencedVariables } from "./TemplateVariableAnalysis.js";
5
7
  import { TemplateEngineBase } from '@memberjunction/templates-base-types';
8
+ // Stored templates are user-editable, so nunjucks is guarded as soon as the engine loads. The guard
9
+ // is process-wide: it also covers nunjucks environments that other packages create.
10
+ HardenNunjucksRuntime();
6
11
  /**
7
12
  * This class extends the nunjucks loader to allow adding templates directly to the loader
8
13
  */
@@ -56,10 +61,16 @@ export class TemplateEngineServer extends BaseSingleton {
56
61
  constructor() {
57
62
  super(...arguments);
58
63
  this._oneTimeLoadingComplete = false;
64
+ /** The extension instances registered on {@link _nunjucksEnv}. The variable analysis parses their custom tags. */
65
+ this._registeredExtensions = [];
59
66
  /**
60
- * Cache for templates that have been created by nunjucks so we don't have to create them over and over
67
+ * Compiled templates per environment, then per template content ID, so a raw compile is never served to an
68
+ * escaping render.
61
69
  */
62
- this._templateCache = new Map();
70
+ this._templateCache = new WeakMap();
71
+ this._simpleTemplateCache = new Map();
72
+ /** {@link GetReferencedVariables} results by template text. */
73
+ this._referencedVariablesCache = new Map();
63
74
  }
64
75
  static get Instance() {
65
76
  return super.getInstance();
@@ -91,7 +102,7 @@ export class TemplateEngineServer extends BaseSingleton {
91
102
  this.ClearTemplateCache(); // base templates (re)loaded — drop any stale compiled templates
92
103
  this.ensureNunjucksInitialized(contextUser);
93
104
  }
94
- /** One-time nunjucks environment + registered-extension setup, performed after the base templates load. */
105
+ /** One-time nunjucks environment + registered-extension setup. {@link Config} and {@link GetReferencedVariables} call it. */
95
106
  ensureNunjucksInitialized(contextUser) {
96
107
  if (this._oneTimeLoadingComplete) {
97
108
  return;
@@ -100,17 +111,27 @@ export class TemplateEngineServer extends BaseSingleton {
100
111
  this._templateLoader = new TemplateEntityLoader();
101
112
  this._nunjucksEnv = this.createConfiguredNunjucksEnv(true);
102
113
  this._nunjucksEnvNoAutoescape = undefined; // rebound lazily against the fresh loader on next no-autoescape render
103
- // get all of the extensions that are registered and register them with nunjucks
114
+ this._nunjucksEnvRawTemplates = undefined;
115
+ this._registeredExtensions = this.registerExtensions(this._nunjucksEnv, contextUser);
116
+ }
117
+ /**
118
+ * Registers every {@link TemplateExtensionBase} subclass with the given environment.
119
+ * @returns the extension instances registered on `env`
120
+ */
121
+ registerExtensions(env, contextUser) {
122
+ const registered = [];
104
123
  const extensions = MJGlobal.Instance.ClassFactory.GetAllRegistrations(TemplateExtensionBase);
105
124
  if (extensions && extensions.length > 0) {
106
125
  for (const ext of extensions) {
107
126
  const SubClassConstructor = ext.SubClass;
108
127
  const instance = new SubClassConstructor(contextUser);
109
128
  if (ext.Key) {
110
- this._nunjucksEnv.addExtension(ext.Key, instance);
129
+ env.addExtension(ext.Key, instance);
130
+ registered.push(instance);
111
131
  }
112
132
  }
113
133
  }
134
+ return registered;
114
135
  }
115
136
  /** True once the underlying TemplateEngineBase cache has loaded. */
116
137
  get Loaded() { return this.base.Loaded; }
@@ -123,10 +144,13 @@ export class TemplateEngineServer extends BaseSingleton {
123
144
  get TemplateContents() { return this.base.TemplateContents; }
124
145
  get TemplateParams() { return this.base.TemplateParams; }
125
146
  FindTemplate(templateName) { return this.base.FindTemplate(templateName); }
147
+ FindTemplateByID(templateId) { return this.base.FindTemplateByID(templateId); }
126
148
  SetupNunjucks() {
127
149
  this._templateLoader = new TemplateEntityLoader();
128
150
  this._nunjucksEnv = this.createConfiguredNunjucksEnv(true);
129
151
  this._nunjucksEnvNoAutoescape = undefined; // rebound lazily against the fresh loader on next no-autoescape render
152
+ this._nunjucksEnvRawTemplates = undefined;
153
+ this._simpleTemplateCache.clear();
130
154
  }
131
155
  /**
132
156
  * Builds a Nunjucks environment bound to the shared template loader with our custom filters applied.
@@ -174,6 +198,11 @@ export class TemplateEngineServer extends BaseSingleton {
174
198
  }
175
199
  });
176
200
  }
201
+ /**
202
+ * Bounded LRU cache for ad-hoc templates rendered via {@link RenderTemplateSimple}.
203
+ * Keyed by `${autoescape ? '1:' : '0:'}${templateText}`.
204
+ */
205
+ static { this.MAX_SIMPLE_TEMPLATE_CACHE_SIZE = 2000; }
177
206
  AddTemplate(templateEntity) {
178
207
  this._templateLoader.AddTemplate(templateEntity.ID, templateEntity);
179
208
  }
@@ -184,8 +213,10 @@ export class TemplateEngineServer extends BaseSingleton {
184
213
  * @param data
185
214
  * @param SkipValidation if true, validation is skipped entirely (or reduced to warnings depending on SuppressWarnings)
186
215
  * @param SuppressWarnings if true AND SkipValidation is true, no validation warnings are logged. When SkipValidation is true but SuppressWarnings is false, validation issues are logged as non-fatal warnings. Defaults to false.
216
+ * @param options `autoescape` (default `true`) toggles HTML escaping; pass `false` when the output is plain text for
217
+ * a model, where `Affineur & Owner` must not become `Affineur & Owner`
187
218
  */
188
- async RenderTemplate(templateEntity, templateContent, data, SkipValidation, SuppressWarnings) {
219
+ async RenderTemplate(templateEntity, templateContent, data, SkipValidation, SuppressWarnings, options) {
189
220
  try {
190
221
  if (!templateContent) {
191
222
  return {
@@ -229,7 +260,8 @@ export class TemplateEngineServer extends BaseSingleton {
229
260
  }
230
261
  // Merge default values from parameters applicable to this content
231
262
  const mergedData = this.mergeDefaultValues(templateEntity, templateContent.ID, data);
232
- const template = this.getNunjucksTemplate(templateContent.ID, templateContent.TemplateText, true);
263
+ const env = options?.autoescape === false ? this.getRawTemplateEnv() : this._nunjucksEnv;
264
+ const template = this.getNunjucksTemplate(templateContent.ID, templateContent.TemplateText, true, env);
233
265
  const result = await this.renderTemplateAsync(template, mergedData);
234
266
  return {
235
267
  Success: true,
@@ -257,8 +289,25 @@ export class TemplateEngineServer extends BaseSingleton {
257
289
  */
258
290
  async RenderTemplateSimple(templateText, data, options) {
259
291
  try {
260
- const env = this.getSimpleRenderEnv(options?.autoescape ?? true);
261
- const template = this.createNunjucksTemplate(templateText, env);
292
+ const autoescape = options?.autoescape ?? true;
293
+ const cacheKey = `${autoescape ? '1:' : '0:'}${templateText}`;
294
+ let template = this._simpleTemplateCache.get(cacheKey);
295
+ if (template) {
296
+ // Refresh LRU order
297
+ this._simpleTemplateCache.delete(cacheKey);
298
+ this._simpleTemplateCache.set(cacheKey, template);
299
+ }
300
+ else {
301
+ const env = this.getSimpleRenderEnv(autoescape);
302
+ template = this.createNunjucksTemplate(templateText, env);
303
+ if (this._simpleTemplateCache.size >= TemplateEngineServer.MAX_SIMPLE_TEMPLATE_CACHE_SIZE) {
304
+ const oldestKey = this._simpleTemplateCache.keys().next().value;
305
+ if (oldestKey !== undefined) {
306
+ this._simpleTemplateCache.delete(oldestKey);
307
+ }
308
+ }
309
+ this._simpleTemplateCache.set(cacheKey, template);
310
+ }
262
311
  const result = await this.renderTemplateAsync(template, data);
263
312
  return {
264
313
  Success: true,
@@ -275,26 +324,57 @@ export class TemplateEngineServer extends BaseSingleton {
275
324
  };
276
325
  }
277
326
  }
327
+ /**
328
+ * Returns the top-level variable names a template's text reads, following stored templates it
329
+ * pulls in by literal name (`{% include %}`, `{% import %}`, `{% from %}`, `{% extends %}`,
330
+ * `{% template %}`). It sets up the Nunjucks environment first, so the registered extensions' tags
331
+ * parse before the first {@link Config} too. The result is frozen and cached per template text until
332
+ * {@link ClearTemplateCache}; a result whose text does not parse is not cached.
333
+ */
334
+ GetReferencedVariables(templateText) {
335
+ const cached = this._referencedVariablesCache.get(templateText);
336
+ if (cached) {
337
+ return cached;
338
+ }
339
+ this.ensureNunjucksInitialized(this.ContextUser);
340
+ const result = Object.freeze(CollectReferencedVariables(templateText, {
341
+ Extensions: this._registeredExtensions,
342
+ ResolveTemplateTexts: (name) => {
343
+ const template = this.FindTemplate(name);
344
+ return template ? template.Content.map((c) => c.TemplateText).filter((t) => !!t) : null;
345
+ },
346
+ }));
347
+ if (!result.ParseFailed) {
348
+ this._referencedVariablesCache.set(templateText, result);
349
+ }
350
+ return result;
351
+ }
278
352
  /**
279
353
  * This method is responsible for creating a new Nunjucks template, caching it, and returning it.
280
354
  * If the templateContentId already had a template created, it will return that template from the cache.
281
355
  * @param templateId - must be provided if you want to cache the template, if not provided the template will not be cached
282
356
  * @param templateText
283
357
  * @param cacheTemplate - if true, the template will be cached, otherwise it will not be cached
358
+ * @param env the environment to compile against; defaults to the shared autoescape environment
284
359
  */
285
- getNunjucksTemplate(templateContentId, templateText, cacheTemplate) {
360
+ getNunjucksTemplate(templateContentId, templateText, cacheTemplate, env = this._nunjucksEnv) {
286
361
  if (templateContentId && cacheTemplate) {
287
- let template = this._templateCache.get(templateContentId);
362
+ let envCache = this._templateCache.get(env);
363
+ if (!envCache) {
364
+ envCache = new Map();
365
+ this._templateCache.set(env, envCache);
366
+ }
367
+ let template = envCache.get(templateContentId);
288
368
  if (!template) {
289
- template = this.createNunjucksTemplate(templateText);
290
- this._templateCache.set(templateContentId, template);
369
+ template = this.createNunjucksTemplate(templateText, env);
370
+ envCache.set(templateContentId, template);
291
371
  }
292
372
  return template;
293
373
  }
294
374
  else {
295
375
  // we don't have a template ID which means this is a dyanmic template, and so we don't want to do
296
376
  // anything with the cache, we just create a new nunjucks template and return it
297
- return this.createNunjucksTemplate(templateText);
377
+ return this.createNunjucksTemplate(templateText, env);
298
378
  }
299
379
  }
300
380
  /**
@@ -320,8 +400,19 @@ export class TemplateEngineServer extends BaseSingleton {
320
400
  }
321
401
  return this._nunjucksEnvNoAutoescape;
322
402
  }
403
+ /** The environment for {@link RenderTemplate} with `autoescape: false`, built on first use with the registered extensions. */
404
+ getRawTemplateEnv() {
405
+ if (!this._nunjucksEnvRawTemplates) {
406
+ this._nunjucksEnvRawTemplates = this.createConfiguredNunjucksEnv(false);
407
+ this.registerExtensions(this._nunjucksEnvRawTemplates, this._contextUser);
408
+ }
409
+ return this._nunjucksEnvRawTemplates;
410
+ }
411
+ /** Clears the compiled-template cache and the cached {@link GetReferencedVariables} results. */
323
412
  ClearTemplateCache() {
324
- this._templateCache.clear();
413
+ this._templateCache = new WeakMap();
414
+ this._simpleTemplateCache.clear();
415
+ this._referencedVariablesCache.clear();
325
416
  }
326
417
  /**
327
418
  * Promisifies the Nunjucks template rendering process.
@@ -329,6 +420,7 @@ export class TemplateEngineServer extends BaseSingleton {
329
420
  * @param data the data to render the template with
330
421
  */
331
422
  async renderTemplateAsync(template, data) {
423
+ HardenNunjucksRuntime(); // no-op unless something replaced a guarded nunjucks hook
332
424
  return new Promise((resolve, reject) => {
333
425
  template.render(data, (err, result) => {
334
426
  if (err) {
@@ -359,16 +451,24 @@ export class TemplateEngineServer extends BaseSingleton {
359
451
  const mergedData = { ...data };
360
452
  // Get all parameters applicable to this content
361
453
  const params = templateEntity.GetParametersForContent(contentId);
454
+ if (!params || params.length === 0) {
455
+ return mergedData;
456
+ }
362
457
  // Group parameters by name to handle precedence
363
458
  const paramsByName = new Map();
364
- // First add global parameters
365
- params.filter(p => !p.TemplateContentID).forEach(p => {
366
- paramsByName.set(p.Name, p);
367
- });
368
- // Then add/override with content-specific parameters
369
- params.filter(p => UUIDsEqual(p.TemplateContentID, contentId)).forEach(p => {
370
- paramsByName.set(p.Name, p);
371
- });
459
+ // First add global parameters, then override with content-specific parameters
460
+ for (let i = 0; i < params.length; i++) {
461
+ const p = params[i];
462
+ if (!p.TemplateContentID) {
463
+ paramsByName.set(p.Name, p);
464
+ }
465
+ }
466
+ for (let i = 0; i < params.length; i++) {
467
+ const p = params[i];
468
+ if (p.TemplateContentID && UUIDsEqual(p.TemplateContentID, contentId)) {
469
+ paramsByName.set(p.Name, p);
470
+ }
471
+ }
372
472
  // Apply default values for missing parameters
373
473
  paramsByName.forEach((param, name) => {
374
474
  // Only apply default if the parameter is not already provided
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEngine.js","sourceRoot":"","sources":["../src/TemplateEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateEngine.js","sourceRoot":"","sources":["../src/TemplateEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,QAAQ,EAAiC,MAAM,sBAAsB,CAAC;AAElG,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAA6B,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAA+C,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAEtH,oGAAoG;AACpG,oFAAoF;AACpF,qBAAqB,EAAE,CAAC;AAExB;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,QAAQ,CAAC,MAAM;IAAzD;;QACW,UAAK,GAAG,IAAI,CAAC;QAWZ,cAAS,GAAuD,EAAE,CAAC;IAgC/E,CAAC;IAzCG,qCAAqC;IACrC,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,qCAAqC;IACrC,IAAW,KAAK,CAAC,KAAK;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,wCAAwC;IAI1C;;;;OAIG;IACI,WAAW,CAAC,UAAkB,EAAE,QAAkC;QACrE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,IAAY,EAAE,QAAa;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC;gBACL,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI;aAChB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,yCAAyC;IAClC,SAAS,CAAC,IAAY,EAAE,QAAa;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAmC;IAA7E;;QAkBY,4BAAuB,GAAY,KAAK,CAAC;QAwFjD,kHAAkH;QAC1G,0BAAqB,GAAyB,EAAE,CAAC;QAiDzD;;;WAGG;QACK,mBAAc,GAAG,IAAI,OAAO,EAAwD,CAAC;QAOrF,yBAAoB,GAAmC,IAAI,GAAG,EAA6B,CAAC;QAEpG,+DAA+D;QACvD,8BAAyB,GAAG,IAAI,GAAG,EAAqC,CAAC;IAgUrF,CAAC;IAzeU,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAAwB,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,IAAY,IAAI;QACZ,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACvC,CAAC;IAMD;;;;;;;;OAQG;IACI,KAAK,CAAC,MAAM,CAAC,YAAsB,EAAE,WAAsB,EAAE,QAA4B;QAC5F,IAAI,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,gEAAgE;QAC3F,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,6HAA6H;IACrH,yBAAyB,CAAC,WAAsB;QACpD,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAEpC,IAAI,CAAC,eAAe,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC,uEAAuE;QAClH,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACzF,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,GAAyB,EAAE,WAAsB;QACxE,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAC7F,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAgE,CAAC;gBACjG,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,WAAY,CAAC,CAAC;gBACvD,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACpC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,oEAAoE;IACpE,IAAW,MAAM,KAAc,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,IAAW,WAAW,KAAe,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACzF,IAAW,WAAW,CAAC,KAAe,IAAI,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;IAEtE,kGAAkG;IAClG,IAAW,SAAS,KAAiC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAClF,IAAW,oBAAoB,KAAoC,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC3G,IAAW,kBAAkB,KAAiC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpG,IAAW,gBAAgB,KAAgC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/F,IAAW,cAAc,KAA8B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAClF,YAAY,CAAC,YAAoB,IAA8B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7G,gBAAgB,CAAC,UAAkB,IAA0C,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAE7H,aAAa;QAChB,IAAI,CAAC,eAAe,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC,uEAAuE;QAClH,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAiBD;;;;OAIG;IACK,2BAA2B,CAAC,UAAmB;QACnD,kFAAkF;QAClF,qFAAqF;QACrF,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,eAA8C,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QACtH,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,GAAyB;QAC9C,2DAA2D;QAC3D,sEAAsE;QACtE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAQ,EAAE,SAAiB,CAAC,EAAE,EAAE;YACnD,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,8BAA8B,GAAG,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;YAChE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,GAAQ,EAAE,EAAE;YACrC,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,8BAA8B,GAAG,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;YAChE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE;YACvC,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,GAAG,CAAC,CAAC,0CAA0C;YAC1D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAQD;;;OAGG;aACqB,mCAA8B,GAAG,IAAI,AAAP,CAAQ;IAMvD,WAAW,CAAC,cAAwC;QACvD,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAGD;;;;;;;;;OASG;IACI,KAAK,CAAC,cAAc,CAAC,cAAwC,EAAE,eAAwC,EAAE,IAAS,EAAE,cAAwB,EAAE,gBAA0B,EAAE,OAA+B;QAC5M,IAAI,CAAC;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,sCAAsC;iBAClD,CAAC;YACN,CAAC;YAED,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;gBAChC,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,mDAAmD;iBAC/D,CAAC;YACN,CAAC;YAED,IAAG,CAAC,cAAc,EAAC,CAAC;gBAChB,6CAA6C;gBAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;gBACjF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBACrB,OAAO;wBACH,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAA0B,EAAE,EAAE;4BACzD,OAAO,KAAK,CAAC,OAAO,CAAC;wBACzB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;qBAChB,CAAC;gBACN,CAAC;YACL,CAAC;iBACI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzB,6HAA6H;gBAC7H,MAAM,SAAS,GAAG,cAAc,CAAC,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;gBACjF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBACrB,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM;yBACnC,MAAM,CAAC,CAAC,KAA0B,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;yBAChE,GAAG,CAAC,CAAC,KAA0B,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;yBAClD,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,QAAQ,CAAC,0DAA0D,cAAc,CAAC,IAAI,MAAM,eAAe,EAAE,CAAC,CAAC;oBACnH,CAAC;gBACL,CAAC;YACL,CAAC;YAED,kEAAkE;YAClE,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAErF,MAAM,GAAG,GAAG,OAAO,EAAE,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;YACzF,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACvG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpE,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,SAAS;aACrB,CAAC;QACN,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACrB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,oBAAoB,CAAC,YAAoB,EAAE,IAAS,EAAE,OAA+B;QAC9F,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;YAC9D,IAAI,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACX,oBAAoB;gBACpB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBAChD,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBAC1D,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,IAAI,oBAAoB,CAAC,8BAA8B,EAAE,CAAC;oBACxF,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;oBAChE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;wBAC1B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAChD,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC9D,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,SAAS;aACrB,CAAC;QACN,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACrB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,sBAAsB,CAAC,YAAoB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,YAAY,EAAE;YAClE,UAAU,EAAE,IAAI,CAAC,qBAAqB;YACtC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzG,CAAC;SACJ,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACO,mBAAmB,CAAC,iBAAyB,EAAE,YAAoB,EAAE,aAAsB,EAAE,MAA4B,IAAI,CAAC,YAAY;QAChJ,IAAI,iBAAiB,IAAI,aAAa,EAAE,CAAC;YACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;gBAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBAC1D,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,QAAQ,CAAC;QACpB,CAAC;aACI,CAAC;YACF,iGAAiG;YACjG,gFAAgF;YAChF,OAAO,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACO,sBAAsB,CAAC,YAAoB,EAAE,MAA4B,IAAI,CAAC,YAAY;QAChG,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,UAAmB;QAC1C,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACjC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED,8HAA8H;IACtH,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACjC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;YACxE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED,gGAAgG;IACzF,kBAAkB;QACrB,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,EAAwD,CAAC;QAC1F,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,mBAAmB,CAAC,QAA2B,EAAE,IAAS;QACtE,qBAAqB,EAAE,CAAC,CAAC,0DAA0D;QACnF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAClC,IAAI,GAAG,EAAE,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,MAAO,CAAC,CAAC;gBACrB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;;;;;;OAaG;IACO,kBAAkB,CAAC,cAAwC,EAAE,SAAiB,EAAE,IAAS;QAC/F,0CAA0C;QAC1C,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAE/B,gDAAgD;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,gDAAgD;QAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiC,CAAC;QAE9D,8EAA8E;QAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAE,CAAS,CAAC,iBAAiB,EAAE,CAAC;gBAChC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAK,CAAS,CAAC,iBAAiB,IAAI,UAAU,CAAE,CAAS,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAAE,CAAC;gBACtF,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QAED,8CAA8C;QAC9C,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACjC,8DAA8D;YAC9D,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACpG,IAAI,CAAC;oBACD,mCAAmC;oBACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;wBACjB,KAAK,OAAO,CAAC;wBACb,KAAK,QAAQ,CAAC;wBACd,KAAK,QAAQ,CAAC;wBACd,KAAK,QAAQ;4BACT,yCAAyC;4BACzC,IAAI,CAAC;gCACD,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;4BACtD,CAAC;4BAAC,MAAM,CAAC;gCACL,+BAA+B;gCAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;4BAC1C,CAAC;4BACD,MAAM;wBAEV,KAAK,QAAQ,CAAC;wBACd;4BACI,2CAA2C;4BAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;4BACtC,MAAM;oBACd,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,0DAA0D;oBAC1D,QAAQ,CAAC,gDAAgD,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxF,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview The error the template sandbox throws.
3
+ * @module @memberjunction/templates
4
+ */
5
+ /** Thrown when a template uses a name, a value or a call that the template sandbox does not allow. */
6
+ export declare class TemplateSandboxError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ //# sourceMappingURL=TemplateSandboxError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateSandboxError.d.ts","sourceRoot":"","sources":["../src/TemplateSandboxError.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sGAAsG;AACtG,qBAAa,oBAAqB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI9B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileoverview The error the template sandbox throws.
3
+ * @module @memberjunction/templates
4
+ */
5
+ /** Thrown when a template uses a name, a value or a call that the template sandbox does not allow. */
6
+ export class TemplateSandboxError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'TemplateSandboxError';
10
+ }
11
+ }
12
+ //# sourceMappingURL=TemplateSandboxError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateSandboxError.js","sourceRoot":"","sources":["../src/TemplateSandboxError.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sGAAsG;AACtG,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACvC,CAAC;CACJ"}
@@ -0,0 +1,27 @@
1
+ import nunjucks from 'nunjucks';
2
+ /** Variables a template reads. */
3
+ export interface ReferencedVariablesResult {
4
+ /** Top-level names the template and the templates it pulls in read. Also holds loop, `set`, filter and keyword names. */
5
+ readonly Names: ReadonlySet<string>;
6
+ /** False when part of the template could not be analyzed, so `Names` may miss entries. */
7
+ readonly Complete: boolean;
8
+ /** Why `Complete` is false. */
9
+ readonly Reason?: string;
10
+ /** True when the text, or a template it pulls in, does not parse. Registering an extension can change such a result. */
11
+ readonly ParseFailed?: boolean;
12
+ }
13
+ /** Inputs for {@link CollectReferencedVariables}. */
14
+ export interface ReferencedVariablesOptions {
15
+ /** Extensions whose custom tags the parser must understand. */
16
+ Extensions: nunjucks.Extension[];
17
+ /** Texts of every content of the stored template with this name, or null when there is no such template. */
18
+ ResolveTemplateTexts: (templateName: string) => string[] | null;
19
+ }
20
+ /**
21
+ * Parses a Nunjucks template and returns the top-level variable names it reads, following stored
22
+ * templates it pulls in by literal name. The result is incomplete when a template is named by an
23
+ * expression, a named template is missing or cannot be loaded, the text does not parse, or a tag
24
+ * comes from an extension the analysis does not know.
25
+ */
26
+ export declare function CollectReferencedVariables(templateText: string, options: ReferencedVariablesOptions): ReferencedVariablesResult;
27
+ //# sourceMappingURL=TemplateVariableAnalysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateVariableAnalysis.d.ts","sourceRoot":"","sources":["../src/TemplateVariableAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA0BhC,kCAAkC;AAClC,MAAM,WAAW,yBAAyB;IACtC,yHAAyH;IACzH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wHAAwH;IACxH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,qDAAqD;AACrD,MAAM,WAAW,0BAA0B;IACvC,+DAA+D;IAC/D,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;IACjC,4GAA4G;IAC5G,oBAAoB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;CACnE;AAyBD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,GAAG,yBAAyB,CAQ/H"}
@@ -0,0 +1,140 @@
1
+ import nunjucks from 'nunjucks';
2
+ /** The parser nunjucks compiles templates with. */
3
+ const templateParser = nunjucks.parser;
4
+ /** Tags that pull in another template, by AST node type. The node keeps the template name in its `template` field. */
5
+ const TEMPLATE_REFERENCE_TAGS = new Map([
6
+ ['Include', 'include'],
7
+ ['Import', 'import'],
8
+ ['FromImport', 'from'],
9
+ ['Extends', 'extends'],
10
+ ]);
11
+ /** AST node types of custom extension tags. */
12
+ const EXTENSION_CALL_NODES = new Set(['CallExtension', 'CallExtensionAsync']);
13
+ /** Registration key of the `{% template %}` embed extension. The analysis follows the template it names. */
14
+ const TEMPLATE_EMBED_EXTENSION = 'TemplateEmbed';
15
+ /** Registration keys of extensions that read only the arguments and body the walk visits. */
16
+ const ARGUMENT_ONLY_EXTENSIONS = new Set(['AIPrompt']);
17
+ /**
18
+ * Parses a Nunjucks template and returns the top-level variable names it reads, following stored
19
+ * templates it pulls in by literal name. The result is incomplete when a template is named by an
20
+ * expression, a named template is missing or cannot be loaded, the text does not parse, or a tag
21
+ * comes from an extension the analysis does not know.
22
+ */
23
+ export function CollectReferencedVariables(templateText, options) {
24
+ const state = { names: new Set(), problems: new Set(), parseFailed: false, visitedTemplates: new Set(), visitedObjects: new Set(), options };
25
+ collectFromText(templateText, state);
26
+ if (state.problems.size === 0) {
27
+ return { Names: state.names, Complete: true };
28
+ }
29
+ const incomplete = { Names: state.names, Complete: false, Reason: [...state.problems].join('; ') };
30
+ return state.parseFailed ? { ...incomplete, ParseFailed: true } : incomplete;
31
+ }
32
+ function collectFromText(text, state) {
33
+ let root;
34
+ try {
35
+ root = templateParser.parse(text, state.options.Extensions);
36
+ }
37
+ catch (error) {
38
+ state.parseFailed = true;
39
+ state.problems.add(`template could not be parsed: ${error instanceof Error ? error.message : String(error)}`);
40
+ return;
41
+ }
42
+ walk(root, state);
43
+ }
44
+ function isAstNode(value) {
45
+ return typeof value === 'object' && value !== null && !Array.isArray(value) && typeof value.typename === 'string';
46
+ }
47
+ /** Visits each node and list reachable from `value` once. */
48
+ function walk(value, state) {
49
+ if (typeof value !== 'object' || value === null || state.visitedObjects.has(value))
50
+ return;
51
+ state.visitedObjects.add(value);
52
+ if (Array.isArray(value)) {
53
+ for (const item of value)
54
+ walk(item, state);
55
+ }
56
+ else if (isAstNode(value)) {
57
+ visitNode(value, state);
58
+ }
59
+ }
60
+ function visitNode(node, state) {
61
+ if (node.typename === 'Symbol' && typeof node.value === 'string') {
62
+ state.names.add(node.value);
63
+ }
64
+ const referenceTag = TEMPLATE_REFERENCE_TAGS.get(node.typename);
65
+ if (referenceTag) {
66
+ followTemplate(node.template, referenceTag, state);
67
+ }
68
+ if (EXTENSION_CALL_NODES.has(node.typename)) {
69
+ checkExtensionCall(node, state);
70
+ }
71
+ for (const property of childProperties(node)) {
72
+ walk(node[property], state);
73
+ }
74
+ }
75
+ /**
76
+ * Names of the node's properties that can hold child nodes: its declared `fields` and every own property.
77
+ * The block form of `{% set %}` keeps its body in `body`, which is not a declared field.
78
+ */
79
+ function childProperties(node) {
80
+ return new Set([...node.fields, ...Object.keys(node)]);
81
+ }
82
+ /** Follows a `{% template %}` embed, accepts argument-only extensions, and records a problem for any other extension. */
83
+ function checkExtensionCall(node, state) {
84
+ const extensionName = node.extName;
85
+ if (extensionName === TEMPLATE_EMBED_EXTENSION) {
86
+ followTemplate(firstArgument(node), 'template', state);
87
+ }
88
+ else if (typeof extensionName !== 'string') {
89
+ state.problems.add(`${describeTag(extensionName, state)} comes from an extension with no registered name`);
90
+ }
91
+ else if (!ARGUMENT_ONLY_EXTENSIONS.has(extensionName)) {
92
+ state.problems.add(`${describeTag(extensionName, state)} comes from extension "${extensionName}", which the analysis does not know`);
93
+ }
94
+ }
95
+ function firstArgument(node) {
96
+ const args = node.args;
97
+ return isAstNode(args) && Array.isArray(args.children) ? args.children[0] : undefined;
98
+ }
99
+ /**
100
+ * Names the tag of an extension call from its extension's tag list, such as `the {% custom %} tag`.
101
+ * A call node holds the extension's registration name, or the extension itself when it has none.
102
+ */
103
+ function describeTag(extensionName, state) {
104
+ const extensions = state.options.Extensions;
105
+ const extension = typeof extensionName === 'string'
106
+ ? extensions.find((candidate) => candidate.__name === extensionName)
107
+ : extensions.find((candidate) => Object.is(candidate, extensionName));
108
+ const tags = extension?.tags ?? [];
109
+ return tags.length > 0 ? `the ${tags.map((tag) => `{% ${tag} %}`).join(' or ')} tag` : 'a custom tag';
110
+ }
111
+ function followTemplate(nameNode, tag, state) {
112
+ if (!isAstNode(nameNode) || nameNode.typename !== 'Literal' || typeof nameNode.value !== 'string') {
113
+ state.problems.add(`a {% ${tag} %} tag names its template with an expression`);
114
+ return;
115
+ }
116
+ const name = nameNode.value;
117
+ const key = name.trim().toLowerCase();
118
+ if (state.visitedTemplates.has(key))
119
+ return;
120
+ state.visitedTemplates.add(key);
121
+ for (const text of resolveTemplateTexts(name, state))
122
+ collectFromText(text, state);
123
+ }
124
+ /** Texts of every content of the named template. A missing template, or one that cannot be loaded, records a problem and gives none. */
125
+ function resolveTemplateTexts(name, state) {
126
+ let texts;
127
+ try {
128
+ texts = state.options.ResolveTemplateTexts(name);
129
+ }
130
+ catch (error) {
131
+ state.problems.add(`template "${name}" could not be loaded: ${error instanceof Error ? error.message : String(error)}`);
132
+ return [];
133
+ }
134
+ if (!texts) {
135
+ state.problems.add(`template "${name}" was not found`);
136
+ return [];
137
+ }
138
+ return texts;
139
+ }
140
+ //# sourceMappingURL=TemplateVariableAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateVariableAnalysis.js","sourceRoot":"","sources":["../src/TemplateVariableAnalysis.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,14 @@ export type TemplateEmbedConfig = {
19
19
  */
20
20
  data?: any;
21
21
  };
22
+ /** The render context's escape mode; nunjucks keeps it at `env.opts` at runtime (`@types/nunjucks` says `options`). */
23
+ type RenderEnvironmentView = {
24
+ env?: {
25
+ opts?: {
26
+ autoescape?: boolean;
27
+ };
28
+ };
29
+ };
22
30
  /**
23
31
  * Extension that enables recursive template embedding using {% template "TemplateName" %} syntax.
24
32
  *
@@ -76,8 +84,12 @@ export declare class TemplateEmbedExtension extends TemplateExtensionBase {
76
84
  * Prepares the data context for the embedded template by merging current context with additional data.
77
85
  */
78
86
  private prepareDataContext;
87
+ /** Whether the render that reached this tag escapes its output; an embed inside a raw render renders raw too. */
88
+ protected static RendersEscaped(context: RenderEnvironmentView): boolean;
79
89
  /**
80
- * Renders the embedded template content with the provided data context.
90
+ * Renders the embedded template content with the provided data context. A raw render goes through
91
+ * {@link TemplateEngineServer.RenderTemplate}, whose raw environment carries the extensions.
92
+ * The raw path renders through RenderTemplate so the registered extensions (nested embeds) stay available; unlike the escaped RenderTemplateSimple path it also merges the template's parameter defaults.
81
93
  */
82
94
  private renderEmbeddedTemplate;
83
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateEmbed.extension.d.ts","sourceRoot":"","sources":["../../src/extensions/TemplateEmbed.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKlF,KAAK,MAAM,GAAG,GAAG,CAAC;AAClB,KAAK,KAAK,GAAG,GAAG,CAAC;AACjB,KAAK,KAAK,GAAG,GAAG,CAAC;AACjB,KAAK,OAAO,GAAG,GAAG,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,GAAG,CAAC;CACd,CAAC;AAiBF;;;;;;;;;;;;;;GAcG;AACH,qBACa,sBAAuB,SAAQ,qBAAqB;gBAEjD,WAAW,EAAE,QAAQ;IAK1B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAavD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB;IAyHlE;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;YACW,sBAAsB;CAUvC"}
1
+ {"version":3,"file":"TemplateEmbed.extension.d.ts","sourceRoot":"","sources":["../../src/extensions/TemplateEmbed.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKlF,KAAK,MAAM,GAAG,GAAG,CAAC;AAClB,KAAK,KAAK,GAAG,GAAG,CAAC;AACjB,KAAK,KAAK,GAAG,GAAG,CAAC;AACjB,KAAK,OAAO,GAAG,GAAG,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,GAAG,CAAC;CACd,CAAC;AAEF,uHAAuH;AACvH,KAAK,qBAAqB,GAAG;IAAE,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAiB3E;;;;;;;;;;;;;;GAcG;AACH,qBACa,sBAAuB,SAAQ,qBAAqB;gBAEjD,WAAW,EAAE,QAAQ;IAK1B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAavD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB;IAyHlE;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B,iHAAiH;IACjH,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO;IAIxE;;;;OAIG;YACW,sBAAsB;CAiBvC"}
@@ -7,6 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
+ var TemplateEmbedExtension_1;
10
11
  import { LogError, UserInfo } from "@memberjunction/core";
11
12
  import { RegisterClass } from "@memberjunction/global";
12
13
  import { TemplateExtensionBase } from "./TemplateExtensionBase.js";
@@ -26,7 +27,7 @@ import { TemplateEngineServer } from '../TemplateEngine.js';
26
27
  * {% template "TemplateName", data={extra: "value"} %}
27
28
  * {% template "TemplateName", type="PlainText", data={key: "value"} %}
28
29
  */
29
- let TemplateEmbedExtension = class TemplateEmbedExtension extends TemplateExtensionBase {
30
+ let TemplateEmbedExtension = TemplateEmbedExtension_1 = class TemplateEmbedExtension extends TemplateExtensionBase {
30
31
  constructor(contextUser) {
31
32
  super(contextUser);
32
33
  this.tags = ['template'];
@@ -149,8 +150,8 @@ let TemplateEmbedExtension = class TemplateEmbedExtension extends TemplateExtens
149
150
  renderContext.templateStack.push(templateName);
150
151
  const originalContentType = renderContext.currentContentType;
151
152
  renderContext.currentContentType = templateContent.Type;
152
- // Render the embedded template asynchronously
153
- this.renderEmbeddedTemplate(templateEngine, templateContent, embeddedData)
153
+ // Render the embedded template asynchronously, in the outer render's escape mode
154
+ this.renderEmbeddedTemplate(templateEngine, targetTemplate, templateContent, embeddedData, TemplateEmbedExtension_1.RendersEscaped(context))
154
155
  .then((result) => {
155
156
  // Remove template from stack after successful rendering
156
157
  renderContext.templateStack.pop();
@@ -221,19 +222,26 @@ let TemplateEmbedExtension = class TemplateEmbedExtension extends TemplateExtens
221
222
  // Additional data takes precedence over current context
222
223
  return { ...currentContext, ...additionalData };
223
224
  }
225
+ /** Whether the render that reached this tag escapes its output; an embed inside a raw render renders raw too. */
226
+ static RendersEscaped(context) {
227
+ return context.env?.opts?.autoescape !== false;
228
+ }
224
229
  /**
225
- * Renders the embedded template content with the provided data context.
230
+ * Renders the embedded template content with the provided data context. A raw render goes through
231
+ * {@link TemplateEngineServer.RenderTemplate}, whose raw environment carries the extensions.
232
+ * The raw path renders through RenderTemplate so the registered extensions (nested embeds) stay available; unlike the escaped RenderTemplateSimple path it also merges the template's parameter defaults.
226
233
  */
227
- async renderEmbeddedTemplate(templateEngine, templateContent, data) {
228
- // Use the template engine's simple rendering method which handles Nunjucks environment setup
229
- const result = await templateEngine.RenderTemplateSimple(templateContent.TemplateText, data);
234
+ async renderEmbeddedTemplate(templateEngine, template, templateContent, data, autoescape) {
235
+ const result = autoescape
236
+ ? await templateEngine.RenderTemplateSimple(templateContent.TemplateText, data)
237
+ : await templateEngine.RenderTemplate(template, templateContent, data, true, true, { autoescape: false });
230
238
  if (!result.Success) {
231
239
  throw new Error(`Failed to render embedded template: ${result.Message}`);
232
240
  }
233
241
  return result.Output;
234
242
  }
235
243
  };
236
- TemplateEmbedExtension = __decorate([
244
+ TemplateEmbedExtension = TemplateEmbedExtension_1 = __decorate([
237
245
  RegisterClass(TemplateExtensionBase, 'TemplateEmbed'),
238
246
  __metadata("design:paramtypes", [UserInfo])
239
247
  ], TemplateEmbedExtension);