Базовая система входа и система новостей/оповещений
This commit is contained in:
parent
38b3006746
commit
811856fee4
21 changed files with 1400 additions and 109 deletions
|
|
@ -1,4 +1,15 @@
|
||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
|
||||||
|
import node from "@astrojs/node";
|
||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({});
|
export default defineConfig({
|
||||||
|
server: {
|
||||||
|
port: 8900,
|
||||||
|
host: true
|
||||||
|
},
|
||||||
|
output: 'server',
|
||||||
|
adapter: node({
|
||||||
|
mode: "standalone"
|
||||||
|
})
|
||||||
|
});
|
||||||
14
package.json
14
package.json
|
|
@ -10,6 +10,18 @@
|
||||||
"astro": "astro"
|
"astro": "astro"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"astro": "^2.4.1"
|
"@astrojs/node": "^5.1.2",
|
||||||
|
"@noble/hashes": "^1.3.0",
|
||||||
|
"@popperjs/core": "^2.11.7",
|
||||||
|
"@prisma/client": "4.13.0",
|
||||||
|
"@types/bootstrap": "^5.2.6",
|
||||||
|
"astro": "^2.4.1",
|
||||||
|
"astro-bootstrap": "^0.5.13",
|
||||||
|
"bootstrap": "^5.2.3",
|
||||||
|
"sharp": "^0.32.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.1.1",
|
||||||
|
"prisma": "^4.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
489
pnpm-lock.yaml
generated
489
pnpm-lock.yaml
generated
|
|
@ -1,9 +1,41 @@
|
||||||
lockfileVersion: '6.0'
|
lockfileVersion: '6.0'
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@astrojs/node':
|
||||||
|
specifier: ^5.1.2
|
||||||
|
version: 5.1.2(astro@2.4.1)
|
||||||
|
'@noble/hashes':
|
||||||
|
specifier: ^1.3.0
|
||||||
|
version: 1.3.0
|
||||||
|
'@popperjs/core':
|
||||||
|
specifier: ^2.11.7
|
||||||
|
version: 2.11.7
|
||||||
|
'@prisma/client':
|
||||||
|
specifier: 4.13.0
|
||||||
|
version: 4.13.0(prisma@4.13.0)
|
||||||
|
'@types/bootstrap':
|
||||||
|
specifier: ^5.2.6
|
||||||
|
version: 5.2.6
|
||||||
astro:
|
astro:
|
||||||
specifier: ^2.4.1
|
specifier: ^2.4.1
|
||||||
version: 2.4.1
|
version: 2.4.1(@types/node@20.1.1)(sharp@0.32.1)
|
||||||
|
astro-bootstrap:
|
||||||
|
specifier: ^0.5.13
|
||||||
|
version: 0.5.13(astro@2.4.1)(bootstrap@5.2.3)
|
||||||
|
bootstrap:
|
||||||
|
specifier: ^5.2.3
|
||||||
|
version: 5.2.3(@popperjs/core@2.11.7)
|
||||||
|
sharp:
|
||||||
|
specifier: ^0.32.1
|
||||||
|
version: 0.32.1
|
||||||
|
|
||||||
|
devDependencies:
|
||||||
|
'@types/node':
|
||||||
|
specifier: ^20.1.1
|
||||||
|
version: 20.1.1
|
||||||
|
prisma:
|
||||||
|
specifier: ^4.13.0
|
||||||
|
version: 4.13.0
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
|
|
@ -44,7 +76,7 @@ packages:
|
||||||
astro: ^2.4.0
|
astro: ^2.4.0
|
||||||
dependencies:
|
dependencies:
|
||||||
'@astrojs/prism': 2.1.1
|
'@astrojs/prism': 2.1.1
|
||||||
astro: 2.4.1
|
astro: 2.4.1(@types/node@20.1.1)(sharp@0.32.1)
|
||||||
github-slugger: 1.5.0
|
github-slugger: 1.5.0
|
||||||
import-meta-resolve: 2.2.2
|
import-meta-resolve: 2.2.2
|
||||||
rehype-raw: 6.1.1
|
rehype-raw: 6.1.1
|
||||||
|
|
@ -61,6 +93,19 @@ packages:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@astrojs/node@5.1.2(astro@2.4.1):
|
||||||
|
resolution: {integrity: sha512-tDApFnU99O3KQXaRUmfwbkdxqgJhNvPDWou4CVBpybVm3xruigMfz5c+H9P2f4vRo0+sYTzof1L3Hzx9Rh9sQA==}
|
||||||
|
peerDependencies:
|
||||||
|
astro: ^2.3.3
|
||||||
|
dependencies:
|
||||||
|
'@astrojs/webapi': 2.1.1
|
||||||
|
astro: 2.4.1(@types/node@20.1.1)(sharp@0.32.1)
|
||||||
|
send: 0.18.0
|
||||||
|
server-destroy: 1.0.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@astrojs/prism@2.1.1:
|
/@astrojs/prism@2.1.1:
|
||||||
resolution: {integrity: sha512-Gnwnlb1lGJzCQEg89r4/WqgfCGPNFC7Kuh2D/k289Cbdi/2PD7Lrdstz86y1itDvcb2ijiRqjqWnJ5rsfu/QOA==}
|
resolution: {integrity: sha512-Gnwnlb1lGJzCQEg89r4/WqgfCGPNFC7Kuh2D/k289Cbdi/2PD7Lrdstz86y1itDvcb2ijiRqjqWnJ5rsfu/QOA==}
|
||||||
engines: {node: '>=16.12.0'}
|
engines: {node: '>=16.12.0'}
|
||||||
|
|
@ -573,6 +618,10 @@ packages:
|
||||||
resolution: {integrity: sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==}
|
resolution: {integrity: sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@noble/hashes@1.3.0:
|
||||||
|
resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@nodelib/fs.scandir@2.1.5:
|
/@nodelib/fs.scandir@2.1.5:
|
||||||
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
@ -606,6 +655,32 @@ packages:
|
||||||
tslib: 2.5.0
|
tslib: 2.5.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@popperjs/core@2.11.7:
|
||||||
|
resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@prisma/client@4.13.0(prisma@4.13.0):
|
||||||
|
resolution: {integrity: sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==}
|
||||||
|
engines: {node: '>=14.17'}
|
||||||
|
requiresBuild: true
|
||||||
|
peerDependencies:
|
||||||
|
prisma: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
prisma:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
'@prisma/engines-version': 4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a
|
||||||
|
prisma: 4.13.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a:
|
||||||
|
resolution: {integrity: sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@prisma/engines@4.13.0:
|
||||||
|
resolution: {integrity: sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==}
|
||||||
|
requiresBuild: true
|
||||||
|
|
||||||
/@types/babel__core@7.20.0:
|
/@types/babel__core@7.20.0:
|
||||||
resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==}
|
resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -635,6 +710,12 @@ packages:
|
||||||
'@babel/types': 7.21.5
|
'@babel/types': 7.21.5
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@types/bootstrap@5.2.6:
|
||||||
|
resolution: {integrity: sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==}
|
||||||
|
dependencies:
|
||||||
|
'@popperjs/core': 2.11.7
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@types/debug@4.1.7:
|
/@types/debug@4.1.7:
|
||||||
resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==}
|
resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -667,6 +748,9 @@ packages:
|
||||||
'@types/unist': 2.0.6
|
'@types/unist': 2.0.6
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@types/node@20.1.1:
|
||||||
|
resolution: {integrity: sha512-uKBEevTNb+l6/aCQaKVnUModfEMjAl98lw2Si9P5y4hLu9tm6AlX2ZIoXZX6Wh9lJueYPrGPKk5WMCNHg/u6/A==}
|
||||||
|
|
||||||
/@types/parse5@6.0.3:
|
/@types/parse5@6.0.3:
|
||||||
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
|
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -760,7 +844,23 @@ packages:
|
||||||
resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
|
resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/astro@2.4.1:
|
/astro-bootstrap@0.5.13(astro@2.4.1)(bootstrap@5.2.3):
|
||||||
|
resolution: {integrity: sha512-XbixeG+lu76Wy2rB8ae/wtRE5Kf90CID3usUO7HTc/h/RS4UxWk6meyWTIB083z9jCBsRbZN1G2FsmGkLoPd+Q==}
|
||||||
|
peerDependencies:
|
||||||
|
astro: '>=1.x'
|
||||||
|
bootstrap: 5.x
|
||||||
|
dependencies:
|
||||||
|
'@types/bootstrap': 5.2.6
|
||||||
|
astro: 2.4.1(@types/node@20.1.1)(sharp@0.32.1)
|
||||||
|
bootstrap: 5.2.3(@popperjs/core@2.11.7)
|
||||||
|
clsx: 1.2.1
|
||||||
|
dompurify: 2.4.5
|
||||||
|
marked: 4.3.0
|
||||||
|
nanoid: 4.0.2
|
||||||
|
title-case: 3.0.3
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/astro@2.4.1(@types/node@20.1.1)(sharp@0.32.1):
|
||||||
resolution: {integrity: sha512-qNYXxjtJm0+FHr+MtHXhV/WEMkoulAoCsvtdyJrQiuk9raodPo2xNHgP1WPZUtmFlPN2ezZ2XGDUK1zmFZgRLg==}
|
resolution: {integrity: sha512-qNYXxjtJm0+FHr+MtHXhV/WEMkoulAoCsvtdyJrQiuk9raodPo2xNHgP1WPZUtmFlPN2ezZ2XGDUK1zmFZgRLg==}
|
||||||
engines: {node: '>=16.12.0', npm: '>=6.14.0'}
|
engines: {node: '>=16.12.0', npm: '>=6.14.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
@ -810,6 +910,7 @@ packages:
|
||||||
rehype: 12.0.1
|
rehype: 12.0.1
|
||||||
semver: 7.5.0
|
semver: 7.5.0
|
||||||
server-destroy: 1.0.1
|
server-destroy: 1.0.1
|
||||||
|
sharp: 0.32.1
|
||||||
shiki: 0.14.2
|
shiki: 0.14.2
|
||||||
slash: 4.0.0
|
slash: 4.0.0
|
||||||
string-width: 5.1.2
|
string-width: 5.1.2
|
||||||
|
|
@ -819,7 +920,7 @@ packages:
|
||||||
typescript: 5.0.4
|
typescript: 5.0.4
|
||||||
unist-util-visit: 4.1.2
|
unist-util-visit: 4.1.2
|
||||||
vfile: 5.3.7
|
vfile: 5.3.7
|
||||||
vite: 4.3.5
|
vite: 4.3.5(@types/node@20.1.1)
|
||||||
vitefu: 0.2.4(vite@4.3.5)
|
vitefu: 0.2.4(vite@4.3.5)
|
||||||
yargs-parser: 21.1.1
|
yargs-parser: 21.1.1
|
||||||
zod: 3.21.4
|
zod: 3.21.4
|
||||||
|
|
@ -851,6 +952,14 @@ packages:
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/bl@4.1.0:
|
||||||
|
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
|
||||||
|
dependencies:
|
||||||
|
buffer: 5.7.1
|
||||||
|
inherits: 2.0.4
|
||||||
|
readable-stream: 3.6.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/bl@5.1.0:
|
/bl@5.1.0:
|
||||||
resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
|
resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -859,6 +968,14 @@ packages:
|
||||||
readable-stream: 3.6.2
|
readable-stream: 3.6.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/bootstrap@5.2.3(@popperjs/core@2.11.7):
|
||||||
|
resolution: {integrity: sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==}
|
||||||
|
peerDependencies:
|
||||||
|
'@popperjs/core': ^2.11.6
|
||||||
|
dependencies:
|
||||||
|
'@popperjs/core': 2.11.7
|
||||||
|
dev: false
|
||||||
|
|
||||||
/boxen@6.2.1:
|
/boxen@6.2.1:
|
||||||
resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==}
|
resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==}
|
||||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
|
|
@ -898,6 +1015,13 @@ packages:
|
||||||
update-browserslist-db: 1.0.11(browserslist@4.21.5)
|
update-browserslist-db: 1.0.11(browserslist@4.21.5)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/buffer@5.7.1:
|
||||||
|
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
||||||
|
dependencies:
|
||||||
|
base64-js: 1.5.1
|
||||||
|
ieee754: 1.2.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/buffer@6.0.3:
|
/buffer@6.0.3:
|
||||||
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
|
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -981,6 +1105,10 @@ packages:
|
||||||
fsevents: 2.3.2
|
fsevents: 2.3.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/chownr@1.1.4:
|
||||||
|
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ci-info@3.8.0:
|
/ci-info@3.8.0:
|
||||||
resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
|
resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
@ -1008,6 +1136,11 @@ packages:
|
||||||
engines: {node: '>=0.8'}
|
engines: {node: '>=0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/clsx@1.2.1:
|
||||||
|
resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/color-convert@1.9.3:
|
/color-convert@1.9.3:
|
||||||
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
|
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -1029,6 +1162,21 @@ packages:
|
||||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/color-string@1.9.1:
|
||||||
|
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
|
||||||
|
dependencies:
|
||||||
|
color-name: 1.1.4
|
||||||
|
simple-swizzle: 0.2.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/color@4.2.3:
|
||||||
|
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
|
||||||
|
engines: {node: '>=12.5.0'}
|
||||||
|
dependencies:
|
||||||
|
color-convert: 2.0.1
|
||||||
|
color-string: 1.9.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/comma-separated-tokens@2.0.3:
|
/comma-separated-tokens@2.0.3:
|
||||||
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
|
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -1055,6 +1203,17 @@ packages:
|
||||||
which: 2.0.2
|
which: 2.0.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/debug@2.6.9:
|
||||||
|
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
||||||
|
peerDependencies:
|
||||||
|
supports-color: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
supports-color:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
ms: 2.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/debug@4.3.4:
|
/debug@4.3.4:
|
||||||
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
||||||
engines: {node: '>=6.0'}
|
engines: {node: '>=6.0'}
|
||||||
|
|
@ -1073,6 +1232,18 @@ packages:
|
||||||
character-entities: 2.0.2
|
character-entities: 2.0.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/decompress-response@6.0.0:
|
||||||
|
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dependencies:
|
||||||
|
mimic-response: 3.1.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/deep-extend@0.6.0:
|
||||||
|
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
|
||||||
|
engines: {node: '>=4.0.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/deepmerge-ts@4.3.0:
|
/deepmerge-ts@4.3.0:
|
||||||
resolution: {integrity: sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==}
|
resolution: {integrity: sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==}
|
||||||
engines: {node: '>=12.4.0'}
|
engines: {node: '>=12.4.0'}
|
||||||
|
|
@ -1107,11 +1278,26 @@ packages:
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/depd@2.0.0:
|
||||||
|
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/dequal@2.0.3:
|
/dequal@2.0.3:
|
||||||
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/destroy@1.2.0:
|
||||||
|
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
|
||||||
|
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/detect-libc@2.0.1:
|
||||||
|
resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/devalue@4.3.0:
|
/devalue@4.3.0:
|
||||||
resolution: {integrity: sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==}
|
resolution: {integrity: sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -1125,6 +1311,10 @@ packages:
|
||||||
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/dompurify@2.4.5:
|
||||||
|
resolution: {integrity: sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/dset@3.1.2:
|
/dset@3.1.2:
|
||||||
resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==}
|
resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
@ -1134,6 +1324,10 @@ packages:
|
||||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ee-first@1.1.1:
|
||||||
|
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/electron-to-chromium@1.4.387:
|
/electron-to-chromium@1.4.387:
|
||||||
resolution: {integrity: sha512-tutLf+alr1/0YqJwKPdstVvDLmxmLb5xNyDLNS0RZmenHcEYk9qKfpKDCVZEKJ00JVbnayJm1MZAbYhYDFpcOw==}
|
resolution: {integrity: sha512-tutLf+alr1/0YqJwKPdstVvDLmxmLb5xNyDLNS0RZmenHcEYk9qKfpKDCVZEKJ00JVbnayJm1MZAbYhYDFpcOw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -1153,6 +1347,17 @@ packages:
|
||||||
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/encodeurl@1.0.2:
|
||||||
|
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/end-of-stream@1.4.4:
|
||||||
|
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
|
||||||
|
dependencies:
|
||||||
|
once: 1.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/es-module-lexer@1.2.1:
|
/es-module-lexer@1.2.1:
|
||||||
resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==}
|
resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -1192,6 +1397,10 @@ packages:
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/escape-html@1.0.3:
|
||||||
|
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/escape-string-regexp@1.0.5:
|
/escape-string-regexp@1.0.5:
|
||||||
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
|
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
|
||||||
engines: {node: '>=0.8.0'}
|
engines: {node: '>=0.8.0'}
|
||||||
|
|
@ -1212,6 +1421,11 @@ packages:
|
||||||
resolution: {integrity: sha512-s6ceX0NFiU/vKPiKvFdR83U1Zffu7upwZsGwpoqfg5rbbq1l50WQ5hCeIvM6E6oD4shUHCYMsiFPns4Jk0YfMQ==}
|
resolution: {integrity: sha512-s6ceX0NFiU/vKPiKvFdR83U1Zffu7upwZsGwpoqfg5rbbq1l50WQ5hCeIvM6E6oD4shUHCYMsiFPns4Jk0YfMQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/etag@1.8.1:
|
||||||
|
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/events@3.3.0:
|
/events@3.3.0:
|
||||||
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
||||||
engines: {node: '>=0.8.x'}
|
engines: {node: '>=0.8.x'}
|
||||||
|
|
@ -1262,6 +1476,11 @@ packages:
|
||||||
strip-final-newline: 3.0.0
|
strip-final-newline: 3.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/expand-template@2.0.3:
|
||||||
|
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/extend-shallow@2.0.1:
|
/extend-shallow@2.0.1:
|
||||||
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
|
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
@ -1320,6 +1539,15 @@ packages:
|
||||||
pkg-dir: 4.2.0
|
pkg-dir: 4.2.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/fresh@0.5.2:
|
||||||
|
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/fs-constants@1.0.0:
|
||||||
|
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/fsevents@2.3.2:
|
/fsevents@2.3.2:
|
||||||
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
||||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
|
|
@ -1342,6 +1570,10 @@ packages:
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/github-from-package@0.0.0:
|
||||||
|
resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/github-slugger@1.5.0:
|
/github-slugger@1.5.0:
|
||||||
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
|
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -1482,6 +1714,17 @@ packages:
|
||||||
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
|
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/http-errors@2.0.0:
|
||||||
|
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dependencies:
|
||||||
|
depd: 2.0.0
|
||||||
|
inherits: 2.0.4
|
||||||
|
setprototypeof: 1.2.0
|
||||||
|
statuses: 2.0.1
|
||||||
|
toidentifier: 1.0.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/human-signals@2.1.0:
|
/human-signals@2.1.0:
|
||||||
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
||||||
engines: {node: '>=10.17.0'}
|
engines: {node: '>=10.17.0'}
|
||||||
|
|
@ -1509,6 +1752,14 @@ packages:
|
||||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ini@1.3.8:
|
||||||
|
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/is-arrayish@0.3.2:
|
||||||
|
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/is-binary-path@2.1.0:
|
/is-binary-path@2.1.0:
|
||||||
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
@ -1717,6 +1968,12 @@ packages:
|
||||||
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
|
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/marked@4.3.0:
|
||||||
|
resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
|
||||||
|
engines: {node: '>= 12'}
|
||||||
|
hasBin: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mdast-util-definitions@5.1.2:
|
/mdast-util-definitions@5.1.2:
|
||||||
resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
|
resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -2113,6 +2370,12 @@ packages:
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/mime@1.6.0:
|
||||||
|
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
hasBin: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mime@3.0.0:
|
/mime@3.0.0:
|
||||||
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
|
|
@ -2129,27 +2392,69 @@ packages:
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/mimic-response@3.1.0:
|
||||||
|
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/minimist@1.2.8:
|
||||||
|
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/mkdirp-classic@0.5.3:
|
||||||
|
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mri@1.2.0:
|
/mri@1.2.0:
|
||||||
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
|
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ms@2.0.0:
|
||||||
|
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ms@2.1.2:
|
/ms@2.1.2:
|
||||||
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ms@2.1.3:
|
||||||
|
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/nanoid@3.3.6:
|
/nanoid@3.3.6:
|
||||||
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
|
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
|
||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/nanoid@4.0.2:
|
||||||
|
resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==}
|
||||||
|
engines: {node: ^14 || ^16 || >=18}
|
||||||
|
hasBin: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/napi-build-utils@1.0.2:
|
||||||
|
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/nlcst-to-string@3.1.1:
|
/nlcst-to-string@3.1.1:
|
||||||
resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==}
|
resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/nlcst': 1.0.0
|
'@types/nlcst': 1.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/node-abi@3.40.0:
|
||||||
|
resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dependencies:
|
||||||
|
semver: 7.5.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/node-addon-api@6.1.0:
|
||||||
|
resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/node-releases@2.0.10:
|
/node-releases@2.0.10:
|
||||||
resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
|
resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -2173,6 +2478,19 @@ packages:
|
||||||
path-key: 4.0.0
|
path-key: 4.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/on-finished@2.4.1:
|
||||||
|
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dependencies:
|
||||||
|
ee-first: 1.1.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/once@1.4.0:
|
||||||
|
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||||
|
dependencies:
|
||||||
|
wrappy: 1.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/onetime@5.1.2:
|
/onetime@5.1.2:
|
||||||
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
@ -2310,6 +2628,25 @@ packages:
|
||||||
source-map-js: 1.0.2
|
source-map-js: 1.0.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/prebuild-install@7.1.1:
|
||||||
|
resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
detect-libc: 2.0.1
|
||||||
|
expand-template: 2.0.3
|
||||||
|
github-from-package: 0.0.0
|
||||||
|
minimist: 1.2.8
|
||||||
|
mkdirp-classic: 0.5.3
|
||||||
|
napi-build-utils: 1.0.2
|
||||||
|
node-abi: 3.40.0
|
||||||
|
pump: 3.0.0
|
||||||
|
rc: 1.2.8
|
||||||
|
simple-get: 4.0.1
|
||||||
|
tar-fs: 2.1.1
|
||||||
|
tunnel-agent: 0.6.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/preferred-pm@3.0.3:
|
/preferred-pm@3.0.3:
|
||||||
resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==}
|
resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
@ -2336,6 +2673,14 @@ packages:
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/prisma@4.13.0:
|
||||||
|
resolution: {integrity: sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==}
|
||||||
|
engines: {node: '>=14.17'}
|
||||||
|
hasBin: true
|
||||||
|
requiresBuild: true
|
||||||
|
dependencies:
|
||||||
|
'@prisma/engines': 4.13.0
|
||||||
|
|
||||||
/prismjs@1.29.0:
|
/prismjs@1.29.0:
|
||||||
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
|
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
@ -2353,10 +2698,32 @@ packages:
|
||||||
resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
|
resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/pump@3.0.0:
|
||||||
|
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
|
||||||
|
dependencies:
|
||||||
|
end-of-stream: 1.4.4
|
||||||
|
once: 1.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/queue-microtask@1.2.3:
|
/queue-microtask@1.2.3:
|
||||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/range-parser@1.2.1:
|
||||||
|
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/rc@1.2.8:
|
||||||
|
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
deep-extend: 0.6.0
|
||||||
|
ini: 1.3.8
|
||||||
|
minimist: 1.2.8
|
||||||
|
strip-json-comments: 2.0.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/readable-stream@3.6.2:
|
/readable-stream@3.6.2:
|
||||||
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
|
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
|
@ -2566,10 +2933,50 @@ packages:
|
||||||
lru-cache: 6.0.0
|
lru-cache: 6.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/send@0.18.0:
|
||||||
|
resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
|
||||||
|
engines: {node: '>= 0.8.0'}
|
||||||
|
dependencies:
|
||||||
|
debug: 2.6.9
|
||||||
|
depd: 2.0.0
|
||||||
|
destroy: 1.2.0
|
||||||
|
encodeurl: 1.0.2
|
||||||
|
escape-html: 1.0.3
|
||||||
|
etag: 1.8.1
|
||||||
|
fresh: 0.5.2
|
||||||
|
http-errors: 2.0.0
|
||||||
|
mime: 1.6.0
|
||||||
|
ms: 2.1.3
|
||||||
|
on-finished: 2.4.1
|
||||||
|
range-parser: 1.2.1
|
||||||
|
statuses: 2.0.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: false
|
||||||
|
|
||||||
/server-destroy@1.0.1:
|
/server-destroy@1.0.1:
|
||||||
resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==}
|
resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/setprototypeof@1.2.0:
|
||||||
|
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/sharp@0.32.1:
|
||||||
|
resolution: {integrity: sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==}
|
||||||
|
engines: {node: '>=14.15.0'}
|
||||||
|
requiresBuild: true
|
||||||
|
dependencies:
|
||||||
|
color: 4.2.3
|
||||||
|
detect-libc: 2.0.1
|
||||||
|
node-addon-api: 6.1.0
|
||||||
|
prebuild-install: 7.1.1
|
||||||
|
semver: 7.5.0
|
||||||
|
simple-get: 4.0.1
|
||||||
|
tar-fs: 2.1.1
|
||||||
|
tunnel-agent: 0.6.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/shebang-command@2.0.0:
|
/shebang-command@2.0.0:
|
||||||
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
@ -2595,6 +3002,24 @@ packages:
|
||||||
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/simple-concat@1.0.1:
|
||||||
|
resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/simple-get@4.0.1:
|
||||||
|
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
|
||||||
|
dependencies:
|
||||||
|
decompress-response: 6.0.0
|
||||||
|
once: 1.4.0
|
||||||
|
simple-concat: 1.0.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/simple-swizzle@0.2.2:
|
||||||
|
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
|
||||||
|
dependencies:
|
||||||
|
is-arrayish: 0.3.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/sisteransi@1.0.5:
|
/sisteransi@1.0.5:
|
||||||
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
|
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -2617,6 +3042,11 @@ packages:
|
||||||
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/statuses@2.0.1:
|
||||||
|
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/stdin-discarder@0.1.0:
|
/stdin-discarder@0.1.0:
|
||||||
resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
|
resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
|
||||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
|
|
@ -2699,6 +3129,11 @@ packages:
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/strip-json-comments@2.0.1:
|
||||||
|
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/suf-log@2.5.3:
|
/suf-log@2.5.3:
|
||||||
resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
|
resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -2738,6 +3173,32 @@ packages:
|
||||||
tslib: 2.5.0
|
tslib: 2.5.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/tar-fs@2.1.1:
|
||||||
|
resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
|
||||||
|
dependencies:
|
||||||
|
chownr: 1.1.4
|
||||||
|
mkdirp-classic: 0.5.3
|
||||||
|
pump: 3.0.0
|
||||||
|
tar-stream: 2.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/tar-stream@2.2.0:
|
||||||
|
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
dependencies:
|
||||||
|
bl: 4.1.0
|
||||||
|
end-of-stream: 1.4.4
|
||||||
|
fs-constants: 1.0.0
|
||||||
|
inherits: 2.0.4
|
||||||
|
readable-stream: 3.6.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/title-case@3.0.3:
|
||||||
|
resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==}
|
||||||
|
dependencies:
|
||||||
|
tslib: 2.5.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/titleize@3.0.0:
|
/titleize@3.0.0:
|
||||||
resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
|
resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
@ -2755,6 +3216,11 @@ packages:
|
||||||
is-number: 7.0.0
|
is-number: 7.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/toidentifier@1.0.1:
|
||||||
|
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
|
||||||
|
engines: {node: '>=0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/trim-lines@3.0.1:
|
/trim-lines@3.0.1:
|
||||||
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
|
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
@ -2778,6 +3244,12 @@ packages:
|
||||||
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
|
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/tunnel-agent@0.6.0:
|
||||||
|
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
|
||||||
|
dependencies:
|
||||||
|
safe-buffer: 5.2.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/type-fest@0.13.1:
|
/type-fest@0.13.1:
|
||||||
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
|
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
@ -2921,7 +3393,7 @@ packages:
|
||||||
vfile-message: 3.1.4
|
vfile-message: 3.1.4
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vite@4.3.5:
|
/vite@4.3.5(@types/node@20.1.1):
|
||||||
resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==}
|
resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
@ -2946,6 +3418,7 @@ packages:
|
||||||
terser:
|
terser:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@types/node': 20.1.1
|
||||||
esbuild: 0.17.18
|
esbuild: 0.17.18
|
||||||
postcss: 8.4.23
|
postcss: 8.4.23
|
||||||
rollup: 3.21.5
|
rollup: 3.21.5
|
||||||
|
|
@ -2961,7 +3434,7 @@ packages:
|
||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 4.3.5
|
vite: 4.3.5(@types/node@20.1.1)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vscode-css-languageservice@6.2.5:
|
/vscode-css-languageservice@6.2.5:
|
||||||
|
|
@ -3072,6 +3545,10 @@ packages:
|
||||||
strip-ansi: 7.0.1
|
strip-ansi: 7.0.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/wrappy@1.0.2:
|
||||||
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/yallist@3.1.1:
|
/yallist@3.1.1:
|
||||||
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
|
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
|
||||||
69
prisma/schema.prisma
Normal file
69
prisma/schema.prisma
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
generator client {
|
||||||
|
provider = "prisma-client-js"
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource db {
|
||||||
|
provider = "postgresql"
|
||||||
|
url = env("DATABASE_URL")
|
||||||
|
}
|
||||||
|
|
||||||
|
model news {
|
||||||
|
id Int @id(map: "pk_news") @default(autoincrement())
|
||||||
|
title String
|
||||||
|
message String
|
||||||
|
is_alert Boolean @default(false)
|
||||||
|
created_at DateTime @default(now())
|
||||||
|
}
|
||||||
|
|
||||||
|
model study_item {
|
||||||
|
id Int @id(map: "pk_study_item") @default(autoincrement())
|
||||||
|
title String
|
||||||
|
study_slot study_slot[]
|
||||||
|
}
|
||||||
|
|
||||||
|
model study_slot {
|
||||||
|
id Int @id(map: "pk_study_slot") @default(autoincrement())
|
||||||
|
study_item_id Int?
|
||||||
|
study_item study_item? @relation(fields: [study_item_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "fk_study_slot_study_item")
|
||||||
|
timetable_timetable_slot_1Tostudy_slot timetable[] @relation("timetable_slot_1Tostudy_slot")
|
||||||
|
timetable_timetable_slot_2Tostudy_slot timetable[] @relation("timetable_slot_2Tostudy_slot")
|
||||||
|
timetable_timetable_slot_3Tostudy_slot timetable[] @relation("timetable_slot_3Tostudy_slot")
|
||||||
|
timetable_timetable_slot_4Tostudy_slot timetable[] @relation("timetable_slot_4Tostudy_slot")
|
||||||
|
timetable_timetable_slot_5Tostudy_slot timetable[] @relation("timetable_slot_5Tostudy_slot")
|
||||||
|
timetable_timetable_slot_6Tostudy_slot timetable[] @relation("timetable_slot_6Tostudy_slot")
|
||||||
|
}
|
||||||
|
|
||||||
|
model timetable {
|
||||||
|
id Int @id(map: "pk_timetable") @default(autoincrement())
|
||||||
|
slot_1 Int?
|
||||||
|
slot_2 Int?
|
||||||
|
slot_3 Int?
|
||||||
|
slot_4 Int?
|
||||||
|
slot_5 Int?
|
||||||
|
slot_6 Int?
|
||||||
|
day Int @db.SmallInt
|
||||||
|
teacher Int
|
||||||
|
study_slot_timetable_slot_1Tostudy_slot study_slot? @relation("timetable_slot_1Tostudy_slot", fields: [slot_1], references: [id], map: "fk_timetable_study_slot_1")
|
||||||
|
study_slot_timetable_slot_2Tostudy_slot study_slot? @relation("timetable_slot_2Tostudy_slot", fields: [slot_2], references: [id], map: "fk_timetable_study_slot_2")
|
||||||
|
study_slot_timetable_slot_3Tostudy_slot study_slot? @relation("timetable_slot_3Tostudy_slot", fields: [slot_3], references: [id], map: "fk_timetable_study_slot_3")
|
||||||
|
study_slot_timetable_slot_4Tostudy_slot study_slot? @relation("timetable_slot_4Tostudy_slot", fields: [slot_4], references: [id], map: "fk_timetable_study_slot_4")
|
||||||
|
study_slot_timetable_slot_5Tostudy_slot study_slot? @relation("timetable_slot_5Tostudy_slot", fields: [slot_5], references: [id], map: "fk_timetable_study_slot_5")
|
||||||
|
study_slot_timetable_slot_6Tostudy_slot study_slot? @relation("timetable_slot_6Tostudy_slot", fields: [slot_6], references: [id], map: "fk_timetable_study_slot_6")
|
||||||
|
users users @relation(fields: [teacher], references: [id], onDelete: Cascade, map: "fk_timetable_users_teacher")
|
||||||
|
}
|
||||||
|
|
||||||
|
model users {
|
||||||
|
id Int @id(map: "pk_users") @default(autoincrement())
|
||||||
|
login String @db.VarChar(25)
|
||||||
|
pass String? @db.VarChar(100)
|
||||||
|
is_admin Boolean? @default(false)
|
||||||
|
timetable timetable[]
|
||||||
|
user_session user_session[]
|
||||||
|
}
|
||||||
|
|
||||||
|
model user_session {
|
||||||
|
id String @id @default(uuid())
|
||||||
|
usersId Int
|
||||||
|
|
||||||
|
user users @relation(fields: [usersId], references: [id])
|
||||||
|
}
|
||||||
1
public/uploads/.gitignore
vendored
Normal file
1
public/uploads/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
*.jpg
|
||||||
0
public/uploads/.gitkeep
Normal file
0
public/uploads/.gitkeep
Normal file
32
src/components/Navbar.astro
Normal file
32
src/components/Navbar.astro
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
const items = [
|
||||||
|
{
|
||||||
|
href: "/",
|
||||||
|
title: "Новости",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/timetable",
|
||||||
|
title: "Расписание",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/logout",
|
||||||
|
title: "Выйти",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
---
|
||||||
|
|
||||||
|
<nav class="navbar navbar-expand-lg bg-primary text-white">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0 text-white">
|
||||||
|
{
|
||||||
|
items.map((e) => (
|
||||||
|
<li class="nav-item">
|
||||||
|
<a href={e.href} class="active nav-link text-white" aria-current="page">
|
||||||
|
{e.title}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
128
src/components/NewsBlock.astro
Normal file
128
src/components/NewsBlock.astro
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
---
|
||||||
|
import { getNewsAndAlerts, getSessionUser } from "../db";
|
||||||
|
|
||||||
|
const { news, alerts } = await getNewsAndAlerts();
|
||||||
|
|
||||||
|
const sessId = Astro.cookies.get("session").value!;
|
||||||
|
const user = (await getSessionUser(sessId))!;
|
||||||
|
|
||||||
|
const formatDate = (dt: Date) => {
|
||||||
|
return (
|
||||||
|
("0" + dt.getDay()).substr(-2) +
|
||||||
|
"." +
|
||||||
|
("0" + (0 + dt.getMonth())).substr(-2) +
|
||||||
|
"." +
|
||||||
|
dt.getFullYear() +
|
||||||
|
" в " +
|
||||||
|
dt.getHours() +
|
||||||
|
":" +
|
||||||
|
("0" + dt.getMinutes()).substr(-2)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
{user.is_admin ? (
|
||||||
|
<a class="btn btn-sm btn-primary d-block mt-2" href="/articleEditor">
|
||||||
|
Новая статья
|
||||||
|
</a>
|
||||||
|
<hr />
|
||||||
|
) : null}
|
||||||
|
{
|
||||||
|
alerts.map((article, idx) => (
|
||||||
|
<div class:list={[idx === 0 ? "mt-2" : ""]}>
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<h4 class="alert-heading">{article.title}</h4>
|
||||||
|
<h6>{formatDate(article.created_at)}</h6>
|
||||||
|
<p data-article={article.message} />
|
||||||
|
{user.is_admin ? (
|
||||||
|
<hr />
|
||||||
|
<div class="d-flex gap-3">
|
||||||
|
<button class="btn btn-sm btn-danger flex-grow-1" onclick={`deleteArticle(${article.id})`}>
|
||||||
|
Удалить
|
||||||
|
</button>
|
||||||
|
<a class="btn btn-sm btn-warning flex-grow-1" href={`/articleEditor?id=${article.id}`}>
|
||||||
|
Редактировать
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
{ alerts.length > 0 ? <hr /> : null }
|
||||||
|
{ news.length > 0 ?
|
||||||
|
news.map((article, idx) => (
|
||||||
|
<div class:list={[idx === 0 ? "mt-2" : ""]}>
|
||||||
|
<div class="alert alert-info" role="alert">
|
||||||
|
<h4 class="alert-heading">{article.title}</h4>
|
||||||
|
<h6>{formatDate(article.created_at)}</h6>
|
||||||
|
<p data-article={article.message} />
|
||||||
|
{user.is_admin ? (
|
||||||
|
<hr />
|
||||||
|
<div class="d-flex gap-3">
|
||||||
|
<button class="btn btn-sm btn-danger flex-grow-1" onclick={`deleteArticle(${article.id})`}>
|
||||||
|
Удалить
|
||||||
|
</button>
|
||||||
|
<a class="btn btn-sm btn-warning flex-grow-1" href={`/articleEditor?id=${article.id}`}>
|
||||||
|
Редактировать
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)) :
|
||||||
|
<div class="mt-2">
|
||||||
|
<div class="alert alert-success" role="alert">
|
||||||
|
<h4 class="alert-heading m-0">Новостей нет</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
{user.is_admin ?
|
||||||
|
<script is:inline>
|
||||||
|
async function deleteArticle(articleId) {
|
||||||
|
try {
|
||||||
|
const resp = await fetch(`/articles/delete?id=${articleId}`, {
|
||||||
|
method: "POST"
|
||||||
|
});
|
||||||
|
const json = await resp.json();
|
||||||
|
if (json.ok) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
throw new Error(json.reason)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
alert(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script> : null}
|
||||||
|
<script src ="https://cdn.jsdelivr.net/npm/editorjs-html@latest/build/edjsHTML.js"> </script>
|
||||||
|
<script is:inline>
|
||||||
|
function checklist(data) {
|
||||||
|
const items = data.data.items.reduce(
|
||||||
|
(acc, item) => acc + `<div class="form-check"><input class="form-check-input" type="checkbox"${item.checked ? " checked" : ""} disabled/><label class="form-check-label">${item.text}</label></div>`,
|
||||||
|
""
|
||||||
|
);
|
||||||
|
return `<div>${items}</div>`;
|
||||||
|
}
|
||||||
|
function quote(data) {
|
||||||
|
const {text, caption} = data.data;
|
||||||
|
if (caption && caption.length > 0) {
|
||||||
|
return `<figure><blockquote class="blockquote"><p>${text}</p></blockquote><figcaption class="blockquote-footer">${caption}</figcaption></figure>`;
|
||||||
|
}
|
||||||
|
return `<blockquote class="blockquote"><p>${text}</p></blockquote>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
const edjsParser = edjsHTML({ checklist, quote });
|
||||||
|
document.querySelectorAll("[data-article]").forEach(e => {
|
||||||
|
e.innerHTML = edjsParser.parse(JSON.parse(e.dataset["article"])).reduce((a,b) => a+b, "");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style is:inline>
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
0
src/data/user.ts
Normal file
0
src/data/user.ts
Normal file
146
src/db.ts
Normal file
146
src/db.ts
Normal file
|
|
@ -0,0 +1,146 @@
|
||||||
|
import { PrismaClient, users } from "@prisma/client";
|
||||||
|
import { blake3 } from "@noble/hashes/blake3";
|
||||||
|
import { bytesToHex as toHex } from "@noble/hashes/utils";
|
||||||
|
|
||||||
|
const client = new PrismaClient();
|
||||||
|
|
||||||
|
export async function getSessionUser(sessionId: string) {
|
||||||
|
const dbSession = await client.user_session.findFirst({
|
||||||
|
where: {
|
||||||
|
id: sessionId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const user = await client.users.findFirst({
|
||||||
|
where: {
|
||||||
|
id: dbSession!.usersId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getUserSession(sessionId: string) {
|
||||||
|
const dbSession = await client.user_session.findFirst({
|
||||||
|
where: {
|
||||||
|
id: sessionId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return dbSession;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function destroySession(sessionId: string) {
|
||||||
|
try {
|
||||||
|
await client.user_session.delete({
|
||||||
|
where: {
|
||||||
|
id: sessionId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function isThereAnyAdmins() {
|
||||||
|
const user = await client.users.findMany({
|
||||||
|
where: {
|
||||||
|
is_admin: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return user.length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getUserFromAuth(login: string, password: string) {
|
||||||
|
const user = await client.users.findFirst({
|
||||||
|
where: {
|
||||||
|
login: login,
|
||||||
|
pass: toHex(blake3(password)),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createUser(login: string, password: string) {
|
||||||
|
const anyAdmins = await isThereAnyAdmins();
|
||||||
|
const user = await client.users.create({
|
||||||
|
data: {
|
||||||
|
login: login,
|
||||||
|
pass: toHex(blake3(password)),
|
||||||
|
is_admin: !anyAdmins,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createSession(user: users) {
|
||||||
|
const session = await client.user_session.create({
|
||||||
|
data: {
|
||||||
|
usersId: user!.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return session;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getNewsAndAlerts() {
|
||||||
|
const allNews = await client.news.findMany({
|
||||||
|
orderBy: {
|
||||||
|
created_at: "desc",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const news = [];
|
||||||
|
const alerts = [];
|
||||||
|
for (let n of allNews) {
|
||||||
|
if (n.is_alert) {
|
||||||
|
alerts.push(n);
|
||||||
|
} else {
|
||||||
|
news.push(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
news,
|
||||||
|
alerts,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteArticle(articleId: number) {
|
||||||
|
const result = await client.news.delete({
|
||||||
|
where: {
|
||||||
|
id: articleId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return result !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createArticle(title: string, data: string, isAlert: boolean) {
|
||||||
|
const article = await client.news.create({
|
||||||
|
data: {
|
||||||
|
title: title,
|
||||||
|
message: data,
|
||||||
|
is_alert: isAlert,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return article !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateArticle(id: number, title: string, data: string, isAlert: boolean) {
|
||||||
|
const article = await client.news.update({
|
||||||
|
where: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
title: title,
|
||||||
|
message: data,
|
||||||
|
is_alert: isAlert,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return article !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getArticle(articleId: number) {
|
||||||
|
const article = await client.news.findFirst({
|
||||||
|
where: {
|
||||||
|
id: articleId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return article;
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
|
import "bootstrap/dist/css/bootstrap.css";
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
title: string;
|
title: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { title } = Astro.props;
|
const { title } = Astro.props;
|
||||||
|
|
@ -8,28 +10,14 @@ const { title } = Astro.props;
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name="viewport" content="width=device-width" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
<meta name="generator" content={Astro.generator} />
|
<meta name="generator" content={Astro.generator} />
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<slot />
|
<slot />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
<style is:global>
|
|
||||||
:root {
|
|
||||||
--accent: 124, 58, 237;
|
|
||||||
--accent-gradient: linear-gradient(45deg, rgb(var(--accent)), #da62c4 30%, white 60%);
|
|
||||||
}
|
|
||||||
html {
|
|
||||||
font-family: system-ui, sans-serif;
|
|
||||||
background-color: #F6F6F6;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
|
|
||||||
Bitstream Vera Sans Mono, Courier New, monospace;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
||||||
199
src/pages/articleEditor.astro
Normal file
199
src/pages/articleEditor.astro
Normal file
|
|
@ -0,0 +1,199 @@
|
||||||
|
---
|
||||||
|
import Layout from "../layouts/Layout.astro";
|
||||||
|
import { getSessionUser, getArticle } from "../db";
|
||||||
|
import Navbar from "../components/Navbar.astro";
|
||||||
|
import type { news } from "@prisma/client";
|
||||||
|
|
||||||
|
const sessId = Astro.cookies.get("session").value!;
|
||||||
|
const user = await getSessionUser(sessId);
|
||||||
|
|
||||||
|
if (user === null || !user.is_admin) {
|
||||||
|
return Astro.redirect("/login");
|
||||||
|
}
|
||||||
|
|
||||||
|
let article: news | null = null;
|
||||||
|
const articleId = parseInt(Astro.url.searchParams.get("id") ?? "");
|
||||||
|
if (articleId) {
|
||||||
|
article = await getArticle(articleId);
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Создание новости">
|
||||||
|
<main data-article={article?.message} data-articleId={articleId}>
|
||||||
|
<Navbar />
|
||||||
|
<div class="container mt-5" style="max-width: 650px;">
|
||||||
|
<div class="d-flex">
|
||||||
|
<button type="button" class="btn btn-sm btn-success flex-fill" id="saveBtn">Сохранить</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label for="title" class="form-label mt-4">Заголовок</label>
|
||||||
|
<input type="text" id="title" class="form-control" value={article ? article.title : ""} />
|
||||||
|
|
||||||
|
<div class="form-check">
|
||||||
|
{
|
||||||
|
article && article.is_alert ? (
|
||||||
|
<input class="form-check-input" type="checkbox" id="isAlert" checked />
|
||||||
|
) : (
|
||||||
|
<input class="form-check-input" type="checkbox" id="isAlert" />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
<label class="form-check-label" for="isAlert">Оповещение</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="editorjs" class="mt-4">
|
||||||
|
<label for="title">Текст</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/editorjs@latest"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/header@latest"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/quote@latest"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/checklist@latest"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/list@latest"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/embed@latest"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@editorjs/image@latest"></script>
|
||||||
|
<script is:inline>
|
||||||
|
async function saveArticle(articleTitle, articleData, articleIsAlert) {
|
||||||
|
if (!articleTitle || articleData.blocks.length === 0 || (articleIsAlert !== true && articleIsAlert !== false)) {
|
||||||
|
alert("Проверьте ввод!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fd = new FormData();
|
||||||
|
fd.append("title", articleTitle);
|
||||||
|
fd.append("data", JSON.stringify(articleData));
|
||||||
|
fd.append("isAlert", JSON.stringify(articleIsAlert));
|
||||||
|
|
||||||
|
try {
|
||||||
|
const articleId = parseInt(document.querySelector("[data-articleid]").dataset["articleid"]);
|
||||||
|
if (Number.isInteger(articleId)) {
|
||||||
|
fd.append("isUpdate", JSON.stringify(true));
|
||||||
|
fd.append("articleId", articleId);
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const resp = await fetch("/articles/create", {
|
||||||
|
method: "POST",
|
||||||
|
body: fd,
|
||||||
|
});
|
||||||
|
const json = await resp.json();
|
||||||
|
if (json.ok) {
|
||||||
|
location.href = "/";
|
||||||
|
} else {
|
||||||
|
throw new Error(json.reason);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.group("Ошибка сохранения статьи");
|
||||||
|
console.error(e);
|
||||||
|
console.groupEnd();
|
||||||
|
alert("Не удалось сохранить! \nПроверьте консоль для подробностей");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
const editor = new EditorJS({
|
||||||
|
holder: "editorjs",
|
||||||
|
placeholder: "Начните писать",
|
||||||
|
tools: {
|
||||||
|
header: Header,
|
||||||
|
quote: Quote,
|
||||||
|
checklist: Checklist,
|
||||||
|
list: List,
|
||||||
|
embed: Embed,
|
||||||
|
image: {
|
||||||
|
class: ImageTool,
|
||||||
|
title: "Изображение",
|
||||||
|
config: {
|
||||||
|
endpoints: {
|
||||||
|
byFile: "/uploadFile",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
i18n: {
|
||||||
|
messages: {
|
||||||
|
ui: {
|
||||||
|
blockTunes: {
|
||||||
|
toggler: {
|
||||||
|
"Click to tune": "Нажмите, чтобы настроить",
|
||||||
|
"or drag to move": "или перетащите",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
inlineToolbar: {
|
||||||
|
converter: {
|
||||||
|
"Convert to": "Конвертировать в",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
toolbox: {
|
||||||
|
Add: "Добавить",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
toolNames: {
|
||||||
|
Text: "Параграф",
|
||||||
|
Heading: "Заголовок",
|
||||||
|
List: "Список",
|
||||||
|
Warning: "Примечание",
|
||||||
|
Checklist: "Чеклист",
|
||||||
|
Quote: "Цитата",
|
||||||
|
Code: "Код",
|
||||||
|
Delimiter: "Разделитель",
|
||||||
|
"Raw HTML": "HTML-фрагмент",
|
||||||
|
Table: "Таблица",
|
||||||
|
Link: "Ссылка",
|
||||||
|
Marker: "Маркер",
|
||||||
|
Bold: "Полужирный",
|
||||||
|
Italic: "Курсив",
|
||||||
|
InlineCode: "Моноширинный",
|
||||||
|
Image: "Изображение",
|
||||||
|
},
|
||||||
|
|
||||||
|
tools: {
|
||||||
|
link: {
|
||||||
|
"Add a link": "Вставьте ссылку",
|
||||||
|
},
|
||||||
|
stub: {
|
||||||
|
"The block can not be displayed correctly.": "Блок не может быть отображен",
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
"Couldn’t upload image. Please try another.": "Не удалось загрузить изображение. Попробуйте ещё раз.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
blockTunes: {
|
||||||
|
delete: {
|
||||||
|
Delete: "Удалить",
|
||||||
|
},
|
||||||
|
moveUp: {
|
||||||
|
"Move up": "Переместить вверх",
|
||||||
|
},
|
||||||
|
moveDown: {
|
||||||
|
"Move down": "Переместить вниз",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const titleInput = document.getElementById("title");
|
||||||
|
const isAlertInput = document.getElementById("isAlert");
|
||||||
|
|
||||||
|
document.getElementById("saveBtn").addEventListener("click", async () => {
|
||||||
|
const articleData = await editor.save();
|
||||||
|
saveArticle(titleInput.value, articleData, isAlertInput.checked);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.isReady.then(() => {
|
||||||
|
try {
|
||||||
|
const article = JSON.parse(document.querySelector("[data-article]").dataset["article"]);
|
||||||
|
if (article !== null) {
|
||||||
|
editor.render(article);
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</Layout>
|
||||||
42
src/pages/articles/create.ts
Normal file
42
src/pages/articles/create.ts
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
import type { APIContext } from "astro";
|
||||||
|
import { createArticle, updateArticle } from "../../db";
|
||||||
|
|
||||||
|
export async function post({ request, url }: APIContext) {
|
||||||
|
const response: { ok: boolean; reason?: string } = {
|
||||||
|
ok: true,
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
const fd = await request.formData();
|
||||||
|
const title = fd.get("title");
|
||||||
|
const data = fd.get("data");
|
||||||
|
const isAlert = fd.get("isAlert");
|
||||||
|
const isUpdate = JSON.parse(fd.get("isUpdate")?.toString() ?? "false");
|
||||||
|
const articleId = parseInt(fd.get("articleId")?.toString() ?? "");
|
||||||
|
if (title === null || data === null || isAlert === null || (isUpdate && Number.isNaN(articleId))) {
|
||||||
|
throw new Error("Неправильный формат запроса");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isUpdate) {
|
||||||
|
const updated = await updateArticle(parseInt(articleId?.toString() ?? ""), title.toString(), data.toString(), JSON.parse(isAlert.toString()));
|
||||||
|
if (!updated) {
|
||||||
|
throw new Error("Не удалось создать");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const created = await createArticle(title.toString(), data.toString(), JSON.parse(isAlert.toString()));
|
||||||
|
if (!created) {
|
||||||
|
throw new Error("Не удалось создать");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: any) {
|
||||||
|
response.ok = false;
|
||||||
|
if (e instanceof Error) {
|
||||||
|
response.reason = e.message;
|
||||||
|
} else {
|
||||||
|
response.reason = e.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
body: JSON.stringify(response),
|
||||||
|
};
|
||||||
|
}
|
||||||
30
src/pages/articles/delete.ts
Normal file
30
src/pages/articles/delete.ts
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
import type { APIContext } from "astro";
|
||||||
|
import { deleteArticle } from "../../db";
|
||||||
|
|
||||||
|
export async function post({ request, url }: APIContext) {
|
||||||
|
const response: { ok: boolean; reason?: string } = {
|
||||||
|
ok: true,
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
const postId = parseInt(url.searchParams.get("id") ?? "");
|
||||||
|
if (!postId) {
|
||||||
|
throw new Error("Неправильный формат запроса");
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleted = await deleteArticle(postId);
|
||||||
|
if (!deleted) {
|
||||||
|
throw new Error("Не удалось удалить");
|
||||||
|
}
|
||||||
|
} catch (e: any) {
|
||||||
|
response.ok = false;
|
||||||
|
if (e instanceof Error) {
|
||||||
|
response.reason = e.message;
|
||||||
|
} else {
|
||||||
|
response.reason = e.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
body: JSON.stringify(response),
|
||||||
|
};
|
||||||
|
}
|
||||||
38
src/pages/gate/login.ts
Normal file
38
src/pages/gate/login.ts
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
import type { APIContext } from "astro";
|
||||||
|
import { createSession, getUserFromAuth } from "../../db";
|
||||||
|
|
||||||
|
export async function post({ request, redirect, cookies }: APIContext) {
|
||||||
|
const response: { ok: boolean; reason?: string } = {
|
||||||
|
ok: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const formData = await request.formData();
|
||||||
|
const login = formData.get("login");
|
||||||
|
const password = formData.get("password");
|
||||||
|
if (login === null || password === null) {
|
||||||
|
response.ok = false;
|
||||||
|
response.reason = "Не предоставлены данные для входа";
|
||||||
|
} else {
|
||||||
|
const user = await getUserFromAuth(login!.toString(), password!.toString());
|
||||||
|
|
||||||
|
if (user === null) {
|
||||||
|
response.ok = false;
|
||||||
|
response.reason = "Неправильная связка логин/пароль";
|
||||||
|
} else {
|
||||||
|
const session = await createSession(user!);
|
||||||
|
if (session !== null) {
|
||||||
|
response.ok = true;
|
||||||
|
cookies.set("session", session.id, {
|
||||||
|
path: "/",
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
response.ok = false;
|
||||||
|
response.reason = "Не удалось создать сессию для пользователя";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
body: JSON.stringify(response),
|
||||||
|
};
|
||||||
|
}
|
||||||
29
src/pages/gate/register.ts
Normal file
29
src/pages/gate/register.ts
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
import type { APIContext } from "astro";
|
||||||
|
import { createUser } from "../../db";
|
||||||
|
|
||||||
|
export async function post({ request }: APIContext) {
|
||||||
|
const response: { ok: boolean; reason?: string } = {
|
||||||
|
ok: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const formData = await request.formData();
|
||||||
|
const login = formData.get("login");
|
||||||
|
const password = formData.get("password");
|
||||||
|
if (login === null || password === null) {
|
||||||
|
response.ok = false;
|
||||||
|
response.reason = "Не предоставлены данные для регистрации";
|
||||||
|
} else {
|
||||||
|
const user = await createUser(login!.toString(), password!.toString());
|
||||||
|
|
||||||
|
if (user === null) {
|
||||||
|
response.ok = false;
|
||||||
|
response.reason = "Невозможно зарегистрировать пользователя";
|
||||||
|
} else {
|
||||||
|
response.ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
body: JSON.stringify(response),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,81 +1,35 @@
|
||||||
---
|
---
|
||||||
import Layout from '../layouts/Layout.astro';
|
import Layout from "../layouts/Layout.astro";
|
||||||
import Card from '../components/Card.astro';
|
import type { NavbarItemType } from "astro-bootstrap";
|
||||||
|
|
||||||
|
import { getUserSession, getNewsAndAlerts, getSessionUser } from "../db";
|
||||||
|
import NewsBlock from "../components/NewsBlock.astro";
|
||||||
|
import Navbar from "../components/Navbar.astro";
|
||||||
|
|
||||||
|
if (Astro.cookies.has("session")) {
|
||||||
|
const sessId = Astro.cookies.get("session").value!;
|
||||||
|
const dbSess = await getUserSession(sessId);
|
||||||
|
if (dbSess === null) {
|
||||||
|
Astro.cookies.delete("session");
|
||||||
|
return Astro.redirect("/login");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Astro.redirect("/login");
|
||||||
|
}
|
||||||
|
|
||||||
|
const { news, alerts } = await getNewsAndAlerts();
|
||||||
|
|
||||||
|
const items: NavbarItemType[] = [
|
||||||
|
{ text: "Новости", href: "/" },
|
||||||
|
{ text: "Расписание", href: "/timetable" },
|
||||||
|
];
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title="Welcome to Astro.">
|
<Layout title="Новости">
|
||||||
<main>
|
<main>
|
||||||
<h1>Welcome to <span class="text-gradient">Astro</span></h1>
|
<Navbar />
|
||||||
<p class="instructions">
|
<NewsBlock />
|
||||||
To get started, open the directory <code>src/pages</code> in your project.<br />
|
</main>
|
||||||
<strong>Code Challenge:</strong> Tweak the "Welcome to Astro" message above.
|
|
||||||
</p>
|
|
||||||
<ul role="list" class="link-card-grid">
|
|
||||||
<Card
|
|
||||||
href="https://docs.astro.build/"
|
|
||||||
title="Documentation"
|
|
||||||
body="Learn how Astro works and explore the official API docs."
|
|
||||||
/>
|
|
||||||
<Card
|
|
||||||
href="https://astro.build/integrations/"
|
|
||||||
title="Integrations"
|
|
||||||
body="Supercharge your project with new frameworks and libraries."
|
|
||||||
/>
|
|
||||||
<Card
|
|
||||||
href="https://astro.build/themes/"
|
|
||||||
title="Themes"
|
|
||||||
body="Explore a galaxy of community-built starter themes."
|
|
||||||
/>
|
|
||||||
<Card
|
|
||||||
href="https://astro.build/chat/"
|
|
||||||
title="Community"
|
|
||||||
body="Come say hi to our amazing Discord community. ❤️"
|
|
||||||
/>
|
|
||||||
</ul>
|
|
||||||
</main>
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
||||||
<style>
|
<style></style>
|
||||||
main {
|
|
||||||
margin: auto;
|
|
||||||
padding: 1.5rem;
|
|
||||||
max-width: 60ch;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 3rem;
|
|
||||||
font-weight: 800;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.text-gradient {
|
|
||||||
background-image: var(--accent-gradient);
|
|
||||||
-webkit-background-clip: text;
|
|
||||||
-webkit-text-fill-color: transparent;
|
|
||||||
background-size: 400%;
|
|
||||||
background-position: 0%;
|
|
||||||
}
|
|
||||||
.instructions {
|
|
||||||
line-height: 1.6;
|
|
||||||
margin: 1rem 0;
|
|
||||||
border: 1px solid rgba(var(--accent), 25%);
|
|
||||||
background-color: white;
|
|
||||||
padding: 1rem;
|
|
||||||
border-radius: 0.4rem;
|
|
||||||
}
|
|
||||||
.instructions code {
|
|
||||||
font-size: 0.875em;
|
|
||||||
font-weight: bold;
|
|
||||||
background: rgba(var(--accent), 12%);
|
|
||||||
color: rgb(var(--accent));
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 0.3em 0.45em;
|
|
||||||
}
|
|
||||||
.instructions strong {
|
|
||||||
color: rgb(var(--accent));
|
|
||||||
}
|
|
||||||
.link-card-grid {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(24ch, 1fr));
|
|
||||||
gap: 1rem;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
||||||
48
src/pages/login.astro
Normal file
48
src/pages/login.astro
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
---
|
||||||
|
import Layout from "../layouts/Layout.astro";
|
||||||
|
|
||||||
|
import { getUserSession } from "../db";
|
||||||
|
|
||||||
|
if (Astro.cookies.has("session")) {
|
||||||
|
const sessId = Astro.cookies.get("session").value!;
|
||||||
|
const dbSess = await getUserSession(sessId);
|
||||||
|
if (dbSess !== null) {
|
||||||
|
return Astro.redirect("/");
|
||||||
|
}
|
||||||
|
Astro.cookies.delete("session");
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Вход">
|
||||||
|
<main>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center mt-5">
|
||||||
|
<div class="col-lg-4 col-md-6 col-sm-6">
|
||||||
|
<div class="card shadow">
|
||||||
|
<div class="card-title text-center border-bottom">
|
||||||
|
<h2 class="p-3">Вход</h2>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form method="POST" action="/gate/login">
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="login" class="form-label">Логин</label>
|
||||||
|
<input type="text" class="form-control" id="login" id="login" name="login" required />
|
||||||
|
</div>
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="password" class="form-label">Пароль</label>
|
||||||
|
<input type="password" class="form-control" id="password" id="login" name="password" required />
|
||||||
|
</div>
|
||||||
|
<div class="d-grid">
|
||||||
|
<button type="submit" class="btn btn-primary">Войти</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
Нет аккаунта? <a href="/register">Зарегистрироваться</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style></style>
|
||||||
8
src/pages/logout.ts
Normal file
8
src/pages/logout.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
import type { APIContext } from "astro";
|
||||||
|
import { destroySession } from "../db";
|
||||||
|
|
||||||
|
export async function get({ redirect, cookies }: APIContext) {
|
||||||
|
const sessionId = cookies.get("session").value ?? "";
|
||||||
|
await destroySession(sessionId);
|
||||||
|
return redirect("/");
|
||||||
|
}
|
||||||
48
src/pages/register.astro
Normal file
48
src/pages/register.astro
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
---
|
||||||
|
import Layout from "../layouts/Layout.astro";
|
||||||
|
|
||||||
|
import { getUserSession } from "../db";
|
||||||
|
|
||||||
|
if (Astro.cookies.has("session")) {
|
||||||
|
const sessId = Astro.cookies.get("session").value!;
|
||||||
|
const dbSess = await getUserSession(sessId);
|
||||||
|
if (dbSess !== null) {
|
||||||
|
return Astro.redirect("/");
|
||||||
|
}
|
||||||
|
Astro.cookies.delete("session");
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Регистрация">
|
||||||
|
<main>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center mt-5">
|
||||||
|
<div class="col-lg-4 col-md-6 col-sm-6">
|
||||||
|
<div class="card shadow">
|
||||||
|
<div class="card-title text-center border-bottom">
|
||||||
|
<h2 class="p-3">Регистрация</h2>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form method="POST" action="/gate/register">
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="login" class="form-label">Логин</label>
|
||||||
|
<input type="text" class="form-control" id="login" id="login" name="login" required />
|
||||||
|
</div>
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="password" class="form-label">Пароль</label>
|
||||||
|
<input type="password" class="form-control" id="password" id="login" name="password" required />
|
||||||
|
</div>
|
||||||
|
<div class="d-grid">
|
||||||
|
<button type="submit" class="btn btn-primary">Зарегистрироваться</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
Уже есть аккаунт? <a href="/login">Войти</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style></style>
|
||||||
31
src/pages/uploadFile.ts
Normal file
31
src/pages/uploadFile.ts
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
import type { APIContext } from "astro";
|
||||||
|
import sharp from "sharp";
|
||||||
|
import { join as joinPath } from "path";
|
||||||
|
|
||||||
|
function randomHash() {
|
||||||
|
return (Math.random() * 1e30).toString(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function post({ request }: APIContext) {
|
||||||
|
const response: { success: number; file?: { url: string } } = {
|
||||||
|
success: 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const fd = await request.formData();
|
||||||
|
const imageFile = fd.get("image") as Blob;
|
||||||
|
const fName = `${randomHash()}_${imageFile.name}.jpg`;
|
||||||
|
await sharp(await imageFile.arrayBuffer())
|
||||||
|
.jpeg({ mozjpeg: true })
|
||||||
|
.toFile(joinPath(process.cwd(), "public", "uploads", fName));
|
||||||
|
response.file = {
|
||||||
|
url: `/uploads/${fName}`,
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
response.success = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
body: JSON.stringify(response),
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue