synthos 0.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.
- package/LICENSE +21 -0
- package/README.md +71 -0
- package/bin/synthos.js +3 -0
- package/default-pages/[application].html +87 -0
- package/default-pages/[markdown].html +261 -0
- package/default-pages/[sidebar].html +89 -0
- package/default-pages/[split-application].html +133 -0
- package/default-pages/json_tools.html +176 -0
- package/default-scripts/android.terminal.json +7 -0
- package/default-scripts/linux-terminal.json +7 -0
- package/default-scripts/mac-terminal.json +7 -0
- package/default-scripts/windows-terminal.json +7 -0
- package/dist/files.d.ts +9 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +79 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +9 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +59 -0
- package/dist/init.js.map +1 -0
- package/dist/pages.d.ts +6 -0
- package/dist/pages.d.ts.map +1 -0
- package/dist/pages.js +55 -0
- package/dist/pages.js.map +1 -0
- package/dist/scripts.d.ts +14 -0
- package/dist/scripts.d.ts.map +1 -0
- package/dist/scripts.js +103 -0
- package/dist/scripts.js.map +1 -0
- package/dist/service/createCompletePrompt.d.ts +4 -0
- package/dist/service/createCompletePrompt.d.ts.map +1 -0
- package/dist/service/createCompletePrompt.js +42 -0
- package/dist/service/createCompletePrompt.js.map +1 -0
- package/dist/service/generateImage.d.ts +32 -0
- package/dist/service/generateImage.d.ts.map +1 -0
- package/dist/service/generateImage.js +71 -0
- package/dist/service/generateImage.js.map +1 -0
- package/dist/service/index.d.ts +8 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +24 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/requiresSettings.d.ts +3 -0
- package/dist/service/requiresSettings.d.ts.map +1 -0
- package/dist/service/requiresSettings.js +24 -0
- package/dist/service/requiresSettings.js.map +1 -0
- package/dist/service/server.d.ts +4 -0
- package/dist/service/server.d.ts.map +1 -0
- package/dist/service/server.js +26 -0
- package/dist/service/server.js.map +1 -0
- package/dist/service/transformPage.d.ts +11 -0
- package/dist/service/transformPage.d.ts.map +1 -0
- package/dist/service/transformPage.js +119 -0
- package/dist/service/transformPage.js.map +1 -0
- package/dist/service/useApiRoutes.d.ts +4 -0
- package/dist/service/useApiRoutes.d.ts.map +1 -0
- package/dist/service/useApiRoutes.js +95 -0
- package/dist/service/useApiRoutes.js.map +1 -0
- package/dist/service/useDataRoutes.d.ts +4 -0
- package/dist/service/useDataRoutes.d.ts.map +1 -0
- package/dist/service/useDataRoutes.js +98 -0
- package/dist/service/useDataRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts +5 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -0
- package/dist/service/usePageRoutes.js +132 -0
- package/dist/service/usePageRoutes.js.map +1 -0
- package/dist/settings.d.ts +13 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +55 -0
- package/dist/settings.js.map +1 -0
- package/dist/synthos-cli.d.ts +2 -0
- package/dist/synthos-cli.d.ts.map +1 -0
- package/dist/synthos-cli.js +43 -0
- package/dist/synthos-cli.js.map +1 -0
- package/images/home.png +0 -0
- package/images/page-management.png +0 -0
- package/images/settings.png +0 -0
- package/images/synthos-square.png +0 -0
- package/package.json +58 -0
- package/required-pages/apis.html +347 -0
- package/required-pages/home.html +83 -0
- package/required-pages/pages.html +135 -0
- package/required-pages/scripts.html +335 -0
- package/required-pages/settings.html +158 -0
- package/src/files.ts +49 -0
- package/src/index.ts +6 -0
- package/src/init.ts +66 -0
- package/src/pages.ts +55 -0
- package/src/scripts.ts +130 -0
- package/src/service/createCompletePrompt.ts +40 -0
- package/src/service/generateImage.ts +101 -0
- package/src/service/index.ts +7 -0
- package/src/service/requiresSettings.ts +22 -0
- package/src/service/server.ts +26 -0
- package/src/service/transformPage.ts +135 -0
- package/src/service/useApiRoutes.ts +95 -0
- package/src/service/useDataRoutes.ts +97 -0
- package/src/service/usePageRoutes.ts +147 -0
- package/src/settings.ts +60 -0
- package/src/synthos-cli.ts +38 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>SynthOS - {Application Title}</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: #1a1a1a; color: #e0e0e0; height: 100vh; display: flex; }
|
|
10
|
+
.chat-panel { width: 30%; background: #2a2a2a; box-shadow: 0 0 10px rgba(0,0,0,0.3); padding: 20px; display: flex; flex-direction: column; }
|
|
11
|
+
.chat-header { font-size: 24px; padding: 10px; background: #3a7bc8; color: white; text-align: center; border-radius: 10px 10px 0 0; }
|
|
12
|
+
.chat-messages { flex-grow: 1; overflow-y: auto; padding: 15px; margin-top: 10px; background: #333; border-radius: 10px; }
|
|
13
|
+
.chat-message { margin-bottom: 15px; padding: 10px; background: #444; border-radius: 15px; box-shadow: 0 2px 5px rgba(0,0,0,0.2); }
|
|
14
|
+
.chat-message p { margin-bottom: 5px; line-height: 1.4; }
|
|
15
|
+
.chat-message p strong { font-weight: 600; color: #4a90e2; }
|
|
16
|
+
.chat-message p code { background: #555; padding: 2px 4px; border-radius: 3px; font-family: 'Courier New', Courier, monospace; color: #e0e0e0; }
|
|
17
|
+
.link-group { display: flex; justify-content: space-between; margin: 15px 0; }
|
|
18
|
+
.link-group a { font-size: 14px; color: #4a90e2; text-decoration: none; padding: 5px 10px; border-radius: 5px; transition: background-color 0.3s; }
|
|
19
|
+
.link-group a:hover { background-color: #3a3a3a; }
|
|
20
|
+
form { display: flex; flex-direction: column; width: 100%; }
|
|
21
|
+
.chat-input, .chat-submit { padding: 12px; border: none; border-radius: 25px; width: 100%; font-size: 14px; }
|
|
22
|
+
.chat-input { background: #444; color: #e0e0e0; margin-bottom: 10px; box-shadow: inset 0 1px 3px rgba(0,0,0,0.3); }
|
|
23
|
+
.chat-submit { background: #3a7bc8; color: white; cursor: pointer; transition: background-color 0.3s; }
|
|
24
|
+
.chat-submit:hover { background: #2a6cb8; }
|
|
25
|
+
.viewer-panel { width: 70%; background: #2a2a2a; display: flex; flex-direction: column; justify-content: flex-start; align-items: center; box-shadow: -5px 0 10px rgba(0,0,0,0.2); }
|
|
26
|
+
.loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(26, 26, 26, 0.8); display: none; justify-content: center; align-items: center; z-index: 1000; }
|
|
27
|
+
.spinner { border: 8px solid #333; border-top: 8px solid #3a7bc8; border-radius: 50%; width: 60px; height: 60px; animation: spin 1s linear infinite; }
|
|
28
|
+
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
|
29
|
+
::-webkit-scrollbar { width: 10px; }
|
|
30
|
+
::-webkit-scrollbar-track { background: #333; }
|
|
31
|
+
::-webkit-scrollbar-thumb { background: #555; border-radius: 5px; }
|
|
32
|
+
::-webkit-scrollbar-thumb:hover { background: #666; }
|
|
33
|
+
.application-panel { display: flex; flex-direction: column; height: 100%; width: 100%; padding: 20px; }
|
|
34
|
+
.application-header { font-size: 24px; padding: 10px; background: #3a7bc8; color: white; text-align: center; border-radius: 10px 10px 0 0; }
|
|
35
|
+
.application-content { flex-grow: 1; display: flex; flex-direction: column; margin-top: 10px; }
|
|
36
|
+
.application-top, .application-bottom { background: #333; border-radius: 10px; padding: 15px; overflow-y: auto; }
|
|
37
|
+
.application-top { flex-grow: 1; margin-bottom: 10px; }
|
|
38
|
+
.application-bottom { flex-grow: 1; }
|
|
39
|
+
.splitter { height: 10px; background: #2a2a2a; cursor: row-resize; border-radius: 5px; margin: 5px 0; }
|
|
40
|
+
</style>
|
|
41
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
42
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
43
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
<div class="chat-panel">
|
|
47
|
+
<div class="chat-header">SynthOS</div>
|
|
48
|
+
<div class="chat-messages" id="chatMessages">
|
|
49
|
+
<div class="chat-message"><p><strong>SynthOS:</strong> what kind of application would you like?</p></div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="link-group">
|
|
52
|
+
<a href="#" id="saveLink">Save</a>
|
|
53
|
+
<a href="/pages" id="pagesLink">Pages</a>
|
|
54
|
+
<a href="#" id="resetLink">Reset</a>
|
|
55
|
+
</div>
|
|
56
|
+
<form action="/" method="POST" id="chatForm">
|
|
57
|
+
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message...">
|
|
58
|
+
<button type="submit" class="chat-submit">Send</button>
|
|
59
|
+
</form>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="viewer-panel" id="viewerPanel">
|
|
62
|
+
<div class="application-panel">
|
|
63
|
+
<div class="application-header">{Application Title}</div>
|
|
64
|
+
<div class="application-content">
|
|
65
|
+
<div class="application-top">
|
|
66
|
+
<p>{Top Panel Content}</p>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="splitter" id="splitter"></div>
|
|
69
|
+
<div class="application-bottom">
|
|
70
|
+
<p>{Bottom Panel Content}</p>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
<div id="thoughts" style="display: none;">I've prompted the user for the type of application to create.</div>
|
|
76
|
+
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
77
|
+
<script>
|
|
78
|
+
// Basic chat functionality
|
|
79
|
+
document.getElementById("chatInput").focus();
|
|
80
|
+
document.getElementById("chatForm").addEventListener('submit', () => {
|
|
81
|
+
document.getElementById("loadingOverlay").style.display = 'flex';
|
|
82
|
+
document.getElementById("chatForm").action = window.location.pathname;
|
|
83
|
+
});
|
|
84
|
+
document.getElementById("saveLink").addEventListener("click", function() {
|
|
85
|
+
const pageName = prompt("Enter the name of the page to save as:");
|
|
86
|
+
if (pageName) {
|
|
87
|
+
window.location.href = `${window.location.pathname}/save?name=${encodeURIComponent(pageName)}`;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
document.getElementById("resetLink").addEventListener("click", function() {
|
|
91
|
+
window.location.href = `${window.location.pathname}/reset`;
|
|
92
|
+
});
|
|
93
|
+
window.onload = function() {
|
|
94
|
+
const chatMessages = document.getElementById('chatMessages');
|
|
95
|
+
chatMessages.scrollTo({
|
|
96
|
+
top: chatMessages.scrollHeight,
|
|
97
|
+
behavior: 'smooth'
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Splitter functionality
|
|
102
|
+
const splitter = document.getElementById('splitter');
|
|
103
|
+
const topPanel = document.querySelector('.application-top');
|
|
104
|
+
const bottomPanel = document.querySelector('.application-bottom');
|
|
105
|
+
|
|
106
|
+
let isDragging = false;
|
|
107
|
+
|
|
108
|
+
splitter.addEventListener('mousedown', function(e) {
|
|
109
|
+
isDragging = true;
|
|
110
|
+
document.body.style.cursor = 'row-resize';
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
document.addEventListener('mousemove', function(e) {
|
|
114
|
+
if (!isDragging) return;
|
|
115
|
+
const containerRect = document.querySelector('.application-content').getBoundingClientRect();
|
|
116
|
+
const containerHeight = containerRect.height;
|
|
117
|
+
const offsetY = e.clientY - containerRect.top;
|
|
118
|
+
const newTopHeight = (offsetY / containerHeight) * 100;
|
|
119
|
+
const newBottomHeight = 100 - newTopHeight;
|
|
120
|
+
|
|
121
|
+
if (newTopHeight > 10 && newBottomHeight > 10) {
|
|
122
|
+
topPanel.style.flexBasis = `${newTopHeight}%`;
|
|
123
|
+
bottomPanel.style.flexBasis = `${newBottomHeight}%`;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
document.addEventListener('mouseup', function() {
|
|
128
|
+
isDragging = false;
|
|
129
|
+
document.body.style.cursor = 'default';
|
|
130
|
+
});
|
|
131
|
+
</script>
|
|
132
|
+
</body>
|
|
133
|
+
</html>
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>SynthOS - JSON Tools</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: #1a1a1a; color: #e0e0e0; height: 100vh; display: flex; }
|
|
10
|
+
.chat-panel { width: 30%; background: #2a2a2a; box-shadow: 0 0 10px rgba(0,0,0,0.3); padding: 20px; display: flex; flex-direction: column; }
|
|
11
|
+
.chat-header { font-size: 24px; padding: 10px; background: #3a7bc8; color: white; text-align: center; border-radius: 10px 10px 0 0; }
|
|
12
|
+
.chat-messages { flex-grow: 1; overflow-y: auto; padding: 15px; margin-top: 10px; background: #333; border-radius: 10px; }
|
|
13
|
+
.chat-message { margin-bottom: 15px; padding: 10px; background: #444; border-radius: 15px; box-shadow: 0 2px 5px rgba(0,0,0,0.2); }
|
|
14
|
+
.chat-message p { margin-bottom: 5px; line-height: 1.4; }
|
|
15
|
+
.chat-message p strong { font-weight: 600; color: #4a90e2; }
|
|
16
|
+
.chat-message p code { background: #555; padding: 2px 4px; border-radius: 3px; font-family: 'Courier New', Courier, monospace; color: #e0e0e0; }
|
|
17
|
+
.link-group { display: flex; justify-content: space-between; margin: 15px 0; }
|
|
18
|
+
.link-group a { font-size: 14px; color: #4a90e2; text-decoration: none; padding: 5px 10px; border-radius: 5px; transition: background-color 0.3s; }
|
|
19
|
+
.link-group a:hover { background-color: #3a3a3a; }
|
|
20
|
+
form { display: flex; flex-direction: column; width: 100%; }
|
|
21
|
+
.chat-input, .chat-submit { padding: 12px; border: none; border-radius: 25px; width: 100%; font-size: 14px; }
|
|
22
|
+
.chat-input { background: #444; color: #e0e0e0; margin-bottom: 10px; box-shadow: inset 0 1px 3px rgba(0,0,0,0.3); }
|
|
23
|
+
.chat-submit { background: #3a7bc8; color: white; cursor: pointer; transition: background-color 0.3s; }
|
|
24
|
+
.chat-submit:hover { background: #2a6cb8; }
|
|
25
|
+
.viewer-panel { width: 70%; padding: 20px; background: #2a2a2a; display: flex; flex-direction: column; justify-content: flex-start; align-items: center; box-shadow: -5px 0 10px rgba(0,0,0,0.2); }
|
|
26
|
+
.loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(26, 26, 26, 0.8); display: none; justify-content: center; align-items: center; z-index: 1000; }
|
|
27
|
+
.spinner { border: 8px solid #333; border-top: 8px solid #3a7bc8; border-radius: 50%; width: 60px; height: 60px; animation: spin 1s linear infinite; }
|
|
28
|
+
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
|
29
|
+
::-webkit-scrollbar { width: 10px; }
|
|
30
|
+
::-webkit-scrollbar-track { background: #333; }
|
|
31
|
+
::-webkit-scrollbar-thumb { background: #555; border-radius: 5px; }
|
|
32
|
+
::-webkit-scrollbar-thumb:hover { background: #666; }
|
|
33
|
+
.application-title { font-size: 24px; color: white; background: #3a7bc8; padding: 10px; width: 100%; text-align: center; border-radius: 10px 10px 0 0; }
|
|
34
|
+
.application-content { font-size: 18px; color: #ccc; padding: 20px; margin-top: 10px; flex-grow: 1; width: 100%; background: #333; border-radius: 0 0 10px 10px; }
|
|
35
|
+
.multi-line-input { width: 100%; height: 100px; background: #444; color: white; border: none; border-radius: 5px; padding: 10px; margin-bottom: 10px; }
|
|
36
|
+
.copy-button, .convert-button, .reset-button { background: #3a7bc8; color: white; border: none; border-radius: 5px; padding: 10px; cursor: pointer; margin-top: 10px; transition: background-color 0.3s; }
|
|
37
|
+
.copy-button:hover, .convert-button:hover, .reset-button:hover { background: #2a6cb8; }
|
|
38
|
+
.conversion-type { background: #444; color: white; border: none; border-radius: 5px; padding: 10px; margin-bottom: 10px; width: 100%; }
|
|
39
|
+
#resultPanel { border: 1px solid #444; padding: 10px; border-radius: 5px; min-height: 400px; white-space: pre-wrap; background: #444; color: #e0e0e0; }
|
|
40
|
+
.button-group { display: flex; justify-content: space-between; width: 100%; }
|
|
41
|
+
</style>
|
|
42
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
43
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
44
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
45
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js"></script>
|
|
46
|
+
</head>
|
|
47
|
+
<body>
|
|
48
|
+
<div class="chat-panel">
|
|
49
|
+
<div class="chat-header">SynthOS</div>
|
|
50
|
+
<div class="chat-messages" id="chatMessages">
|
|
51
|
+
<div class="chat-message"><p><strong>SynthOS:</strong> You can use the dropdown to select a conversion type, enter your text, and click "Convert" to see the result.</p></div>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="link-group">
|
|
54
|
+
<a href="#" id="saveLink">Save</a>
|
|
55
|
+
<a href="/pages" id="pagesLink">Pages</a>
|
|
56
|
+
<a href="#" id="resetLink">Reset</a>
|
|
57
|
+
</div>
|
|
58
|
+
<form action="/" method="POST" id="chatForm">
|
|
59
|
+
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message...">
|
|
60
|
+
<button type="submit" class="chat-submit">Send</button>
|
|
61
|
+
</form>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="viewer-panel" id="viewerPanel">
|
|
64
|
+
<div class="application-title">JSON Tools</div>
|
|
65
|
+
<div class="application-content">
|
|
66
|
+
<select class="conversion-type" id="conversionType">
|
|
67
|
+
<option value="escape">Escape JSON</option>
|
|
68
|
+
<option value="unescape">Unescape JSON</option>
|
|
69
|
+
<option value="format">Format JSON</option>
|
|
70
|
+
<option value="unformat">Unformat JSON</option>
|
|
71
|
+
<option value="toYaml">Convert to YAML</option>
|
|
72
|
+
<option value="fromYaml">Convert from YAML</option>
|
|
73
|
+
</select>
|
|
74
|
+
<textarea class="multi-line-input" id="userInput" placeholder="Enter your text here..."></textarea>
|
|
75
|
+
<div class="button-group">
|
|
76
|
+
<div>
|
|
77
|
+
<button class="convert-button" id="convertButton">Convert</button>
|
|
78
|
+
<button class="reset-button" id="resetButton">Reset</button>
|
|
79
|
+
</div>
|
|
80
|
+
<button class="copy-button" id="copyButton" disabled>Copy to Clipboard</button>
|
|
81
|
+
</div>
|
|
82
|
+
<div id="resultPanel" class="application-content"></div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
<div id="thoughts" style="display: none;">I've instructed the user for how to use the tool.</div>
|
|
86
|
+
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
87
|
+
<script>
|
|
88
|
+
// Basic chat functionality
|
|
89
|
+
document.getElementById("chatInput").focus();
|
|
90
|
+
document.getElementById("chatForm").addEventListener('submit', () => {
|
|
91
|
+
document.getElementById("loadingOverlay").style.display = 'flex';
|
|
92
|
+
document.getElementById("chatForm").action = window.location.pathname;
|
|
93
|
+
});
|
|
94
|
+
document.getElementById("saveLink").addEventListener("click", function() {
|
|
95
|
+
const pageName = prompt("Enter the name of the page to save as:");
|
|
96
|
+
if (pageName) {
|
|
97
|
+
window.location.href = `${window.location.pathname}/save?name=${encodeURIComponent(pageName)}`;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
document.getElementById("resetLink").addEventListener("click", function() {
|
|
101
|
+
window.location.href = `${window.location.pathname}/reset`;
|
|
102
|
+
});
|
|
103
|
+
window.onload = function() {
|
|
104
|
+
const chatMessages = document.getElementById('chatMessages');
|
|
105
|
+
chatMessages.scrollTo({
|
|
106
|
+
top: chatMessages.scrollHeight,
|
|
107
|
+
behavior: 'smooth'
|
|
108
|
+
});
|
|
109
|
+
s };
|
|
110
|
+
|
|
111
|
+
// Copy to clipboard functionality
|
|
112
|
+
document.getElementById("copyButton").addEventListener("click", function() {
|
|
113
|
+
const resultPanel = document.getElementById("resultPanel");
|
|
114
|
+
const textToCopy = resultPanel.innerText;
|
|
115
|
+
navigator.clipboard.writeText(textToCopy).then(() => {
|
|
116
|
+
alert('Text copied to clipboard!');
|
|
117
|
+
}, (err) => {
|
|
118
|
+
console.error('Could not copy text: ', err);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Conversion functionality
|
|
123
|
+
document.getElementById("convertButton").addEventListener("click", function() {
|
|
124
|
+
const userInput = document.getElementById("userInput").value;
|
|
125
|
+
const conversionType = document.getElementById("conversionType").value;
|
|
126
|
+
let result = "";
|
|
127
|
+
if (conversionType === "escape") {
|
|
128
|
+
result = JSON.stringify(userInput);
|
|
129
|
+
} else if (conversionType === "unescape") {
|
|
130
|
+
try {
|
|
131
|
+
result = JSON.parse(userInput);
|
|
132
|
+
} catch (e) {
|
|
133
|
+
result = "Invalid JSON input";
|
|
134
|
+
}
|
|
135
|
+
} else if (conversionType === "format") {
|
|
136
|
+
try {
|
|
137
|
+
const jsonObject = JSON.parse(userInput);
|
|
138
|
+
result = JSON.stringify(jsonObject, null, 2);
|
|
139
|
+
} catch (e) {
|
|
140
|
+
result = "Invalid JSON input";
|
|
141
|
+
}
|
|
142
|
+
} else if (conversionType === "unformat") {
|
|
143
|
+
try {
|
|
144
|
+
const jsonObject = JSON.parse(userInput);
|
|
145
|
+
result = JSON.stringify(jsonObject);
|
|
146
|
+
} catch (e) {
|
|
147
|
+
result = "Invalid JSON input";
|
|
148
|
+
}
|
|
149
|
+
} else if (conversionType === "toYaml") {
|
|
150
|
+
try {
|
|
151
|
+
const jsonObject = JSON.parse(userInput);
|
|
152
|
+
result = jsyaml.dump(jsonObject, { indent: 2 });
|
|
153
|
+
} catch (e) {
|
|
154
|
+
result = "Invalid JSON input";
|
|
155
|
+
}
|
|
156
|
+
} else if (conversionType === "fromYaml") {
|
|
157
|
+
try {
|
|
158
|
+
const yamlObject = jsyaml.load(userInput);
|
|
159
|
+
result = JSON.stringify(yamlObject, null, 2);
|
|
160
|
+
} catch (e) {
|
|
161
|
+
result = "Invalid YAML input";
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
document.getElementById("resultPanel").innerText = result;
|
|
165
|
+
document.getElementById("copyButton").disabled = false;
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Reset functionality
|
|
169
|
+
document.getElementById("resetButton").addEventListener("click", function() {
|
|
170
|
+
document.getElementById("userInput").value = "";
|
|
171
|
+
document.getElementById("resultPanel").innerText = "";
|
|
172
|
+
document.getElementById("copyButton").disabled = true;
|
|
173
|
+
});
|
|
174
|
+
</script>
|
|
175
|
+
</body>
|
|
176
|
+
</html>
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function checkIfExists(path: string): Promise<boolean>;
|
|
2
|
+
export declare function copyFile(srcFile: string, destFolder: string): Promise<void>;
|
|
3
|
+
export declare function copyFiles(srcFolder: string, destFolder: string): Promise<void>;
|
|
4
|
+
export declare function ensureFolderExists(path: string): Promise<void>;
|
|
5
|
+
export declare function listFiles(path: string): Promise<string[]>;
|
|
6
|
+
export declare function loadFile(path: string): Promise<string>;
|
|
7
|
+
export declare function saveFile(path: string, content: string): Promise<void>;
|
|
8
|
+
export declare function deleteFile(path: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE/D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D"}
|
package/dist/files.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.deleteFile = exports.saveFile = exports.loadFile = exports.listFiles = exports.ensureFolderExists = exports.copyFiles = exports.copyFile = exports.checkIfExists = void 0;
|
|
30
|
+
const fs = __importStar(require("fs/promises"));
|
|
31
|
+
const path_1 = __importDefault(require("path"));
|
|
32
|
+
async function checkIfExists(path) {
|
|
33
|
+
try {
|
|
34
|
+
await fs.access(path);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.checkIfExists = checkIfExists;
|
|
42
|
+
async function copyFile(srcFile, destFolder) {
|
|
43
|
+
await ensureFolderExists(destFolder);
|
|
44
|
+
const fileName = path_1.default.basename(srcFile);
|
|
45
|
+
const destFile = path_1.default.join(destFolder, fileName);
|
|
46
|
+
await fs.copyFile(srcFile, destFile);
|
|
47
|
+
}
|
|
48
|
+
exports.copyFile = copyFile;
|
|
49
|
+
async function copyFiles(srcFolder, destFolder) {
|
|
50
|
+
await ensureFolderExists(destFolder);
|
|
51
|
+
const files = await fs.readdir(srcFolder);
|
|
52
|
+
for (const file of files) {
|
|
53
|
+
const srcPath = `${srcFolder}/${file}`;
|
|
54
|
+
const destPath = `${destFolder}/${file}`;
|
|
55
|
+
await fs.copyFile(srcPath, destPath);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.copyFiles = copyFiles;
|
|
59
|
+
async function ensureFolderExists(path) {
|
|
60
|
+
await fs.mkdir(path, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
exports.ensureFolderExists = ensureFolderExists;
|
|
63
|
+
async function listFiles(path) {
|
|
64
|
+
return (await fs.readdir(path)).filter(file => !file.startsWith('.') && file.includes('.'));
|
|
65
|
+
}
|
|
66
|
+
exports.listFiles = listFiles;
|
|
67
|
+
async function loadFile(path) {
|
|
68
|
+
return await fs.readFile(path, 'utf8');
|
|
69
|
+
}
|
|
70
|
+
exports.loadFile = loadFile;
|
|
71
|
+
async function saveFile(path, content) {
|
|
72
|
+
await fs.writeFile(path, content, 'utf8');
|
|
73
|
+
}
|
|
74
|
+
exports.saveFile = saveFile;
|
|
75
|
+
async function deleteFile(path) {
|
|
76
|
+
await fs.unlink(path);
|
|
77
|
+
}
|
|
78
|
+
exports.deleteFile = deleteFile;
|
|
79
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,gDAAwB;AAEjB,KAAK,UAAU,aAAa,CAAC,IAAY;IAC5C,IAAI;QACA,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;KACf;IAAC,MAAM;QACJ,OAAO,KAAK,CAAC;KAChB;AACL,CAAC;AAPD,sCAOC;AAEM,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,UAAkB;IAC9D,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AALD,4BAKC;AAEM,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,UAAkB;IACjE,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;QACzC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;KACxC;AACL,CAAC;AATD,8BASC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACjD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAFD,gDAEC;AAEM,KAAK,UAAU,SAAS,CAAC,IAAY;IACxC,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChG,CAAC;AAFD,8BAEC;AAEM,KAAK,UAAU,QAAQ,CAAC,IAAY;IACvC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAFD,4BAEC;AAEM,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAFD,4BAEC;AAEM,KAAK,UAAU,UAAU,CAAC,IAAY;IACzC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAFD,gCAEC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./service"), exports);
|
|
18
|
+
__exportStar(require("./files"), exports);
|
|
19
|
+
__exportStar(require("./init"), exports);
|
|
20
|
+
__exportStar(require("./pages"), exports);
|
|
21
|
+
__exportStar(require("./scripts"), exports);
|
|
22
|
+
__exportStar(require("./settings"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,0CAAwB;AACxB,yCAAuB;AACvB,0CAAwB;AACxB,4CAA0B;AAC1B,6CAA2B"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SynthOSConfig {
|
|
2
|
+
pagesFolder: string;
|
|
3
|
+
requiredPagesFolder: string;
|
|
4
|
+
defaultPagesFolder: string;
|
|
5
|
+
defaultScriptsFolder: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function createConfig(pagesFolder?: string): SynthOSConfig;
|
|
8
|
+
export declare function init(config: SynthOSConfig, includeDefaultPages?: boolean): Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,WAAW,SAAa,GAAG,aAAa,CAOpE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,mBAAmB,GAAE,OAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CvG"}
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.init = exports.createConfig = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const files_1 = require("./files");
|
|
9
|
+
const settings_1 = require("./settings");
|
|
10
|
+
function createConfig(pagesFolder = '.synthos') {
|
|
11
|
+
return {
|
|
12
|
+
pagesFolder: path_1.default.join(process.cwd(), pagesFolder),
|
|
13
|
+
requiredPagesFolder: path_1.default.join(__dirname, '../required-pages'),
|
|
14
|
+
defaultPagesFolder: path_1.default.join(__dirname, '../default-pages'),
|
|
15
|
+
defaultScriptsFolder: path_1.default.join(__dirname, '../default-scripts')
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
exports.createConfig = createConfig;
|
|
19
|
+
async function init(config, includeDefaultPages = true) {
|
|
20
|
+
// Check for existing folder
|
|
21
|
+
if (await (0, files_1.checkIfExists)(config.pagesFolder)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
console.log(`Initializing .synthos folder...`);
|
|
25
|
+
// Create pages folder
|
|
26
|
+
await (0, files_1.ensureFolderExists)(config.pagesFolder);
|
|
27
|
+
// Create mandatory files
|
|
28
|
+
await (0, files_1.saveFile)(path_1.default.join(config.pagesFolder, '.gitignore'), 'settings.json\n');
|
|
29
|
+
await (0, files_1.saveFile)(path_1.default.join(config.pagesFolder, 'settings.json'), JSON.stringify(settings_1.DefaultSettings, null, 4));
|
|
30
|
+
await (0, files_1.saveFile)(path_1.default.join(config.pagesFolder, 'settings.json.example'), JSON.stringify(settings_1.DefaultSettings, null, 4));
|
|
31
|
+
// Setup default scripts
|
|
32
|
+
console.log(`Copying default scripts to .synthos folder...`);
|
|
33
|
+
const scriptsFolder = path_1.default.join(config.pagesFolder, 'scripts');
|
|
34
|
+
await (0, files_1.ensureFolderExists)(scriptsFolder);
|
|
35
|
+
switch (process.platform) {
|
|
36
|
+
case 'win32':
|
|
37
|
+
await (0, files_1.copyFile)(path_1.default.join(config.defaultScriptsFolder, 'windows-terminal.json'), scriptsFolder);
|
|
38
|
+
break;
|
|
39
|
+
case 'darwin':
|
|
40
|
+
await (0, files_1.copyFile)(path_1.default.join(config.defaultScriptsFolder, 'mac-terminal.json'), scriptsFolder);
|
|
41
|
+
break;
|
|
42
|
+
case 'android':
|
|
43
|
+
await (0, files_1.copyFile)(path_1.default.join(config.defaultScriptsFolder, 'android-terminal.json'), scriptsFolder);
|
|
44
|
+
break;
|
|
45
|
+
case 'linux':
|
|
46
|
+
default:
|
|
47
|
+
await (0, files_1.copyFile)(path_1.default.join(config.defaultScriptsFolder, 'linux-terminal.json'), scriptsFolder);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
await (0, files_1.saveFile)(path_1.default.join(scriptsFolder, 'example.sh'), '#!/bin/bash\n\n# This is an example script\n\n# You can run this script using the following command:\n# sh .synthos/scripts/example.sh\n\n# This script will print "Hello, World!" to the console\n\necho "Hello, World!"\n');
|
|
51
|
+
// Copy pages
|
|
52
|
+
if (includeDefaultPages) {
|
|
53
|
+
console.log(`Copying default pages to .synthos folder...`);
|
|
54
|
+
await (0, files_1.copyFiles)(config.defaultPagesFolder, config.pagesFolder);
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
exports.init = init;
|
|
59
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/pages.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function listPages(pagesFolder: string, fallbackPagesFolder: string): Promise<string[]>;
|
|
2
|
+
export declare function loadPageState(pagesFolder: string, name: string, reset: boolean): Promise<string | undefined>;
|
|
3
|
+
export declare function normalizePageName(name: string | undefined): string | undefined;
|
|
4
|
+
export declare function savePageState(pagesFolder: string, name: string, content: string): Promise<void>;
|
|
5
|
+
export declare function updatePageState(name: string, content: string): void;
|
|
6
|
+
//# sourceMappingURL=pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnG;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CAahH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAC,SAAS,GAAG,MAAM,GAAC,SAAS,CAE1E;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEnE"}
|
package/dist/pages.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.updatePageState = exports.savePageState = exports.normalizePageName = exports.loadPageState = exports.listPages = void 0;
|
|
7
|
+
const files_1 = require("./files");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
// Page State Cache
|
|
10
|
+
const _pages = {};
|
|
11
|
+
async function listPages(pagesFolder, fallbackPagesFolder) {
|
|
12
|
+
// Load all pages from primary pages folder
|
|
13
|
+
const all = (await (0, files_1.listFiles)(pagesFolder)).filter(file => file.endsWith('.html'));
|
|
14
|
+
// Add pages from fallback pages folder that don't already exist
|
|
15
|
+
(await (0, files_1.listFiles)(fallbackPagesFolder)).forEach(file => {
|
|
16
|
+
if (file.endsWith('.html') && !all.includes(file)) {
|
|
17
|
+
all.push(file);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
// Remove .html and sort all files
|
|
21
|
+
const sorted = all.map(file => file.substring(0, file.length - 5)).sort();
|
|
22
|
+
// Move [templates] to end of array
|
|
23
|
+
const pages = sorted.filter(page => !page.startsWith('['));
|
|
24
|
+
const templates = sorted.filter(page => page.startsWith('['));
|
|
25
|
+
pages.push(...templates);
|
|
26
|
+
return pages;
|
|
27
|
+
}
|
|
28
|
+
exports.listPages = listPages;
|
|
29
|
+
async function loadPageState(pagesFolder, name, reset) {
|
|
30
|
+
if (!_pages[name] || reset) {
|
|
31
|
+
// Check for file to exist
|
|
32
|
+
const filename = path_1.default.join(pagesFolder, `${name}.html`);
|
|
33
|
+
if (!(await (0, files_1.checkIfExists)(filename))) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
// Load file
|
|
37
|
+
_pages[name] = await (0, files_1.loadFile)(filename);
|
|
38
|
+
}
|
|
39
|
+
return _pages[name];
|
|
40
|
+
}
|
|
41
|
+
exports.loadPageState = loadPageState;
|
|
42
|
+
function normalizePageName(name) {
|
|
43
|
+
return typeof name == 'string' && name.length > 0 ? name.replace(/[^a-z0-9\-_\[\]\(\)\{\}@#\$%&]/gi, '_').toLowerCase() : undefined;
|
|
44
|
+
}
|
|
45
|
+
exports.normalizePageName = normalizePageName;
|
|
46
|
+
async function savePageState(pagesFolder, name, content) {
|
|
47
|
+
_pages[name] = content;
|
|
48
|
+
await (0, files_1.saveFile)(path_1.default.join(pagesFolder, `${name}.html`), content);
|
|
49
|
+
}
|
|
50
|
+
exports.savePageState = savePageState;
|
|
51
|
+
function updatePageState(name, content) {
|
|
52
|
+
_pages[name] = content;
|
|
53
|
+
}
|
|
54
|
+
exports.updatePageState = updatePageState;
|
|
55
|
+
//# sourceMappingURL=pages.js.map
|