hazo_notify 1.1.4 → 3.1.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 (236) hide show
  1. package/README.md +163 -41
  2. package/dist/components/template_manager/category_dialog.d.ts +11 -0
  3. package/dist/components/template_manager/category_dialog.d.ts.map +1 -0
  4. package/dist/components/template_manager/category_dialog.js +41 -0
  5. package/dist/components/template_manager/category_dialog.js.map +1 -0
  6. package/dist/components/template_manager/category_tree.d.ts +13 -0
  7. package/dist/components/template_manager/category_tree.d.ts.map +1 -0
  8. package/dist/components/template_manager/category_tree.js +45 -0
  9. package/dist/components/template_manager/category_tree.js.map +1 -0
  10. package/dist/components/template_manager/index.d.ts +10 -0
  11. package/dist/components/template_manager/index.d.ts.map +1 -0
  12. package/dist/components/template_manager/index.js +8 -0
  13. package/dist/components/template_manager/index.js.map +1 -0
  14. package/dist/components/template_manager/preview_dialog.d.ts +11 -0
  15. package/dist/components/template_manager/preview_dialog.d.ts.map +1 -0
  16. package/dist/components/template_manager/preview_dialog.js +15 -0
  17. package/dist/components/template_manager/preview_dialog.js.map +1 -0
  18. package/dist/components/template_manager/template_dialog.d.ts +12 -0
  19. package/dist/components/template_manager/template_dialog.d.ts.map +1 -0
  20. package/dist/components/template_manager/template_dialog.js +46 -0
  21. package/dist/components/template_manager/template_dialog.js.map +1 -0
  22. package/dist/components/template_manager/template_editor.d.ts +12 -0
  23. package/dist/components/template_manager/template_editor.d.ts.map +1 -0
  24. package/dist/components/template_manager/template_editor.js +57 -0
  25. package/dist/components/template_manager/template_editor.js.map +1 -0
  26. package/dist/components/template_manager/template_globals_admin.d.ts +8 -0
  27. package/dist/components/template_manager/template_globals_admin.d.ts.map +1 -0
  28. package/dist/components/template_manager/template_globals_admin.js +27 -0
  29. package/dist/components/template_manager/template_globals_admin.js.map +1 -0
  30. package/dist/components/template_manager/template_manager_admin.d.ts +44 -0
  31. package/dist/components/template_manager/template_manager_admin.d.ts.map +1 -0
  32. package/dist/components/template_manager/template_manager_admin.js +272 -0
  33. package/dist/components/template_manager/template_manager_admin.js.map +1 -0
  34. package/dist/lib/emailer/emailer.d.ts.map +1 -0
  35. package/dist/lib/emailer/emailer.js.map +1 -0
  36. package/dist/lib/emailer/index.d.ts.map +1 -0
  37. package/dist/lib/emailer/index.js.map +1 -0
  38. package/dist/lib/emailer/providers/index.d.ts.map +1 -0
  39. package/dist/lib/emailer/providers/index.js.map +1 -0
  40. package/dist/lib/emailer/providers/pop3_provider.d.ts.map +1 -0
  41. package/dist/lib/emailer/providers/pop3_provider.js.map +1 -0
  42. package/dist/lib/emailer/providers/smtp_provider.d.ts.map +1 -0
  43. package/dist/lib/emailer/providers/smtp_provider.js.map +1 -0
  44. package/dist/lib/emailer/providers/zeptomail_provider.d.ts.map +1 -0
  45. package/dist/{emailer → lib/emailer}/providers/zeptomail_provider.js +9 -6
  46. package/dist/lib/emailer/providers/zeptomail_provider.js.map +1 -0
  47. package/dist/lib/emailer/types.d.ts.map +1 -0
  48. package/dist/lib/emailer/types.js.map +1 -0
  49. package/dist/lib/emailer/utils/constants.d.ts.map +1 -0
  50. package/dist/lib/emailer/utils/constants.js.map +1 -0
  51. package/dist/lib/emailer/utils/index.d.ts.map +1 -0
  52. package/dist/lib/emailer/utils/index.js.map +1 -0
  53. package/dist/lib/emailer/utils/logger.d.ts.map +1 -0
  54. package/dist/lib/emailer/utils/logger.js.map +1 -0
  55. package/dist/lib/emailer/utils/validation.d.ts.map +1 -0
  56. package/dist/lib/emailer/utils/validation.js.map +1 -0
  57. package/dist/lib/index.d.ts.map +1 -0
  58. package/dist/lib/index.js.map +1 -0
  59. package/dist/lib/template_manager/cache/scope_chain_cache.d.ts +26 -0
  60. package/dist/lib/template_manager/cache/scope_chain_cache.d.ts.map +1 -0
  61. package/dist/lib/template_manager/cache/scope_chain_cache.js +60 -0
  62. package/dist/lib/template_manager/cache/scope_chain_cache.js.map +1 -0
  63. package/dist/{template_manager → lib/template_manager}/config/config_loader.d.ts +16 -15
  64. package/dist/lib/template_manager/config/config_loader.d.ts.map +1 -0
  65. package/dist/lib/template_manager/config/config_loader.js +98 -0
  66. package/dist/lib/template_manager/config/config_loader.js.map +1 -0
  67. package/dist/{template_manager → lib/template_manager}/config/constants.d.ts +4 -54
  68. package/dist/lib/template_manager/config/constants.d.ts.map +1 -0
  69. package/dist/{template_manager → lib/template_manager}/config/constants.js +4 -84
  70. package/dist/lib/template_manager/config/constants.js.map +1 -0
  71. package/dist/lib/template_manager/config/index.d.ts.map +1 -0
  72. package/dist/lib/template_manager/config/index.js.map +1 -0
  73. package/dist/{template_manager → lib/template_manager}/db/category_repository.d.ts +22 -14
  74. package/dist/lib/template_manager/db/category_repository.d.ts.map +1 -0
  75. package/dist/{template_manager → lib/template_manager}/db/category_repository.js +127 -83
  76. package/dist/lib/template_manager/db/category_repository.js.map +1 -0
  77. package/dist/lib/template_manager/db/index.d.ts +6 -0
  78. package/dist/lib/template_manager/db/index.d.ts.map +1 -0
  79. package/dist/lib/template_manager/db/index.js +6 -0
  80. package/dist/lib/template_manager/db/index.js.map +1 -0
  81. package/dist/{template_manager → lib/template_manager}/db/template_repository.d.ts +25 -28
  82. package/dist/lib/template_manager/db/template_repository.d.ts.map +1 -0
  83. package/dist/lib/template_manager/db/template_repository.js +507 -0
  84. package/dist/lib/template_manager/db/template_repository.js.map +1 -0
  85. package/dist/lib/template_manager/engine/handlebars_engine.d.ts.map +1 -0
  86. package/dist/lib/template_manager/engine/handlebars_engine.js.map +1 -0
  87. package/dist/lib/template_manager/engine/index.d.ts.map +1 -0
  88. package/dist/lib/template_manager/engine/index.js.map +1 -0
  89. package/dist/{template_manager → lib/template_manager}/engine/variable_resolver.d.ts +13 -14
  90. package/dist/lib/template_manager/engine/variable_resolver.d.ts.map +1 -0
  91. package/dist/{template_manager → lib/template_manager}/engine/variable_resolver.js +25 -33
  92. package/dist/lib/template_manager/engine/variable_resolver.js.map +1 -0
  93. package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts +20 -0
  94. package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts.map +1 -0
  95. package/dist/lib/template_manager/handlers/adapters/hazo_auth.js +46 -0
  96. package/dist/lib/template_manager/handlers/adapters/hazo_auth.js.map +1 -0
  97. package/dist/lib/template_manager/handlers/auth.d.ts +47 -0
  98. package/dist/lib/template_manager/handlers/auth.d.ts.map +1 -0
  99. package/dist/lib/template_manager/handlers/auth.js +67 -0
  100. package/dist/lib/template_manager/handlers/auth.js.map +1 -0
  101. package/dist/lib/template_manager/handlers/index.d.ts +67 -0
  102. package/dist/lib/template_manager/handlers/index.d.ts.map +1 -0
  103. package/dist/lib/template_manager/handlers/index.js +284 -0
  104. package/dist/lib/template_manager/handlers/index.js.map +1 -0
  105. package/dist/lib/template_manager/index.d.ts +56 -0
  106. package/dist/lib/template_manager/index.d.ts.map +1 -0
  107. package/dist/lib/template_manager/index.js +68 -0
  108. package/dist/lib/template_manager/index.js.map +1 -0
  109. package/dist/lib/template_manager/init.d.ts +54 -0
  110. package/dist/lib/template_manager/init.d.ts.map +1 -0
  111. package/dist/lib/template_manager/init.js +85 -0
  112. package/dist/lib/template_manager/init.js.map +1 -0
  113. package/dist/lib/template_manager/registry.d.ts +23 -0
  114. package/dist/lib/template_manager/registry.d.ts.map +1 -0
  115. package/dist/lib/template_manager/registry.js +33 -0
  116. package/dist/lib/template_manager/registry.js.map +1 -0
  117. package/dist/lib/template_manager/seed/sync.d.ts +8 -0
  118. package/dist/lib/template_manager/seed/sync.d.ts.map +1 -0
  119. package/dist/lib/template_manager/seed/sync.js +77 -0
  120. package/dist/lib/template_manager/seed/sync.js.map +1 -0
  121. package/dist/{template_manager → lib/template_manager}/template_manager.d.ts +25 -27
  122. package/dist/lib/template_manager/template_manager.d.ts.map +1 -0
  123. package/dist/{template_manager → lib/template_manager}/template_manager.js +41 -55
  124. package/dist/lib/template_manager/template_manager.js.map +1 -0
  125. package/dist/{template_manager → lib/template_manager}/types.d.ts +32 -125
  126. package/dist/lib/template_manager/types.d.ts.map +1 -0
  127. package/dist/lib/template_manager/types.js +12 -0
  128. package/dist/lib/template_manager/types.js.map +1 -0
  129. package/dist/lib/template_manager/utils/index.d.ts.map +1 -0
  130. package/dist/lib/template_manager/utils/index.js.map +1 -0
  131. package/dist/lib/template_manager/utils/system_variables.d.ts.map +1 -0
  132. package/dist/lib/template_manager/utils/system_variables.js.map +1 -0
  133. package/dist/lib/template_manager/utils/validation.d.ts.map +1 -0
  134. package/dist/lib/template_manager/utils/validation.js.map +1 -0
  135. package/dist/lib/utils.d.ts +3 -0
  136. package/dist/lib/utils.d.ts.map +1 -0
  137. package/dist/lib/utils.js +6 -0
  138. package/dist/lib/utils.js.map +1 -0
  139. package/migrations/002_scope_migration.sql +93 -0
  140. package/package.json +65 -37
  141. package/dist/emailer/emailer.d.ts.map +0 -1
  142. package/dist/emailer/emailer.js.map +0 -1
  143. package/dist/emailer/index.d.ts.map +0 -1
  144. package/dist/emailer/index.js.map +0 -1
  145. package/dist/emailer/providers/index.d.ts.map +0 -1
  146. package/dist/emailer/providers/index.js.map +0 -1
  147. package/dist/emailer/providers/pop3_provider.d.ts.map +0 -1
  148. package/dist/emailer/providers/pop3_provider.js.map +0 -1
  149. package/dist/emailer/providers/smtp_provider.d.ts.map +0 -1
  150. package/dist/emailer/providers/smtp_provider.js.map +0 -1
  151. package/dist/emailer/providers/zeptomail_provider.d.ts.map +0 -1
  152. package/dist/emailer/providers/zeptomail_provider.js.map +0 -1
  153. package/dist/emailer/types.d.ts.map +0 -1
  154. package/dist/emailer/types.js.map +0 -1
  155. package/dist/emailer/utils/constants.d.ts.map +0 -1
  156. package/dist/emailer/utils/constants.js.map +0 -1
  157. package/dist/emailer/utils/index.d.ts.map +0 -1
  158. package/dist/emailer/utils/index.js.map +0 -1
  159. package/dist/emailer/utils/logger.d.ts.map +0 -1
  160. package/dist/emailer/utils/logger.js.map +0 -1
  161. package/dist/emailer/utils/validation.d.ts.map +0 -1
  162. package/dist/emailer/utils/validation.js.map +0 -1
  163. package/dist/index.d.ts.map +0 -1
  164. package/dist/index.js.map +0 -1
  165. package/dist/template_manager/config/config_loader.d.ts.map +0 -1
  166. package/dist/template_manager/config/config_loader.js +0 -154
  167. package/dist/template_manager/config/config_loader.js.map +0 -1
  168. package/dist/template_manager/config/constants.d.ts.map +0 -1
  169. package/dist/template_manager/config/constants.js.map +0 -1
  170. package/dist/template_manager/config/index.d.ts.map +0 -1
  171. package/dist/template_manager/config/index.js.map +0 -1
  172. package/dist/template_manager/db/category_repository.d.ts.map +0 -1
  173. package/dist/template_manager/db/category_repository.js.map +0 -1
  174. package/dist/template_manager/db/index.d.ts +0 -6
  175. package/dist/template_manager/db/index.d.ts.map +0 -1
  176. package/dist/template_manager/db/index.js +0 -6
  177. package/dist/template_manager/db/index.js.map +0 -1
  178. package/dist/template_manager/db/template_repository.d.ts.map +0 -1
  179. package/dist/template_manager/db/template_repository.js +0 -674
  180. package/dist/template_manager/db/template_repository.js.map +0 -1
  181. package/dist/template_manager/engine/handlebars_engine.d.ts.map +0 -1
  182. package/dist/template_manager/engine/handlebars_engine.js.map +0 -1
  183. package/dist/template_manager/engine/index.d.ts.map +0 -1
  184. package/dist/template_manager/engine/index.js.map +0 -1
  185. package/dist/template_manager/engine/variable_resolver.d.ts.map +0 -1
  186. package/dist/template_manager/engine/variable_resolver.js.map +0 -1
  187. package/dist/template_manager/index.d.ts +0 -32
  188. package/dist/template_manager/index.d.ts.map +0 -1
  189. package/dist/template_manager/index.js +0 -41
  190. package/dist/template_manager/index.js.map +0 -1
  191. package/dist/template_manager/template_manager.d.ts.map +0 -1
  192. package/dist/template_manager/template_manager.js.map +0 -1
  193. package/dist/template_manager/types.d.ts.map +0 -1
  194. package/dist/template_manager/types.js +0 -11
  195. package/dist/template_manager/types.js.map +0 -1
  196. package/dist/template_manager/utils/index.d.ts.map +0 -1
  197. package/dist/template_manager/utils/index.js.map +0 -1
  198. package/dist/template_manager/utils/system_variables.d.ts.map +0 -1
  199. package/dist/template_manager/utils/system_variables.js.map +0 -1
  200. package/dist/template_manager/utils/validation.d.ts.map +0 -1
  201. package/dist/template_manager/utils/validation.js.map +0 -1
  202. /package/dist/{emailer → lib/emailer}/emailer.d.ts +0 -0
  203. /package/dist/{emailer → lib/emailer}/emailer.js +0 -0
  204. /package/dist/{emailer → lib/emailer}/index.d.ts +0 -0
  205. /package/dist/{emailer → lib/emailer}/index.js +0 -0
  206. /package/dist/{emailer → lib/emailer}/providers/index.d.ts +0 -0
  207. /package/dist/{emailer → lib/emailer}/providers/index.js +0 -0
  208. /package/dist/{emailer → lib/emailer}/providers/pop3_provider.d.ts +0 -0
  209. /package/dist/{emailer → lib/emailer}/providers/pop3_provider.js +0 -0
  210. /package/dist/{emailer → lib/emailer}/providers/smtp_provider.d.ts +0 -0
  211. /package/dist/{emailer → lib/emailer}/providers/smtp_provider.js +0 -0
  212. /package/dist/{emailer → lib/emailer}/providers/zeptomail_provider.d.ts +0 -0
  213. /package/dist/{emailer → lib/emailer}/types.d.ts +0 -0
  214. /package/dist/{emailer → lib/emailer}/types.js +0 -0
  215. /package/dist/{emailer → lib/emailer}/utils/constants.d.ts +0 -0
  216. /package/dist/{emailer → lib/emailer}/utils/constants.js +0 -0
  217. /package/dist/{emailer → lib/emailer}/utils/index.d.ts +0 -0
  218. /package/dist/{emailer → lib/emailer}/utils/index.js +0 -0
  219. /package/dist/{emailer → lib/emailer}/utils/logger.d.ts +0 -0
  220. /package/dist/{emailer → lib/emailer}/utils/logger.js +0 -0
  221. /package/dist/{emailer → lib/emailer}/utils/validation.d.ts +0 -0
  222. /package/dist/{emailer → lib/emailer}/utils/validation.js +0 -0
  223. /package/dist/{index.d.ts → lib/index.d.ts} +0 -0
  224. /package/dist/{index.js → lib/index.js} +0 -0
  225. /package/dist/{template_manager → lib/template_manager}/config/index.d.ts +0 -0
  226. /package/dist/{template_manager → lib/template_manager}/config/index.js +0 -0
  227. /package/dist/{template_manager → lib/template_manager}/engine/handlebars_engine.d.ts +0 -0
  228. /package/dist/{template_manager → lib/template_manager}/engine/handlebars_engine.js +0 -0
  229. /package/dist/{template_manager → lib/template_manager}/engine/index.d.ts +0 -0
  230. /package/dist/{template_manager → lib/template_manager}/engine/index.js +0 -0
  231. /package/dist/{template_manager → lib/template_manager}/utils/index.d.ts +0 -0
  232. /package/dist/{template_manager → lib/template_manager}/utils/index.js +0 -0
  233. /package/dist/{template_manager → lib/template_manager}/utils/system_variables.d.ts +0 -0
  234. /package/dist/{template_manager → lib/template_manager}/utils/system_variables.js +0 -0
  235. /package/dist/{template_manager → lib/template_manager}/utils/validation.d.ts +0 -0
  236. /package/dist/{template_manager → lib/template_manager}/utils/validation.js +0 -0
