@loopstack/core 0.2.0 → 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.
Files changed (132) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/modules/common/common.module.js +9 -15
  3. package/dist/modules/common/common.module.js.map +1 -1
  4. package/dist/modules/common/errors/object-expression.error.d.ts +4 -0
  5. package/dist/modules/common/errors/object-expression.error.js +13 -0
  6. package/dist/modules/common/errors/object-expression.error.js.map +1 -0
  7. package/dist/modules/common/errors/template-expression.error.d.ts +4 -0
  8. package/dist/modules/common/errors/template-expression.error.js +13 -0
  9. package/dist/modules/common/errors/template-expression.error.js.map +1 -0
  10. package/dist/modules/common/services/context.service.d.ts +1 -0
  11. package/dist/modules/common/services/context.service.js +4 -0
  12. package/dist/modules/common/services/context.service.js.map +1 -1
  13. package/dist/modules/common/services/expression-handler/object-expression.handler.d.ts +20 -0
  14. package/dist/modules/common/services/expression-handler/object-expression.handler.js +125 -0
  15. package/dist/modules/common/services/expression-handler/object-expression.handler.js.map +1 -0
  16. package/dist/modules/common/services/expression-handler/template-expression.handler.d.ts +12 -0
  17. package/dist/modules/common/services/expression-handler/template-expression.handler.js +63 -0
  18. package/dist/modules/common/services/expression-handler/template-expression.handler.js.map +1 -0
  19. package/dist/modules/common/services/handlebars-helpers/date-formatter-handlebars-helper.service.d.ts +9 -0
  20. package/dist/modules/common/services/handlebars-helpers/date-formatter-handlebars-helper.service.js +124 -0
  21. package/dist/modules/common/services/handlebars-helpers/date-formatter-handlebars-helper.service.js.map +1 -0
  22. package/dist/modules/common/services/handlebars-helpers/index.d.ts +1 -0
  23. package/dist/modules/common/services/handlebars-helpers/index.js +18 -0
  24. package/dist/modules/common/services/handlebars-helpers/index.js.map +1 -0
  25. package/dist/modules/common/services/handlebars-processor.service.d.ts +12 -0
  26. package/dist/modules/common/services/handlebars-processor.service.js +70 -0
  27. package/dist/modules/common/services/handlebars-processor.service.js.map +1 -0
  28. package/dist/modules/common/services/index.d.ts +6 -5
  29. package/dist/modules/common/services/index.js +6 -5
  30. package/dist/modules/common/services/index.js.map +1 -1
  31. package/dist/modules/common/services/template.service.d.ts +16 -0
  32. package/dist/modules/common/services/template.service.js +64 -0
  33. package/dist/modules/common/services/template.service.js.map +1 -0
  34. package/dist/modules/common/services/variable-sanitizer.service.d.ts +9 -0
  35. package/dist/modules/common/services/variable-sanitizer.service.js +84 -0
  36. package/dist/modules/common/services/variable-sanitizer.service.js.map +1 -0
  37. package/dist/modules/configuration/configuration.module.js +2 -1
  38. package/dist/modules/configuration/configuration.module.js.map +1 -1
  39. package/dist/modules/configuration/services/configuration.service.d.ts +15 -13
  40. package/dist/modules/configuration/services/configuration.service.js +97 -96
  41. package/dist/modules/configuration/services/configuration.service.js.map +1 -1
  42. package/dist/modules/configuration/services/index.d.ts +1 -0
  43. package/dist/modules/configuration/services/index.js +1 -0
  44. package/dist/modules/configuration/services/index.js.map +1 -1
  45. package/dist/modules/configuration/services/schema-registry.service.d.ts +9 -0
  46. package/dist/modules/configuration/services/schema-registry.service.js +41 -0
  47. package/dist/modules/configuration/services/schema-registry.service.js.map +1 -0
  48. package/dist/modules/persistence/services/document.service.d.ts +5 -1
  49. package/dist/modules/persistence/services/document.service.js +27 -15
  50. package/dist/modules/persistence/services/document.service.js.map +1 -1
  51. package/dist/modules/workflow-processor/services/index.d.ts +2 -1
  52. package/dist/modules/workflow-processor/services/index.js +2 -1
  53. package/dist/modules/workflow-processor/services/index.js.map +1 -1
  54. package/dist/modules/workflow-processor/services/pipeline-processor.service.d.ts +9 -8
  55. package/dist/modules/workflow-processor/services/pipeline-processor.service.js +92 -52
  56. package/dist/modules/workflow-processor/services/pipeline-processor.service.js.map +1 -1
  57. package/dist/modules/workflow-processor/services/root-processor.service.d.ts +2 -2
  58. package/dist/modules/workflow-processor/services/root-processor.service.js +1 -0
  59. package/dist/modules/workflow-processor/services/root-processor.service.js.map +1 -1
  60. package/dist/modules/workflow-processor/services/service-execution.service.d.ts +12 -0
  61. package/dist/modules/workflow-processor/services/service-execution.service.js +53 -0
  62. package/dist/modules/workflow-processor/services/service-execution.service.js.map +1 -0
  63. package/dist/modules/workflow-processor/services/state-machine-config.service.d.ts +2 -17
  64. package/dist/modules/workflow-processor/services/state-machine-config.service.js +33 -17
  65. package/dist/modules/workflow-processor/services/state-machine-config.service.js.map +1 -1
  66. package/dist/modules/workflow-processor/services/state-machine-processor.service.d.ts +11 -7
  67. package/dist/modules/workflow-processor/services/state-machine-processor.service.js +90 -24
  68. package/dist/modules/workflow-processor/services/state-machine-processor.service.js.map +1 -1
  69. package/dist/modules/workflow-processor/services/template-expression-evaluator.service.d.ts +24 -4
  70. package/dist/modules/workflow-processor/services/template-expression-evaluator.service.js +90 -21
  71. package/dist/modules/workflow-processor/services/template-expression-evaluator.service.js.map +1 -1
  72. package/dist/modules/workflow-processor/services/tool-execution.service.d.ts +8 -20
  73. package/dist/modules/workflow-processor/services/tool-execution.service.js +31 -55
  74. package/dist/modules/workflow-processor/services/tool-execution.service.js.map +1 -1
  75. package/dist/modules/workflow-processor/services/workflow-context.service.d.ts +4 -0
  76. package/dist/modules/{common/services/template-engine.service.js → workflow-processor/services/workflow-context.service.js} +12 -15
  77. package/dist/modules/workflow-processor/services/workflow-context.service.js.map +1 -0
  78. package/dist/modules/workflow-processor/services/workflow-processor.service.d.ts +2 -2
  79. package/dist/modules/workflow-processor/services/workflow-processor.service.js +12 -8
  80. package/dist/modules/workflow-processor/services/workflow-processor.service.js.map +1 -1
  81. package/dist/modules/workflow-processor/services/workflow-state.service.d.ts +2 -2
  82. package/dist/modules/workflow-processor/services/workflow-state.service.js +5 -5
  83. package/dist/modules/workflow-processor/services/workflow-state.service.js.map +1 -1
  84. package/dist/modules/workflow-processor/tool-services/add-namespace.service.js +4 -4
  85. package/dist/modules/workflow-processor/tool-services/add-namespace.service.js.map +1 -1
  86. package/dist/modules/workflow-processor/tool-services/batch-create-documents.service.d.ts +6 -10
  87. package/dist/modules/workflow-processor/tool-services/batch-create-documents.service.js +38 -26
  88. package/dist/modules/workflow-processor/tool-services/batch-create-documents.service.js.map +1 -1
  89. package/dist/modules/workflow-processor/tool-services/create-document.service.d.ts +17 -138
  90. package/dist/modules/workflow-processor/tool-services/create-document.service.js +83 -31
  91. package/dist/modules/workflow-processor/tool-services/create-document.service.js.map +1 -1
  92. package/dist/modules/workflow-processor/tool-services/load-document.service.d.ts +25 -50
  93. package/dist/modules/workflow-processor/tool-services/load-document.service.js +57 -79
  94. package/dist/modules/workflow-processor/tool-services/load-document.service.js.map +1 -1
  95. package/dist/modules/workflow-processor/tool-services/mock.service.d.ts +11 -8
  96. package/dist/modules/workflow-processor/tool-services/mock.service.js +41 -9
  97. package/dist/modules/workflow-processor/tool-services/mock.service.js.map +1 -1
  98. package/dist/modules/workflow-processor/tool-services/set-context.service.d.ts +3 -0
  99. package/dist/modules/workflow-processor/tool-services/set-context.service.js +11 -5
  100. package/dist/modules/workflow-processor/tool-services/set-context.service.js.map +1 -1
  101. package/dist/modules/workflow-processor/tool-services/set-target-place.service.js +1 -1
  102. package/dist/modules/workflow-processor/tool-services/set-target-place.service.js.map +1 -1
  103. package/dist/modules/workflow-processor/tool-services/transition-selector.service.js +2 -2
  104. package/dist/modules/workflow-processor/tool-services/transition-selector.service.js.map +1 -1
  105. package/dist/modules/workflow-processor/tool-services/update-document.service.d.ts +32 -55
  106. package/dist/modules/workflow-processor/tool-services/update-document.service.js +92 -7
  107. package/dist/modules/workflow-processor/tool-services/update-document.service.js.map +1 -1
  108. package/dist/modules/workflow-processor/validators/workflow-option.validator.d.ts +1 -1
  109. package/dist/modules/workflow-processor/validators/workflow-option.validator.js +3 -3
  110. package/dist/modules/workflow-processor/validators/workflow-option.validator.js.map +1 -1
  111. package/dist/modules/workflow-processor/workflow-processor.module.js +2 -1
  112. package/dist/modules/workflow-processor/workflow-processor.module.js.map +1 -1
  113. package/dist/utils/load-configuration.js +5 -3
  114. package/dist/utils/load-configuration.js.map +1 -1
  115. package/package.json +5 -3
  116. package/dist/modules/common/services/document-helper.service.d.ts +0 -198
  117. package/dist/modules/common/services/document-helper.service.js +0 -53
  118. package/dist/modules/common/services/document-helper.service.js.map +0 -1
  119. package/dist/modules/common/services/expression-evaluator.service.d.ts +0 -5
  120. package/dist/modules/common/services/expression-evaluator.service.js +0 -44
  121. package/dist/modules/common/services/expression-evaluator.service.js.map +0 -1
  122. package/dist/modules/common/services/schema-validator.service.d.ts +0 -7
  123. package/dist/modules/common/services/schema-validator.service.js +0 -41
  124. package/dist/modules/common/services/schema-validator.service.js.map +0 -1
  125. package/dist/modules/common/services/template-engine.service.d.ts +0 -5
  126. package/dist/modules/common/services/template-engine.service.js.map +0 -1
  127. package/dist/modules/common/services/value-parser.service.d.ts +0 -19
  128. package/dist/modules/common/services/value-parser.service.js +0 -68
  129. package/dist/modules/common/services/value-parser.service.js.map +0 -1
  130. package/dist/modules/workflow-processor/services/tool-schema-validator.service.d.ts +0 -5
  131. package/dist/modules/workflow-processor/services/tool-schema-validator.service.js +0 -41
  132. package/dist/modules/workflow-processor/services/tool-schema-validator.service.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @loopstack/core
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Improved Document Handling, Template Expressions and added Config Includes
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @loopstack/shared@0.3.0
13
+
3
14
  ## 0.2.0
