fa-mcp-sdk 0.4.74 → 0.4.77
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/README.md +319 -314
- package/bin/fa-mcp.js +85 -68
- package/cli-template/.claude/agents/javascript-pro.md +276 -276
- package/cli-template/.claude/settings.json +50 -50
- package/cli-template/.claude/skills/mcp-app-add-to-server/SKILL.md +427 -0
- package/cli-template/.claude/skills/mcp-app-create/SKILL.md +222 -0
- package/cli-template/.claude/skills/upgrade-guide/SKILL.md +2 -1
- package/cli-template/.oxfmtrc.json +41 -0
- package/cli-template/.oxlintrc.json +120 -0
- package/cli-template/CLAUDE.md +358 -355
- package/cli-template/FA-MCP-SDK-DOC/00-FA-MCP-SDK-index.md +132 -132
- package/cli-template/FA-MCP-SDK-DOC/01-getting-started.md +146 -146
- package/cli-template/FA-MCP-SDK-DOC/02-1-tools-and-api.md +431 -431
- package/cli-template/FA-MCP-SDK-DOC/02-2-prompts-and-resources.md +201 -201
- package/cli-template/FA-MCP-SDK-DOC/03-configuration.md +384 -384
- package/cli-template/FA-MCP-SDK-DOC/04-authentication.md +412 -412
- package/cli-template/FA-MCP-SDK-DOC/05-ad-authorization.md +196 -196
- package/cli-template/FA-MCP-SDK-DOC/06-utilities.md +163 -163
- package/cli-template/FA-MCP-SDK-DOC/07-testing-and-operations.md +127 -127
- package/cli-template/FA-MCP-SDK-DOC/08-agent-tester-and-headless-api.md +681 -659
- package/cli-template/README.md +193 -191
- package/cli-template/jest.config.js +27 -30
- package/cli-template/package.json +10 -5
- package/cli-template/prompt-example-new-MCP.md +101 -101
- package/cli-template/readme-docs/SKILLS.md +86 -1
- package/cli-template/tsconfig.json +58 -58
- package/cli-template/update.cjs +41 -38
- package/config/custom-environment-variables.yaml +63 -63
- package/config/development.yaml +4 -4
- package/config/production.yaml +4 -4
- package/config/test.yaml +26 -26
- package/dist/core/_types_/TNtlm.d.ts.map +1 -1
- package/dist/core/_types_/active-directory-config.d.ts.map +1 -1
- package/dist/core/_types_/config.d.ts.map +1 -1
- package/dist/core/_types_/types.d.ts.map +1 -1
- package/dist/core/ad/group-checker.d.ts.map +1 -1
- package/dist/core/ad/group-checker.js.map +1 -1
- package/dist/core/agent-tester/agent-tester-router.d.ts.map +1 -1
- package/dist/core/agent-tester/agent-tester-router.js +6 -6
- package/dist/core/agent-tester/agent-tester-router.js.map +1 -1
- package/dist/core/agent-tester/check-llm.d.ts.map +1 -1
- package/dist/core/agent-tester/check-llm.js.map +1 -1
- package/dist/core/agent-tester/services/SummaryMemory.d.ts.map +1 -1
- package/dist/core/agent-tester/services/SummaryMemory.js +3 -9
- package/dist/core/agent-tester/services/SummaryMemory.js.map +1 -1
- package/dist/core/agent-tester/services/TesterAgentService.d.ts.map +1 -1
- package/dist/core/agent-tester/services/TesterAgentService.js +25 -27
- package/dist/core/agent-tester/services/TesterAgentService.js.map +1 -1
- package/dist/core/agent-tester/services/TesterMcpClientService.d.ts.map +1 -1
- package/dist/core/agent-tester/services/TesterMcpClientService.js +26 -25
- package/dist/core/agent-tester/services/TesterMcpClientService.js.map +1 -1
- package/dist/core/auth/admin-auth.d.ts.map +1 -1
- package/dist/core/auth/admin-auth.js +5 -5
- package/dist/core/auth/admin-auth.js.map +1 -1
- package/dist/core/auth/agent-tester-auth.d.ts.map +1 -1
- package/dist/core/auth/agent-tester-auth.js +1 -6
- package/dist/core/auth/agent-tester-auth.js.map +1 -1
- package/dist/core/auth/basic.d.ts.map +1 -1
- package/dist/core/auth/basic.js.map +1 -1
- package/dist/core/auth/ip-check.d.ts.map +1 -1
- package/dist/core/auth/ip-check.js +1 -1
- package/dist/core/auth/ip-check.js.map +1 -1
- package/dist/core/auth/jwt.d.ts.map +1 -1
- package/dist/core/auth/jwt.js +1 -1
- package/dist/core/auth/jwt.js.map +1 -1
- package/dist/core/auth/middleware.d.ts.map +1 -1
- package/dist/core/auth/middleware.js +9 -6
- package/dist/core/auth/middleware.js.map +1 -1
- package/dist/core/auth/multi-auth.d.ts.map +1 -1
- package/dist/core/auth/multi-auth.js +6 -6
- package/dist/core/auth/multi-auth.js.map +1 -1
- package/dist/core/auth/revocation.d.ts.map +1 -1
- package/dist/core/auth/revocation.js +2 -6
- package/dist/core/auth/revocation.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.d.ts.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js +2 -2
- package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.d.ts.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.js +4 -2
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.js.map +1 -1
- package/dist/core/auth/token-generator/server.d.ts.map +1 -1
- package/dist/core/auth/token-generator/server.js.map +1 -1
- package/dist/core/bootstrap/init-config.d.ts.map +1 -1
- package/dist/core/bootstrap/init-config.js +2 -2
- package/dist/core/bootstrap/init-config.js.map +1 -1
- package/dist/core/bootstrap/startup-info.d.ts.map +1 -1
- package/dist/core/bootstrap/startup-info.js +3 -7
- package/dist/core/bootstrap/startup-info.js.map +1 -1
- package/dist/core/cache/cache.d.ts.map +1 -1
- package/dist/core/cache/cache.js +2 -2
- package/dist/core/cache/cache.js.map +1 -1
- package/dist/core/consul/deregister.d.ts.map +1 -1
- package/dist/core/consul/deregister.js.map +1 -1
- package/dist/core/consul/get-consul-api.d.ts.map +1 -1
- package/dist/core/consul/get-consul-api.js +1 -2
- package/dist/core/consul/get-consul-api.js.map +1 -1
- package/dist/core/db/pg-db.d.ts.map +1 -1
- package/dist/core/db/pg-db.js +3 -3
- package/dist/core/db/pg-db.js.map +1 -1
- package/dist/core/debug.d.ts.map +1 -1
- package/dist/core/debug.js.map +1 -1
- package/dist/core/errors/BaseMcpError.d.ts.map +1 -1
- package/dist/core/errors/BaseMcpError.js.map +1 -1
- package/dist/core/errors/ValidationError.d.ts.map +1 -1
- package/dist/core/errors/ValidationError.js.map +1 -1
- package/dist/core/errors/errors.d.ts.map +1 -1
- package/dist/core/errors/errors.js +1 -1
- package/dist/core/errors/errors.js.map +1 -1
- package/dist/core/index.d.ts +6 -6
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/init-mcp-server.d.ts.map +1 -1
- package/dist/core/init-mcp-server.js.map +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +1 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/mcp/create-mcp-server.d.ts.map +1 -1
- package/dist/core/mcp/create-mcp-server.js +1 -1
- package/dist/core/mcp/create-mcp-server.js.map +1 -1
- package/dist/core/mcp/prompts.d.ts.map +1 -1
- package/dist/core/mcp/prompts.js.map +1 -1
- package/dist/core/mcp/readme-assembler.d.ts.map +1 -1
- package/dist/core/mcp/readme-assembler.js +3 -1
- package/dist/core/mcp/readme-assembler.js.map +1 -1
- package/dist/core/mcp/resources.d.ts.map +1 -1
- package/dist/core/mcp/resources.js.map +1 -1
- package/dist/core/mcp/server-stdio.d.ts.map +1 -1
- package/dist/core/utils/formatToolResult.d.ts.map +1 -1
- package/dist/core/utils/formatToolResult.js.map +1 -1
- package/dist/core/utils/port-checker.d.ts.map +1 -1
- package/dist/core/utils/port-checker.js.map +1 -1
- package/dist/core/utils/rate-limit.d.ts.map +1 -1
- package/dist/core/utils/rate-limit.js +2 -8
- package/dist/core/utils/rate-limit.js.map +1 -1
- package/dist/core/utils/testing/BaseMcpClient.d.ts.map +1 -1
- package/dist/core/utils/testing/BaseMcpClient.js.map +1 -1
- package/dist/core/utils/testing/McpHttpClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpHttpClient.js +2 -2
- package/dist/core/utils/testing/McpHttpClient.js.map +1 -1
- package/dist/core/utils/testing/McpSseClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpSseClient.js +3 -8
- package/dist/core/utils/testing/McpSseClient.js.map +1 -1
- package/dist/core/utils/testing/McpStdioClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpStdioClient.js.map +1 -1
- package/dist/core/utils/testing/McpStreamableHttpClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpStreamableHttpClient.js +7 -8
- package/dist/core/utils/testing/McpStreamableHttpClient.js.map +1 -1
- package/dist/core/utils/utils.d.ts.map +1 -1
- package/dist/core/utils/utils.js +3 -5
- package/dist/core/utils/utils.js.map +1 -1
- package/dist/core/web/admin-router.d.ts.map +1 -1
- package/dist/core/web/admin-router.js +3 -3
- package/dist/core/web/admin-router.js.map +1 -1
- package/dist/core/web/cors.d.ts.map +1 -1
- package/dist/core/web/cors.js.map +1 -1
- package/dist/core/web/favicon-svg.d.ts.map +1 -1
- package/dist/core/web/favicon-svg.js +1 -5
- package/dist/core/web/favicon-svg.js.map +1 -1
- package/dist/core/web/home-api.d.ts.map +1 -1
- package/dist/core/web/home-api.js +7 -8
- package/dist/core/web/home-api.js.map +1 -1
- package/dist/core/web/openapi.d.ts.map +1 -1
- package/dist/core/web/openapi.js +1 -3
- package/dist/core/web/openapi.js.map +1 -1
- package/dist/core/web/server-http.d.ts.map +1 -1
- package/dist/core/web/server-http.js +4 -4
- package/dist/core/web/server-http.js.map +1 -1
- package/dist/core/web/static/agent-tester/index.html +323 -323
- package/dist/core/web/static/agent-tester/script.js +311 -200
- package/dist/core/web/static/agent-tester/styles.css +1840 -1840
- package/dist/core/web/static/home/index.html +220 -220
- package/dist/core/web/static/home/script.js +72 -43
- package/dist/core/web/static/styles.css +927 -927
- package/dist/core/web/static/token-gen/index.html +136 -136
- package/dist/core/web/static/token-gen/script.js +58 -56
- package/dist/core/web/svg-icons.d.ts.map +1 -1
- package/dist/core/web/svg-icons.js +1 -5
- package/dist/core/web/svg-icons.js.map +1 -1
- package/package.json +10 -5
- package/{cli-template/.claude/hooks/eslint-fix.cjs → scripts/cc-hook-oxlint-oxfmt-fix.cjs} +109 -100
- package/scripts/generate-jwt.js +5 -9
- package/scripts/kill-port.js +5 -2
- package/scripts/npm/run.js +1 -2
- package/scripts/remove-nul.js +1 -1
- package/scripts/update-sdk.js +36 -14
- package/src/template/api/router.ts +3 -3
- package/src/template/prompts/agent-brief.ts +0 -1
- package/src/template/start.ts +3 -8
- package/src/template/tools/handle-tool-call.ts +3 -3
- package/src/template/tools/tools.ts +3 -7
- package/src/tests/jest-simple-reporter.js +1 -1
- package/src/tests/mcp/sse/mcp-sse-client-handling.md +111 -111
- package/src/tests/mcp/sse/test-sse-npm-package.js +2 -3
- package/src/tests/mcp/test-cases.js +6 -7
- package/src/tests/mcp/test-http.js +2 -2
- package/src/tests/mcp/test-sse.js +9 -7
- package/src/tests/mcp/test-stdio.js +12 -8
- package/src/tests/utils.ts +4 -3
- package/cli-template/eslint.config.js +0 -27
|
@@ -1,136 +1,136 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang='ru'>
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset='UTF-8'>
|
|
5
|
-
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
|
|
6
|
-
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
7
|
-
<title>Token Generator & Validator</title>
|
|
8
|
-
<link rel="stylesheet" href="/static/styles.css">
|
|
9
|
-
</head>
|
|
10
|
-
<body>
|
|
11
|
-
<!-- Authentication Modal -->
|
|
12
|
-
<div id="tokenModal" class="modal-overlay" style="display: none;">
|
|
13
|
-
<div class="modal-content" style="width: 450px;">
|
|
14
|
-
<div class="modal-header">
|
|
15
|
-
<h3>🔐 Authentication Required</h3>
|
|
16
|
-
</div>
|
|
17
|
-
<div class="modal-body">
|
|
18
|
-
<p style="margin-bottom: 16px; color: #505f79;">
|
|
19
|
-
Please authenticate to continue.
|
|
20
|
-
</p>
|
|
21
|
-
|
|
22
|
-
<!-- Auth tabs (shown only when both token and basic are available) -->
|
|
23
|
-
<div id="adminAuthTabs" class="admin-auth-tabs" style="display: none;">
|
|
24
|
-
<button type="button" class="admin-auth-tab active" data-tab="token">Token</button>
|
|
25
|
-
<button type="button" class="admin-auth-tab" data-tab="basic">Login</button>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<!-- Token auth form -->
|
|
29
|
-
<form id="tokenAuthForm">
|
|
30
|
-
<div class="form-group">
|
|
31
|
-
<label for="authTokenInput">Access Token:</label>
|
|
32
|
-
<textarea id="authTokenInput" name="authToken" rows="3" required
|
|
33
|
-
placeholder="Paste your JWT or server token here..."></textarea>
|
|
34
|
-
</div>
|
|
35
|
-
<div id="tokenAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
|
|
36
|
-
<button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
|
|
37
|
-
</form>
|
|
38
|
-
|
|
39
|
-
<!-- Basic auth form (hidden by default) -->
|
|
40
|
-
<form id="basicAuthForm" style="display: none;">
|
|
41
|
-
<div class="form-group">
|
|
42
|
-
<label for="authUsername">Username:</label>
|
|
43
|
-
<input type="text" id="authUsername" name="username" required placeholder="Username" autocomplete="username">
|
|
44
|
-
</div>
|
|
45
|
-
<div class="form-group">
|
|
46
|
-
<label for="authPassword">Password:</label>
|
|
47
|
-
<input type="password" id="authPassword" name="password" required placeholder="Password" autocomplete="current-password">
|
|
48
|
-
</div>
|
|
49
|
-
<div id="basicAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
|
|
50
|
-
<button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
|
|
51
|
-
</form>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
<div class="simple-container">
|
|
57
|
-
<!-- Header -->
|
|
58
|
-
<header class="simple-header">
|
|
59
|
-
<div class="header-left">
|
|
60
|
-
<div class="service-icon">
|
|
61
|
-
<img src="/svg/token-gen/jwt-icon.svg" alt="JWT">
|
|
62
|
-
</div>
|
|
63
|
-
<h1>Token Generator & Validator</h1>
|
|
64
|
-
</div>
|
|
65
|
-
<div id="authStatusContainer" class="header-right"></div>
|
|
66
|
-
</header>
|
|
67
|
-
|
|
68
|
-
<main class="simple-main">
|
|
69
|
-
|
|
70
|
-
<div class="tab-container">
|
|
71
|
-
<div class="tabs">
|
|
72
|
-
<button class="tab active" onclick="switchTab('generate')">Token generation</button>
|
|
73
|
-
<button class="tab" onclick="switchTab('validate')">Token validation</button>
|
|
74
|
-
</div>
|
|
75
|
-
|
|
76
|
-
<!-- Token generation -->
|
|
77
|
-
<div id="generate" class="tab-content active">
|
|
78
|
-
<form id="generateForm">
|
|
79
|
-
<div class="form-group">
|
|
80
|
-
<div class="form-row" style="gap: 20px;">
|
|
81
|
-
<div style="flex: 1;">
|
|
82
|
-
<label for="tokenUser">Who is the token issued to:</label>
|
|
83
|
-
<input type="text" id="tokenUser" name="user" required>
|
|
84
|
-
</div>
|
|
85
|
-
<div style="flex: 1;">
|
|
86
|
-
<label>For how long:</label>
|
|
87
|
-
<div class="form-row">
|
|
88
|
-
<input type="number" id="timeValue" name="timeValue" class="time-input" min="1" value="15" required>
|
|
89
|
-
<select id="timeUnit" name="timeUnit" class="time-unit">
|
|
90
|
-
<option value="minutes" selected>minutes</option>
|
|
91
|
-
<option value="hours">hours</option>
|
|
92
|
-
<option value="days">days</option>
|
|
93
|
-
<option value="months">months</option>
|
|
94
|
-
<option value="years">years</option>
|
|
95
|
-
</select>
|
|
96
|
-
</div>
|
|
97
|
-
</div>
|
|
98
|
-
</div>
|
|
99
|
-
</div>
|
|
100
|
-
<div class="form-group">
|
|
101
|
-
<label for="tokenIp">Allowed IP addresses (optional):</label>
|
|
102
|
-
<input type="text" id="tokenIp" name="ip"
|
|
103
|
-
placeholder="e.g. 192.168.1.100, 10.0.0.0/24; 172.16.0.0/12">
|
|
104
|
-
<small style="color: #6b778c; margin-top: 4px; display: block;">
|
|
105
|
-
Comma, semicolon or space separated. Supports CIDR notation.
|
|
106
|
-
Leave empty to allow any IP.
|
|
107
|
-
</small>
|
|
108
|
-
</div>
|
|
109
|
-
<div class="form-group">
|
|
110
|
-
<label>Additional data (key-value):</label>
|
|
111
|
-
<div id="keyValuePairs"></div>
|
|
112
|
-
<button type="button" class="add-btn" onclick="addKeyValuePair()">+</button>
|
|
113
|
-
</div>
|
|
114
|
-
<button type="submit" class="btn">Generate a token</button>
|
|
115
|
-
</form>
|
|
116
|
-
<div id="generateResult"></div>
|
|
117
|
-
</div>
|
|
118
|
-
|
|
119
|
-
<!-- Token validation -->
|
|
120
|
-
<div id="validate" class="tab-content">
|
|
121
|
-
<form id="validateForm">
|
|
122
|
-
<div class="form-group">
|
|
123
|
-
<label for="tokenInput">Enter the token for verification:</label>
|
|
124
|
-
<textarea id="tokenInput" name="token" rows="4" required></textarea>
|
|
125
|
-
</div>
|
|
126
|
-
<button type="submit" class="btn">Check Token</button>
|
|
127
|
-
</form>
|
|
128
|
-
<div id="validateResult"></div>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
</main>
|
|
132
|
-
</div>
|
|
133
|
-
|
|
134
|
-
<script src="/static/token-gen/script.js"></script>
|
|
135
|
-
</body>
|
|
136
|
-
</html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang='ru'>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset='UTF-8'>
|
|
5
|
+
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
7
|
+
<title>Token Generator & Validator</title>
|
|
8
|
+
<link rel="stylesheet" href="/static/styles.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<!-- Authentication Modal -->
|
|
12
|
+
<div id="tokenModal" class="modal-overlay" style="display: none;">
|
|
13
|
+
<div class="modal-content" style="width: 450px;">
|
|
14
|
+
<div class="modal-header">
|
|
15
|
+
<h3>🔐 Authentication Required</h3>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="modal-body">
|
|
18
|
+
<p style="margin-bottom: 16px; color: #505f79;">
|
|
19
|
+
Please authenticate to continue.
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<!-- Auth tabs (shown only when both token and basic are available) -->
|
|
23
|
+
<div id="adminAuthTabs" class="admin-auth-tabs" style="display: none;">
|
|
24
|
+
<button type="button" class="admin-auth-tab active" data-tab="token">Token</button>
|
|
25
|
+
<button type="button" class="admin-auth-tab" data-tab="basic">Login</button>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<!-- Token auth form -->
|
|
29
|
+
<form id="tokenAuthForm">
|
|
30
|
+
<div class="form-group">
|
|
31
|
+
<label for="authTokenInput">Access Token:</label>
|
|
32
|
+
<textarea id="authTokenInput" name="authToken" rows="3" required
|
|
33
|
+
placeholder="Paste your JWT or server token here..."></textarea>
|
|
34
|
+
</div>
|
|
35
|
+
<div id="tokenAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
|
|
36
|
+
<button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
|
|
37
|
+
</form>
|
|
38
|
+
|
|
39
|
+
<!-- Basic auth form (hidden by default) -->
|
|
40
|
+
<form id="basicAuthForm" style="display: none;">
|
|
41
|
+
<div class="form-group">
|
|
42
|
+
<label for="authUsername">Username:</label>
|
|
43
|
+
<input type="text" id="authUsername" name="username" required placeholder="Username" autocomplete="username">
|
|
44
|
+
</div>
|
|
45
|
+
<div class="form-group">
|
|
46
|
+
<label for="authPassword">Password:</label>
|
|
47
|
+
<input type="password" id="authPassword" name="password" required placeholder="Password" autocomplete="current-password">
|
|
48
|
+
</div>
|
|
49
|
+
<div id="basicAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
|
|
50
|
+
<button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
|
|
51
|
+
</form>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div class="simple-container">
|
|
57
|
+
<!-- Header -->
|
|
58
|
+
<header class="simple-header">
|
|
59
|
+
<div class="header-left">
|
|
60
|
+
<div class="service-icon">
|
|
61
|
+
<img src="/svg/token-gen/jwt-icon.svg" alt="JWT">
|
|
62
|
+
</div>
|
|
63
|
+
<h1>Token Generator & Validator</h1>
|
|
64
|
+
</div>
|
|
65
|
+
<div id="authStatusContainer" class="header-right"></div>
|
|
66
|
+
</header>
|
|
67
|
+
|
|
68
|
+
<main class="simple-main">
|
|
69
|
+
|
|
70
|
+
<div class="tab-container">
|
|
71
|
+
<div class="tabs">
|
|
72
|
+
<button class="tab active" onclick="switchTab('generate')">Token generation</button>
|
|
73
|
+
<button class="tab" onclick="switchTab('validate')">Token validation</button>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<!-- Token generation -->
|
|
77
|
+
<div id="generate" class="tab-content active">
|
|
78
|
+
<form id="generateForm">
|
|
79
|
+
<div class="form-group">
|
|
80
|
+
<div class="form-row" style="gap: 20px;">
|
|
81
|
+
<div style="flex: 1;">
|
|
82
|
+
<label for="tokenUser">Who is the token issued to:</label>
|
|
83
|
+
<input type="text" id="tokenUser" name="user" required>
|
|
84
|
+
</div>
|
|
85
|
+
<div style="flex: 1;">
|
|
86
|
+
<label>For how long:</label>
|
|
87
|
+
<div class="form-row">
|
|
88
|
+
<input type="number" id="timeValue" name="timeValue" class="time-input" min="1" value="15" required>
|
|
89
|
+
<select id="timeUnit" name="timeUnit" class="time-unit">
|
|
90
|
+
<option value="minutes" selected>minutes</option>
|
|
91
|
+
<option value="hours">hours</option>
|
|
92
|
+
<option value="days">days</option>
|
|
93
|
+
<option value="months">months</option>
|
|
94
|
+
<option value="years">years</option>
|
|
95
|
+
</select>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
<div class="form-group">
|
|
101
|
+
<label for="tokenIp">Allowed IP addresses (optional):</label>
|
|
102
|
+
<input type="text" id="tokenIp" name="ip"
|
|
103
|
+
placeholder="e.g. 192.168.1.100, 10.0.0.0/24; 172.16.0.0/12">
|
|
104
|
+
<small style="color: #6b778c; margin-top: 4px; display: block;">
|
|
105
|
+
Comma, semicolon or space separated. Supports CIDR notation.
|
|
106
|
+
Leave empty to allow any IP.
|
|
107
|
+
</small>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="form-group">
|
|
110
|
+
<label>Additional data (key-value):</label>
|
|
111
|
+
<div id="keyValuePairs"></div>
|
|
112
|
+
<button type="button" class="add-btn" onclick="addKeyValuePair()">+</button>
|
|
113
|
+
</div>
|
|
114
|
+
<button type="submit" class="btn">Generate a token</button>
|
|
115
|
+
</form>
|
|
116
|
+
<div id="generateResult"></div>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Token validation -->
|
|
120
|
+
<div id="validate" class="tab-content">
|
|
121
|
+
<form id="validateForm">
|
|
122
|
+
<div class="form-group">
|
|
123
|
+
<label for="tokenInput">Enter the token for verification:</label>
|
|
124
|
+
<textarea id="tokenInput" name="token" rows="4" required></textarea>
|
|
125
|
+
</div>
|
|
126
|
+
<button type="submit" class="btn">Check Token</button>
|
|
127
|
+
</form>
|
|
128
|
+
<div id="validateResult"></div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</main>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<script src="/static/token-gen/script.js"></script>
|
|
135
|
+
</body>
|
|
136
|
+
</html>
|
|
@@ -9,22 +9,22 @@ let requiresFrontendAuth = false;
|
|
|
9
9
|
let authMethods = []; // ['token', 'basic']
|
|
10
10
|
|
|
11
11
|
// Get stored auth token from sessionStorage
|
|
12
|
-
function getStoredToken
|
|
12
|
+
function getStoredToken() {
|
|
13
13
|
return sessionStorage.getItem(AUTH_TOKEN_KEY);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
// Store auth token in sessionStorage
|
|
17
|
-
function storeToken
|
|
17
|
+
function storeToken(token) {
|
|
18
18
|
sessionStorage.setItem(AUTH_TOKEN_KEY, token);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
// Clear stored auth token
|
|
22
|
-
function clearStoredToken
|
|
22
|
+
function clearStoredToken() {
|
|
23
23
|
sessionStorage.removeItem(AUTH_TOKEN_KEY);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
// Show authentication modal
|
|
27
|
-
function showAuthModal
|
|
27
|
+
function showAuthModal(errorMessage = null) {
|
|
28
28
|
const modal = document.getElementById('tokenModal');
|
|
29
29
|
|
|
30
30
|
// Clear errors on both forms
|
|
@@ -35,8 +35,7 @@ function showAuthModal (errorMessage = null) {
|
|
|
35
35
|
|
|
36
36
|
if (errorMessage) {
|
|
37
37
|
// Show error in the active form
|
|
38
|
-
const activeError = document.getElementById('basicAuthForm').style.display !== 'none'
|
|
39
|
-
? basicError : tokenError;
|
|
38
|
+
const activeError = document.getElementById('basicAuthForm').style.display !== 'none' ? basicError : tokenError;
|
|
40
39
|
activeError.innerHTML = `<strong>Error:</strong> ${errorMessage}`;
|
|
41
40
|
activeError.style.display = 'block';
|
|
42
41
|
}
|
|
@@ -45,13 +44,13 @@ function showAuthModal (errorMessage = null) {
|
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
// Hide authentication modal
|
|
48
|
-
function hideAuthModal
|
|
47
|
+
function hideAuthModal() {
|
|
49
48
|
const modal = document.getElementById('tokenModal');
|
|
50
49
|
modal.style.display = 'none';
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
// Setup auth tabs and forms based on available methods
|
|
54
|
-
function setupAuthForms
|
|
53
|
+
function setupAuthForms(methods) {
|
|
55
54
|
const hasToken = methods.includes('token');
|
|
56
55
|
const hasBasic = methods.includes('basic');
|
|
57
56
|
|
|
@@ -79,7 +78,7 @@ function setupAuthForms (methods) {
|
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
// Bind tab click handlers
|
|
82
|
-
function bindAuthTabs
|
|
81
|
+
function bindAuthTabs() {
|
|
83
82
|
const tabButtons = document.querySelectorAll('.admin-auth-tab');
|
|
84
83
|
const tokenForm = document.getElementById('tokenAuthForm');
|
|
85
84
|
const basicForm = document.getElementById('basicAuthForm');
|
|
@@ -108,13 +107,13 @@ function bindAuthTabs () {
|
|
|
108
107
|
}
|
|
109
108
|
|
|
110
109
|
// Authenticated fetch wrapper - adds Authorization header
|
|
111
|
-
async function authFetch
|
|
110
|
+
async function authFetch(url, options = {}) {
|
|
112
111
|
const token = getStoredToken();
|
|
113
112
|
|
|
114
113
|
if (requiresFrontendAuth && token) {
|
|
115
114
|
options.headers = {
|
|
116
115
|
...options.headers,
|
|
117
|
-
|
|
116
|
+
Authorization: token,
|
|
118
117
|
};
|
|
119
118
|
}
|
|
120
119
|
|
|
@@ -140,7 +139,7 @@ async function authFetch (url, options = {}) {
|
|
|
140
139
|
}
|
|
141
140
|
|
|
142
141
|
// Check auth config and initialize authentication if needed
|
|
143
|
-
async function initializeAuth
|
|
142
|
+
async function initializeAuth() {
|
|
144
143
|
try {
|
|
145
144
|
// Get auth config from public endpoint (no auth required)
|
|
146
145
|
const response = await fetch('/admin/api/auth-config');
|
|
@@ -205,9 +204,11 @@ async function initializeAuth () {
|
|
|
205
204
|
}
|
|
206
205
|
|
|
207
206
|
// Handle token authentication form submission
|
|
208
|
-
function setupTokenAuthForm
|
|
207
|
+
function setupTokenAuthForm() {
|
|
209
208
|
const form = document.getElementById('tokenAuthForm');
|
|
210
|
-
if (!form) {
|
|
209
|
+
if (!form) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
211
212
|
|
|
212
213
|
form.addEventListener('submit', async (e) => {
|
|
213
214
|
e.preventDefault();
|
|
@@ -246,9 +247,11 @@ function setupTokenAuthForm () {
|
|
|
246
247
|
}
|
|
247
248
|
|
|
248
249
|
// Handle basic authentication form submission
|
|
249
|
-
function setupBasicAuthForm
|
|
250
|
+
function setupBasicAuthForm() {
|
|
250
251
|
const form = document.getElementById('basicAuthForm');
|
|
251
|
-
if (!form) {
|
|
252
|
+
if (!form) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
252
255
|
|
|
253
256
|
form.addEventListener('submit', async (e) => {
|
|
254
257
|
e.preventDefault();
|
|
@@ -297,32 +300,32 @@ function setupBasicAuthForm () {
|
|
|
297
300
|
}
|
|
298
301
|
|
|
299
302
|
// Set primary color CSS variable
|
|
300
|
-
function setPrimaryColor
|
|
303
|
+
function setPrimaryColor(color) {
|
|
301
304
|
if (color) {
|
|
302
305
|
document.documentElement.style.setProperty('--primary-color', color);
|
|
303
306
|
}
|
|
304
307
|
}
|
|
305
308
|
|
|
306
|
-
function switchTab
|
|
307
|
-
document.querySelectorAll('.tab-content').forEach(content => {
|
|
309
|
+
function switchTab(tabName) {
|
|
310
|
+
document.querySelectorAll('.tab-content').forEach((content) => {
|
|
308
311
|
content.classList.remove('active');
|
|
309
312
|
});
|
|
310
|
-
document.querySelectorAll('.tab').forEach(tab => {
|
|
313
|
+
document.querySelectorAll('.tab').forEach((tab) => {
|
|
311
314
|
tab.classList.remove('active');
|
|
312
315
|
});
|
|
313
316
|
document.getElementById(tabName).classList.add('active');
|
|
314
317
|
|
|
315
318
|
// Activate the corresponding tab button
|
|
316
319
|
const tabs = document.querySelectorAll('.tab');
|
|
317
|
-
tabs.forEach(tab => {
|
|
320
|
+
tabs.forEach((tab) => {
|
|
318
321
|
const onclick = tab.getAttribute('onclick');
|
|
319
|
-
if (onclick && onclick.includes(
|
|
322
|
+
if (onclick && onclick.includes("switchTab('" + tabName + "')")) {
|
|
320
323
|
tab.classList.add('active');
|
|
321
324
|
}
|
|
322
325
|
});
|
|
323
326
|
}
|
|
324
327
|
|
|
325
|
-
function addKeyValuePair
|
|
328
|
+
function addKeyValuePair(key = '', value = '', readonly = false, placeholder = 'Value') {
|
|
326
329
|
if (keyValuePairCount >= 15) {
|
|
327
330
|
alert('Maximum of 15 key-value pairs');
|
|
328
331
|
return;
|
|
@@ -331,25 +334,24 @@ function addKeyValuePair (key = '', value = '', readonly = false, placeholder =
|
|
|
331
334
|
const pairDiv = document.createElement('div');
|
|
332
335
|
pairDiv.className = 'key-value-pair';
|
|
333
336
|
|
|
334
|
-
const keyInput = readonly
|
|
335
|
-
'<input type="text" placeholder="Key" name="keys" value="' + key + '" readonly style="background-color: #f8f9fa;">'
|
|
336
|
-
'<input type="text" placeholder="Key" name="keys" value="' + key + '">';
|
|
337
|
+
const keyInput = readonly
|
|
338
|
+
? '<input type="text" placeholder="Key" name="keys" value="' + key + '" readonly style="background-color: #f8f9fa;">'
|
|
339
|
+
: '<input type="text" placeholder="Key" name="keys" value="' + key + '">';
|
|
337
340
|
|
|
338
341
|
const valueInput = '<input type="text" placeholder="' + placeholder + '" name="values" value="' + value + '">';
|
|
339
342
|
|
|
340
|
-
pairDiv.innerHTML = keyInput + valueInput +
|
|
341
|
-
'<button type="button" class="remove-btn" onclick="removeKeyValuePair(this)">×</button>';
|
|
343
|
+
pairDiv.innerHTML = keyInput + valueInput + '<button type="button" class="remove-btn" onclick="removeKeyValuePair(this)">×</button>';
|
|
342
344
|
container.appendChild(pairDiv);
|
|
343
345
|
keyValuePairCount++;
|
|
344
346
|
}
|
|
345
347
|
|
|
346
348
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
347
|
-
function removeKeyValuePair
|
|
349
|
+
function removeKeyValuePair(button) {
|
|
348
350
|
button.parentElement.remove();
|
|
349
351
|
keyValuePairCount--;
|
|
350
352
|
}
|
|
351
353
|
|
|
352
|
-
function addCopyButtonToTokenOutput
|
|
354
|
+
function addCopyButtonToTokenOutput(tokenOutput, token) {
|
|
353
355
|
if (!tokenOutput || tokenOutput.hasAttribute('data-copy-added')) {
|
|
354
356
|
return;
|
|
355
357
|
}
|
|
@@ -387,7 +389,6 @@ function addCopyButtonToTokenOutput (tokenOutput, token) {
|
|
|
387
389
|
setTimeout(() => {
|
|
388
390
|
notification.classList.remove('show');
|
|
389
391
|
}, 1000);
|
|
390
|
-
|
|
391
392
|
} catch {
|
|
392
393
|
// Fallback for browsers that don't support clipboard API
|
|
393
394
|
const textArea = document.createElement('textarea');
|
|
@@ -434,22 +435,30 @@ function addCopyButtonToTokenOutput (tokenOutput, token) {
|
|
|
434
435
|
});
|
|
435
436
|
}
|
|
436
437
|
|
|
437
|
-
function formatTime
|
|
438
|
+
function formatTime(ms) {
|
|
438
439
|
const seconds = Math.floor(ms / 1000);
|
|
439
440
|
const minutes = Math.floor(seconds / 60);
|
|
440
441
|
const hours = Math.floor(minutes / 60);
|
|
441
442
|
const days = Math.floor(hours / 24);
|
|
442
443
|
|
|
443
|
-
if (days > 0) {
|
|
444
|
-
|
|
445
|
-
|
|
444
|
+
if (days > 0) {
|
|
445
|
+
return days + ' d. ' + (hours % 24) + ' h.';
|
|
446
|
+
}
|
|
447
|
+
if (hours > 0) {
|
|
448
|
+
return hours + ' h. ' + (minutes % 60) + ' min.';
|
|
449
|
+
}
|
|
450
|
+
if (minutes > 0) {
|
|
451
|
+
return minutes + ' min.';
|
|
452
|
+
}
|
|
446
453
|
return seconds + ' s.';
|
|
447
454
|
}
|
|
448
455
|
|
|
449
456
|
// Render authentication status in header
|
|
450
|
-
function renderAuthStatus
|
|
457
|
+
function renderAuthStatus(data) {
|
|
451
458
|
const container = document.getElementById('authStatusContainer');
|
|
452
|
-
if (!container) {
|
|
459
|
+
if (!container) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
453
462
|
|
|
454
463
|
const { authType, isAuthenticated, user, canLogout } = data;
|
|
455
464
|
|
|
@@ -476,7 +485,7 @@ function renderAuthStatus (data) {
|
|
|
476
485
|
}
|
|
477
486
|
|
|
478
487
|
// Load authentication status from API
|
|
479
|
-
async function loadAuthStatus
|
|
488
|
+
async function loadAuthStatus() {
|
|
480
489
|
try {
|
|
481
490
|
const response = await authFetch('/admin/api/auth-status');
|
|
482
491
|
const data = await response.json();
|
|
@@ -493,8 +502,8 @@ document.getElementById('generateForm').addEventListener('submit', async (e) =>
|
|
|
493
502
|
e.preventDefault();
|
|
494
503
|
|
|
495
504
|
const formData = new FormData(e.target);
|
|
496
|
-
const keys = formData.getAll('keys').filter(k => k.trim());
|
|
497
|
-
const values = formData.getAll('values').filter(v => v.trim());
|
|
505
|
+
const keys = formData.getAll('keys').filter((k) => k.trim());
|
|
506
|
+
const values = formData.getAll('values').filter((v) => v.trim());
|
|
498
507
|
|
|
499
508
|
const payload = {};
|
|
500
509
|
for (let i = 0; i < keys.length; i++) {
|
|
@@ -526,8 +535,7 @@ document.getElementById('generateForm').addEventListener('submit', async (e) =>
|
|
|
526
535
|
const resultDiv = document.getElementById('generateResult');
|
|
527
536
|
|
|
528
537
|
if (result.success) {
|
|
529
|
-
resultDiv.innerHTML =
|
|
530
|
-
`<div class="result success">
|
|
538
|
+
resultDiv.innerHTML = `<div class="result success">
|
|
531
539
|
<strong>The token has been successfully created!</strong><br>
|
|
532
540
|
<div class="token-output">${result.token}</div>
|
|
533
541
|
</div>`;
|
|
@@ -544,14 +552,12 @@ document.getElementById('generateForm').addEventListener('submit', async (e) =>
|
|
|
544
552
|
tokenTextarea.value = result.token;
|
|
545
553
|
}
|
|
546
554
|
} else {
|
|
547
|
-
resultDiv.innerHTML =
|
|
548
|
-
`<div class="result error">
|
|
555
|
+
resultDiv.innerHTML = `<div class="result error">
|
|
549
556
|
<strong>Error:</strong> ${result.error}
|
|
550
557
|
</div>`;
|
|
551
558
|
}
|
|
552
559
|
} catch (error) {
|
|
553
|
-
document.getElementById('generateResult').innerHTML =
|
|
554
|
-
`<div class="result error">
|
|
560
|
+
document.getElementById('generateResult').innerHTML = `<div class="result error">
|
|
555
561
|
<strong>Error:</strong> ${error.message}
|
|
556
562
|
</div>`;
|
|
557
563
|
}
|
|
@@ -581,7 +587,7 @@ document.getElementById('validateForm').addEventListener('submit', async (e) =>
|
|
|
581
587
|
let payloadHtml = '';
|
|
582
588
|
if (payloadKeys.length > 0) {
|
|
583
589
|
payloadHtml = '<h4>Additional data:</h4>';
|
|
584
|
-
payloadKeys.forEach(key => {
|
|
590
|
+
payloadKeys.forEach((key) => {
|
|
585
591
|
payloadHtml += '<p><strong>' + key + ':</strong> ' + result.payload[key] + '</p>';
|
|
586
592
|
});
|
|
587
593
|
}
|
|
@@ -589,8 +595,7 @@ document.getElementById('validateForm').addEventListener('submit', async (e) =>
|
|
|
589
595
|
// Format issued at time
|
|
590
596
|
const issuedAtTime = result.payload.iat ? new Date(result.payload.iat).toLocaleString('ru-RU') : 'N/A';
|
|
591
597
|
|
|
592
|
-
resultDiv.innerHTML =
|
|
593
|
-
`<div class="result success">
|
|
598
|
+
resultDiv.innerHTML = `<div class="result success">
|
|
594
599
|
<strong>The token is valid!</strong>
|
|
595
600
|
<div class="token-info">
|
|
596
601
|
<h4>Token Information:</h4>
|
|
@@ -604,22 +609,20 @@ ${payloadHtml}
|
|
|
604
609
|
</div>
|
|
605
610
|
</div>`;
|
|
606
611
|
} else {
|
|
607
|
-
resultDiv.innerHTML =
|
|
608
|
-
`<div class="result error">
|
|
612
|
+
resultDiv.innerHTML = `<div class="result error">
|
|
609
613
|
<strong>Token invalid!</strong><br>
|
|
610
614
|
Reason: ${result.error}
|
|
611
615
|
</div>`;
|
|
612
616
|
}
|
|
613
617
|
} catch (error) {
|
|
614
|
-
document.getElementById('validateResult').innerHTML =
|
|
615
|
-
`<div class="result error">
|
|
618
|
+
document.getElementById('validateResult').innerHTML = `<div class="result error">
|
|
616
619
|
<strong>Error:</strong> ${error.message}
|
|
617
620
|
</div>`;
|
|
618
621
|
}
|
|
619
622
|
});
|
|
620
623
|
|
|
621
624
|
// Function to initialize the form
|
|
622
|
-
async function initializeForm
|
|
625
|
+
async function initializeForm() {
|
|
623
626
|
try {
|
|
624
627
|
// Getting information about the service
|
|
625
628
|
const response = await authFetch('/admin/api/service-info');
|
|
@@ -637,7 +640,6 @@ async function initializeForm () {
|
|
|
637
640
|
// Adding a pre-filled pair serviceName
|
|
638
641
|
addKeyValuePair('service', serviceName, true);
|
|
639
642
|
addKeyValuePair('issue', '', true, 'URL of request for the issuance of a token in JIRA');
|
|
640
|
-
|
|
641
643
|
} catch (error) {
|
|
642
644
|
console.error('Error loading service info:', error);
|
|
643
645
|
return;
|
|
@@ -648,7 +650,7 @@ async function initializeForm () {
|
|
|
648
650
|
|
|
649
651
|
// Logout function
|
|
650
652
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
651
|
-
async function logout
|
|
653
|
+
async function logout() {
|
|
652
654
|
try {
|
|
653
655
|
// For frontend auth, clear the stored credentials
|
|
654
656
|
if (requiresFrontendAuth) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-icons.d.ts","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"svg-icons.d.ts","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAmEpD,eAAO,MAAM,eAAe,QAAO,MAelC,CAAC"}
|
|
@@ -14,11 +14,7 @@ const ONE_YEAR_MS = 60 * 60 * 24 * 365 * 1000; // 1 year
|
|
|
14
14
|
// Cache for loaded SVG files
|
|
15
15
|
const svgCache = new Map();
|
|
16
16
|
const etagS = (entity) => {
|
|
17
|
-
const hash = crypto
|
|
18
|
-
.createHash('sha1')
|
|
19
|
-
.update(entity, 'utf8')
|
|
20
|
-
.digest('base64')
|
|
21
|
-
.substring(0, 27);
|
|
17
|
+
const hash = crypto.createHash('sha1').update(entity, 'utf8').digest('base64').substring(0, 27);
|
|
22
18
|
return `"${Buffer.byteLength(entity, 'utf8').toString(16)}-${hash}"`;
|
|
23
19
|
};
|
|
24
20
|
const loadSvg = (relativePath) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-icons.js","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,SAAS;AAExD,6BAA6B;AAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE;IACvC,MAAM,IAAI,GAAG,MAAM
|
|
1
|
+
{"version":3,"file":"svg-icons.js","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,SAAS;AAExD,6BAA6B;AAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChG,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,YAAoB,EAAiB,EAAE;IACtD,MAAM,QAAQ,GAAG,GAAG,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAE7D,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1C,6DAA6D;QAC7D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,GAAa,EAAQ,EAAE;IAChE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,mBAAmB,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAC1C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,sCAAsC;IACtC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3D,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1D,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACnD,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|