@@ -1,16 +1,16 @@
1
1
  /**
2
- * Variable resolver for template manager
2
+ * Variable resolver for template manager (v2.0.0)
3
3
  *
4
- * Resolves user variables, system variables, and @template references
4
+ * Resolves user variables, system variables, and @template references.
5
+ * Uses scope_chain (hierarchical scope resolution) instead of org_id.
5
6
  */
6
7
  import { TEMPLATE_REFERENCE_PATTERN, MAX_TEMPLATE_REFERENCE_DEPTH, ERROR_MESSAGES, } from '../config/constants.js';
7
8
  import { resolve_system_variables } from '../utils/system_variables.js';
8
9
  import { get_template_by_name } from '../db/template_repository.js';
9
10
  import { render_handlebars_string } from './handlebars_engine.js';
10
11
  /**
11
- * Merge user variables with system variables
12
- *
13
- * System variables take lower priority than user variables
12
+ * Merge user variables with system variables.
13
+ * System variables take lower priority than user variables.
14
14
  *
15
15
  * @param user_variables - Variables provided by user
16
16
  * @returns Merged variables with system variables
@@ -23,7 +23,7 @@ export function resolve_variables(user_variables) {
23
23
  };
24
24
  }
25
25
  /**
26
- * Extract @template references from content
26
+ * Extract @template references from content.
27
27
  *
28
28
  * @param content - Template content to scan
29
29
  * @returns Array of template names referenced
@@ -42,21 +42,19 @@ export function extract_template_references(content) {
42
42
  return Array.from(references);
43
43
  }
44
44
  /**
45
- * Resolve @template references in content
46
- *
47
- * Recursively fetches and renders referenced templates
45
+ * Resolve @template references in HTML content.
46
+ * Recursively fetches and renders referenced templates using the scope_chain.
48
47
  *
49
48
  * @param content - Template content with @references
50
49
  * @param variables - Variables to use for rendering
51
50
  * @param hazo_connect - Database connection
52
- * @param org_id - Organization ID
51
+ * @param scope_chain - Ordered scope chain, deepest first (see get_template_by_name)
53
52
  * @param visited - Set of already visited templates (for circular detection)
54
53
  * @param depth - Current recursion depth
55
54
  * @returns Resolved content with references replaced
56
55
  */