4
15
 
5
16
  ### Minor Changes
@@ -11,30 +11,24 @@ const common_1 = require("@nestjs/common");
11
11
  const event_emitter_1 = require("@nestjs/event-emitter");
12
12
  const services_1 = require("./services");
13
13
  const client_message_service_1 = require("./services/client-message.service");
14
+ const configuration_1 = require("../configuration");
14
15
  let CommonModule = class CommonModule {
15
16
  };
16
17
  exports.CommonModule = CommonModule;
17
18
  exports.CommonModule = CommonModule = __decorate([
18
19
  (0, common_1.Module)({
19
- imports: [event_emitter_1.EventEmitterModule.forRoot()],
20
+ imports: [configuration_1.ConfigurationModule, event_emitter_1.EventEmitterModule.forRoot()],
20
21
  providers: [
21
22
  client_message_service_1.ClientMessageService,
22
- services_1.ExpressionEvaluatorService,
23
- services_1.SchemaValidatorService,
24
- services_1.TemplateEngineService,
25
- services_1.DocumentHelperService,
26
- services_1.ValueParserService,
27
- services_1.ContextService,
28
- ],
29
- exports: [
30
- client_message_service_1.ClientMessageService,
31
- services_1.ExpressionEvaluatorService,
32
- services_1.SchemaValidatorService,
33
- services_1.TemplateEngineService,
34
- services_1.DocumentHelperService,
35
- services_1.ValueParserService,
36
23
  services_1.ContextService,
24
+ services_1.TemplateService,
25
+ services_1.ObjectExpressionHandler,
26
+ services_1.TemplateExpressionHandler,
27
+ services_1.HandlebarsProcessor,
28
+ services_1.DateFormatterHandlebarsHelperService,
29
+ services_1.VariableSanitizerService,
37
30
  ],
31
+ exports: [client_message_service_1.ClientMessageService, services_1.ContextService, services_1.TemplateService],
38
32
  })
39
33
  ], CommonModule);
