aprog 1.1.2 → 1.2.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/README.md +17 -5
- package/index.js +3 -2
- package/package.json +1 -1
- package/src/OpenAI.js +50 -0
- package/src/indexDB.js +55 -0
package/README.md
CHANGED
|
@@ -33,8 +33,8 @@ import Unauthorized from "./pages/Unauthorized";
|
|
|
33
33
|
|
|
34
34
|
const routes = [
|
|
35
35
|
{
|
|
36
|
-
path: "/
|
|
37
|
-
component:
|
|
36
|
+
path: "/",
|
|
37
|
+
component: NamePage,
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
path: "/access/denied",
|
|
@@ -48,8 +48,8 @@ const routes = [
|
|
|
48
48
|
|
|
49
49
|
document.addEventListener("DOMContentLoaded", async function() {
|
|
50
50
|
// router
|
|
51
|
-
const
|
|
52
|
-
await router({ routes,
|
|
51
|
+
const main = document.getElementById('main');
|
|
52
|
+
await router({ routes, main, "Page Not Found" });
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
```
|
|
@@ -114,20 +114,32 @@ dd(int, array, boolean);
|
|
|
114
114
|
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
+
Приклад використання gemini:
|
|
118
|
+
|
|
119
|
+
```shell
|
|
120
|
+
|
|
121
|
+
const message = await gemini("Розкажи жарт про програміста!");
|
|
122
|
+
console.log(message);
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
|
|
117
126
|
Загальний список методів:
|
|
118
127
|
|
|
119
128
|
- *dump(...args), dd(...args)*
|
|
120
129
|
- *redirect(url, { newTab: bool, replace: bool })*
|
|
121
130
|
- *encrypt(str), decrypt(encryptedStr)*
|
|
122
131
|
|
|
123
|
-
|
|
124
132
|
- *div, span, button, a, img, meta, label, input, select, option, options, form, hr, textarea, table, thead, tbody, tr, th, td, pre*
|
|
125
133
|
- *_get, GUID, apState, cookie, date, pause, apFetch, chars, elementToObject, copyText, scrollToTop, scrollToBottom, firstKey, checkArrays, ucfirst, deepEqual, nodeListToObject*
|
|
126
134
|
- *isEmpty, isNull, isFloat, isNumeric, isObject, isArray, isNumber, isString, isPromise, isNull, isFloat, isNumeric, isObject*
|
|
127
135
|
|
|
136
|
+
- *router({ routes, main, "Page Not Found" })*
|
|
137
|
+
|
|
138
|
+
- *gemini(message)*
|
|
128
139
|
|
|
129
140
|
### Info
|
|
130
141
|
|
|
142
|
+
- Додано безплатний чат із Gemini
|
|
131
143
|
- З часом будуть додаватися можливості створення додаткових інструментів
|
|
132
144
|
|
|
133
145
|
|
package/index.js
CHANGED
|
@@ -6,5 +6,6 @@ export {
|
|
|
6
6
|
} from './src/aprog.js';
|
|
7
7
|
export { dump, dd } from './src/debugger.js';
|
|
8
8
|
export { redirect } from './src/redirect.js';
|
|
9
|
-
export { router } from './src/router.js';
|
|
10
|
-
export { encrypt, decrypt } from './src/shifrator.js';
|
|
9
|
+
export { router, navigateTo } from './src/router.js';
|
|
10
|
+
export { encrypt, decrypt } from './src/shifrator.js';
|
|
11
|
+
export { gemini } from './src/OpenAI.js';
|
package/package.json
CHANGED
package/src/OpenAI.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {loadCacheDB, saveCacheDB} from "./indexDB.js";
|
|
2
|
+
|
|
3
|
+
const empty = (variable) => {
|
|
4
|
+
if (typeof variable === 'object' && !Array.isArray(variable) && Object.keys(variable).length === 0) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
return !variable;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const loadCache = async () => {
|
|
11
|
+
const data = await loadCacheDB();
|
|
12
|
+
return !empty(data) ? data : { messages: {} };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const gemini = async (content) => {
|
|
16
|
+
let cache = await loadCache();
|
|
17
|
+
|
|
18
|
+
if (cache.messages[content]) {
|
|
19
|
+
console.warn("Відповідь знайдена у кеші");
|
|
20
|
+
return cache.messages[content];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const apiKey = import.meta.env.VITE_GEMINI_KEY;
|
|
24
|
+
const url = `https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent?key=${apiKey}`;
|
|
25
|
+
|
|
26
|
+
const response = await fetch(url, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "Content-Type": "application/json" },
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
contents: [{ parts: [{ text: content }] }]
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const data = await response.json();
|
|
35
|
+
if (data.error) {
|
|
36
|
+
console.error(data.error.message)
|
|
37
|
+
cache.messages[content] = data.error.message;
|
|
38
|
+
await saveCacheDB(cache);
|
|
39
|
+
return data.error.message;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const answer = data.candidates?.[0]?.content?.parts?.[0]?.text || null;
|
|
43
|
+
|
|
44
|
+
if (answer) {
|
|
45
|
+
cache.messages[content] = answer;
|
|
46
|
+
await saveCacheDB(cache);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return answer;
|
|
50
|
+
};
|
package/src/indexDB.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const dbName = "aprogDB";
|
|
2
|
+
const storeName = "cacheGemini";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Відкриття або створення IndexedDB
|
|
6
|
+
*/
|
|
7
|
+
const openDB = () => {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const request = indexedDB.open(dbName, 1);
|
|
10
|
+
|
|
11
|
+
request.onupgradeneeded = (event) => {
|
|
12
|
+
const db = event.target.result;
|
|
13
|
+
if (!db.objectStoreNames.contains(storeName)) {
|
|
14
|
+
db.createObjectStore(storeName, { keyPath: "id" });
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
request.onsuccess = () => resolve(request.result);
|
|
19
|
+
request.onerror = () => reject(request.error);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Завантаження кешу (аналог sessionStorage.getItem)
|
|
25
|
+
*/
|
|
26
|
+
const loadCacheDB = async (name = "gemini") => {
|
|
27
|
+
const db = await openDB();
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const tx = db.transaction(storeName, "readonly");
|
|
30
|
+
const store = tx.objectStore(storeName);
|
|
31
|
+
const request = store.get(name);
|
|
32
|
+
|
|
33
|
+
request.onsuccess = () => resolve(request.result ? request.result.data : {});
|
|
34
|
+
request.onerror = () => reject(request.error);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Збереження кешу (аналог sessionStorage.setItem)
|
|
40
|
+
*/
|
|
41
|
+
const saveCacheDB = async (cache, id = "gemini") => {
|
|
42
|
+
try {
|
|
43
|
+
const resolvedCache = await Promise.resolve(cache);
|
|
44
|
+
const db = await openDB();
|
|
45
|
+
const tx = db.transaction(storeName, "readwrite");
|
|
46
|
+
const store = tx.objectStore(storeName);
|
|
47
|
+
|
|
48
|
+
await store.put({ id: id, data: resolvedCache });
|
|
49
|
+
await tx.complete;
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error("Failed to save cache:", err);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export {loadCacheDB, saveCacheDB};
|