57
- export async function resolve_template_references(content, variables, hazo_connect, org_id, visited = new Set(), depth = 0) {
56
+ export async function resolve_template_references(content, variables, hazo_connect, scope_chain, visited = new Set(), depth = 0) {
58
57
  try {
59
- // Check max depth
60
58
  if (depth > MAX_TEMPLATE_REFERENCE_DEPTH) {
61
59
  return {
62
60
  success: false,
@@ -74,7 +72,6 @@ export async function resolve_template_references(content, variables, hazo_conne
74
72
  }
75
73
  let resolved_content = content;
76
74
  for (const ref_name of references) {
77
- // Check for circular reference
78
75
  if (visited.has(ref_name)) {
79
76
  return {
80
77
  success: false,
@@ -82,22 +79,18 @@ export async function resolve_template_references(content, variables, hazo_conne
82
79
  message: `Circular reference detected: ${ref_name}`,
83
80
  };
84
81
  }
85
- // Fetch the referenced template
86
- const template_result = await get_template_by_name(hazo_connect, org_id, ref_name);
82
+ const template_result = await get_template_by_name(hazo_connect, scope_chain, ref_name);
87
83
  if (!template_result.success || !template_result.data) {
88
- // Template not found, leave reference as-is
84
+ // Template not found leave reference as-is
89
85
  continue;
90
86
  }
91
87
  const template = template_result.data;
92
88
  visited.add(ref_name);
93
- // Recursively resolve any references in the fetched template
94
- const nested_result = await resolve_template_references(template.template_html, variables, hazo_connect, org_id, new Set(visited), depth + 1);
89
+ const nested_result = await resolve_template_references(template.template_html, variables, hazo_connect, scope_chain, new Set(visited), depth + 1);
95
90
  if (!nested_result.success) {
96
91
  return nested_result;
97
92
  }
98
- // Render the fetched template with variables
99
93
  const rendered_ref = render_handlebars_string(nested_result.rendered_html || template.template_html, variables);
100
- // Replace the @reference with rendered content
101
94
  const ref_pattern = new RegExp(`@${ref_name}\\b`, 'g');
102
95
  resolved_content = resolved_content.replace(ref_pattern, rendered_ref);
103
96
  }
@@ -117,24 +110,24 @@ export async function resolve_template_references(content, variables, hazo_conne
117
110
  }
118
111
  }
119
112
  /**
120
- * Resolve @template references for both HTML and text content
113
+ * Resolve @template references for both HTML and text content.
121
114
  *
122
115
  * @param html_content - HTML template content
123
116
  * @param text_content - Text template content
124
117
  * @param variables - Variables for rendering
125
118
  * @param hazo_connect - Database connection
126
- * @param org_id - Organization ID
119
+ * @param scope_chain - Ordered scope chain, deepest first
127
120
  * @returns Resolved HTML and text content
128
121
  */
129
- export async function resolve_all_template_references(html_content, text_content, variables, hazo_connect, org_id) {
122
+ export async function resolve_all_template_references(html_content, text_content, variables, hazo_connect, scope_chain) {
130
123
  try {
131
- // Resolve HTML references
132
- const html_result = await resolve_template_references(html_content, variables, hazo_connect, org_id);
124
+ const [html_result, text_result] = await Promise.all([
125
+ resolve_template_references(html_content, variables, hazo_connect, scope_chain),
126
+ resolve_text_template_references(text_content, variables, hazo_connect, scope_chain),
127
+ ]);
133
128
  if (!html_result.success) {
134
129
  return html_result;
135
130
  }
136
- // Resolve text references (fetch text version of templates)
137
- const text_result = await resolve_text_template_references(text_content, variables, hazo_connect, org_id);
138
131
  if (!text_result.success) {
139
132
  return text_result;
140
133
  }
@@ -155,10 +148,10 @@ export async function resolve_all_template_references(html_content, text_content
155
148
  }
156
149
  }
157
150
  /**
158
- * Resolve @template references in text content
159
- * Uses template_text instead of template_html
151
+ * Resolve @template references in text content.
152
+ * Uses template_text instead of template_html.
160
153
  */
161
- async function resolve_text_template_references(content, variables, hazo_connect, org_id, visited = new Set(), depth = 0) {
154
+ async function resolve_text_template_references(content, variables, hazo_connect, scope_chain, visited = new Set(), depth = 0) {
162
155
  try {
163
156
  if (depth > MAX_TEMPLATE_REFERENCE_DEPTH) {
164
157
  return {
@@ -184,14 +177,13 @@ async function resolve_text_template_references(content, variables, hazo_connect
184
177
  message: `Circular reference detected: ${ref_name}`,
185
178
  };
186
179
  }
187
- const template_result = await get_template_by_name(hazo_connect, org_id, ref_name);
180
+ const template_result = await get_template_by_name(hazo_connect, scope_chain, ref_name);
188
181
  if (!template_result.success || !template_result.data) {
189
182
  continue;
190
183
  }
191
184
  const template = template_result.data;
192
185
  visited.add(ref_name);
193
- // Recursively resolve text template references
194
- const nested_result = await resolve_text_template_references(template.template_text, variables, hazo_connect, org_id, new Set(visited), depth + 1);
186
+ const nested_result = await resolve_text_template_references(template.template_text, variables, hazo_connect, scope_chain, new Set(visited), depth + 1);
195
187
  if (!nested_result.success) {
196
188
  return nested_result;
197
189
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable_resolver.js","sourceRoot":"","sources":["../../../../src/lib/template_manager/engine/variable_resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Convenience adapter wiring hazo_auth's `hazo_get_tenant_auth` into the
3
+ * template-manager auth wrapper.
4
+ *
5
+ * hazo_auth is dynamic-imported so it stays an OPTIONAL peer dependency of
6
+ * hazo_notify — apps that authenticate differently can implement
7
+ * `TemplateManagerAuthAdapter` themselves without installing hazo_auth.
8
+ */
9
+ import 'server-only';
10
+ import type { TemplateManagerAuthAdapter } from '../auth.js';
11
+ export interface CreateHazoAuthAdapterOptions {
12
+ scoped_permission?: string;
13
+ global_permission?: string;
14
+ }
15
+ /**
16
+ * Resolve the hazo_auth adapter. Throws a clear error if hazo_auth is not
17
+ * installed in the consuming app.
18
+ */
19
+ export declare function create_hazo_auth_adapter(options?: CreateHazoAuthAdapterOptions): Promise<TemplateManagerAuthAdapter>;
20
+ //# sourceMappingURL=hazo_auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_auth.d.ts","sourceRoot":"","sources":["../../../../../src/lib/template_manager/handlers/adapters/hazo_auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAWD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CAiCrC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Convenience adapter wiring hazo_auth's `hazo_get_tenant_auth` into the
3
+ * template-manager auth wrapper.
4
+ *
5
+ * hazo_auth is dynamic-imported so it stays an OPTIONAL peer dependency of
6
+ * hazo_notify — apps that authenticate differently can implement
7
+ * `TemplateManagerAuthAdapter` themselves without installing hazo_auth.
8
+ */
9
+ import 'server-only';
10
+ // hazo_auth re-exports template_manager types from hazo_notify itself. Resolving
11
+ // the import path statically would make tsc follow that chain back through the
12
+ // workspace symlink to this package's own dist/.d.ts files, triggering TS5055
13
+ // "would overwrite input file" errors on every rebuild after the first. We
14
+ // defeat constant-folding by passing the spec through a variable that's only
15
+ // computed at runtime — tsc treats it as `Promise<any>` and never resolves the
16
+ // types, while Node still imports it normally at the consumer site.
17
+ const HAZO_AUTH_PKG = ['hazo_auth', 'server-lib'].join('/');
18
+ /**
19
+ * Resolve the hazo_auth adapter. Throws a clear error if hazo_auth is not
20
+ * installed in the consuming app.
21
+ */
22
+ export async function create_hazo_auth_adapter(options) {
23
+ let mod;
24
+ try {
25
+ mod = (await import(HAZO_AUTH_PKG));
26
+ }
27
+ catch (err) {
28
+ throw new Error("hazo_notify/template_manager_handlers/hazo_auth requires the optional peer 'hazo_auth' to be installed. Install it or supply a custom TemplateManagerAuthAdapter.");
29
+ }
30
+ const hazo_get_tenant_auth = mod.hazo_get_tenant_auth;
31
+ return {
32
+ scoped_permission: options?.scoped_permission ?? 'notify_templates_admin',
33
+ global_permission: options?.global_permission ?? 'notify_templates_super_admin',
34
+ resolve: async (request, required_permission) => {
35
+ const r = (await hazo_get_tenant_auth(request, {
36
+ required_permissions: [required_permission],
37
+ }));
38
+ return {
39
+ authenticated: r.authenticated,
40
+ permission_ok: r.permission_ok,
41
+ organization_id: r.organization_id ?? null,
42
+ };
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=hazo_auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_auth.js","sourceRoot":"","sources":["../../../../../src/lib/template_manager/handlers/adapters/hazo_auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,aAAa,CAAC;AASrB,iFAAiF;AACjF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAsC;IAEtC,IAAI,GAAuE,CAAC;IAC5E,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAEjC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mKAAmK,CACpK,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,GAAG,CAAC,oBAAoB,CAAC;IAEtD,OAAO;QACL,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,wBAAwB;QACzE,iBAAiB,EACf,OAAO,EAAE,iBAAiB,IAAI,8BAA8B;QAC9D,OAAO,EAAE,KAAK,EAAE,OAAoB,EAAE,mBAA2B,EAAE,EAAE;YACnE,MAAM,CAAC,GAAG,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE;gBAC7C,oBAAoB,EAAE,CAAC,mBAAmB,CAAC;aAC5C,CAAC,CAID,CAAC;YACF,OAAO;gBACL,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;aAC3C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Pluggable auth wrapper for the template-manager admin route handlers.
3
+ *
4
+ * The wrapper resolves whether the request is in "global" view (`?view=global`)
5
+ * or scoped (per-tenant), checks the matching permission via the supplied
6
+ * `TemplateManagerAuthAdapter`, and on success calls the wrapped handler with
7
+ * `{ scope_id, is_global }` and any URL params.
8
+ *
9
+ * hazo_notify intentionally has NO direct dependency on hazo_auth — consumers
10
+ * supply an adapter. A convenience adapter for hazo_auth ships at
11
+ * `hazo_notify/template_manager_handlers/hazo_auth` (dynamic-imported, so
12
+ * apps that don't use hazo_auth aren't forced to install it).
13
+ */
14
+ import 'server-only';
15
+ import { NextRequest, NextResponse } from 'next/server';
16
+ export interface TemplateManagerAuth {
17
+ scope_id: string | null;
18
+ is_global: boolean;
19
+ }
20
+ export interface TemplateManagerAuthAdapterResult {
21
+ authenticated: boolean;
22
+ permission_ok: boolean;
23
+ organization_id?: string | null;
24
+ }
25
+ export interface TemplateManagerAuthAdapter {
26
+ /**
27
+ * Resolve auth for the request against the named permission. Mirrors the
28
+ * shape of hazo_auth's `hazo_get_tenant_auth`.
29
+ */
30
+ resolve: (request: NextRequest, required_permission: string) => Promise<TemplateManagerAuthAdapterResult>;
31
+ /** Permission required for scoped (per-tenant) admin. */
32
+ scoped_permission: string;
33
+ /** Permission required for global (super-admin) admin. */
34
+ global_permission: string;
35
+ }
36
+ export type TemplateManagerHandler<P = Record<string, never>> = (request: NextRequest, auth: TemplateManagerAuth, params: P) => Promise<NextResponse>;
37
+ interface RouteContext<P> {
38
+ params: P | Promise<P>;
39
+ }
40
+ /**
41
+ * Build a `with_template_auth` higher-order handler bound to the supplied
42
+ * adapter and CORS headers. The returned function wraps a route handler
43
+ * with auth, scope resolution and consistent error responses.
44
+ */
45
+ export declare function create_with_template_auth(adapter: TemplateManagerAuthAdapter, cors_headers?: HeadersInit): <P = Record<string, never>>(handler: TemplateManagerHandler<P>) => (request: NextRequest, context?: RouteContext<P>) => Promise<NextResponse>;
46
+ export {};
47
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/template_manager/handlers/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,OAAO,EAAE,CACP,OAAO,EAAE,WAAW,EACpB,mBAAmB,EAAE,MAAM,KACxB,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAC9D,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,UAAU,YAAY,CAAC,CAAC;IACtB,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxB;AAgBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,EACnC,YAAY,GAAE,WAAgB,IAKK,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC1D,SAAS,sBAAsB,CAAC,CAAC,CAAC,MAGhC,SAAS,WAAW,EACpB,UAAU,YAAY,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,YAAY,CAAC,CAoC3B"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Pluggable auth wrapper for the template-manager admin route handlers.
3
+ *
4
+ * The wrapper resolves whether the request is in "global" view (`?view=global`)
5
+ * or scoped (per-tenant), checks the matching permission via the supplied
6
+ * `TemplateManagerAuthAdapter`, and on success calls the wrapped handler with
7
+ * `{ scope_id, is_global }` and any URL params.
8
+ *
9
+ * hazo_notify intentionally has NO direct dependency on hazo_auth — consumers
10
+ * supply an adapter. A convenience adapter for hazo_auth ships at
11
+ * `hazo_notify/template_manager_handlers/hazo_auth` (dynamic-imported, so
12
+ * apps that don't use hazo_auth aren't forced to install it).
13
+ */
14
+ import 'server-only';
15
+ import { NextResponse } from 'next/server';
16
+ async function resolve_params(context) {
17
+ if (!context)
18
+ return {};
19
+ const p = context.params;
20
+ return (p && typeof p.then === 'function'
21
+ ? await p
22
+ : p);
23
+ }
24
+ function is_global_view(request) {
25
+ return new URL(request.url).searchParams.get('view') === 'global';
26
+ }
27
+ /**
28
+ * Build a `with_template_auth` higher-order handler bound to the supplied
29
+ * adapter and CORS headers. The returned function wraps a route handler
30
+ * with auth, scope resolution and consistent error responses.
31
+ */
32
+ export function create_with_template_auth(adapter, cors_headers = {}) {
33
+ const unauth = (status, body) => NextResponse.json(body, { status, headers: cors_headers });
34
+ return function with_template_auth(handler) {
35
+ return async (request, context) => {
36
+ const params = await resolve_params(context);
37
+ const is_global = is_global_view(request);
38
+ const required = is_global
39
+ ? adapter.global_permission
40
+ : adapter.scoped_permission;
41
+ const auth_result = await adapter.resolve(request, required);
42
+ if (!auth_result.authenticated) {
43
+ return unauth(401, {
44
+ error: 'Authentication required',
45
+ code: 'UNAUTHENTICATED',
46
+ });
47
+ }
48
+ if (!auth_result.permission_ok) {
49
+ return unauth(403, {
50
+ error: 'Insufficient permissions',
51
+ code: 'FORBIDDEN',
52
+ });
53
+ }
54
+ const scope_id = is_global
55
+ ? null
56
+ : auth_result.organization_id ?? null;
57
+ if (!is_global && !scope_id) {
58
+ return unauth(403, {
59
+ error: 'Organization context required',
60
+ code: 'TENANT_REQUIRED',
61
+ });
62
+ }
63
+ return handler(request, { scope_id, is_global }, params);
64
+ };
65
+ };
66
+ }
67
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/lib/template_manager/handlers/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAsCxD,KAAK,UAAU,cAAc,CAC3B,OAAoC;IAEpC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAO,CAAC;IAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,OAAO,CAAC,CAAC,IAAI,OAAQ,CAAgB,CAAC,IAAI,KAAK,UAAU;QACvD,CAAC,CAAC,MAAM,CAAC;QACT,CAAC,CAAC,CAAC,CAAM,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,OAAoB;IAC1C,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAmC,EACnC,eAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,IAA6B,EAAE,EAAE,CAC/D,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAE7D,OAAO,SAAS,kBAAkB,CAChC,OAAkC;QAElC,OAAO,KAAK,EACV,OAAoB,EACpB,OAAyB,EACF,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,OAAO,CAAC,iBAAiB;gBAC3B,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAE9B,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE7D,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,yBAAyB;oBAChC,IAAI,EAAE,iBAAiB;iBACxB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,0BAA0B;oBACjC,IAAI,EAAE,WAAW;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,WAAW,CAAC,eAAe,IAAI,IAAI,CAAC;YAExC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,+BAA+B;oBACtC,IAAI,EAAE,iBAAiB;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Mountable route-handler factory for the template-manager admin UI.
3
+ *
4
+ * v3.1.0 lifts the test-app's route handlers + auth wrapper into a single
5
+ * factory that consumers wire up with three lines:
6
+ *
7
+ * ```ts
8
+ * // app/api/template_manager/[...path]/route.ts
9
+ * import { create_template_manager_handlers } from 'hazo_notify/template_manager_handlers';
10
+ * import { create_hazo_auth_adapter } from 'hazo_notify/template_manager_handlers/hazo_auth';
11
+ * import { get_db } from '@/lib/db';
12
+ *
13
+ * export const dynamic = 'force-dynamic';
14
+ *
15
+ * const handlers = create_template_manager_handlers({
16
+ * hazo_connect_factory: () => get_db(),
17
+ * auth: await create_hazo_auth_adapter(),
18
+ * });
19
+ *
20
+ * export const { GET, POST, PUT, PATCH, DELETE, OPTIONS } = handlers;
21
+ * ```
22
+ *
23
+ * Routes handled (relative to mount point):
24
+ * GET /categories list categories
25
+ * POST /categories create category
26
+ * GET /categories/:id get category
27
+ * PUT /categories/:id update category (PATCH alias)
28
+ * DELETE /categories/:id delete category
29
+ * GET /templates list templates (?category_id filters)
30
+ * POST /templates create template
31
+ * GET /templates/:id get template
32
+ * PUT /templates/:id update template (PATCH alias)
33
+ * DELETE /templates/:id delete template
34
+ * GET /types list registered template types
35
+ */
36
+ import 'server-only';
37
+ import { NextRequest, NextResponse } from 'next/server';
38
+ import type { HazoConnectInstance } from '../types.js';
39
+ import { type TemplateManagerAuthAdapter } from './auth.js';
40
+ export type { TemplateManagerAuth, TemplateManagerAuthAdapter, TemplateManagerAuthAdapterResult, TemplateManagerHandler, } from './auth.js';
41
+ export { create_with_template_auth } from './auth.js';
42
+ export interface TemplateManagerHandlersOptions {
43
+ /**
44
+ * Returns the hazo_connect instance to use for this request. Called per
45
+ * request so the consumer can short-circuit to a singleton or per-request
46
+ * connection as appropriate.
47
+ */
48
+ hazo_connect_factory: () => Promise<HazoConnectInstance> | HazoConnectInstance;
49
+ /** Auth adapter (see `create_hazo_auth_adapter` for the hazo_auth default). */
50
+ auth: TemplateManagerAuthAdapter;
51
+ /**
52
+ * CORS headers to attach to every response. Defaults to building from
53
+ * `cors_allowed_origins` in `hazo_notify_config.ini` (wildcard if missing).
54
+ * Pass a function to recompute per request.
55
+ */
56
+ cors_headers?: HeadersInit | (() => HeadersInit);
57
+ }
58
+ export interface TemplateManagerHandlers {
59
+ GET: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
60
+ POST: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
61
+ PUT: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
62
+ PATCH: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
63
+ DELETE: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
64
+ OPTIONS: () => Promise<NextResponse>;
65
+ }
66
+ export declare function create_template_manager_handlers(options: TemplateManagerHandlersOptions): TemplateManagerHandlers;
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/template_manager/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,WAAW,CAAC;AAEnB,YAAY,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAKtD,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,oBAAoB,EAAE,MAClB,OAAO,CAAC,mBAAmB,CAAC,GAC5B,mBAAmB,CAAC;IACxB,+EAA+E;IAC/E,IAAI,EAAE,0BAA0B,CAAC;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACvE,OAAO,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;CACtC;AAmCD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,8BAA8B,GACtC,uBAAuB,CAmRzB"}