40
34
  //# sourceMappingURL=common.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.module.js","sourceRoot":"","sources":["../../../src/modules/common/common.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yDAA2D;AAC3D,yCAOoB;AACpB,8EAAyE;AAuBlE,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IArBxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kCAAkB,CAAC,OAAO,EAAE,CAAC;QACvC,SAAS,EAAE;YACT,6CAAoB;YACpB,qCAA0B;YAC1B,iCAAsB;YACtB,gCAAqB;YACrB,gCAAqB;YACrB,6BAAkB;YAClB,yBAAc;SACf;QACD,OAAO,EAAE;YACP,6CAAoB;YACpB,qCAA0B;YAC1B,iCAAsB;YACtB,gCAAqB;YACrB,gCAAqB;YACrB,6BAAkB;YAClB,yBAAc;SACf;KACF,CAAC;GACW,YAAY,CAAG"}
1
+ {"version":3,"file":"common.module.js","sourceRoot":"","sources":["../../../src/modules/common/common.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yDAA2D;AAC3D,yCAQoB;AACpB,8EAAyE;AACzE,oDAAuD;AAgBhD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAdxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,mCAAmB,EAAE,kCAAkB,CAAC,OAAO,EAAE,CAAC;QAC5D,SAAS,EAAE;YACT,6CAAoB;YACpB,yBAAc;YACd,0BAAe;YACf,kCAAuB;YACvB,oCAAyB;YACzB,8BAAmB;YACnB,+CAAoC;YACpC,mCAAwB;SACzB;QACD,OAAO,EAAE,CAAC,6CAAoB,EAAE,yBAAc,EAAE,0BAAe,CAAC;KACjE,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,4 @@
1
+ export declare class ObjectExpressionError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code: string);
4
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObjectExpressionError = void 0;
4
+ class ObjectExpressionError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'ObjectExpressionError';
10
+ }
11
+ }
12
+ exports.ObjectExpressionError = ObjectExpressionError;
13
+ //# sourceMappingURL=object-expression.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-expression.error.js","sourceRoot":"","sources":["../../../../src/modules/common/errors/object-expression.error.ts"],"names":[],"mappings":";;;AAAA,MAAa,qBAAsB,SAAQ,KAAK;IAG5B;IAFlB,YACE,OAAe,EACC,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AARD,sDAQC"}
@@ -0,0 +1,4 @@
1
+ export declare class TemplateExpressionError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code: string);
4
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TemplateExpressionError = void 0;
4
+ class TemplateExpressionError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'ObjectExpressionError';
10
+ }
11
+ }
12
+ exports.TemplateExpressionError = TemplateExpressionError;
13
+ //# sourceMappingURL=template-expression.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-expression.error.js","sourceRoot":"","sources":["../../../../src/modules/common/errors/template-expression.error.ts"],"names":[],"mappings":";;;AAAA,MAAa,uBAAwB,SAAQ,KAAK;IAG9B;IAFlB,YACE,OAAe,EACC,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AARD,0DAQC"}
@@ -2,4 +2,5 @@ import { ContextInterface, ProcessRunInterface, PipelineEntity } from '@loopstac
2
2
  export declare class ContextService {
3
3
  createRootContext(pipeline: PipelineEntity, additional: Partial<ContextInterface>): ContextInterface;
4
4
  create(payload: ProcessRunInterface | ContextInterface): ContextInterface;
5
+ addIncludes(context: ContextInterface, includes: Map<string, string>): void;
5
6
  }
