@hed-hog/core 0.0.400 → 0.0.402
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-log/access-log.interceptor.d.ts +10 -0
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +15 -1
- package/dist/access-log/access-log.interceptor.js.map +1 -1
- package/dist/ai/ai.controller.d.ts +2 -0
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.service.d.ts +86 -2
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +304 -23
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +3 -0
- package/dist/core.module.js.map +1 -1
- package/dist/document-kit/document-kit.module.d.ts +3 -0
- package/dist/document-kit/document-kit.module.d.ts.map +1 -0
- package/dist/document-kit/document-kit.module.js +24 -0
- package/dist/document-kit/document-kit.module.js.map +1 -0
- package/dist/document-kit/document-kit.registry.d.ts +55 -0
- package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
- package/dist/document-kit/document-kit.registry.js +91 -0
- package/dist/document-kit/document-kit.registry.js.map +1 -0
- package/dist/document-kit/document-kit.service.d.ts +49 -0
- package/dist/document-kit/document-kit.service.d.ts.map +1 -0
- package/dist/document-kit/document-kit.service.js +135 -0
- package/dist/document-kit/document-kit.service.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +1 -1
- package/dist/file/file.controller.d.ts +3 -3
- package/dist/file/file.service.d.ts +136 -13
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +297 -27
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -1
- package/dist/file/mcp-file-source.schema.js +8 -5
- package/dist/file/mcp-file-source.schema.js.map +1 -1
- package/dist/file/provider/abstract.provider.d.ts +33 -0
- package/dist/file/provider/abstract.provider.d.ts.map +1 -1
- package/dist/file/provider/abstract.provider.js +9 -0
- package/dist/file/provider/abstract.provider.js.map +1 -1
- package/dist/file/provider/s3-multipart.util.d.ts +17 -0
- package/dist/file/provider/s3-multipart.util.d.ts.map +1 -0
- package/dist/file/provider/s3-multipart.util.js +88 -0
- package/dist/file/provider/s3-multipart.util.js.map +1 -0
- package/dist/file/provider/s3.provider.d.ts +9 -1
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +16 -0
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts +10 -1
- package/dist/file/provider/spaces.provider.d.ts.map +1 -1
- package/dist/file/provider/spaces.provider.js +17 -0
- package/dist/file/provider/spaces.provider.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.controller.d.ts +1 -0
- package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +26 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +1 -0
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +3 -3
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/ai.testers.js +46 -8
- package/dist/integration-profile/testers/ai.testers.js.map +1 -1
- package/dist/integration-profile/testers/http-probe.d.ts.map +1 -1
- package/dist/integration-profile/testers/http-probe.js +5 -3
- package/dist/integration-profile/testers/http-probe.js.map +1 -1
- package/dist/integration-profile/testers/integration-tester.types.d.ts +5 -0
- package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -1
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +16 -1
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +10 -1
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +2 -0
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-files.mcp-tools.js +4 -4
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +72 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
- package/dist/oauth/oauth-token-broker.service.js +105 -3
- package/dist/oauth/oauth-token-broker.service.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +30 -4
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
- package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-bar.js +117 -0
- package/dist/pdf/document/charts/chart-bar.js.map +1 -0
- package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
- package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-donut.js +89 -0
- package/dist/pdf/document/charts/chart-donut.js.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.js +60 -0
- package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
- package/dist/pdf/document/charts/chart-line.d.ts +29 -0
- package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-line.js +89 -0
- package/dist/pdf/document/charts/chart-line.js.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.js +110 -0
- package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
- package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
- package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-radar.js +83 -0
- package/dist/pdf/document/charts/chart-radar.js.map +1 -0
- package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
- package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-scale.js +118 -0
- package/dist/pdf/document/charts/chart-scale.js.map +1 -0
- package/dist/pdf/document/charts/index.d.ts +8 -0
- package/dist/pdf/document/charts/index.d.ts.map +1 -0
- package/dist/pdf/document/charts/index.js +24 -0
- package/dist/pdf/document/charts/index.js.map +1 -0
- package/dist/pdf/document/index.d.ts +8 -0
- package/dist/pdf/document/index.d.ts.map +1 -0
- package/dist/pdf/document/index.js +24 -0
- package/dist/pdf/document/index.js.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.js +36 -0
- package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
- package/dist/pdf/document/pdf-document.css.d.ts +20 -0
- package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.css.js +327 -0
- package/dist/pdf/document/pdf-document.css.js.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.js +226 -0
- package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
- package/dist/pdf/document/pdf-document.service.d.ts +27 -0
- package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.service.js +81 -0
- package/dist/pdf/document/pdf-document.service.js.map +1 -0
- package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
- package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.theme.js +105 -0
- package/dist/pdf/document/pdf-document.theme.js.map +1 -0
- package/dist/pdf/document/pdf-document.types.d.ts +164 -0
- package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.types.js +18 -0
- package/dist/pdf/document/pdf-document.types.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -1
- package/dist/pdf/pdf.module.js +3 -2
- package/dist/pdf/pdf.module.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +75 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +167 -63
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
- package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
- package/dist/pdf/templates/commercial-proposal.template.js +276 -0
- package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
- package/dist/setting/favicon.controller.d.ts +26 -0
- package/dist/setting/favicon.controller.d.ts.map +1 -0
- package/dist/setting/favicon.controller.js +130 -0
- package/dist/setting/favicon.controller.js.map +1 -0
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +2 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +3 -0
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +6 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +44 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +35 -2
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +107 -22
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/route.yaml +8 -0
- package/hedhog/data/setting_group.yaml +52 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +85 -2
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +576 -491
- package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +29 -50
- package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +146 -50
- package/hedhog/frontend/messages/en.json +81 -2
- package/hedhog/frontend/messages/pt.json +81 -2
- package/hedhog/table/file.yaml +3 -1
- package/package.json +5 -5
- package/src/access-log/access-log.interceptor.spec.ts +50 -0
- package/src/access-log/access-log.interceptor.ts +18 -0
- package/src/ai/ai-attachment.fragments.spec.ts +56 -3
- package/src/ai/ai.service.responses.spec.ts +429 -0
- package/src/ai/ai.service.ts +409 -27
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
- package/src/core.module.ts +3 -0
- package/src/document-kit/document-kit.module.ts +12 -0
- package/src/document-kit/document-kit.registry.ts +125 -0
- package/src/document-kit/document-kit.service.spec.ts +156 -0
- package/src/document-kit/document-kit.service.ts +173 -0
- package/src/file/file-direct-upload.spec.ts +344 -0
- package/src/file/file.service.spec.ts +168 -1
- package/src/file/file.service.ts +435 -36
- package/src/file/mcp-file-source.schema.ts +8 -5
- package/src/file/provider/abstract.provider.ts +57 -0
- package/src/file/provider/s3-multipart.spec.ts +123 -0
- package/src/file/provider/s3-multipart.util.ts +126 -0
- package/src/file/provider/s3.provider.ts +65 -1
- package/src/file/provider/spaces.provider.ts +67 -1
- package/src/index.ts +5 -0
- package/src/integration-profile/integration-profile.secrets.ts +26 -0
- package/src/integration-profile/integration-profile.service.ts +1 -0
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/http-probe.ts +5 -3
- package/src/integration-profile/testers/integration-tester.types.ts +5 -0
- package/src/integration-profile/testers/oauth.testers.spec.ts +13 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
- package/src/integration-profile/testers/tester-coverage.spec.ts +12 -0
- package/src/mail/mail.service.spec.ts +25 -0
- package/src/mail/mail.service.ts +18 -1
- package/src/mcp/mcp-server.service.spec.ts +16 -0
- package/src/mcp/mcp-server.service.ts +10 -1
- package/src/mcp/mcp.module.ts +2 -0
- package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
- package/src/mcp/tools/core-files.mcp-tools.ts +4 -4
- package/src/meeting/meeting-provider.registry.ts +80 -0
- package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
- package/src/oauth/oauth-token-broker.service.ts +129 -2
- package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
- package/src/oauth/providers/microsoft-entra-id.provider.ts +29 -2
- package/src/pdf/document/charts/chart-bar.ts +217 -0
- package/src/pdf/document/charts/chart-donut.ts +163 -0
- package/src/pdf/document/charts/chart-gauge.ts +94 -0
- package/src/pdf/document/charts/chart-line.ts +159 -0
- package/src/pdf/document/charts/chart-primitives.ts +188 -0
- package/src/pdf/document/charts/chart-radar.ts +136 -0
- package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
- package/src/pdf/document/charts/chart-scale.ts +141 -0
- package/src/pdf/document/charts/charts.spec.ts +157 -0
- package/src/pdf/document/charts/index.ts +7 -0
- package/src/pdf/document/index.ts +7 -0
- package/src/pdf/document/pdf-document.chrome.ts +38 -0
- package/src/pdf/document/pdf-document.css.ts +326 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +172 -0
- package/src/pdf/document/pdf-document.renderer.ts +317 -0
- package/src/pdf/document/pdf-document.service.ts +77 -0
- package/src/pdf/document/pdf-document.theme.ts +146 -0
- package/src/pdf/document/pdf-document.types.ts +149 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +256 -82
- package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
- package/src/pdf/templates/commercial-proposal.template.ts +400 -0
- package/src/setting/favicon.controller.spec.ts +92 -0
- package/src/setting/favicon.controller.ts +135 -0
- package/src/setting/setting.module.ts +2 -1
- package/src/setting/setting.service.ts +3 -0
- package/src/task/task.service.spec.ts +77 -1
- package/src/task/task.service.ts +58 -14
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +263 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +154 -16
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapePdfHtml = escapePdfHtml;
|
|
4
|
+
exports.commercialProposalTemplate = commercialProposalTemplate;
|
|
5
|
+
const hcode_theme_1 = require("../themes/hcode.theme");
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
// Helpers
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
function escapePdfHtml(value) {
|
|
10
|
+
return String(value !== null && value !== void 0 ? value : '')
|
|
11
|
+
.replace(/&/g, '&')
|
|
12
|
+
.replace(/</g, '<')
|
|
13
|
+
.replace(/>/g, '>')
|
|
14
|
+
.replace(/"/g, '"')
|
|
15
|
+
.replace(/'/g, ''');
|
|
16
|
+
}
|
|
17
|
+
/** Only a plain hex color reaches the CSS; anything else falls back. */
|
|
18
|
+
function safeColor(value, fallback) {
|
|
19
|
+
return /^#[0-9a-f]{3,8}$/i.test(String(value !== null && value !== void 0 ? value : '').trim()) ? value.trim() : fallback;
|
|
20
|
+
}
|
|
21
|
+
/** Font stacks end up inside a `<style>`: drop what could close it. */
|
|
22
|
+
function safeFontStack(value, fallback) {
|
|
23
|
+
const cleaned = String(value !== null && value !== void 0 ? value : '').replace(/[<>{};]/g, '').trim();
|
|
24
|
+
return cleaned || fallback;
|
|
25
|
+
}
|
|
26
|
+
function sectionNumber(index) {
|
|
27
|
+
return String(index + 1).padStart(2, '0');
|
|
28
|
+
}
|
|
29
|
+
function renderParagraphs(text) {
|
|
30
|
+
return String(text !== null && text !== void 0 ? text : '')
|
|
31
|
+
.split(/\n{2,}/)
|
|
32
|
+
.map((paragraph) => paragraph.trim())
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.map((paragraph) => `<p>${escapePdfHtml(paragraph).replace(/\n/g, '<br>')}</p>`)
|
|
35
|
+
.join('');
|
|
36
|
+
}
|
|
37
|
+
function renderBlock(block) {
|
|
38
|
+
switch (block.type) {
|
|
39
|
+
case 'html':
|
|
40
|
+
return `<div class="rich">${block.html}</div>`;
|
|
41
|
+
case 'paragraphs':
|
|
42
|
+
return `<div class="rich">${renderParagraphs(block.text)}</div>`;
|
|
43
|
+
case 'list':
|
|
44
|
+
return `<ul class="dash-list">${block.items
|
|
45
|
+
.map((item) => `<li>${escapePdfHtml(item)}</li>`)
|
|
46
|
+
.join('')}</ul>`;
|
|
47
|
+
case 'callout':
|
|
48
|
+
return `<div class="callout ${block.tone === 'neutral' ? 'callout-neutral' : 'callout-accent'} no-break">
|
|
49
|
+
${block.title ? `<div class="label">${escapePdfHtml(block.title)}</div>` : ''}
|
|
50
|
+
${renderParagraphs(block.text)}
|
|
51
|
+
</div>`;
|
|
52
|
+
case 'table': {
|
|
53
|
+
const align = (index) => { var _a; return (((_a = block.align) === null || _a === void 0 ? void 0 : _a[index]) === 'right' ? ' class="num"' : ''); };
|
|
54
|
+
return `<table class="grid-table">
|
|
55
|
+
<thead><tr>${block.headers
|
|
56
|
+
.map((header, index) => `<th${align(index)}>${escapePdfHtml(header)}</th>`)
|
|
57
|
+
.join('')}</tr></thead>
|
|
58
|
+
<tbody>${block.rows
|
|
59
|
+
.map((row) => `<tr>${row.map((cell, index) => `<td${align(index)}>${escapePdfHtml(cell)}</td>`).join('')}</tr>`)
|
|
60
|
+
.join('')}</tbody>
|
|
61
|
+
</table>`;
|
|
62
|
+
}
|
|
63
|
+
case 'totals':
|
|
64
|
+
return `<div class="totals no-break">${block.rows
|
|
65
|
+
.map((row) => `<div class="totals-row${row.emphasis ? ' totals-strong' : ''}"><span>${escapePdfHtml(row.label)}</span><span>${escapePdfHtml(row.value)}</span></div>`)
|
|
66
|
+
.join('')}</div>`;
|
|
67
|
+
default:
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Uploaded logo when there is one, otherwise the company name as a wordmark. */
|
|
72
|
+
function renderBrand(theme) {
|
|
73
|
+
if (theme.logoOverride) {
|
|
74
|
+
return `<img class="brand-logo" src="${escapePdfHtml(theme.logoOverride)}" alt="${escapePdfHtml(theme.companyName)}">`;
|
|
75
|
+
}
|
|
76
|
+
const name = String(theme.companyName || '').trim();
|
|
77
|
+
return `<div class="wordmark"><span class="accent">${escapePdfHtml(name.slice(0, 1))}</span>${escapePdfHtml(name.slice(1))}<span class="wordmark-area"> | ${escapePdfHtml(theme.area.toUpperCase())}</span></div>`;
|
|
78
|
+
}
|
|
79
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
80
|
+
// Template
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Commercial proposal — cover with the metadata table, numbered sections
|
|
84
|
+
* (`01 · ESCOPO`), borderless tables, rounded cards and a footer with the
|
|
85
|
+
* legal line and `n / N` on every page.
|
|
86
|
+
*
|
|
87
|
+
* Pure function: the caller resolves the theme (see
|
|
88
|
+
* `PdfService.loadCommercialDocumentTheme`) and the data, so the same input
|
|
89
|
+
* always renders the same document.
|
|
90
|
+
*/
|
|
91
|
+
function commercialProposalTemplate(data, theme) {
|
|
92
|
+
var _a, _b;
|
|
93
|
+
const primary = safeColor(theme.primaryColor, '#FF760C');
|
|
94
|
+
const ink = hcode_theme_1.HCODE_NEUTRALS.ink1;
|
|
95
|
+
const muted = hcode_theme_1.HCODE_NEUTRALS.ink2;
|
|
96
|
+
const line = hcode_theme_1.HCODE_NEUTRALS.line;
|
|
97
|
+
const surface = hcode_theme_1.HCODE_NEUTRALS.surface2;
|
|
98
|
+
const fontFamily = safeFontStack(theme.fontFamily, "'Inter', sans-serif");
|
|
99
|
+
const fontMono = safeFontStack(theme.fontMono, "'JetBrains Mono', monospace");
|
|
100
|
+
const sections = data.sections
|
|
101
|
+
.filter((section) => section.blocks.length > 0)
|
|
102
|
+
.map((section, index) => `<section class="section">
|
|
103
|
+
<div class="section-eyebrow">${sectionNumber(index)} · ${escapePdfHtml(section.eyebrow.toUpperCase())}</div>
|
|
104
|
+
<h2>${escapePdfHtml(section.title)}</h2>
|
|
105
|
+
${section.blocks.map(renderBlock).join('\n')}
|
|
106
|
+
</section>`)
|
|
107
|
+
.join('\n');
|
|
108
|
+
const signatories = ((_a = data.signatories) === null || _a === void 0 ? void 0 : _a.length)
|
|
109
|
+
? `<section class="section signatures no-break">
|
|
110
|
+
${data.signatureTitle ? `<h2>${escapePdfHtml(data.signatureTitle)}</h2>` : ''}
|
|
111
|
+
<div class="signature-grid">${data.signatories
|
|
112
|
+
.map((signatory) => `<div class="signature">
|
|
113
|
+
<div class="signature-line"></div>
|
|
114
|
+
<div class="label">${escapePdfHtml(signatory.party)}</div>
|
|
115
|
+
${signatory.name ? `<div class="signature-name">${escapePdfHtml(signatory.name)}</div>` : ''}
|
|
116
|
+
${signatory.role ? `<div class="signature-role">${escapePdfHtml(signatory.role)}</div>` : ''}
|
|
117
|
+
</div>`)
|
|
118
|
+
.join('')}</div>
|
|
119
|
+
</section>`
|
|
120
|
+
: '';
|
|
121
|
+
const cover = `<div class="cover">
|
|
122
|
+
<div class="cover-brand">${renderBrand(theme)}</div>
|
|
123
|
+
<div class="cover-eyebrow">${escapePdfHtml(data.eyebrow.toUpperCase())}</div>
|
|
124
|
+
<h1 class="cover-title">${escapePdfHtml(data.title)}${data.titleAccent ? `<br><span class="accent">${escapePdfHtml(data.titleAccent)}</span>` : ''}</h1>
|
|
125
|
+
${data.subtitle ? `<div class="cover-subtitle">${escapePdfHtml(data.subtitle)}</div>` : ''}
|
|
126
|
+
<table class="meta-table">
|
|
127
|
+
<tbody>${data.meta
|
|
128
|
+
.filter((item) => { var _a; return String((_a = item.value) !== null && _a !== void 0 ? _a : '').trim(); })
|
|
129
|
+
.map((item) => `<tr><th>${escapePdfHtml(item.label.toUpperCase())}</th><td>${escapePdfHtml(item.value)}</td></tr>`)
|
|
130
|
+
.join('')}</tbody>
|
|
131
|
+
</table>
|
|
132
|
+
${theme.partnerLine ? `<div class="partner-line">${escapePdfHtml(theme.partnerLine.toUpperCase())}</div>` : ''}
|
|
133
|
+
</div>`;
|
|
134
|
+
const html = `<!DOCTYPE html>
|
|
135
|
+
<html lang="${escapePdfHtml(data.locale || 'pt-BR')}">
|
|
136
|
+
<head>
|
|
137
|
+
<meta charset="UTF-8">
|
|
138
|
+
${(0, hcode_theme_1.buildFontImport)()}
|
|
139
|
+
<style>
|
|
140
|
+
:root {
|
|
141
|
+
--primary: ${primary};
|
|
142
|
+
--primary-soft: color-mix(in srgb, ${primary} 12%, #ffffff);
|
|
143
|
+
--ink: ${ink};
|
|
144
|
+
--muted: ${muted};
|
|
145
|
+
--line: ${line};
|
|
146
|
+
--surface: ${surface};
|
|
147
|
+
--font: ${fontFamily};
|
|
148
|
+
--mono: ${fontMono};
|
|
149
|
+
}
|
|
150
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
151
|
+
html, body {
|
|
152
|
+
font-family: var(--font);
|
|
153
|
+
font-size: 10.5pt;
|
|
154
|
+
line-height: 1.55;
|
|
155
|
+
color: var(--ink);
|
|
156
|
+
background: #ffffff;
|
|
157
|
+
-webkit-print-color-adjust: exact;
|
|
158
|
+
print-color-adjust: exact;
|
|
159
|
+
}
|
|
160
|
+
.accent { color: var(--primary); }
|
|
161
|
+
.no-break { break-inside: avoid; page-break-inside: avoid; }
|
|
162
|
+
.label {
|
|
163
|
+
font-family: var(--mono);
|
|
164
|
+
font-size: 7.5pt;
|
|
165
|
+
letter-spacing: 0.14em;
|
|
166
|
+
text-transform: uppercase;
|
|
167
|
+
color: var(--muted);
|
|
168
|
+
margin-bottom: 6px;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Cover */
|
|
172
|
+
.cover { min-height: 245mm; display: flex; flex-direction: column; break-after: page; }
|
|
173
|
+
.cover-brand { margin-bottom: 48mm; }
|
|
174
|
+
.brand-logo { max-height: 40px; max-width: 180px; object-fit: contain; }
|
|
175
|
+
.wordmark { font-size: 26pt; font-weight: 300; letter-spacing: -0.01em; line-height: 1; }
|
|
176
|
+
.wordmark-area { font-family: var(--mono); font-size: 9pt; letter-spacing: 0.2em; color: #949494; }
|
|
177
|
+
.cover-eyebrow {
|
|
178
|
+
font-family: var(--mono);
|
|
179
|
+
font-size: 8pt;
|
|
180
|
+
letter-spacing: 0.16em;
|
|
181
|
+
color: var(--muted);
|
|
182
|
+
margin-bottom: 14px;
|
|
183
|
+
}
|
|
184
|
+
.cover-title { font-size: 30pt; font-weight: 700; line-height: 1.12; letter-spacing: -0.02em; margin-bottom: 14px; }
|
|
185
|
+
.cover-subtitle { font-size: 11.5pt; color: var(--muted); margin-bottom: 28px; }
|
|
186
|
+
.meta-table { width: 100%; border-collapse: collapse; margin-top: auto; }
|
|
187
|
+
.meta-table th, .meta-table td { padding: 7px 0; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; }
|
|
188
|
+
.meta-table th {
|
|
189
|
+
width: 34%;
|
|
190
|
+
font-family: var(--mono);
|
|
191
|
+
font-size: 7.5pt;
|
|
192
|
+
font-weight: 400;
|
|
193
|
+
letter-spacing: 0.14em;
|
|
194
|
+
color: var(--muted);
|
|
195
|
+
}
|
|
196
|
+
.meta-table td { font-size: 10pt; }
|
|
197
|
+
.partner-line { margin-top: 18px; font-family: var(--mono); font-size: 7.5pt; letter-spacing: 0.16em; color: #949494; }
|
|
198
|
+
|
|
199
|
+
/* Sections */
|
|
200
|
+
.section { margin-bottom: 26px; }
|
|
201
|
+
.section-eyebrow { font-family: var(--mono); font-size: 8pt; letter-spacing: 0.16em; color: var(--primary); margin-bottom: 6px; }
|
|
202
|
+
h2 { font-size: 16pt; font-weight: 700; line-height: 1.25; letter-spacing: -0.01em; margin-bottom: 12px; break-after: avoid; }
|
|
203
|
+
.rich p { margin-bottom: 8px; }
|
|
204
|
+
.rich ul, .rich ol { margin: 0 0 8px 18px; }
|
|
205
|
+
.rich h3 { font-size: 11.5pt; margin: 12px 0 6px; }
|
|
206
|
+
.dash-list, .rich ul { list-style: none; margin-left: 0; }
|
|
207
|
+
.dash-list li, .rich ul li { position: relative; padding-left: 18px; margin-bottom: 5px; }
|
|
208
|
+
.dash-list li::before, .rich ul li::before {
|
|
209
|
+
content: '';
|
|
210
|
+
position: absolute;
|
|
211
|
+
left: 0;
|
|
212
|
+
top: 0.75em;
|
|
213
|
+
width: 9px;
|
|
214
|
+
height: 2px;
|
|
215
|
+
background: var(--primary);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Cards */
|
|
219
|
+
.callout { border-radius: 10px; padding: 14px 16px; margin: 10px 0; }
|
|
220
|
+
.callout p { margin-bottom: 6px; }
|
|
221
|
+
.callout p:last-child { margin-bottom: 0; }
|
|
222
|
+
.callout-accent { background: var(--primary-soft); }
|
|
223
|
+
.callout-accent .label { color: var(--primary); }
|
|
224
|
+
.callout-neutral { background: var(--surface); }
|
|
225
|
+
|
|
226
|
+
/* Tables: horizontal rules only, no grid */
|
|
227
|
+
.grid-table { width: 100%; border-collapse: collapse; margin: 6px 0 10px; font-size: 9.5pt; }
|
|
228
|
+
.grid-table th {
|
|
229
|
+
font-family: var(--mono);
|
|
230
|
+
font-size: 7.5pt;
|
|
231
|
+
font-weight: 400;
|
|
232
|
+
letter-spacing: 0.12em;
|
|
233
|
+
text-transform: uppercase;
|
|
234
|
+
color: var(--muted);
|
|
235
|
+
text-align: left;
|
|
236
|
+
padding: 0 7px 7px;
|
|
237
|
+
border-bottom: 1px solid var(--ink);
|
|
238
|
+
}
|
|
239
|
+
.grid-table td { padding: 8px 7px; border-bottom: 1px solid var(--line); vertical-align: top; }
|
|
240
|
+
.grid-table th:first-child, .grid-table td:first-child { padding-left: 0; }
|
|
241
|
+
.grid-table th:last-child, .grid-table td:last-child { padding-right: 0; }
|
|
242
|
+
.grid-table tr { break-inside: avoid; }
|
|
243
|
+
.grid-table .num { text-align: right; white-space: nowrap; }
|
|
244
|
+
|
|
245
|
+
.totals { margin: 6px 0 10px auto; width: 60%; }
|
|
246
|
+
.totals-row { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid var(--line); font-size: 10pt; }
|
|
247
|
+
.totals-strong { border-bottom: none; border-top: 2px solid var(--ink); font-weight: 700; font-size: 12pt; color: var(--primary); }
|
|
248
|
+
|
|
249
|
+
/* Signatures */
|
|
250
|
+
.signature-grid { display: flex; gap: 32px; margin-top: 36px; }
|
|
251
|
+
.signature { flex: 1; }
|
|
252
|
+
.signature-line { border-top: 1px solid var(--ink); margin-bottom: 8px; }
|
|
253
|
+
.signature-name { font-weight: 600; }
|
|
254
|
+
.signature-role { color: var(--muted); font-size: 9.5pt; }
|
|
255
|
+
</style>
|
|
256
|
+
</head>
|
|
257
|
+
<body>
|
|
258
|
+
${cover}
|
|
259
|
+
${sections}
|
|
260
|
+
${signatories}
|
|
261
|
+
</body>
|
|
262
|
+
</html>`;
|
|
263
|
+
const footerLeft = theme.legalFooter || data.documentLabel || theme.companyName;
|
|
264
|
+
const separator = (_b = data.pageSeparator) !== null && _b !== void 0 ? _b : '/';
|
|
265
|
+
const pdfOptions = {
|
|
266
|
+
format: 'A4',
|
|
267
|
+
printBackground: true,
|
|
268
|
+
displayHeaderFooter: true,
|
|
269
|
+
headerTemplate: `<div style="position:absolute;top:0;left:0;right:0;height:6px;background:${primary};-webkit-print-color-adjust:exact;print-color-adjust:exact;"></div>`,
|
|
270
|
+
footerTemplate: `<div style="width:100%;margin:0 25mm;display:flex;justify-content:space-between;gap:16px;font-family:${escapePdfHtml(fontMono)};font-size:6.5pt;letter-spacing:0.12em;color:#949494;-webkit-print-color-adjust:exact;"><span>${escapePdfHtml(footerLeft.toUpperCase())}</span><span style="white-space:nowrap;"><span class="pageNumber"></span> ${escapePdfHtml(separator)} <span class="totalPages"></span></span></div>`,
|
|
271
|
+
margin: { top: '22mm', right: '25mm', bottom: '22mm', left: '25mm' },
|
|
272
|
+
label: 'commercial-proposal',
|
|
273
|
+
};
|
|
274
|
+
return { html, pdfOptions };
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=commercial-proposal.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commercial-proposal.template.js","sourceRoot":"","sources":["../../../src/pdf/templates/commercial-proposal.template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Response } from 'express';
|
|
2
|
+
import { BrandAssetService } from './brand-asset.service';
|
|
3
|
+
import { SettingService } from './setting.service';
|
|
4
|
+
/**
|
|
5
|
+
* `GET /favicon.ico` no host da API, com o icone do Branding (`icon-url`).
|
|
6
|
+
*
|
|
7
|
+
* Quem procura o favicon no dominio da API sao os clientes que so conhecem esse
|
|
8
|
+
* endereco - o conector MCP no claude.ai, por exemplo, mostra o icone do dominio
|
|
9
|
+
* do servidor ao lado do nome. Sem esta rota a resposta era o 404 JSON do Nest e
|
|
10
|
+
* o conector caia na letra inicial.
|
|
11
|
+
*
|
|
12
|
+
* O arquivo e servido daqui (e nao por redirect) porque nem todo coletor de
|
|
13
|
+
* favicon segue redirecionamento. O Content-Type e o da origem, entao um SVG
|
|
14
|
+
* configurado no Branding chega como SVG.
|
|
15
|
+
*/
|
|
16
|
+
export declare class FaviconController {
|
|
17
|
+
private readonly setting;
|
|
18
|
+
private readonly brandAsset;
|
|
19
|
+
private readonly logger;
|
|
20
|
+
private cache;
|
|
21
|
+
constructor(setting: SettingService, brandAsset: BrandAssetService);
|
|
22
|
+
favicon(res: Response): Promise<void>;
|
|
23
|
+
private loadIcon;
|
|
24
|
+
private download;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=favicon.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favicon.controller.d.ts","sourceRoot":"","sources":["../../src/setting/favicon.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAenD;;;;;;;;;;;GAWG;AACH,qBACa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,KAAK,CAA2B;gBAGrB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,iBAAiB;IAK1C,OAAO,CAAQ,GAAG,EAAE,QAAQ;YAYpB,QAAQ;YAiCR,QAAQ;CA8CvB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var FaviconController_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.FaviconController = void 0;
|
|
17
|
+
const api_1 = require("@hed-hog/api");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const brand_asset_service_1 = require("./brand-asset.service");
|
|
20
|
+
const setting_service_1 = require("./setting.service");
|
|
21
|
+
/** Timeout do fetch da imagem configurada. */
|
|
22
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
23
|
+
/** Quanto tempo o binario baixado fica em memoria antes de buscar de novo. */
|
|
24
|
+
const CACHE_TTL_MS = 10 * 60000;
|
|
25
|
+
/**
|
|
26
|
+
* `GET /favicon.ico` no host da API, com o icone do Branding (`icon-url`).
|
|
27
|
+
*
|
|
28
|
+
* Quem procura o favicon no dominio da API sao os clientes que so conhecem esse
|
|
29
|
+
* endereco - o conector MCP no claude.ai, por exemplo, mostra o icone do dominio
|
|
30
|
+
* do servidor ao lado do nome. Sem esta rota a resposta era o 404 JSON do Nest e
|
|
31
|
+
* o conector caia na letra inicial.
|
|
32
|
+
*
|
|
33
|
+
* O arquivo e servido daqui (e nao por redirect) porque nem todo coletor de
|
|
34
|
+
* favicon segue redirecionamento. O Content-Type e o da origem, entao um SVG
|
|
35
|
+
* configurado no Branding chega como SVG.
|
|
36
|
+
*/
|
|
37
|
+
let FaviconController = FaviconController_1 = class FaviconController {
|
|
38
|
+
constructor(setting, brandAsset) {
|
|
39
|
+
this.setting = setting;
|
|
40
|
+
this.brandAsset = brandAsset;
|
|
41
|
+
this.logger = new common_1.Logger(FaviconController_1.name);
|
|
42
|
+
this.cache = null;
|
|
43
|
+
}
|
|
44
|
+
async favicon(res) {
|
|
45
|
+
const icon = await this.loadIcon();
|
|
46
|
+
if (!icon) {
|
|
47
|
+
throw new common_1.NotFoundException();
|
|
48
|
+
}
|
|
49
|
+
res.setHeader('Content-Type', icon.contentType);
|
|
50
|
+
res.setHeader('Cache-Control', 'public, max-age=3600');
|
|
51
|
+
res.send(icon.body);
|
|
52
|
+
}
|
|
53
|
+
async loadIcon() {
|
|
54
|
+
var _a, _b, _c;
|
|
55
|
+
const settings = await this.setting.getSettingValues([
|
|
56
|
+
'icon-url',
|
|
57
|
+
'image-url',
|
|
58
|
+
]);
|
|
59
|
+
const value = String((_a = settings['icon-url']) !== null && _a !== void 0 ? _a : '').trim() ||
|
|
60
|
+
String((_b = settings['image-url']) !== null && _b !== void 0 ? _b : '').trim();
|
|
61
|
+
const url = await this.brandAsset.resolveAssetUrl(value);
|
|
62
|
+
if (!url) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (this.cache &&
|
|
66
|
+
this.cache.url === url &&
|
|
67
|
+
this.cache.expiresAt > Date.now()) {
|
|
68
|
+
return this.cache;
|
|
69
|
+
}
|
|
70
|
+
const icon = await this.download(url);
|
|
71
|
+
if (icon) {
|
|
72
|
+
this.cache = icon;
|
|
73
|
+
return icon;
|
|
74
|
+
}
|
|
75
|
+
// Origem fora do ar: melhor o icone anterior do que nenhum.
|
|
76
|
+
return ((_c = this.cache) === null || _c === void 0 ? void 0 : _c.url) === url ? this.cache : null;
|
|
77
|
+
}
|
|
78
|
+
async download(url) {
|
|
79
|
+
var _a;
|
|
80
|
+
const dataUri = /^data:([^;,]+)(;base64)?,([\s\S]*)$/i.exec(url);
|
|
81
|
+
if (dataUri) {
|
|
82
|
+
const [, contentType, base64, payload] = dataUri;
|
|
83
|
+
return {
|
|
84
|
+
url,
|
|
85
|
+
contentType,
|
|
86
|
+
body: base64
|
|
87
|
+
? Buffer.from(payload, 'base64')
|
|
88
|
+
: Buffer.from(decodeURIComponent(payload)),
|
|
89
|
+
expiresAt: Date.now() + CACHE_TTL_MS,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
95
|
+
const response = await globalThis
|
|
96
|
+
.fetch(url, { signal: controller.signal })
|
|
97
|
+
.finally(() => clearTimeout(timeout));
|
|
98
|
+
const contentType = (_a = response.headers.get('content-type')) !== null && _a !== void 0 ? _a : '';
|
|
99
|
+
if (!response.ok || !contentType.startsWith('image/')) {
|
|
100
|
+
this.logger.warn(`Favicon source ${url} answered ${response.status} ${contentType || '(no content-type)'}`);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
url,
|
|
105
|
+
contentType,
|
|
106
|
+
body: Buffer.from(await response.arrayBuffer()),
|
|
107
|
+
expiresAt: Date.now() + CACHE_TTL_MS,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
this.logger.warn(`Could not fetch favicon source ${url}: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
exports.FaviconController = FaviconController;
|
|
117
|
+
__decorate([
|
|
118
|
+
(0, api_1.Public)(),
|
|
119
|
+
(0, common_1.Get)('favicon.ico'),
|
|
120
|
+
__param(0, (0, common_1.Res)()),
|
|
121
|
+
__metadata("design:type", Function),
|
|
122
|
+
__metadata("design:paramtypes", [Object]),
|
|
123
|
+
__metadata("design:returntype", Promise)
|
|
124
|
+
], FaviconController.prototype, "favicon", null);
|
|
125
|
+
exports.FaviconController = FaviconController = FaviconController_1 = __decorate([
|
|
126
|
+
(0, common_1.Controller)(),
|
|
127
|
+
__metadata("design:paramtypes", [setting_service_1.SettingService,
|
|
128
|
+
brand_asset_service_1.BrandAssetService])
|
|
129
|
+
], FaviconController);
|
|
130
|
+
//# sourceMappingURL=favicon.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favicon.controller.js","sourceRoot":"","sources":["../../src/setting/favicon.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setting.module.d.ts","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setting.module.d.ts","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":"AAWA,qBAaa,aAAa;CAAI"}
|
|
@@ -14,6 +14,7 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const auth_module_1 = require("../auth/auth.module");
|
|
15
15
|
const mail_module_1 = require("../mail/mail.module");
|
|
16
16
|
const brand_asset_service_1 = require("./brand-asset.service");
|
|
17
|
+
const favicon_controller_1 = require("./favicon.controller");
|
|
17
18
|
const setting_controller_1 = require("./setting.controller");
|
|
18
19
|
const setting_service_1 = require("./setting.service");
|
|
19
20
|
let SettingModule = class SettingModule {
|
|
@@ -29,7 +30,7 @@ exports.SettingModule = SettingModule = __decorate([
|
|
|
29
30
|
(0, common_1.forwardRef)(() => api_locale_1.LocaleModule),
|
|
30
31
|
(0, common_1.forwardRef)(() => mail_module_1.MailModule),
|
|
31
32
|
],
|
|
32
|
-
controllers: [setting_controller_1.SettingsController],
|
|
33
|
+
controllers: [setting_controller_1.SettingsController, favicon_controller_1.FaviconController],
|
|
33
34
|
providers: [setting_service_1.SettingService, brand_asset_service_1.BrandAssetService],
|
|
34
35
|
exports: [setting_service_1.SettingService, brand_asset_service_1.BrandAssetService],
|
|
35
36
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setting.module.js","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAmD;AACnD,4DAA2D;AAC3D,oDAAmD;AACnD,2CAA4D;AAC5D,qDAAiD;AACjD,qDAAiD;AACjD,+DAA0D;AAC1D,6DAA0D;AAC1D,uDAAmD;AAe5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAI,CAAA;AAAjB,sCAAa;wBAAb,aAAa;IAbzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;YAC5B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,iCAAgB,CAAC;YAClC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;SAC7B;QACD,WAAW,EAAE,CAAC,uCAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"setting.module.js","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAmD;AACnD,4DAA2D;AAC3D,oDAAmD;AACnD,2CAA4D;AAC5D,qDAAiD;AACjD,qDAAiD;AACjD,+DAA0D;AAC1D,6DAAyD;AACzD,6DAA0D;AAC1D,uDAAmD;AAe5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAI,CAAA;AAAjB,sCAAa;wBAAb,aAAa;IAbzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;YAC5B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,iCAAgB,CAAC;YAClC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;SAC7B;QACD,WAAW,EAAE,CAAC,uCAAkB,EAAE,sCAAiB,CAAC;QACpD,SAAS,EAAE,CAAC,gCAAc,EAAE,uCAAiB,CAAC;QAC9C,OAAO,EAAE,CAAC,gCAAc,EAAE,uCAAiB,CAAC;KAC7C,CAAC;GACW,aAAa,CAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setting.service.d.ts","sourceRoot":"","sources":["../../src/setting/setting.service.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAgC,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAOL,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,2DAA2D,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiB7C,qBACa,cAAe,YAAW,YAAY,EAAE,eAAe;IAmChE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAvCjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAG7C;IACF,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,0BAA0B,CAAK;IACvC,OAAO,CAAC,4BAA4B,CAA8B;IAClE,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAGtC;IACF,OAAO,CAAC,6BAA6B,CAAK;IAC1C,OAAO,CAAC,4BAA4B,CAAK;IAMzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGpC;gBAIiB,aAAa,EAAE,aAAa,EAE5B,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,cAAc,EAAE,8BAA8B;IAG3D,YAAY;IAKZ,eAAe;YAOP,oBAAoB;IAgBlC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,wBAAwB;YAYlB,kBAAkB;YAiBlB,mBAAmB;YAqDnB,iCAAiC;YAsBjC,0BAA0B;IAexC,OAAO,CAAC,iBAAiB;YAgBX,8BAA8B;YAa9B,+BAA+B;YAK/B,mBAAmB;YAiBnB,uBAAuB;YAoBvB,uBAAuB;YAUvB,4BAA4B;IA2BpC,cAAc,CAAC,cAAc,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBvD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;;;;;;;IA2C/C,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;;;;IA2D9D,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"setting.service.d.ts","sourceRoot":"","sources":["../../src/setting/setting.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -486,6 +486,9 @@ let SettingService = SettingService_1 = class SettingService {
|
|
|
486
486
|
'lms-video-frame-capture-interval-seconds',
|
|
487
487
|
'lms-error-modal-enabled',
|
|
488
488
|
'url',
|
|
489
|
+
// Base dos callbacks OAuth do backend (canais do social): o perfil de
|
|
490
|
+
// integração mostra a URL exata que o backend envia ao provider.
|
|
491
|
+
'api-url',
|
|
489
492
|
'app-urls',
|
|
490
493
|
// Hcode Store: liga/desliga a venda no frontend (o backend também
|
|
491
494
|
// recusa o checkout — isto é só para a UI mostrar "Em breve" cedo).
|