@@ -21,12 +21,16 @@ let ContextService = class ContextService {
21
21
  workspaceId: pipeline.workspaceId,
22
22
  labels: pipeline.labels,
23
23
  index: pipeline.index,
24
+ includes: new Map(),
24
25
  ...additional,
25
26
  };
26
27
  }
27
28
  create(payload) {
28
29
  return lodash_1.default.cloneDeep(payload);
29
30
  }
31
+ addIncludes(context, includes) {
32
+ context.includes = new Map([...context.includes, ...includes]);
33
+ }
30
34
  };
31
35
  exports.ContextService = ContextService;
32
36
  exports.ContextService = ContextService = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"context.service.js","sourceRoot":"","sources":["../../../../src/modules/common/services/context.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oDAAuB;AAQhB,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,iBAAiB,CACf,QAAwB,EACxB,UAAqC;QAErC,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,SAAS;YAC1B,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,GAAG,UAAU;SACM,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,OAA+C;QACpD,OAAO,gBAAC,CAAC,SAAS,CAAC,OAAO,CAAqB,CAAC;IAClD,CAAC;CACF,CAAA;AAnBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;GACA,cAAc,CAmB1B"}
1
+ {"version":3,"file":"context.service.js","sourceRoot":"","sources":["../../../../src/modules/common/services/context.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oDAAuB;AAQhB,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,iBAAiB,CACf,QAAwB,EACxB,UAAqC;QAErC,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,SAAS;YAC1B,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,GAAG,UAAU;SACM,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,OAA+C;QACpD,OAAO,gBAAC,CAAC,SAAS,CAAC,OAAO,CAAqB,CAAC;IAClD,CAAC;IAED,WAAW,CAAC,OAAyB,EAAE,QAA6B;QAClE,OAAO,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;CACF,CAAA;AAxBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;GACA,cAAc,CAwB1B"}
@@ -0,0 +1,20 @@
1
+ import { TemplateDetector, TemplateProcessor } from '../template.service';
2
+ import { VariableSanitizerService } from '../variable-sanitizer.service';
3
+ export declare class ObjectExpressionHandler implements TemplateDetector, TemplateProcessor {
4
+ private readonly variableSanitizerService;
5
+ private readonly logger;
6
+ private readonly DEFAULT_MAX_DEPTH;
7
+ private readonly DEFAULT_MAX_LENGTH;
8
+ private readonly EXPRESSION_PATTERN;
9
+ private readonly DANGEROUS_PATTERNS;
10
+ private readonly VALID_SEGMENT_PATTERN;
11
+ constructor(variableSanitizerService: VariableSanitizerService);
12
+ canHandle(value: any): boolean;
13
+ process(content: string, variables: Record<string, any>): any;
14
+ private processExpression;
15
+ private extractExpression;
16
+ private validateExpression;
17
+ private parseExpressionSegments;
18
+ private validateSegmentsSecurity;
19
+ private evaluateExpression;
20
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var ObjectExpressionHandler_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.ObjectExpressionHandler = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const lodash_1 = require("lodash");
16
+ const variable_sanitizer_service_1 = require("../variable-sanitizer.service");
17
+ const object_expression_error_1 = require("../../errors/object-expression.error");
18
+ let ObjectExpressionHandler = ObjectExpressionHandler_1 = class ObjectExpressionHandler {
19
+ variableSanitizerService;
20
+ logger = new common_1.Logger(ObjectExpressionHandler_1.name);
21
+ DEFAULT_MAX_DEPTH = 10;
22
+ DEFAULT_MAX_LENGTH = 1000;
23
+ EXPRESSION_PATTERN = /^\$\{(.+)\}$/;
24
+ DANGEROUS_PATTERNS = [
25
+ /^__/,
26
+ /\b__proto__\b/i,
27
+ /\bprototype\b$/i,
28
+ /\bconstructor\b$/i,
29
+ /\beval\b$/i,
30
+ /\bfunction\b$/i,
31
+ /\brequire\b$/i,
32
+ /\bimport\b$/i,
33
+ /\bprocess\b$/i,
34
+ /\bprocess\.env\b/i,
35
+ /\bglobal\b$/i,
36
+ /\bwindow\b$/i,
37
+ /\bBuffer\b$/i,
38
+ /\bconsole\b$/i,
39
+ ];
40
+ VALID_SEGMENT_PATTERN = /^[a-zA-Z0-9_-]+(\[\d+\])?$/;
41
+ constructor(variableSanitizerService) {
42
+ this.variableSanitizerService = variableSanitizerService;
43
+ }
44
+ canHandle(value) {
45
+ if (typeof value !== 'string') {
46
+ return false;
47
+ }
48
+ const trimmed = value.trim();
49
+ return this.EXPRESSION_PATTERN.test(trimmed);
50
+ }
51
+ process(content, variables) {
52
+ try {
53
+ const context = {
54
+ variables,
55
+ depth: 0,
56
+ };
57
+ return this.processExpression(content, context);
58
+ }
59
+ catch (error) {
60
+ this.logger.error(`Failed to process object expression (${content}): ${error.message}`, {
61
+ expression: content,
62
+ });
63
+ if (error instanceof object_expression_error_1.ObjectExpressionError) {
64
+ throw error;
65
+ }
66
+ throw new object_expression_error_1.ObjectExpressionError('Object expression evaluation failed', 'EVALUATION_ERROR');
67
+ }
68
+ }
69
+ processExpression(content, context) {
70
+ const expression = this.extractExpression(content);
71
+ this.validateExpression(expression);
72
+ const sanitizedVariables = this.variableSanitizerService.sanitizeVariables(context.variables);
73
+ return this.evaluateExpression(expression, sanitizedVariables);
74
+ }
75
+ extractExpression(content) {
76
+ const trimmed = content.trim();
77
+ const match = trimmed.match(this.EXPRESSION_PATTERN);
78
+ if (!match || !match[1]) {
79
+ throw new object_expression_error_1.ObjectExpressionError('Invalid expression format', 'INVALID_FORMAT');
80
+ }
81
+ const expression = match[1].trim();
82
+ if (!expression) {
83
+ throw new object_expression_error_1.ObjectExpressionError('Empty expression not allowed', 'EMPTY_EXPRESSION');
84
+ }
85
+ return expression;
86
+ }
87
+ validateExpression(expression, options = {}) {
88
+ const { maxDepth = this.DEFAULT_MAX_DEPTH, maxLength = this.DEFAULT_MAX_LENGTH, } = options;
89
+ if (expression.length > maxLength) {
90
+ throw new object_expression_error_1.ObjectExpressionError(`Expression too long (max: ${maxLength} characters)`, 'EXPRESSION_TOO_LONG');
91
+ }
92
+ const segments = this.parseExpressionSegments(expression);
93
+ if (segments.length > maxDepth) {
94
+ throw new object_expression_error_1.ObjectExpressionError(`Expression depth too high (max: ${maxDepth} levels)`, 'DEPTH_EXCEEDED');
95
+ }
96
+ this.validateSegmentsSecurity(segments);
97
+ }
98
+ parseExpressionSegments(expression) {
99
+ return expression.split('.').filter((segment) => segment.length > 0);
100
+ }
101
+ validateSegmentsSecurity(segments) {
102
+ for (const segment of segments) {
103
+ if (this.DANGEROUS_PATTERNS.some((pattern) => pattern.test(segment))) {
104
+ throw new object_expression_error_1.ObjectExpressionError('Expression contains prohibited patterns', 'SECURITY_VIOLATION');
105
+ }
106
+ if (!this.VALID_SEGMENT_PATTERN.test(segment)) {
107
+ throw new object_expression_error_1.ObjectExpressionError('Expression contains invalid characters or format', 'INVALID_SEGMENT');
108
+ }
109
+ }
110
+ }
111
+ evaluateExpression(expression, variables) {
112
+ try {
113
+ return (0, lodash_1.get)(variables, expression);
114
+ }
115
+ catch (error) {
116
+ throw new object_expression_error_1.ObjectExpressionError('Failed to evaluate expression path', 'EVALUATION_FAILED');
117
+ }
118
+ }
119
+ };
120
+ exports.ObjectExpressionHandler = ObjectExpressionHandler;
121
+ exports.ObjectExpressionHandler = ObjectExpressionHandler = ObjectExpressionHandler_1 = __decorate([
122
+ (0, common_1.Injectable)(),
123
+ __metadata("design:paramtypes", [variable_sanitizer_service_1.VariableSanitizerService])
124
+ ], ObjectExpressionHandler);
125
+ //# sourceMappingURL=object-expression.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-expression.handler.js","sourceRoot":"","sources":["../../../../../src/modules/common/services/expression-handler/object-expression.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { TemplateDetector, TemplateProcessor } from '../template.service';
2
+ import { HandlebarsProcessor } from '../handlebars-processor.service';
3
+ import { VariableSanitizerService } from '../variable-sanitizer.service';
4
+ export declare class TemplateExpressionHandler implements TemplateDetector, TemplateProcessor {
5
+ private readonly handlebarsProcessor;
6
+ private readonly variableSanitizerService;
7
+ private readonly logger;
8
+ private static readonly MAX_TEMPLATE_SIZE;
9
+ constructor(handlebarsProcessor: HandlebarsProcessor, variableSanitizerService: VariableSanitizerService);
10
+ canHandle(value: any): boolean;
11
+ process(content: string, variables: Record<string, any>): any;
12
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var TemplateExpressionHandler_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.TemplateExpressionHandler = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const handlebars_processor_service_1 = require("../handlebars-processor.service");
16
+ const variable_sanitizer_service_1 = require("../variable-sanitizer.service");
17
+ const template_expression_error_1 = require("../../errors/template-expression.error");
18
+ let TemplateExpressionHandler = class TemplateExpressionHandler {
19
+ static { TemplateExpressionHandler_1 = this; }
20
+ handlebarsProcessor;
21
+ variableSanitizerService;
22
+ logger = new common_1.Logger(TemplateExpressionHandler_1.name);
23
+ static MAX_TEMPLATE_SIZE = 50000;
24
+ constructor(handlebarsProcessor, variableSanitizerService) {
25
+ this.handlebarsProcessor = handlebarsProcessor;
26
+ this.variableSanitizerService = variableSanitizerService;
27
+ }
28
+ canHandle(value) {
29
+ return (typeof value === 'string' &&
30
+ value.includes('{{') &&
31
+ value.includes('}}') &&
32
+ !value.trim().startsWith('${{'));
33
+ }
34
+ process(content, variables) {
35
+ try {
36
+ const context = {
37
+ variables,
38
+ depth: 0,
39
+ };
40
+ if (content.length > TemplateExpressionHandler_1.MAX_TEMPLATE_SIZE) {
41
+ throw new template_expression_error_1.TemplateExpressionError('Template too large', 'EVALUATION_ERROR');
42
+ }
43
+ const sanitizedVariables = this.variableSanitizerService.sanitizeVariables(context.variables);
44
+ return this.handlebarsProcessor.render(content, sanitizedVariables);
45
+ }
46
+ catch (error) {
47
+ this.logger.error(`Failed to process template expression: ${error.message}`, {
48
+ expression: content,
49
+ });
50
+ if (error instanceof template_expression_error_1.TemplateExpressionError) {
51
+ throw error;
52
+ }
53
+ throw new template_expression_error_1.TemplateExpressionError('Template expression evaluation failed', 'EVALUATION_ERROR');
54
+ }
55
+ }
56
+ };
57
+ exports.TemplateExpressionHandler = TemplateExpressionHandler;
58
+ exports.TemplateExpressionHandler = TemplateExpressionHandler = TemplateExpressionHandler_1 = __decorate([
59
+ (0, common_1.Injectable)(),
60
+ __metadata("design:paramtypes", [handlebars_processor_service_1.HandlebarsProcessor,
61
+ variable_sanitizer_service_1.VariableSanitizerService])
62
+ ], TemplateExpressionHandler);
63
+ //# sourceMappingURL=template-expression.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-expression.handler.js","sourceRoot":"","sources":["../../../../../src/modules/common/services/expression-handler/template-expression.handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAEpD,kFAAsE;AACtE,8EAAyE;AACzE,sFAAiF;AAQ1E,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;;IAQjB;IACA;IANF,MAAM,GAAG,IAAI,eAAM,CAAC,2BAAyB,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,CAAU,iBAAiB,GAAG,KAAK,CAAC;IAElD,YACmB,mBAAwC,EACxC,wBAAkD;QADlD,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,6BAAwB,GAAxB,wBAAwB,CAA0B;IAClE,CAAC;IAEJ,SAAS,CAAC,KAAU;QAClB,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAChC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,SAA8B;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAsB;gBACjC,SAAS;gBACT,KAAK,EAAE,CAAC;aACT,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,GAAG,2BAAyB,CAAC,iBAAiB,EAAE,CAAC;gBACjE,MAAM,IAAI,mDAAuB,CAC/B,oBAAoB,EACpB,kBAAkB,CACnB,CAAC;YACJ,CAAC;YAED,MAAM,kBAAkB,GACtB,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,0CAA0C,KAAK,CAAC,OAAO,EAAE,EACzD;gBACE,UAAU,EAAE,OAAO;aACpB,CACF,CAAC;YAEF,IAAI,KAAK,YAAY,mDAAuB,EAAE,CAAC;gBAC7C,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,mDAAuB,CAC/B,uCAAuC,EACvC,kBAAkB,CACnB,CAAC;QACJ,CAAC;IACH,CAAC;;AAvDU,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;qCAS6B,kDAAmB;QACd,qDAAwB;GAT1D,yBAAyB,CAwDrC"}
@@ -0,0 +1,9 @@
1
+ export declare class DateFormatterHandlebarsHelperService {
2
+ private readonly MAX_FORMAT_LENGTH;
3
+ private readonly ALLOWED_FORMAT_CHARS;
4
+ private validateFormatString;
5
+ private validateDateInput;
6
+ getCurrentDateHelper(): (...args: any[]) => string;
7
+ getFormatDateHelper(): (...args: any[]) => string;
8
+ getTimeAgoHelper(): (...args: any[]) => string;
9
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DateFormatterHandlebarsHelperService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const date_fns_1 = require("date-fns");
12
+ let DateFormatterHandlebarsHelperService = class DateFormatterHandlebarsHelperService {
13
+ MAX_FORMAT_LENGTH = 100;
14
+ ALLOWED_FORMAT_CHARS = /^[YyMmDdHhSsaAEepdT\s\-\/:.,'"]+$/;
15
+ validateFormatString(formatString) {
16
+ if (!formatString)
17
+ return true;
18
+ if (formatString.length > this.MAX_FORMAT_LENGTH) {
19
+ return false;
20
+ }
21
+ if (!this.ALLOWED_FORMAT_CHARS.test(formatString)) {
22
+ return false;
23
+ }
24
+ return true;
25
+ }
26
+ validateDateInput(date) {
27
+ if (!date)
28
+ return null;
29
+ let dateObj;
30
+ try {
31
+ if (typeof date === 'string') {
32
+ if (date.length > 50)
33
+ return null;
34
+ dateObj = (0, date_fns_1.parseISO)(date);
35
+ }
36
+ else if (typeof date === 'number') {
37
+ if (date < 0 || date > 8640000000000000)
38
+ return null;
39
+ dateObj = new Date(date);
40
+ }
41
+ else if (date instanceof Date) {
42
+ dateObj = date;
43
+ }
44
+ else {
45
+ return null;
46
+ }
47
+ return (0, date_fns_1.isValid)(dateObj) ? dateObj : null;
48
+ }
49
+ catch (error) {
50
+ return null;
51
+ }
52
+ }
53
+ getCurrentDateHelper() {
54
+ return (...args) => {
55
+ const [formatString] = args.slice(0, -1);
56
+ const now = new Date();
57
+ if (!formatString) {
58
+ return now.toISOString();
59
+ }
60
+ if (!this.validateFormatString(formatString)) {
61
+ throw new Error(`Invalid format string blocked: ${formatString}`);
62
+ }
63
+ const presets = {
64
+ iso: 'yyyy-MM-dd',
65
+ short: 'M/d/yyyy',
66
+ long: 'EEEE, MMMM d, yyyy',
67
+ time: 'h:mm a',
68
+ datetime: 'M/d/yyyy h:mm a',
69
+ timestamp: 'T',
70
+ };
71
+ const pattern = presets[formatString.toLowerCase()] || formatString;
72
+ if (pattern === 'T') {
73
+ return now.getTime().toString();
74
+ }
75
+ try {
76
+ return (0, date_fns_1.format)(now, pattern);
77
+ }
78
+ catch (error) {
79
+ throw new Error(`Error Formatting Date: "${pattern}"`);
80
+ }
81
+ };
82
+ }
83
+ getFormatDateHelper() {
84
+ return (...args) => {
85
+ const [date, formatString] = args.slice(0, -1);
86
+ const dateObj = this.validateDateInput(date);
87
+ if (!dateObj) {
88
+ return 'Invalid Date';
89
+ }
90
+ if (!formatString) {
91
+ return dateObj.toISOString();
92
+ }
93
+ if (!this.validateFormatString(formatString)) {
94
+ throw new Error(`Invalid format string blocked: ${formatString}`);
95
+ }
96
+ try {
97
+ return (0, date_fns_1.format)(dateObj, formatString);
98
+ }
99
+ catch (error) {
100
+ throw new Error(`Error Formatting Date "${formatString}"`);
101
+ }
102
+ };
103
+ }
104
+ getTimeAgoHelper() {
105
+ return (...args) => {
106
+ const [date] = args.slice(0, -1);
107
+ const dateObj = this.validateDateInput(date);
108
+ if (!dateObj) {
109
+ throw new Error(`Invalid Date`);
110
+ }
111
+ try {
112
+ return (0, date_fns_1.formatDistanceToNow)(dateObj, { addSuffix: true });
113
+ }
114
+ catch (error) {
115
+ throw new Error(`Invalid Date`);
116
+ }
117
+ };
118
+ }
119
+ };
120
+ exports.DateFormatterHandlebarsHelperService = DateFormatterHandlebarsHelperService;
121
+ exports.DateFormatterHandlebarsHelperService = DateFormatterHandlebarsHelperService = __decorate([
122
+ (0, common_1.Injectable)()
123
+ ], DateFormatterHandlebarsHelperService);
124
+ //# sourceMappingURL=date-formatter-handlebars-helper.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-formatter-handlebars-helper.service.js","sourceRoot":"","sources":["../../../../../src/modules/common/services/handlebars-helpers/date-formatter-handlebars-helper.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './date-formatter-handlebars-helper.service';
@@ -0,0 +1,18 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./date-formatter-handlebars-helper.service"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/common/services/handlebars-helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6EAA2D"}
@@ -0,0 +1,12 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { DateFormatterHandlebarsHelperService } from './handlebars-helpers';
3
+ export declare class HandlebarsProcessor implements OnModuleInit {
4
+ private readonly dateFormatterHandlebarsHelperService;
5
+ private handlebars;
6
+ private allowedHelpers;
7
+ private options;
8
+ private static readonly MAX_TEMPLATE_SIZE;
9
+ constructor(dateFormatterHandlebarsHelperService: DateFormatterHandlebarsHelperService);
10
+ onModuleInit(): void;
11
+ render(content: string, variables: Record<string, any>): string;
12
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ var HandlebarsProcessor_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.HandlebarsProcessor = void 0;
17
+ const handlebars_1 = __importDefault(require("handlebars"));
18
+ const common_1 = require("@nestjs/common");
19
+ const handlebars_helpers_1 = require("./handlebars-helpers");
20
+ let HandlebarsProcessor = class HandlebarsProcessor {
21
+ static { HandlebarsProcessor_1 = this; }
22
+ dateFormatterHandlebarsHelperService;
23
+ handlebars;
24
+ allowedHelpers = {
25
+ if: true,
26
+ else: true,
27
+ unless: true,
28
+ each: true,
29
+ with: false,
30
+ lookup: false,
31
+ currentDate: true,
32
+ formatDate: true,
33
+ timeAgo: true,
34
+ };
35
+ options = {
36
+ strict: false,
37
+ noEscape: true,
38
+ assumeObjects: false,
39
+ preventIndent: true,
40
+ knownHelpers: this.allowedHelpers,
41
+ knownHelpersOnly: true,
42
+ data: false,
43
+ explicitPartialContext: true,
44
+ compat: false,
45
+ ignoreStandalone: false,
46
+ };
47
+ static MAX_TEMPLATE_SIZE = 50000;
48
+ constructor(dateFormatterHandlebarsHelperService) {
49
+ this.dateFormatterHandlebarsHelperService = dateFormatterHandlebarsHelperService;
50
+ }
51
+ onModuleInit() {
52
+ this.handlebars = handlebars_1.default.create();
53
+ this.handlebars.registerHelper('currentDate', this.dateFormatterHandlebarsHelperService.getCurrentDateHelper());
54
+ this.handlebars.registerHelper('formatDate', this.dateFormatterHandlebarsHelperService.getFormatDateHelper());
55
+ this.handlebars.registerHelper('timeAgo', this.dateFormatterHandlebarsHelperService.getTimeAgoHelper());
56
+ }
57
+ render(content, variables) {
58
+ if (content.length > HandlebarsProcessor_1.MAX_TEMPLATE_SIZE) {
59
+ throw new Error(`Template too large`);
60
+ }
61
+ const template = this.handlebars.compile(content, this.options);
62
+ return template(variables);
63
+ }
64
+ };
65
+ exports.HandlebarsProcessor = HandlebarsProcessor;
66
+ exports.HandlebarsProcessor = HandlebarsProcessor = HandlebarsProcessor_1 = __decorate([
67
+ (0, common_1.Injectable)(),
68
+ __metadata("design:paramtypes", [handlebars_helpers_1.DateFormatterHandlebarsHelperService])
69
+ ], HandlebarsProcessor);
70
+ //# sourceMappingURL=handlebars-processor.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlebars-processor.service.js","sourceRoot":"","sources":["../../../../src/modules/common/services/handlebars-processor.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAAoC;AACpC,2CAA0D;AAC1D,6DAA4E;AAGrE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;;IA4EX;IA3EX,UAAU,CAAoB;IAE9B,cAAc,GAAG;QAEvB,EAAE,EAAE,IAAI;QAGR,IAAI,EAAE,IAAI;QAGV,MAAM,EAAE,IAAI;QAGZ,IAAI,EAAE,IAAI;QAIV,IAAI,EAAE,KAAK;QAKX,MAAM,EAAE,KAAK;QAGb,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI;KACd,CAAC;IAEM,OAAO,GAAG;QAGhB,MAAM,EAAE,KAAK;QAIb,QAAQ,EAAE,IAAI;QAId,aAAa,EAAE,KAAK;QAIpB,aAAa,EAAE,IAAI;QAInB,YAAY,EAAE,IAAI,CAAC,cAAc;QAIjC,gBAAgB,EAAE,IAAI;QAItB,IAAI,EAAE,KAAK;QAIX,sBAAsB,EAAE,IAAI;QAI5B,MAAM,EAAE,KAAK;QAIb,gBAAgB,EAAE,KAAK;KACxB,CAAC;IAEM,MAAM,CAAU,iBAAiB,GAAG,KAAK,CAAC;IAElD,YACmB,oCAA0E;QAA1E,yCAAoC,GAApC,oCAAoC,CAAsC;IAC1F,CAAC;IAEJ,YAAY;QACV,IAAI,CAAC,UAAU,GAAG,oBAAU,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,cAAc,CAC5B,aAAa,EACb,IAAI,CAAC,oCAAoC,CAAC,oBAAoB,EAAE,CACjE,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,cAAc,CAC5B,YAAY,EACZ,IAAI,CAAC,oCAAoC,CAAC,mBAAmB,EAAE,CAChE,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,cAAc,CAC5B,SAAS,EACT,IAAI,CAAC,oCAAoC,CAAC,gBAAgB,EAAE,CAC7D,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,OAAe,EAAE,SAA8B;QAC3D,IAAI,OAAO,CAAC,MAAM,GAAG,qBAAmB,CAAC,iBAAiB,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;;AAtGU,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCA6E8C,yDAAoC;GA5ElF,mBAAmB,CAuG/B"}